Modbus和协议,首先什么是协议?百度解释下就是:意思是共同计议,协商;经过谈判、协商而制定的共同承认、共同遵守的文件。比如大学毕业找工作的时候,一般要签一份叫“三方协议”的,三方指自己、校方、企业,这份协议里规定了三方需要遵守的一些事项。
通信协议
那通信协议又是什么呢?通信就是双方或多方的交流,通信协议就是规定双方或多方需要共同遵守的交流方式。比如现在规定两个人需要用数字来代表文字,目前只定义了1表示“我”,2表示“你”,3表示“他”,然后现在两个人中有个人说了1,另一个立即就知道说的是“我”,但假如有个人不按规定来说话,说了一个4,那另一个人就不明白他在说什么了。这个例子里面,定义的1、2、3的表示,就是一份简单的通信协议。一般的通信协议,如TCP/IP、蓝牙协议等比Modbus复杂,但万变不离其宗。
Modbus
概述
接下来就是重头戏了,Modbus通信协议。
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。--摘自百度百科
Modbus是一种一主一从的一对一通信方式(主机发一帧,从机回一帧的形式),当然也一主多从,但实际也是一对一通信,同一时刻只能有一个从机进行响应。如果需要和多个从机同时通信,这里也支持使用广播,即主机发送指令,所有从机接收指令并执行,但不进行应答。可以参考国标标准(以下简称国标),GBT 19582-2。
当进行一主多从通信时,主机通过从机ID号来区分要通信的从机设备。从机ID范围为1~247,0为广播地址,248~255为用户自定义地址。
通信形式
目前总共有4种通信形式,RTU、ASCII、TCP、Plus。
RTU:
RTU是一种远程终端控制系统,这里指的是Modbus的一种通信形式。一般是基于串口进行通信。其报文格式是十六进制的,由Slave ID+数据+CRC校验三部分组成。数据部分详见上面报文解析。剩下的就是数据校验了,这里用的是CRC校验(循环冗余校验,Cyclic Redundancy Check,简称CRC)。要注意的是,数据部分高位数据在前,低位数据在后,而CRC校验则是低位在前,高位在后。
CRC校验
CRC(Cyclic Redundancy Checksum)是一种纠错技术,代表循环冗余校验和。
帧的完整性判断
国标里规定:一帧中两个字符之间间隔时间不超过1.5字符,以大于3.5字符间隔时间作为一帧的结束,波特率高于19200时,间隔时间固定为1.7ms。
比如现在串口设置的波特率为9600,1个停止位,无校验位,8个数据位(这种设置以下会简写成9600-1N8的形式),那么代入如下公式:
可以算出,此设置下,断帧时间应该为3.645833……ms。
另外国标还规定,串口配置中,默认应该配置有偶校验。
tips:在9600-1N8的串口设置下,可以快速估算数据发送时间,即1个字节发送时间为1ms。
ASCII:
ASCII是一种字符型的通信方式,一般也是基于串口进行通信。其报文格式是以ASCII码编码的,由帧头(:)+Slave ID+数据+LRC校验+帧尾(/r/n)五部分组成,其中Slave ID、数据部分跟RTU完全一样,只不过是以ASCII编码形式,如Slave ID,RTU是01一个字节的时候,ASCII表示就是30 31两个字节。所以实际工业应用场合很少会用到Modbus/ASCII,因为通信效率太低。
另外跟RTU还有个不同的地方,就是这里使用的校验不是CRC校验,而是LRC校验。
LRC校验
纵向冗余校验,Longitudinal Redundancy Check,简称:LRC。
LRC具体算法如下:
1、对需要校验的数据(2n个字符)两两组成一个16进制的数值求和。
2、将求和结果与256求模。
3、用256减去所得模值得到校验结果(另一种方法:将模值按位取反然后加1)。
C语言实现--摘自FreeModbus里的实现
因为整个报文都是ASCII的编码形式,所以如果使用单片机串口通信,可以把串口的数据位设置为7位(ASCII的码表范围就是0~0x7F,只用低7位)。
TCP:
TCP是一种网络协议,而Modbus/TCP就是基于网络协议上的一种应用层协议。其报文格式是十六进制的,由报头(2字节的帧序号+2字节的协议类型+2字节的数据长度+1字节的Slave ID)+数据两部分组成。由于该通信方式是基于TCP/IP这种可靠协议上,所以通信不需要有额外的校验机制。
Plus:
Modbus Plus(又称MB+)是一种高速现场总线网络,也是一种典型的令牌总线网。
线圈
读线圈功能码01,可读单个或多个
主节点发送帧格式:
从节点正常应答帧格式:
常用调试工具
Modbus Poll,可模拟主机,跟从机进行通信。
Modbus Slave,可模拟从机,响应主机的通信。
Modbus Scan,更偏向于PLC的操作界面,没有Modbus Poll灵活。
串口调试助手,可以完全从指令层面上进行深入了解,而且也没有上述工具一些问题(因为一般集成的功能越多,问题可能越多),但有个缺点就是如果作为从机应答,没办法做到及时响应主机的指令。
本文暂时没有评论,来添加一个吧(●'◡'●)