三菱PLC的MC通信协议报文解析
上位机Guide 2025-03-14


大家好!我是付工。西门子、三菱、欧姆龙是我们自动化行业使用最多的三个PLC品牌。今天跟大家分享一下三菱PLC的MC通信协议分析。大家在学习MC通信协议时,建议先熟练掌握Modbus通信协议。三菱PLC的MC协议是一种数据通信协议,它用于在计算机和三菱PLC之间传输数据。MC协议是三菱公司独有的一种协议,主要用于控制三菱PLC。MC协议是Melsec协议的简称。

一、通信帧类型

很多人在学习三菱PLC通信协议时,很头疼的是三菱PLC有很多种通信帧类型,每种通信帧又有ASCII和二进制两种编码格式。在我们实际开发中,以太网通信主要使用的是QnA兼容3E帧FX5U系列/Q系列/Qna系列/L系列/R系列),如果是FX3U通过加装Fx3U-ENET-ADP,会使用到A兼容1E帧。对于串口设备,一般会使用QnA兼容2C帧或QnA兼容4C帧通信编码格式有ASCII和二进制两种方式,通过二进制编码数据进行的通信与通过ASCII编码数据进行的通信相比,前者的通信数据量约为后者的二分之一,因此二进制编码的方式通信效率更高。

二、PLC配置

三菱PLC与西门子PLC有所不同。

西门子PLC是固定端口102,一个端口支持多个连接。

三菱PLC需要手动添加端口,一个端口只支持一个连接。

因此三菱PLC需要手动配置,这里以三菱R系列为例:

1、在导航中,通过参数>>R08ENCPU>> 模块参数,双击在打开的界面中设置好PLCIP地址信息,将通信数据代码改成二进制,然后找到【对象设备连接配置设置】:

2、点击设置,可以拖入多个SLMP连接设备,端口号根据自己需求设置,然后反应设置并关闭设置结束,设置完成后,重新下载PLC程序,断电重启PLC。

SLMP(Seamless Message Protocol)是在以太网中使用的协议。MC协议则包含了串口以及以太网的通信协议,范围更广。

三、读取协议帧

接下来我们来分析一下三菱的通信报文,以QnA兼容3E帧为例,其他通信帧大同小异。

协议帧一般分为请求帧、响应帧及异常帧。

请求帧:表示发送请求的报文。

响应帧:如果请求正确,PLC会以响应帧进行返回。

异常帧:如果请求错误,CPU会以异常帧返回。

读取请求帧报文格式:

读取响应帧报文格式

读取异常帧报文格式

说明:以上三种协议帧是参考三菱官方文档总结而成,其中头部指的是TCP头部,我们可以不用管。

四、写入协议帧

写入请求帧报文格式

写入响应帧报文格式

写入异常帧报文格式

说明:如果我们学过Modbus,可以看到,协议都是相通的,MC只是比Modbus报文结构更复杂而已。

五、通信测试

我们以读取D0开始的5个寄存器为例,结合协议文档,来进行报文拼接。

发送报文如下:

副头部:0x50 0x00

网络编号:0x00

PLC编号:0xFF

请求目标模块I/O编号:0xFF 0x03

请求目标模块站号:0x00

请求数据长度:0x0C 0x00

CPU监视定时器:0x0A 0x00

指令:0x01 0x04

子指令:0x00 0x00

起始软元件:0x00 0x00 0x00

软元件代码:0xA8

软元件点数:0x05 0x00

我们通过网络调试助手发送这个报文,观察一下返回的报文:

响应报文如下

副头部:0xD0 0x00

网络编号:0x00

PLC编号:0xFF

请求目标模块I/O编号:0xFF 0x03

请求目标模块站号:0x00

响应数据长度:0x0C 0x00

结束代码:0x00 0x00

软元件数据:0x0A 0x00 0x14 0x00 0x1E 0x00 0x28 0x00 0x32 0x00

其中0x0A 0x00 0x14 0x00 0x1E 0x00 0x28 0x00 0x32 0x00即表示D0-D4的值,进行数据解析处理后的值分别为10、20、30、40、50,与PLC数据一致。

六、代码实现

我们也可以编写C#程序来实现整个过程。

这里测试为主,代码相对简单,实际应用时可进一步封装,代码如下:

