MODBUS简述
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
Modbus可将不同厂商生产的控制设备可以连成工业网络,进行集中监控,是一种通用工业标准。Modbus是一个master/slave架构的协议,有一个节点是master节点,其他使用Modbus协议参与通信的节点是slave节点,每一个slave设备都有一个唯一的地址。只有被指定为master节点的节点可以启动一个命令。所有的Modbus数据帧包含了校验码,保证传输的正确性。基本的ModBus命令能指令一个slave设备改变它的寄存器的某个值,控制或者读取一个I/O端口,以及指挥设备回送一个或者多个其寄存器中的数据。
标准的Modbus口是使用一RS-232C兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。也可以使用RS485甚至TCP传输!
RTU模式和ASCII模式
Modbus有两种传输模式,RTU(Remote Terminal Unit)模式和ASCII模式。TRU模式下的数据帧是源数据,效率高,是最常用的传输方式,而ASCII模式的数据帧源数据的ASCII码!在Modbus标准中,RTU是必须要求的,而ASCII是可选项,即作为一个Modbus通信设备可以只支持RTU,也可以同时支持RTU和ASCII,但不能只支持ASCII。
RTU模式
RTU模式下的数据帧格式如下所示
起始位 设备地址 功能代码 数据 CRC校验 结束符
T1-T2-T3-T4 8Bit 8Bit n个8Bit 16Bit T1-T2-T3-T4
消息中的每个8Bit字节包含两个4Bit的十六进制字符。这种方式的主要优点是:在同样的波特率下,可比ASCII方式传送更多的数据。但由于没有起始位和结束位,协议要求消息帧的发送至少要有3.5个字符时间的停顿间隔!
8位二进制,十六进制数0...9,A...F
消息中的每个8位域都是两个十六进制字符组成每个字节的位
1个起始位
8个数据位,最小的有效位先发送
1个奇偶校验位,无校验则无
1个停止位(有校验时),2个Bit(无校验时)
CRC(循环冗长检测)
ASCII模式
ASCII模式下的数据帧格式如下所示,消息以冒号(:)字符(ASCII码 3AH)开始,以回车换行符结束(ASCII码 0DH,0AH)。
起始位 设备地址 功能代码 数据 LRC校验 结束符
1个字符 2个字符 2个字符 n个字符 2个字符 2个字符
消息中的每个8Bit字节都作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔最长可达到1秒而不产生错误。
十六进制,ASCII字符0...9,A...F(注意是大写字符)
消息中的每个ASCII字符都是一个十六进制字符组成每个字节的位
1个起始位
7个数据位,最小的有效位先发送
1个奇偶校验位,无校验则无
1个停止位(有校验时),2个Bit(无校验时)
错误检测域:LRC(纵向冗长检测)
两种模式数据格式的区别
发送同样的源数据,RTU和ASCII的区别如下。
源数据 RTU模式 ASCII模式
0x45 0x45
0x34 0x35
比如要发送0xFFFE,RTU模式下是直接发送这个数据的二进制bit流,而ASCII模式是发送这个数据的十六进制的字符!
0XFFFE
F F F E
0X46 0X46 0X46 0X45
将一个数据转换成ASCII(大写字符)的代码如下:
1
2
if(data < 10){data += '0';}
else {data += ('A'-10);}
校验方法
CRC校验
CRC即循环冗余校验(Cyclic Redundancy Check),是利用约定多项式对信道数据进行计算产生一定位数的校验码的一种信道编码技术,被广泛用于监测信道传输过程中是否误码。循环冗余校验码包括n位信息码和k位校验码。循环冗余校验码的字长为n+k,所以循环冗余校验码又称为(n+k,n)码。通常k位校验位紧跟在n位数据位的后面。这里的n位信息码可以用一个多项式M(x)表示,它的最高次为xn-1。此外还需要约定一个生成多项式G(x),G(x)表示的是一个长度位k+1的二进制码,它的最高次为xk。将M(x)乘以xk(相当于对信息码进行左移k位),再除以生成多项式G(x),得到的长度为k的二进制余数就是校验位。二进制的除法运算也是模2除法,其计算方法与逻辑异或一致,CRC码的计算方法可以表示为公式如下:
CRC = (M(x)·xk )⊕ G(x)
尽管理论上CRC校验原理的生成多项式G(x)和校验的数据长度n是任意的,但实际上,行业内规定了各种数据格式生成多项式的国际常用的CRC参数模型,其中MODBUS的多项式公式为x^{16} + x^{15} + x^2 + 1,校验码长度为16bit。
在使用中可以通过两种方式对数据进行校验,一种是直接计算法,另一种是查表法。如果内存不是非常有限,建议使用查表法。
关于CRC的更详细的内容点这篇博文。进行CRC校验计算工具点击这里。
LRC校验
纵向冗余校验(Longitudinal Redundancy Check,简称:LRC)是通信中常用的一种校验形式,也称LRC校验或纵向校验。它是一种从纵向通道上的特定比特串产生校验比特的错误检测方法。
具体算法如下:
1、对需要校验的数据(2n个字符)两两组成一个16进制的数值求和。
2、将求和结果与256求模。
3、用256减去所得模值得到校验结果(另一种方法:将模值按位取反然后加1)。
例如16进制数据:01 A0 7C FF 02
(16进制计算) 求和:01 + A0 + 7C + FF + 02 = 21E 取模:21E % 100 = 1E 计算:100 - 1E = E2
(10进制计算) 求和:01 + 160 + 124 + 255 + 02 = 542 取模:542 % 256 = 30 计算:256 - 30 = 226
LRC校验计算工具戳这里。
标签:Modbus,数据,校验,MODBUS,CRC,简述,RTU,ASCII From: https://www.cnblogs.com/jiftle/p/16927579.html