Modbus简介:
Modbus作用于OSI网络模型中的:物理层、数据链路层、应用层。
Modbus有三类:RTU、ASCII、TCP。默认选项Modbus-RTU。
Modbus有单播和广播两种形式、在广播形式下,所有从站必须执行主站命令而无需应答返回。
单播模式下Modbus主站对特定的从站发送请求后进入等待应答(同步启动超时机制),此时主站无法处理其他从站的回答。
一、Modbus4个存储区
Modbus根据寄存器不同,分为四种不同的寄存器:
Modbus有两种可读写的寄存器:线圈寄存器(DO)和保持寄存器(AO&设备设置)
Modbus有4个存储区:0,1,3,4,其中,1区,3区只读,0区4区可读可写。分别对应:
区号 | 名称 | 读写 | 地址范围 |
0 | 输出线圈 | 可读可写布尔量 | 00001-09999 |
1 | 输入线圈 | 只读布尔量 | 10001-19999 |
3 | 输入寄存器 | 只读寄存器 | 30001-39999 |
4 | 保持寄存器 | 可读可写寄存器 | 40001-49999 |
二、常用功能码
- 01:读取线圈。读取1~2000个连续线圈,1表示ON,0表示OFF。
- 02:离散量输入
- 04:读输入寄存器,可读取大约1~125的连续输入寄存器,每个连续输入寄存器用两个字节表示
- 05:写单个线圈
- 0F:写多个线圈。可以对线圈序列中的每个线圈设置ON或者OFF。
- 10:写多个寄存器
三、通信报文
Modbus的通信报文由三部分组成:地址域、协议数据单元(PDU)(由功能码和数据组成)、校验码。
地址域:由1个字节构成。也就是两位16进制数字。从站的地址可有127个,其余位用作扩展。保留区可用作特定地址段的广播指令。地址域只跟从站有关,主站没有地址。
协议数据单元PDU:功能码的长度为1字节,而数据的长度不定。
四、PDU通信报文示例
PDU报文示例:主站请求报文:01 00 02 00 06,均为十六进制数字。表示从第3个线圈读取到第9个线圈。从站应答报文:01 01 00(注意返回数据长度为1字节,未使用到的位使用0进行填充)
01读取线圈状态
主站请求报文解析:
- 01---功能码:读取线圈。
- 00---读取线圈地址高位
- 02---读取线圈地址低位
- 00---读取线圈个数高位
- 06---读取线圈个数低位
从站应答报文解析:
- 01---功能码
- 01---返回数据长度
- 00---线圈状态 ,线圈状态从右边往左边(从低位开始记录)
0F写多个线圈报文: (改变线圈的ON OFF状态)
主站请求报文:0F 00 02 00 06 01 2A
从站应答报文:0F 00 02 00 06
其中写入值42---对应的二进制值数位00 10 10 10 ,对应线圈序列为8---3(由报文中的起始地址以及写入线圈个数决定)
04读输入寄存器
主机报文:04 00 67 00 04
从机报文:04 08 F5 55 F5 55 18 63 01 1A
主机报文解析:
- 04---功能码:表示读输入寄存器
- 00与67---表示起始地址:起始地址为00 67,表示十进制的103,从104号寄存器开始读取(因为十六进制从0开始计数,而寄存器编号从1开始)
- 00与04---表示读取的寄存器数量:数量位00 04,表示十进制的4,一共读取4个寄存器
从机报文解析:
- 按照主机的请求报文,从站返回的报文将包含104->107共4个寄存器的值。
- 04---功能码
- 08---PDU数据长度,8字节
10写多个寄存器(用来改变热电偶类型)
主站报文:10 00 67 00 02 04 00 00 00 07
从站报文:10 00 67 00 02
五、校验码示例
主站报文:02 00 00 00 05
从站报文:82 03
可以看出主站的请求为:读取1~5号离散寄存器的状态。
ModbusRTU异常报文特征:为正常报文功能码的值+80,即为异常报文的功能码。示例中的03表示为异常码。查看Modbus异常码:03表示为非法数据值。
Modbus使用CRC(循环冗余校验):
在PDU报文的末端添加上CRC校验码,在RTU传输模式下,每个字节都会变成11位。