static void Main(string[] args){ // 连接 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect("192.168.2.144", 4096);  byte[] bytes = new byte[] { 0x50,0x00,//副头部,固定50 00 0x00,// 网络编号 0xFF,//PLC编号 0xFF,0x03,//目标模块IO编号,固定FF 03 0x00,// 目标模块站号 0x0C,0x00, // 字节长度,当前字节往后 0x0A,0x00,//PLC响应超时时间,以250ms为单位计算 0x01,0x04,// 成批读出,主命令 0x00,0x00,// 字操作,子命令 0x00,0x00,0x00,// 起始地址 0xA8,// 区域代码  0x05,0x00 //读取长度  }; socket.Send(bytes); byte[] respBytes = new byte[1024]; int count = socket.Receive(respBytes);  if (count == 21) { for (int i = 11; i < count; i+=2) { // 小端处理,每2个字节作为一个数据 byte[] dataBytes = new byte[2]; dataBytes[0] = respBytes[i]; dataBytes[1] = respBytes[i+1]; Console.WriteLine(BitConverter.ToInt16(dataBytes, 0)); } }}

输出结果如下:


声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 【7.24 深圳】2025国际AI+IoT生态发展大会/2025全球 MCU及嵌入式技术论坛


  • 相关技术文库
  • C语言
  • 编程
  • 软件开发
  • 程序
  • 51单片机数码管显示跑马灯程序源代码讲解

    基于51单片机学习板。用S1键作为控制跑马灯的方向按键,S5键作为控制跑马灯方向的加速度按键,S9键作为控制跑马灯方向的减速度按键,S13键作为控制跑马灯方向的启动或者暂停按键。记得把输出线P0.4一直输出低电平,...

    昨天
  • 基于ARM的智能家居控制通信控制站的设计与实现

    0 引言 物体信息化是现代社会信息化建设的“催化剂”和“增倍器”。只有走集成整合信息技术以及信息数据之路,企业的信息化建设才能真正发挥作用,才能进一步推动信息建设上水平。现代物体信息化的发展,直接刺激了新生...

    前天
  • ARM中打印函数print 的几种实现方法

    1利用C库函数printf。 步骤: 1)首先需要包含头文件stdio.h。 2)然后定义文件句柄。实际上就是一个int型变量封装在结构体中。 struct__FILE{inthandle;}; 3)定义FILE__stdout;FILE即为__FILE,通过stdio.h宏定义。...

    前天
  • 高效的C编程之:C编译器及其优化(上)

    本章将帮助读者在ARM处理器上编写高效的C代码。本章涉及的一些技术不仅适用于ARM处理器,也适用于其他RISC处理器。本章首先从ARM编译器及其优化入手,讲解C编译器在优化代码时所碰到的一些问题。理解这些问题,将有...

    07-08
  • 有关C51的编程规范

    简介:编程首要是要考虑程序的可行性,然后是可读性、可移植性、健壮性以及可测试性。这是总则。但是很多人忽略了可读性、可移植性和健壮性(可调试的方法可能歌不相同),这是不对的。 下面就来说说有关C51的编程规...

    07-08
  • 光立方程序编写步骤

    基于51单片机的4*4*4光立方程序实现原理及程序代码。LED光立方的复位电路、时钟电路、每层LED灯电路控制逻辑,系统总原理图,工作流程及相关C语言源码实现。希望能够对你学习了解LED光立方程序编写及LED立方实体制...

    07-04
  • 封装继承多态

    封装: 封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。 封装的意义: 封装的意义在于保护或者防止代码(数据)被我们无意中...

    07-04
  • 封装是什么意思?

    即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中...

    07-04
  • 超声波模块测距51程序_单片机超声波测距c语言

    超声波检测原理 超声波测距的程序流程图 程序如下: //超声波模块程序 //超声波模块程序 //Trig = P2^0 //Echo = P3^2 #include #define uchar unsigned char #define uint unsigned int // void delay(uint z) {...

    07-01
  • 大佬带你看嵌入式系统,嵌入式系统该学习什么?

    嵌入式系统是当今的热门系统之一,在诸多领域,嵌入式系统都有所应用。为增进大家对嵌入式系统的认识,小编将为大家介绍嵌入式系统是一个什么样的专业,以及学习嵌入式系统该学习哪些内容。如果你对嵌入式系统具有...

    06-27
  • c51单片机编程要点总结

    c51单片机编程要点总结 1、头文件:#include (我用的是 STC 89C54RD+) 2、预定义:sbit LED = P1^0// 定义 P1 口的 0 位为 LED 注:“P1^0”这个写法,与 A51 不同(A51 是 P1.0),P1 是一组端口,端口号范围 0~7 注2...

    06-25
下载排行榜
更多
评测报告
更多
广告