ModbusTCP通信报文分析
欢迎交流学习上位机和工业软件相关的QQ群聊: 1009652195
1.ModbusTCP通信格式说明
①MBAP报文头 (7个)
【1】事务处理标识符
报文ID,不参与运算 (2个)
自增
固定00 00
【2】协议标识符 (2个)
固定00 00
【3】长度 (2个)
长度之后总共的字节数(N+2)
【4】单元标识符 (1个)
相当于RTU中的从站地址
②功能码 (1个)
③数据部分 (N个)
2.与RTU之间的对比

3.[ModbusTCP与RTU之间的关系]
校验
ModbusTCP一般是基于TCP/UDP,在传输层已经有了校验,因此应用层不需要再做校验
站地址
ModbusTCP弱化了站地址的概念,因为在以太网网络中,通过IP地址去区别不同的设备,但是为了保守起见,还是保留了站地址,将名称改成了单元标识符,在实际应用中,这个单元标识符可以用,也可以不用,根据实际情况来使用,一般是默认1或者忽略
4.[读取输入输出线圈]
读取输入线圈
发送报文格式: 事务处理标识符 + 协议标识符 + 长度 + 单位标识符 + 功能码 + 线圈地址 + 长度
接收报文格式: 事务处理标识符 + 协议标识符 + 长度 + 单位标识符 + 功能码 + 字节计数 + 具体数据
读取输入线圈测试: 读取1号站点从10开始的20个线圈的值
发送报文: 00 82 00 00 00 06 01 02 00 0A 00 14
00 82(事务处理标识符,自增) 00 00(协议标识符) 00 06(后面有6个字节) 01(单位标识符为1即为01号站点) 02(功能码为读取输入线圈) 00 0A(线圈地址为10) 00 14(长度为20)
接收报文: 00 82 00 00 00 06 01 02 03 03 00 00
00 82(事务处理标识符,自增) 00 00(协议标识符) 00 06(后面有6个字节) 01(单位标识符为1,即为01号站点) 02(功能码为读取输入线圈) 03(字节计数,后面有3个字节) 03(数据为03,二进制为11) 00 00
读取输出线圈
发送报文格式: 事务处理标识符 + 协议标识符 + 长度 + 单位标识符 + 功能码 + 线圈地址 + 长度
接收报文格式: 事务处理标识符 + 协议标识符 + 长度 + 单位标识符 + 功能码 + 字节计数 + 具体数据
读取输出线圈测试: 读取1号站点从10开始的20个线圈的值
发送报文: 05 E1 00 00 00 06 01 01 00 0A 00 14
05 E1(事务处理标识符,自增) 00 00(协议标识符) 00 06(长度,后面有6个字节) 01(单位标识符,01站点) 01(功能码为读取输出线圈) 00 0A(线圈地址为10) 00 14(长度为20)
接收报文: 05 E1 00 00 00 06 01 01 03 03 00 00
05 E1(事务处理标识符,自增) 00 00(协议标识符) 00 06(长度,后面又6个字节) 01(单位标识符,01站点) 01(功能码为读取输出线圈) 03(字节计数,后面有3个字节) 03(数据为03,二进制为11) 00 00
5.[读取输入输出寄存器]
读取输入寄存器
发送报文格式: 事务处理标识符 + 协议标识符 + 长度 + 单位标识符 + 功能码 + 寄存器地址 + 长度
接收报文格式: 事务处理标识符 + 协议标识符 + 长度 + 单位标识符 + 功能码 + 字节计数 + 具体数据
读取输入寄存器测试: 读取1号站点从4开始的2个寄存器值
发送报文: 11 51 00 00 00 06 01 04 00 04 00 02
11 51(事务处理标识符,自增) 00 00(协议标识符) 00 06(长度,后面有6个字节) 01(单位标识符,01站点) 04(功能码,读取输入寄存器) 00 04(寄存器地址为4) 00 02(长度为2)
接收报文: 11 51 00 00 00 07 01 04 04 00 7B 01 C8
11 51(事务处理标识符,自增) 00 00(协议标识符) 00 07(长度,后面有7个字节) 01(单位标识符,01站点) 04(功能码,读取输入寄存器) 04(字节计数,后面有4个字节) 00 7B(数据为7x16+11=123) 01 C8(数据为1x16x16+12x16+8=456)
读取输出寄存器
发送报文格式: 事务处理标识符 + 协议标识符 + 长度 + 单位标识符 + 功能码 + 寄存器地址 + 长度
接收报文格式: 事务处理标识符 + 协议标识符 + 长度 + 单位标识符 + 功能码 + 字节计数 + 具体数据
读取输出寄存器测试: 读取1号站点从4开始的2个寄存器值
发送报文: 15 95 00 00 00 06 01 03 00 04 00 02
15 95(事务处理标识符,自增) 00 00(协议标识符) 00 06(长度,后面有6个字节) 01(单位标识符) 03(功能码,读取输出寄存器) 00 04(寄存器地址为04) 00 02(长度为2)
接收报文: 15 95 00 00 00 07 01 03 04 00 7B 01 C8
15 95(事务处理标识符,自增) 00 00(协议标识符) 00 07(长度,后面有7个字节) 01(单位标识符) 03(功能码,读取输出寄存器) 04(字节计数) 00 7B(数据为7x16+11=123) 01 C8(数据为1x16x16+12x16+8=456)
6.[预置单线圈和单寄存器]
预置单线圈
发送报文格式: 事务处理标识符 + 协议标识符 + 长度 + 单位标识符 + 功能码 + 线圈地址 + 线圈值(FF 00/00 00)
接收报文格式: 事务处理标识符 + 协议标识符 + 长度 + 单位标识符 + 功能码 + 线圈地址 + 线圈值(FF 00/00 00)
预置单线圈测试: 将1号站点的08线圈置位(写入1)[置位写入1 -> "FF 00", 复位写入0 -> "00 00"]
发送报文: 00 00 00 00 00 06 01 05 00 08 FF 00
00 00(事务处理标识符) 00 00(协议标识符) 00 06(长度,后面有6个字节) 01(单位标识符,01站点) 05(功能码,写入单个线圈) 00 08(线圈地址为08) FF 00(写入1)
接收报文: 00 00 00 00 00 06 01 05 00 08 FF 00
00 00(事务处理标识符) 00 00(协议标识符) 00 06(长度,后面有6个字节) 01(单位标识符,01站点) 05(功能码,写入单个线圈) 00 08(线圈地址为08) FF 00(写入1)
预置单寄存器
发送报文格式: 事务处理标识符 + 协议标识符 + 长度 + 单位标识符 + 功能码 + 寄存器地址 + 寄存器值
接收报文格式: 事务处理标识符 + 协议标识符 + 长度 + 单位标识符 + 功能码 + 寄存器地址 + 寄存器值
预置单寄存器测试: 将1号站点的08寄存器写入123
发送报文: 00 00 00 00 00 06 01 06 00 08 00 7B
00 00(事务处理标识符) 00 00(协议标识符) 00 06(长度,后面有6个字节) 01(单位标识符,01站点) 06(功能码,写入单个寄存器) 00 08(寄存器位置为08) 00 7B(寄存器值为123)
接收报文: 00 00 00 00 00 06 01 06 00 08 00 7B
00 00(事务处理标识符) 00 00(协议标识符) 00 06(长度,后面有6个字节) 01(单位标识符,01站点) 06(功能码,写入单个寄存器) 00 08(寄存器位置为08) 00 7B(寄存器值为123)
7.[预置多线圈和多寄存器]
预置多线圈
发送报文格式: 事务处理标识符 + 协议标识符 + 长度 + 单位标识符 + 功能码 + 起始线圈地址 + 线圈数量 + 字节计数 + 字节数据
接收报文格式: 事务处理标识符 + 协议标识符 + 长度 + 单位标识符 + 功能码 + 起始线圈地址 + 线圈数量
预置多线圈测试: 将1号站点从0开始的6个线圈分别写入110011
发送报文: 00 00 00 00 00 08 01 0F 00 00 00 06 01 33
00 00(事务处理标识符,自增) 00 00(协议标识符) 00 08(长度,后面有8个字节) 01(单位标识符,01站点) 0F(功能码,写入多个线圈) 00 00(线圈开始地址) 00 06(线圈数量) 01(字节计数,数据为6个,小于8个,所以为一个字节) 33(字节数据为1+2+16+32=51,十六进制为33)
接收报文: 00 00 00 00 00 06 01 0F 00 00 00 06
00 00(事务处理标识符,自增) 00 00(协议标识符) 00 06(长度,后面有6个字节) 01(单位标识符,01站点) 0F(功能码,写入多个线圈) 00 00(开始线圈地址) 00 06(线圈数量)
预置多寄存器
发送报文格式: 事务处理标识符 + 协议标识符 + 长度 + 单位标识符 + 功能码 + 起始寄存器地址 + 寄存器数量 + 字节计数 + 字节数据
接收报文格式: 事务处理标识符 + 协议标识符 + 长度 + 单位标识符 + 功能码 + 起始寄存器地址 + 寄存器数量
预置多寄存器测试: 将1号站点从0开始的3个寄存器分别写入12 34 56
发送报文: 00 00 00 00 00 0D 01 10 00 00 00 03 06 00 0C 00 22 00 38
00 00(事务处理标识符,自增) 00 00(协议标识符) 00 0D(长度,后面字节有13个) 01(单位标识符,01站点) 10(功能码,写入多个寄存器) 00 00(起始寄存器地址) 00 03(寄存器数量) 06(字节计数3x2=6) 00 0C(十进制值为12) 00 22(十进制值为34) 00 38(十进制值为56)
接收报文: 00 00 00 00 00 06 01 10 00 00 00 03
00 00(事务处理标识符,自增) 00 00(协议标识符) 00 06(长度,后面字节有6个) 01(单位标识符,01站点) 10(功能码,写入多个寄存器) 00 00(起始寄存器地址) 00 03(寄存器数量)

浙公网安备 33010602011771号