REDISANT 提供互联网与物联网开发测试套件 #
互联网与中间件:
第四章:Modbus消息帧格式 #
Modbus ASCII 或 RTU 模式仅适用于标准的 Modbus 协议串行网络,它定义了在这些网络上连续传输的消息段的每一个字节,以及决定怎样将信息打包成消息域和如何解码等功能。
RTU消息帧格式 #
RTU模式通过二进制格式传输数据,具有高效、可靠的特点
ASCII消息帧格式 #
当控制器设为在Modbus 网络上以ASCII模式通信时,在消息中每个8位(bit)的字节都将作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。
在ASCII模式下,消息以冒号(:)字符(ASCII码0x3A)开始,以回车换行符结束(ASCI码0x0D,0x0A)。消息帧的其他字段(域)可以使用的传输字符是十六进制的0··9,A··F。处于网络上的Modbus设备不断侦测“:”字符,当有一个冒号接收到时,每个设备进入解码阶段,并解码下一个字段(地址域)来判断是否是发给自己的。消息帧中的字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为发生传输错误。
地址域 #
所谓地址域,指的是Modbus 通信帧中的地址字段,其内容为从设备地址。Modbus消息帧的地址域包含2个字符(ASCII模式)或者1个字节(RTU模式)。
消息帧中可能的从设备地址是0~247(十进制),单个设备的实际地址范围是1~247。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备做出回应。
地址0用作广播地址,以使所有的从设备都能认识。当Modbus协议用于更高级别的网络时,广播方式可能不被允许或以其他方式代替。
功能码域 #
功能码在Modbus协议中用于表示消息帧的功能。
功能码域由1个字节构成,因此其取值范围为1~255(十进制)。例如,常用的功能码有03、04、06、16等,其中03功能码的作用是读保持寄存器内容,04功能码的作用是读输入寄存器内容(输入寄存器和保持寄存器的区别可参考上一节的内容),06功能码的内容是预置单个保持寄存器,16功能码的内容则是预置多个保持寄存器。
从设备根据功能码执行对应的功能,执行完成后,正常情况下则在返回的响应消息帧中设置同样的功能码;如果出现异常,则在返回的消息帧中将功能码最高位(MSB)设置为1。据此,主设备可获知对应从设备的执行情况。
另外,对于主设备发送的功能码,则从设备根据具体配置来决定是否支持此功能码。如果不支持,则返回异常响应。
数据域 #
数据域与功能码紧密相关,存放功能码需要操作的具体数据。数据域以字节为单位,长度是可变的,对于有些功能码,数据域可以为空。
具体的功能码和数据域的构成及意义,可参考后续章节的内容,下面给出一个简单的例子。
RTU消息帧示例 #
以下是一个Modbus RTU请求消息帧的示例,假设主机请求从设备地址为1的设备读取保持寄存器(功能码03),起始地址为0,读取数量为2:
- 设备地址:0x01
- 功能码:0x03
- 起始地址:0x0000(高字节0x00,低字节0x00)
- 数量:0x0002(高字节0x00,低字节0x02)
- CRC:假设计算得出的CRC为0xC40B
组成的RTU请求消息帧如下:
01 03 00 00 00 02 C4 0B
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.redisant.cn