Modbus协议是一个master/slave架构的协议。有一个节点是master(主站)节点,其他使用Modbus协议参与通信的节点是slave(从站)节点。每一个slave设备都有一个唯一的地址。在串行网络中,只有被指定为master的节点可以启动一个命令(在以太网上,任何一个设备都能发送一个Modbus命令,但是通常也只有一个主节点设备启动指令)。
一个ModBus命令包含了打算执行的设备的Modbus地址。所有设备都会收到命令,但只有指定位置的设备才会执行及回应指令(地址0例外,指定地址0的指令是广播指令,所有收到指令的设备都会运行,不过不回应指令)。所有的Modbus命令包含了校验码,以确定到达的命令没有被破坏。基本的ModBus命令能指令一个RTU改变它的寄存器的某个值,控制或者读取一个I/O端口,以及指挥设备回送一个或者多个其寄存器中的数据。
数据结构
通讯消息帧
ASCII消息帧
(在消息中的每个8Bit 字节都作为两个ASCII字符发送)
十六进制,ASCII字符0...9,A...F
消息中的每个ASCII字符都是一个十六进制字符组成
每个字节的位
1个起始位
n个数据位,最小的有效位先发送
1个奇偶校验位,无校验则无
1个停止位(有校验时),2个Bit(无校验时)
(在消息中的每个8Bit 字节都作为两个ASCII字符发送)
十六进制,ASCII字符0...9,A...F
消息中的每个ASCII字符都是一个十六进制字符组成
每个字节的位
1个起始位
n个数据位,最小的有效位先发送
1个奇偶校验位,无校验则无
1个停止位(有校验时),2个Bit(无校验时)
错误检测域
LRC(纵向冗长检测)
有奇偶校验
无奇偶校验
RTU消息帧
8位二进制,十六进制数0...9,A...F
消息中的每个8位域都是一个两个十六进制字符组成
每个字节的位
1个起始位
8个数据位,最小的有效位先发送
1个奇偶校验位,无校验则无
1个停止位(有校验时),2个Bit(无校验时)
错误检测域
8位二进制,十六进制数0...9,A...F
消息中的每个8位域都是一个两个十六进制字符组成
每个字节的位
1个起始位
8个数据位,最小的有效位先发送
1个奇偶校验位,无校验则无
1个停止位(有校验时),2个Bit(无校验时)
错误检测域
LRC(纵向冗长检测)
有奇偶校验
无奇偶校验
ModBus协议中,CRC校验码计算方法为:
1、预置1个16位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器;
2、把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器;
3、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;4、如果移出位为0:重复第3步(再次右移一位);
如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
5、重复步骤3和4,直到右移8次,这样整个8Bit数据全部进行了处理;
6、重复步骤2到步骤5,进行通讯消息帧下一个字节的处理;
7、将该通讯消息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;
8、最后得到的CRC寄存器内容即为:CRC码Modbus的使用限制
● Modbus是在1970年为可编程逻辑控制器通信开发的,这些有限的数据类型在那个时代是可以被PLC理解的,大型二进制对象数据是不支持的;
● 对节点而言,没有一个标准的方法找到数据对象的描述信息,举个例子:确定一个寄存器的数据是否表示一个介于30-175度之间的温度;
● 由于Modbus是一个主/从协议,没有办法要求设备"报告异常"(构建在以太网的TCP/IP协议之上,被称为open-mbus除外)- 主站节点必须循环的询问每个节点设备,并查找数据中的变化。在带宽可能比较宝贵的应用中,这种方式在应用中消耗带宽和网络时间,例如在低速率的无线链路上;
● Modbus在一个数据链路上只能处理247个地址,这种情况限制了可以连接到主控站点的设备数量(再一次指出以太网TCP/IP除外);
● Modbus传输在远端通讯设备之间缓冲数据的方式进行,有对通信一定是连续的限制,避免了传输中的缓冲区漏洞的问题;
●Modbus协议自身提供针对未经授权的命令或截取数据没有安全性。
1、预置1个16位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器;
2、把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器;
3、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;4、如果移出位为0:重复第3步(再次右移一位);
如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
5、重复步骤3和4,直到右移8次,这样整个8Bit数据全部进行了处理;
6、重复步骤2到步骤5,进行通讯消息帧下一个字节的处理;
7、将该通讯消息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;
8、最后得到的CRC寄存器内容即为:CRC码Modbus的使用限制
● Modbus是在1970年为可编程逻辑控制器通信开发的,这些有限的数据类型在那个时代是可以被PLC理解的,大型二进制对象数据是不支持的;
● 对节点而言,没有一个标准的方法找到数据对象的描述信息,举个例子:确定一个寄存器的数据是否表示一个介于30-175度之间的温度;
● 由于Modbus是一个主/从协议,没有办法要求设备"报告异常"(构建在以太网的TCP/IP协议之上,被称为open-mbus除外)- 主站节点必须循环的询问每个节点设备,并查找数据中的变化。在带宽可能比较宝贵的应用中,这种方式在应用中消耗带宽和网络时间,例如在低速率的无线链路上;
● Modbus在一个数据链路上只能处理247个地址,这种情况限制了可以连接到主控站点的设备数量(再一次指出以太网TCP/IP除外);
● Modbus传输在远端通讯设备之间缓冲数据的方式进行,有对通信一定是连续的限制,避免了传输中的缓冲区漏洞的问题;
●Modbus协议自身提供针对未经授权的命令或截取数据没有安全性。