Modbus 通讯协议模式
GB/T 19582.2-2008 《基于Modbus协议的工业自动化网络规范 第1部分:Modbus协议在串行链路上的实现指南》
1、对于modbus ASCII 模式,使用的是高位字节在前,低位字节在后。使用LRC校验。
2、对于modbus rtu 模式,使用的是低位字节在前,高位字节在后。使用CRC校验。
CRC校验
错误检测域包含一16Bits值(用两个8位的字符来实现)。错误检测域的内容是通过对消息内容进行循环冗长检测方法得出的。CRC域附加在消息的最后,添加时先是低字节然后是高字节。故CRC的高位字节是发送消息的最后一个字节。
CRC检测
RTU方式时,采用CRC方法计算错误校验码,CRC校验传送的全部数据。它忽略信息中单个字符数据的奇偶校验方法。
循环冗余校验(CRC)域占用两个字节,包含了一个16位的二进制值。CRC值由传送设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。
CRC开始时先把寄存器的16位全部置成“1”,然后把相邻2个8位字节的数据放入当前寄存器中,只有每个字符的8位数据用作产生CRC,起始位,停止位和奇偶校验位不加到CRC中。
在生成CRC时,每个8位字节与寄存器中的内容进行异或,然后将结果向低位移位,高位则用“0”补充,最低位(LSB)移出并检测,如果是1,该寄存器就与一个预设的固定值进行一次异或运算,如果最低位为0,不作任何处理。
上述处理重复进行,知道执行完了8次移位操作,当最后一位(第8位)移完以后,下一个8位字节与寄存器材的当前值进行异或运算,同样进行上述的另一个8次移位异或操作,当数据帧中的所有字节都作了处理,生成的最终值就是CRC值。
生成一个CRC的流程为:
1、 预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。
2、 把数据帧中的第一个8位字节与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。
3、 将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。
4、 如果最低位为0:重复第3步(下一次移位)。
如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。
5、 重复第3步和第4步直到8次移位。这样处理完了一个完整的八位。
6、 重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。
7、 最终CRC寄存器得值就是CRC的值。
CRC值附加到信息时,低位在先,高位在后。
帧格式
信息帧
Address | Function | Data | Check |
8-Bits | 8-Bits | N x 8-Bits | 16-Bits |
信息帧格式
特注:Modbus信息帧所允许的最大长度为256个字节,即N的范围是大于等于零且小于等于252(N{0,252})。即,所有的数据一共256个,数据剩下253个。
地址(Address)域
信息帧地址域(信息地址)在帧的开始部分,由8位组成,有效的从机设备地址范围0-247(十进制),各从机设备的寻址范围为1-247。主机把从机地址放入信息帧的地址区,并向从机寻址。从机响应时,把自己的地址放入响应信息的地址区,让主机识别已作出响应的从机地址。
地址0为广播地址,所有从机均能识别。当Modbus协议用于高级网络时,则不允许广播或其它方式替代。
功能(Function)域
信息帧功能域代码告诉了被寻址到的终端执行何种功能。有效码范围1-225(十进制) ,有些代码是适用于所有控制器,有些适应于某种控制器,还有些保留以备后用。
当主机向从句发送信息时,功能代码向从机说明应执行的动作。如读一组离散式线圈或输入信号的ON/OFF状态,读一组寄存器的数据,读从机的诊断状态,写线圈(或寄存器),允许下截、记录、确认从机内的程序等。当从机响应主机时,功能代码可说明从机正常响应或出现错误(即不正常响应),正常响应时,从句简单返回原始功能代码;不正常响应时,从机返回与原始代码相等效的一个码,并把最高有效位设定为“1”。
如,主机要求从机读一组保持寄存器时,则发送信息的功能码为:
0000 0011 (十六进制03)
若从机正确接收请求的动作信息后,则返回相同的代码值作为正常响应。发现错时,则返回一个不正常响信息:
1000 0011(十六进制83)
数据域
数据域包含了终端执行特定功能所需要的数据或者终端响应查询时采集到的数据。这些数据的内容可能是数值、参考地址或者极限值。他由数据区有2个16进制的数据位(2的8次方256),数据范围为00-FF(16进制)。例如:功能域码告诉终端读取一个寄存器,数据域则需要指明从哪个寄存器开始及读取多少个数据,内嵌的地址和数据依照类型和从机之间的不同能力而有所不同。若无错误出现,从机向主机的响应信息中包含了请求数据,若有错误出现,则数据中有一个不正常代码,使主机能判断并作出下一步的动作。数据区的长度可为“零”以表示某类信息。
错误校验域
该域允许主机和终端检查传输过程中的错误。有时,由于电噪声和其它干扰,一组数据在从一个设备传输到另一个设备时在线路上可能会发生一些改变,出错校验能够保证主机或者终端不去响应那些传输过程中发生了改变的数据,这就提高了系统的安全性和效率,出错校验使用了16位循环冗余的方法,即CRC校验。
错误检测域包含一16Bits值(用两个8位的字符来实现)。错误检测域的内容是通过对消息内容进行循环冗长检测方法得出的。CRC域附加在消息的最后,添加时先是低字节然后是高字节。故CRC的高位字节是发送消息的最后一个字节。
字符的连续传输
当消息在标准的Modbus系列网络传输时,每个字符或字节按由左到右的次序方式发送:
最低有效位(LSB)...最高有效位(MSB)。
位的序列是:
有奇偶校验
启始位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 奇偶位 | 停止位 |
无奇偶校验
启始位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 停止位 | 停止位 |
位顺序(RTU)
Modbus数据和控制功能详解
Modbus信息中的所有数据地址以零作为基准,各项数据的第一个数据地址的编号为0。若无特殊说明在此节文中用+进制值表示,图中的数据区则用十六进制表示。
图2-1为一个例子,说明了Modbus的查询信息,图2-2为正常响应的例子,这两例子中的数据均是16进制的,也表示了以RTU方式构成数据帧的方法。
主机查询是读保持寄存器,被请求的从机地址是06,读取的数据来自地址40108保持寄有器。注意,该信息规定了寄存器的起始地址为0107 (006BH)。
从机响应返回该功能代码,说明是正常响应,字节数“Byle count”中说明有多少个8位字节被返回。它表明了附在数据区中8位字节的数量,当在缓冲区组织响应信息时,“字节数”区域中的值应与该信息中数据区的字节数相等。如RTU方式时,63H 用一个字节(01100011)发送。8个位为一个单位计算“字节数”,它忽略了信息帧用组成的方法。
Addr | Fun | Data start reg hi | Data start reg lo | Data #of regs hi | Data #of regs lo | CRC16 hi | CRC16 lo |
06H | 03H | 00H | 6BH | 00H | 01H | XXH | XXH |
图 2 - 1 Modbus的查询信息
Addr | Fun | Byte count | Data1 hi | Data1 Lo | Data 2 hi | Data2 lo | Data3 hi | Data3 lo | CRC16 hi | CRC16 lo |
06H | 03H | 06H | 02H | 2BH | 00H | 00H | 00H | 63H | XXH | XXH |
图 2 – 2 Modbus的响应信息
不正常响应
不正常响应:
除广播外,主机向从机设备发送查询并希望有一个正常响应,主机查询中有可能产生4种事件:
¨ 从机接收查询,通讯错误正常处理信息,则返回一个正常响应事件。
¨ 由于通讯出错,从机不能接收查询数据,因而不返回响应。此时,主机依靠处理程序给出查询超时事件。
¨ 若从机接收查询,发现有 (LRC或CRC) 通讯错误,并返回响应,此时,依靠主机处理程序给出查询超时事件。
¨ 从机接收查询,无通讯错误,但无法处理(如读不存在的线圈和寄存器)时,向主机报告错误的性质。
不正常响应信息有2个与正常响应不相同的区域:
功能代码区:正常响应时,从机的响应功能代码区,带原查询的功能代码。所有功能代码的MSB为0(其值低于80H)。不正常响应时,从机把功能代码的MSB置为1,使功能代码值大于80H,高于正常响应的值。这样,主机应用程序能识别不正常响应事件,能检查不正常代码的数据区。
数据区:正常响应中,数据区含有(按查询要求给出的) 数据或统计值,在不正常响应中,数据区为一个不正常代码,它说明从机产生不正常响应的条件和原因。
ModBus的不正常代码:
代码 | 名称 | 含义 |
01 | 不合法功能代码 | 从机接收的是一种不能执行功能代码。发出查询命令后,该代码指示无程序功能。 |
02 | 不合法数据地址 | 接收的数据地址,是从机不允许的地址。 |
03 | 不合法数据 | 查询数据区的值是从机不允许的值。 |
04 | 从机设备故障 | 从机执行主机请求的动作时出现不可恢复的错误。 |
05 | 确认 | 从机已接收请求处理数据,但需要较长的处理时间,为避免主机出现超时错误而发送该确认响应。主机以此再发送一个“查询程序完成”未决定从机是否已完成处理。 |
06 | 从机设备忙碌 | 从机正忙于处理一个长时程序命令,请求主机在从机空闲时发送信息。 |
07 | 否定 | 从机不能执行查询要求的程序功能时,该代码使用十进制13或14代码,向主机返回一个“不成功的编程请求”信息。主机应请求诊断从机的错误信息。 |
08 | 内存奇偶校验错误 | 从机读扩展内存中的数据时,发现有奇偶校验错误,主机按从机的要求重新发送数据请求。 |
Modbus tcp与rtu
有时候我们的控制器也许只支持以太网总线,或者为了方便管理,通过ModbusTCP来与支持ModbuRTU的设备配合使用这时候就需要一个方案,使得ModbusTCP数据和ModbusRTU数据能够相互转换。在这里提供一个思路,已经将其转化为实际模块,运用到项目中。
转发丢包率小于1/10000;
ModbusTCP与ModbusRTU区别:
Modbus通讯协议和TCP/UDP协议的区别:
1、Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议。通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为Modbus Master,从设备方使用的协议称为Modbus Slave。典型的主设备包括工控机和工业控制器等;典型的从设备如PLC可编程控制器等。Modbus通讯物理接口可以选用串口(包括RS232和RS485),也可以选择以太网口。
2、而Modbus TCP协议则是在RTU协议上加一个MBAP报文头,由于TCP是基于可靠连接的服务,RTU协议中的CRC校验码就不再需要,所以在Modbus TCP协议中是没有CRC校验码,用一句比较通俗的话说就是:Modbus TCP协议就是Modbus RTU协议在前面加上五个0以及一个6,然后去掉两个CRC校验码字节就OK.虽然这句话说得不是特别准确,但是也基本上把RTU与TCP之间的区别说得比较清楚了。
wirshark分析modbus报文,过滤方式:mbtcp.len==3;
其它 摘自https://www.cnblogs.com/iluzhiyong/p/4301192.html
①Coil和Register
Modbus中定义的两种数据类型。Coil是位(bit)变量;Register是整型(Word,即16-bit)变量。
②Slave和Master与Server和Client
同一种设备在不同领域的不同叫法。
Slave: 工业自动化用语;响应请求;
Master:工业自动化用语;发送请求;
Server:IT用语;响应请求;
Client:IT用语;发送请求;
在Modbus中,Slave和Server意思相同,Master和Client意思相同。
2.Modbus数据模型
Modbus中,数据可以分为两大类,分别为Coil和Register,每一种数据,根据读写方式的不同,又可细分为两种(只读,读写)。
Modbus四种数据类型:
Discretes Input 位变量 只读
Coils 位变量 读写
Input Registers 16-bit整型 只读
Holding Registers 16-bit整型 读写
通常,在Slave端中,定义四张表来实现四种数据。
3.Modbus地址范围对应表
设备地址 Modbus地址 描述 功能 R/W
1~10000 address-1 Coils(Output) 0 R/W
10001~20000 address-10001 Discrete Inputs 01 R
30001~40000 address-30001 Input Registers 04 R
40001~50000 address-40001 Holding Registers 03 R/W
4.Modbus变量地址
映射地址 Function Code 地址类型 R/W 描述
0xxxx 01,05,15 Coil R/W -
1xxxx 02 离散输入 R -
2xxxx 03,04,06,16 浮点寄存器 R/W 两个连续16-bit寄存器表示一个浮点数(IEEE754)
3xxxx 04 输入寄存器 R 每个寄存器表示一个16-bit无符号整数(0~65535)
4xxxx 03,06,16 保持寄存器 R/W -
5xxxx 03,04,06,16 ASCII字符 R/W 每个寄存器表示两个ASCII字符
5.3个字符时间计算