Modbus的ASCII和RTU通信

Modbus介绍

Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。Modbus协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。

Modbus 是一个请求/应答协议。也叫做 SlaveMasterServerClient

同一种设备在不同领域的不同叫法,Slave和Server意思相同,Master和Client意思相同。

  • Slave:工业自动化用语;响应请求;
  • Master:工业自动化用语;发送请求;
  • Server:IT用语;响应请求;
  • Client:IT用语;发送请求;

协议分类

ModBus协议是应用层报文传输协议(OSI模型第7层),它定义了一个与通信层无关的协议数据单元(PDU),即PDU=功能码+数据域。     

Modbus通信栈

ModBus协议能够应用在不同类型的总线或网络。对应不同的总线或网络,Modbus协议引入一些附加域映射成应用数据单元(ADU),即ADU=附加域+PDU。目前Modbus有下列三种通信方式:

  1. 以太网,对应的通信模式是 MODBUS TCP
  2. 异步串行传输(各种介质如有线RS-232-/422/485/;光纤、无线等),对应的通信模式是 MODBUS RTUMODBUS ASCII
  3. 高速令牌传递网络,对应的通信模式是 Modbus PLUS

ASCII模式

| : | 地址 | 功能代码 | 数据数量 | 数据1 | … | 数据n | LRC高4位字节值 | LRC低4位字节值 | 回车 | 换行 |

RTU模式

| 地址 | 功能代码 | 数据数量 | 数据1 | … | 数据n | CRC高字节 | CRC低字节 |

两种传输模式中(ASCII或RTU),传输设备以将Modbus消息转为有起点和终点的帧,这就允许接收的设备在消息起始处开始工作,读地址分配信息,判断哪一个设备被选中(广播方式则传给所有设备),判知何时信息已完成。部分的消息也能侦测到并且错误能设置为返回结果。

另外Modbus协议是一个主从协议,子节点在没有收到主节点的请求时并不主动发送数据,也不与其他子节点通信。

Modbus主从协议关系

Modebus中有单播模式(通过地址向单一设备)地址1到247之间,广播模式(所有设备接收)和子节点通信,地址0是专门用于广播数据的地址。

| 0 | 1 ~ 247 | 248 ~ 255 | | —– | —– | —– | —– | | 广播地址 | 子节点单独地址 | 保留 |

主节点没有地址,只有子节点必须有一个地址,而且该地址必须在Modbus串行总线上唯一。

各种情形的主从通信时序图

帧格式

通用Modbus帧

ADU: 应用数据单元 PDU: 协议数据单元

通用Modbus帧格式中用一个字节作为功能码域,有效范围是十进制1到255(128到255为异常响应保留)。

对于异常响应,服务器返回一个与原始功能码等同的功能码,将功能码最高有效位逻辑1(即 逻辑与 0x80 ),数据位为错误code(占1字节)

对于正常响应,功能码为1字节,数据码有一个最大长度约束,因为Modbus PDU的最大长度为256字节,所以串行链路的数据位最大长度为253字节。

ASCII帧

使用ASCII模式,消息以冒号(:)字符(ASCII码 3AH)开始,以回车换行符结束(ASCII码 0DH,0AH)。

其它域可以使用的传输字符是十六进制的0…9,A…F。网络上的设备不断侦测“:”字符,当有一个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给自己的。

消息中字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为传输错误。一个典型消息帧如下所示:

起始位设备地址功能代码数据LRC校验结束符
1个字符2个字符2个字符n个字符2个字符2个字符

RTU帧

使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。在网络波特率下多样的字符时间,这是最容易实现的(如下图的T1-T2-T3-T4所示)。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0…9,A…F。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。

Modbus报文RTU帧

整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC域的值不可能是正确的。一典型的消息帧如下所示:

起始位设备地址功能代码数据CRC校验结束符
T1-T2-T3-T48Bit8Bitn个8Bit16BitT1-T2-T3-T4

消息帧的地址域包含两个字符(ASCII)或8Bit(RTU)。可能的从设备地址是0…247 (十进制)。单个设备的地址范围是1…247。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。地址0是用作广播地址,以使所有的从设备都能认识。当Modbus协议用于更高水准的网络,广播可能不允许或以其它方式代替。

应答包中,数据包括了数据字节长度+数据值,请求包中数据只包含数据值。

校验

我们的系统编码一个字节是8位,而在modbus的RTU模式中每个字节11位,格式为:

1811
起始位数据位作为奇偶校验停止位

例如:RTU字符帧的数据为 1100 0101

1 + 1 + 0 + 0 + 0 + 1 + 0 + 1 = 4

如果我们采用的是偶校验,4是偶数校验位就是0, 如果我们采用的是奇校验,则是1。

奇偶校验是默认的,但是也可以不使用奇偶校验,这样后两位(Bit)就都是停止位。

有奇偶校验:

| 起始 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 校验 | 停止 |

无奇偶校验:

| 起始 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 停止 | 停止 |

CRC校验

在RTU模式包含一个对全部报文内容执行的基于循环沉余校验算法的错误检验。无论有没有奇偶校验均执行此校验。