Modbus RTU、ACSII和TCP协议的数据结构

[复制链接]
查看68 | 回复0 | 6 天前 | 显示全部楼层 |阅读模式
RTU ADU如图所示。

除了核心PDU之外,该ADU仅包含两条信息。 首先,地址用于定义PDU对应的从设备。 在大多数网络中,地址0定义的是“广播”地址。 也就是说,主设备可以发送输出命令到地址0,而所有从设备应处理该请求,但是不做出任何响应。 除了这个地址外,CRC还用于确保数据的完整性。

数据包的首尾一对沉默时间(silent time),消息发送至少要以3.5个字节时间的停顿间隔开始,即总线上没有通信的时段。对于9,600的波特率,这个速率大约是4ms。该标准定义了一个最小沉默长度,不论波特率如何,都低于2 ms。在最后一个传输字节之后,一个至少3.5个字节时间的停顿标定了消息的结束。

另外还规定了报文需要连续发送,字节间隔不得超过1.5字节时间。

这存在性能缺陷,因为在处理数据包之前设备必须等待空闲时间结束。 然而,更危险的是串行传输引入了不同技术,并且波特率比标准更快。 例如,使用USB/串口转换器电缆,您无法控制数据的数据包和数据传输。 测试表明,结合NI-VISA驱动程序使用USB转串口电缆会在数据流中引入了尺寸可变的大间隙,而这些间隙 – 沉默期 – 会“诱骗”符合规范的代码相信消息是完整的。 由于消息不完整,通常会导致CRC无效,并导致设备将ADU解释为损坏。

帧结构 = 地址 + 功能码+ 数据 + 校验

地址: 占用一个字节,范围0-255,其中有效范围是1-247,其他有特殊用途,比如0是广播地址(广播地址就是应答所有地址,正常的需要两个设备的地址一样才能进行查询和回复)。 功能码:占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改数据,所以不同功能码对应不同功能。 数据:根据功能码不同,有不同结构,在下面的实例中有说明。 校验:为了保证数据不错误,增加这个,然后再把前面的数据进行计算看数据是否一致,如果一致,就说明这帧数据是正确的,我再回复;如果不一样,说明你这个数据在传输的时候出了问题,数据不对的,所以就抛弃了。

起始位 设备地址 功能代码 数据 CRC校验 结束符

T1-T2-T3-T4 8Bit 8Bit n个8Bit 16Bit T1-T2-T3-T4

地址码
功能码
数据区
CRC校验
1 Bytes
1Byte
N Bytes
2Byte
地址码:1个字节的从机地址码,=0:广播地址,=1-247:从机地址,=248-255:保留
功能码:常用的就是01、02、03、04、05、06、15、16,具体描述见下图
数据区:数据区包含这么几部分:起始地址、数量、数据,这三项是大端模式
CRC校验:两个字节,小端模式,校验的数据范围为:地址码+功能码+数据区

Modbus-RTU协议一般我们用的最多功能码就是03和06,大部分都是用modbus来查询传感器上的信息用03查询功能码,如果需要修改传感器寄存器的值就用06修改功能码.

Modbus-ACSII协议

 为了解决确定数据包大小的问题,ASCII ADU为每个数据包定义了一个明确且唯一的开始和结束: 每个数据包以“:”开始 并以回车(CR)和换行符(LF)结束。 ASCII ADU的缺点是所有数据都以ASCII编码的十六进制字符进行传输。 也就是说,针对功能代码3(0x03)发送的不是单个字节,而是发送ASCII字符“0”和“3”或0x30/0x33。 这使协议更具可读性,但也意味着必须通过串行网络传输两倍的数据,并且发送和接收应用程序必须能够解析ASCII值。

从上面的图中,看出:

  • • 比RTU多了起始段:,多个结束符CR,LF
  • • 地址和功能都变成了2个字节;
  • • 数据部分更加繁琐,但是更符合人们的查看;

Modbus TCP协议

TCP/IP TCP ADU由Modbus应用协议(MBAP)报文头和Modbus PDU组成。 MBAP是一个通用的报文头,依赖于可靠的网络层。 MBAP= Modbus Application Protocol Header(Modbus应用协议) 头部

MBAP(报文结构)

报文头的数据字段代表其用途。 首先,它包含一个事务处理标识符。 这有助于网络允许同时发生多个未处理的请求。 也就是说,主设备可以发送请求1、2和3。在稍后的时间点,从设备可以以2、1、3的顺序进行响应,并且主设备可以将请求匹配到响应并准确解析数据。 这对以太网网络很有用。 协议标识符通常为零,但您可以使用它来扩展协议的行为。 协议使用长度字段来描述数据包其余部分的长度。 这个元素的位置也表明了这个报文头格式在可靠的网络层上的依赖关系。 由于TCP数据包具有内置的错误检查功能,可确保数据一致性和传送,因此数据包长度可位于报文头的任何位置。 在可靠性较差的网络上(比如串行网络),数据包可能会丢失,其影响是即使应用程序读取的数据流包含有效的事务处理和协议信息,长度信息的损坏也会使报文头无效。 TCP为这种情况提供了适当的保护。 TCP/IP设备通常不适用单元ID。 但是,Modbus是一种常见的协议,因此通常会开发一些网关来将Modbus协议转换为另一种协议。 在最初的预期应用中, Modbus TCP/IP转串行网关用于连接新的TCP/IP网络和旧的串行网络。 这时,单元ID用于确定PDU对应的从设备的地址。 最后,ADU包含一个PDU。 对于标准协议,PDU的长度仍限制为253字节。

如果本文对你有帮助,敬请关注,后续更精彩!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则