与三菱Q系列PLC-TCP通信(MC协议)学习总结

本文介绍使用C#实现与三菱Q系列PLC的TCP通信过程,重点讲解了MC模式下A-1E及Qna-3E协议的应用,并提供了内置以太网模块的设置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2015/09/14

最近几天在做C#代码与三菱Q系列PLC TCP通信(MC模式)读写数据寄存器的功能,留此调试文档。

三菱Q系列PLC通信协议有很多种,本次选择了MC,MC内发送数据有ASCII方式和二进制方式,通信模块有内置以太网模块(与CPU一起)和以太网扩展模块,不同的模块设置参数的方式同,本次使用的是内置式的,

下图为内置式网口设置界面

 

下图为以太网模块参数设置界面


MC的协议方式有A-1E模式和Qna-3E模式、Qna-4E模式,尝试了前两种;A-1E为较早的通信版本,对地址的操作范围有限(数据寄存器区的D0~D6143、D9000~D9255),Qna-3E可访问D0~D12287数据

 

A-1E协议:


Qna-3E协议:

二进制方式

 

ASCII方式


请求数据长度计算为之后的所有数据,二进制方式两个数字为一个字,ASCII为一个数字一个字,二进制发送时数据的高低位需要调换,ASCII发送带字母起始地址式会返回错误(待解决)。

数据回复

异常回复:0b 00 5b c0 00 ff ff 03 00 01 14 00 00

成功回复:d0 00 00 ff ff 03 00 02 00 00 00

 

字符串转换为二进制数据:

byte[] bytes = new byte[str.Length / 2];

for (int i = 0; i < str.Length; i += 2)

    bytes[i / 2] = (byte)Convert.ToByte(str.Substring(i, 2), 16);

### C# 中实现三菱 MC Binary 协议的方法 在 C# 上位机开发中,要实现三菱 PLC通信并使用 MC Binary 协议(如 A-1E 或 QnA-3E),可以通过 Socket 编程完成网络层的数据交互,并按照协议规定组装解析二进制报文。以下是详细的说明: #### 1. 创建项目环境 首先,在 Visual Studio (如 VS2022) 中创建一个新的控制台应用程序或 Windows Forms 应用程序。确保安装 .NET Framework 或 .NET Core 开发工具包。 #### 2. 添加必要的命名空间 为了处理网络通信数据转换,需引入以下命名空间: ```csharp using System; using System.Net.Sockets; using System.Text; ``` #### 3. 配置 Socket 连接 通过 `TcpClient` 类建立 Mitsubishi PLCTCP/IP 连接。配置 IP 地址端口号(默认为 5007)。 ```csharp TcpClient client = new TcpClient(); client.Connect("192.168.0.1", 5007); // 替换为目标PLC的实际IP地址 NetworkStream stream = client.GetStream(); ``` 上述代码实现了目标设备的连接[^2]。 #### 4. 报文结构定义 根据引用中的描述,MC Binary 协议具有固定的帧头帧尾格式。对于不同的操作(如读取 D 寄存器、批量写入等),需要构建特定的指令集。例如,读取寄存器时可以采用如下格式: | 字节位置 | 描述 | |----------|-------------------------| | 0-1 | 帧长度 | | 2 | 控制符 | | ... | 更多字段 | 针对具体的例子——读取 D100 D101 数据: ```csharp byte[] request = { 0x0B, 0x00, // 帧长度 0x01, // 控制符 0x00, 0x00, // 子站号 0xFF, 0xFF, // 设备编号 0x03, 0x00, // 指令:读字数据 0xD0, 0x00, // 起始地址高字节低字节 0x02 // 请求数量 }; ``` 以上请求遵循了 A-1E/QnA-3E 的基本格式[^1]。 #### 5. 发送接收数据 利用 NetworkStream 对象发送已构造好的请求报文,并等待响应。 ```csharp stream.Write(request, 0, request.Length); byte[] buffer = new byte[1024]; int bytesRead = stream.Read(buffer, 0, buffer.Length); // 将收到的数据打印出来供调试分析 Console.WriteLine(BitConverter.ToString(buffer, 0, bytesRead)); ``` 注意,返回的结果也需要依据协议文档逐一拆解提取有用信息[^3]。 #### 6. 批量写入功能扩展 如果涉及向 PLC 写回数据,则需要注意调整相应的指令码以及附加待传输的内容项。比如执行一次简单的整数赋值任务: ```csharp short valueToWrite = 513; // 示例数值 byte[] writeData = BitConverter.GetBytes(valueToWrite).Reverse().ToArray(); // 转换成大端序表示法 List<byte> commandBuilder = new List<byte>() { /* 初始化基础头部 */ }; commandBuilder.AddRange(writeData); // 加入实际参数部分 byte[] finalCommand = commandBuilder.ToArray(); stream.Write(finalCommand, 0, finalCommand.Length); ``` 这里展示了如何动态生成包含用户输入变量的新消息序列[^4]。 --- ### 注意事项 - **异常捕获**:建议在整个流程里加入 try-catch 块捕捉可能发生的错误状况; - **超时设置**:合理设定 socket timeout 参数以免长时间阻塞; - **编码兼容性**:确认所有字符串均按 ASCII 表格映射而非 UTF-* 形式传递给硬件侧解读。 ---
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunny被注册

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值