ModbusTCP是一种基于以太网的通信协议 | ||||||||||||||||||||||||||||||||||||||
发表时间:2024-09-30 阅读次数:149 | ||||||||||||||||||||||||||||||||||||||
发展历史
通用格式 我们可以看出,ModbusTCP在Modbus串行通信的基础上,去除了差错校验和附加地址(即从站地址),然后加上MBAP报文头(7 Bytes)。 1. ModbusTCP协议一般用 于TCP或UDP通信,而TCP和UDP本身就具备数据校验,因此不需要再加校验了。 2、ModbusTCP主要用于以太网通信,因此,不再需要通过附加地址(即从站地址) 来区分不同的设备,因为以太网设备一般会使用IP地址来区分。 因此,我们只需要了解MBAP报文头即可,因为功能码和数据部分与ModbusRTU协议是一样的,下面主要针对MBAP报文头进行分析说明。
【1】事务处理标识符:事务处理标识符可以理解为报文的编号,服务器会复制客户端 的事务处理标识符进行响应,因此事务处理标识符并没有实际意义,一般情况下我们会使用ID自增的方式,事务处理标识符占用2个字节长度。 【2】协议标识符:协议标识符设计时是为了区分不同的协议,但是在实际应用中,只有一个协议Modbus协议,用0来表示,协议标识符占用2个字节长度,所以协议标识符是固定值0x00 0x00。 【3】长度:长度表示它后面有多少个字节,即单元标识符、功能码、数据这三个部分 的字节个数,长度占用2个字节长度。 【4】单元标识符:单元标识符与从站地址是相似的,因为ModbusTCP去除了从站地址, 所以在MBAP报文头中加入单元标识符,防止有些场合需要通过一个标识来区别不同的子设备,比如一个串口服务器下挂了多个串口设备,那么就需要单元标识符来区别不同的串口设备,实际应用中单元标识符的值由服务器决定。 综合来看,ModbusTCP协议的通用报文格式如下所示:
读取输出线圈 我们来分析一下这段发送报文: 【1】事务/协议:事务处理标识符和协议标识符都是用的固定值0x00 0x00。 【2】长度:单元标识符、功能码、数据部分总共是6个字节,因此长度是0x00 0x06。 【3】单元标识符:单元标识符默认是0x01。 【4】功能码:0x01表示读取的是输出线圈存储区。 【5】起始地址:十六进制0x00 0x13对应十进制为19,表示从19号线圈开始读取,这个 19对应的Modbus地址为00020。 【6】线圈数量:十六进制 0x00 0x1B对应十进制的27,表示读取线圈数量为27。 这段发送报文表示的含义是客户端想要读取服务器输出线圈存储区,Modbus地址从 00020-00046,共27个线圈的状态值。 我们再来分析一下这段响应报文: 【1】事务/协议:事务标识符服务器是复制发送报文的,是固定值0x00 0x00。 【2】长度:单元标识符、功能码、数据部分总共是7个字节,因此长度是0x00 0x07。 【3】单元标识符:单元标识符与发送报文一致。 【4】功能码:0x01表示这帧报文响应的是0x01功能码的报文。 【5】字节计数:0x04表示返回的数据总共有4个字节。 【6】字节1至字节4:返回的具体数据分别为0xCD、0x6B、0xB2、0x05,这4个字节对 应32个线圈值,前面的27个线圈值即对应00020-00046的值。 读取保持型寄存器 读取保持型寄存器发送报文格式如下: 这个与读取输出线圈是相似的,只不过这里的起始地址是寄存器地址。 我们来分析一下这段发送报文: 【1】事务/协议:事务处理标识符和协议标识符都是用的固定值0x00 0x00。 【2】长度:单元标识符、功能码、数据部分总共是6个字节,因此长度是0x00 0x06。 【3】单元标识符:单元标识符默认是0x01。 【4】功能码:0x03表示读取的是保持型寄存器存储区。 【5】起始地址:十六进制0x00 0x6B对应十进制为107,表示从107号寄存器开始读取, 这个107对应的Modbus地址为40108。 【6】寄存器数量:0x00 0x02对应十进制的2,表示读取寄存器数量为2。 客户端发送这段报文是想要读取服务器保持型寄存器存储区,Modbus地址 从40108-40109,共2个寄存器的数据值。 服务器响应报文格式如下: 我们再来分析一下这段响应报文: 【1】事务/协议:事务标识符服务器是复制发送报文的,是固定值0x00 0x00。 【2】长度:单元标识符、功能码、数据部分总共是7个字节,因此长度是0x00 0x07。 【3】单元标识符:单元标识符与发送报文一致。 【4】功能码:0x03表示这帧报文响应的是0x03功能码的报文。 【5】字节计数:0x04表示返回的数据总共有4个字节。 【6】字节1至字节4:返回的具体数据分别为0x00、0xC8、0x01、0x2C,这4个字节对 应2个保持型寄存器的值,即对应40108-40109的值。 客户端收到响应报文便获取到了自己要的数据,具体对应关系如下: 0x00 0xC8对应40108的值,16进制的0x00 0xC8对应十进制的200 0x01 0x2C对应40109的值,16进制的0x01 0x2C对应十进制的300 读取输入寄存器,与读取保持型寄存器报文格式几乎一致,唯一的区别就是功能码从0x03变成了0x04,这里就不做过多赘述了。 预置单线圈 我们来分析一下这段发送报文: 预置单线圈接收报文与发送报文一致,原报文返回。 预置单寄存器 预置单寄存器接收报文与发送报文一致,原报文返回。 预置多线圈 我们来分析一下这段发送报文: 预置多输出线圈接收报文是在发送报文基础上除去字节数及写入值。 预置多寄存器 我们来分析一下这段发送报文: 预置多寄存器接收报文是在发送报文基础上除去字节数及写入值。 |
||||||||||||||||||||||||||||||||||||||