发送报文:
Modbus tcp 发送报文是由报文头(MBAP)和帧结构(PDU)组成的。
MBAP由7个字节组成:
00 00 00 00 00 06 01
00 00 事务处理标识,每次通讯后数字加一用来区分不同通信的报文(所以每次通信都不一样)。
00 00 协议标识符,当前00 00表示modbus TCP协议。
00 06 长度,表示PDU的数据由6个字节组成(就是说06后面还有6个字节)。
01 单元标识(就是设备地址)。
PDU由功能码和数据组成:
01 00 13 00 10
01 功能码。
00 13 起始地址(从00 13地址开始读,因为是16进制所以起始地址是00019)
00 10 数据长度(因为16进制,所以0010要读16个位,00019~00034)。
完整的一个TCP modbus发送报文:00 00 00 00 00 06 01 01 00 13 00 10
注意:假如功能码是03,起始地址还是00 13,那内部地址就是40019
接收报文:
00 00 00 00 00 05 01 01 02 3C 25
00 05后面还有5个字节。
以上其它都一样,02 代表字节计数。
3C 25 代表读取的值(转换二进制就是00111010 00100101,前8为代表00019~00026,后8位代表00028~00034)。
常见的功能码:
功能码 | 名称 | 功能 | 对应的地址类型 |
01 | 读线圈状态 | 读位(读N个bit)...读从机线圈寄存器,位操作 | 0x |
02 | 读输入离散量 | 读位(读N个bit)...读离散输入寄存器,位操作 | 1x |
03 | 读多个寄存器 | 读整形、字符型、状态字、浮点型(读N个words)...读保持寄存器,字节操作 | 4x |
04 | 读输入寄存器 | 读整形、状态字、浮点型(读N个words)...读输入寄存器,字节操作 | 3x |
05 | 写单个线圈 | 写位(写一个bit)...写线圈寄存器,位操作 | 0x |
06 | 写单个保持寄存器 | 写整形、字符型、状态字、浮点型(写一个words)...写保持寄存器,字节操作 | 4x |
0F | 写多个线圈 | 写位(写N个bit)...强置一串连续逻辑线圈的通断 | 0x |
10 | 写多个保持寄存器 | 写整形、字符型、状态字、浮点型(写N个words)...把具体的二进制强制装入一串连续的保持寄存器 | 4x |
设备类型 | 读写属性 | 应用定义 | 功能码(16进制) | Modbus协议地址 | 内部地址 |
0x | 可读可写 | 输出线圈 | 01、05、0F | 0000起到FFFF | 000001到065536 |
1x | 只读 | 输入线圈 | 02 | 0000起到FFFF | 100001到165536 |
3x | 只读 | 输入寄存器 | 04 | 0000起到FFFF | 300001到365536 |
4x | 可读可写 | 保持寄存器写的时候功能码多为10 | 03、06、10 | 0000起到FFFF | 400001到465536 |
5x | 可读可写 | 同4x是保存寄存器,但在32位字节的时候要高低位互换。 | 03、06、10 | 0000起到FFFF | 500001到565536 |
6x | 可读可写 | 同4x,但在写的时候功能码要设为06。 | 03、06、10 | 0000起到FFFF | 600001到665536 |