# OPM **Repository Path**: jacket_zhong/opm ## Basic Information - **Project Name**: OPM - **Description**: No description available - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-10 - **Last Updated**: 2026-02-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README Modbus RTU/Modbus TCP协议详细、区别 一、什么是Modbus-RTU ? MODBUS RTU协议是一种开放的、主要基于串行链路(RS232C或RS485)的通信协议,也有在TCP或者UDP方式下使用这种标准通信协议的,名称中的RTU是英文 “Remote Terminal Unit"的缩写,即"远程终端设备”,支持多种电气接口,如RS-232、RS-485等,还可以在各种介质上传送,如双绞线、光纤、无线等,目前,支持Modbus的厂家超过400家,支持Modbus的产品超过600种。 在Modbus RTU协议里,通讯的双方被称为“主站”和“从站”。主站会向从站发出查询或者写入命令,然后从站被动接收命令然后根据功能码和寄存器号反馈相应的数据结果或者执行写入命令,一个485网络里理论上最多可以挂254个从站,实际应用中考虑线路损耗和干扰一般不会超过100个,否则建议用以太网通讯。 Modbus中常用的功能码有8个,可以分为位操作和字操作两类: 读操作: 01(读线圈寄存器 位操作) 02(读离散量输入寄存器 位操作) 03(读保持寄存器 字操作) 04(读输入寄存器 字操作) 写操作: 05(写单个线圈寄存器 位操作) 06(写单个保持寄存器 字操作) 0F(写多个线圈寄存器 位操作) 10(写多个保持寄存器 字操作) Modbus-RTU报文示例 1 读取线圈 0x 请求报文: Tx:01 01 00 00 00 0A BC 0D 01:从站地址 01:功能码 00 00:读取线圈的起始地址0x0000 00 0A:线圈的个数,为10个 BC 0D:CRC校验值 正常响应报文: Rx:01 01 02 03 01 78 CC 01:从站地址 01:功能码 02:后面线圈数据字节数,线圈为单个比特量,其数据仍按字节进行传输。如果数量不是8的倍数,则用零填充数据字节中剩余的位。 03 01:10个线圈的值,第一个字节03(2#0000 0011)对应线圈0x0000~0x0007的值,0x0000=1、0x0001=1,其他为0,第二个字节01(2#0000 0001)对应线圈0x0008~0x0009的值,0x0008=1 78 CC:CRC校验值 异常响应报文: Rx:01 81 02 C1 91 01:从站地址 81:异常响应功能码(为请求功能码+0x80) 02:异常码,表示非法的数据地址 C1 91:CRC校验值 2 写入单个线圈 0x 请求报文: Tx:01 05 00 00 FF 00 8C 3A 01:从站地址 05:功能码 00 00:线圈的地址0x0000 FF 00:置位线圈写入FF,复位线圈写入00 8C 3A:CRC校验值 正常响应报文: Rx:01 05 00 00 FF 00 8C 3A 从站返回相同报文 异常响应报文: Rx:01 85 02 C3 51 01:从站地址 85:异常响应功能码 02:异常码,表示非法的数据地址 C3 51:CRC校验值 3 写入多个线圈 0x 请求报文: Tx:01 0F 00 00 00 0A 02 41 02 54 A9 01:从站地址 0F:功能码 00 00:线圈的起始地址0x0000 00 0A:写入线圈的个数,为10个 02:后面写入的值的字节数 41 02:写入的值,第一个字节41(2#0100 0001)对应线圈0x0000~0x0007的值,0x0000=1、0x0006=1,其他为0,第二个字节02(2#0000 0010)对应线圈0x0008~0x0009的值,0x0009=1 54 A9:CRC校验值 正常响应报文: Rx:01 0F 00 00 00 0A D5 CC 01:从站地址 0F:功能码 00 00:线圈的起始地址 00 0A:写入线圈的个数,为10个 D5 CC:CRC校验值 异常响应报文: Rx:01 8F 02 C5 F1 01:从站地址 8F:异常响应功能码 02:异常码,表示非法的数据地址 C5 F1:CRC校验值 4 读输入离散量 1x 请求报文: Tx:01 02 00 00 00 05 B8 09 01:从站地址 02:功能码 00 00:输入离散量的起始地址1x0000 00 05:读取输入离散量的个数,为5个 B8 09:CRC校验值 正常响应报文: Rx:01 02 01 05 61 8B 01:从站地址 02:功能码 01:后面输入离散量数据字节数,输入离散量为单个比特量,其数据仍按字节进行传输。如果数量不是8的倍数,则用零填充数据字节中剩余的位。 05:5个输入离散量数据的值,对应1x0000~1x0004的值,0x0000=1、0x0002=1,其他为0 61 8B:CRC校验值 异常响应报文: Rx:01 82 02 C1 61 01:从站地址 82:异常响应功能码 02:异常码,表示非法的数据地址 C1 61:CRC校验值 5 读输入寄存器 3x 请求报文: Tx:01 04 00 00 00 02 71 CB 01:从站地址 04:功能码 00 00:输入寄存器的起始地址3x0000 00 02:读取输入寄存器的个数,为2个 71 CB:CRC校验值 正常响应报文: Rx:01 04 04 00 7B 01 C8 8B 9B 01:从站地址 04:功能码 04:后面输入寄存器数据字节数,一个输入寄存器为2个字节 00 7B 01 C8:2个输入寄存器数据的值,对应3x0000~3x0001的值,0x0000=16#007B、0x0001=16#01C8 8B 9B:CRC校验值 异常响应报文: Rx:01 84 02 C2 C1 01:从站地址 84:异常响应功能码 02:异常码,表示非法的数据地址 C2 C1:CRC校验值 6 读保持寄存器 4x 请求报文: Tx:01 03 00 02 00 02 65 CB 01:从站地址 03:功能码 00 02:保持寄存器的起始地址4x0002 00 02:读取保持寄存器的个数,为2个 65 CB:CRC校验值 正常响应报文: Rx:01 03 04 00 6F 00 DE 4A 76 01:从站地址 03:功能码 04:后面保持寄存器数据字节数,一个保持寄存器为2个字节 00 6F 00 DE:2个保持寄存器数据的值,对应4x0002~4x0003的值,4x0002=16#006F、4x0003=16#00DE 4A 76:CRC校验值 异常响应报文: Rx:01 83 02 C0 F1 01:从站地址 83:异常响应功能码 02:异常码,表示非法的数据地址 C0 F1:CRC校验值 7 写入单个保持寄存器 4x 请求报文: Tx:01 06 00 00 FF 00 8C 3A 01:从站地址 06:功能码 00 00:保持寄存器的地址0x0000 00 7B:写入的值,2个字节 C9 E9:CRC校验值 正常响应报文: Rx:01 06 00 00 FF 00 8C 3A 从站返回相同报文 异常响应报文: Rx:01 86 02 C3 A1 01:从站地址 86:异常响应功能码 02:异常码,表示非法的数据地址 C3 A1:CRC校验值 8 写入多个保持寄存器 4x 请求报文: Tx:01 10 03 E7 00 02 04 00 7B 01 C8 D8 EE 01:从站地址 10:功能码 03 E7:多个保持寄存器的起始地址4x0999 00 02:写入保持寄存器的个数,为2个 04:后面写入的值的字节数 00 7B 01 C8:写入的值,第一个保持寄存器4x0999写入16#007B,第二个保持寄存器4x1000写入16#01C8 D8 EE:CRC校验值 正常响应报文: Rx:01 10 03 E7 00 02 F1 BB 01:从站地址 10:功能码 03 E7:多个保持寄存器的起始地址 00 02:写入保持寄存器的个数,为2个 F1 BB:CRC校验值 异常响应报文: Rx:01 90 02 CD C1 01:从站地址 90:异常响应功能码 02:异常码,表示非法的数据地址 CD C1:CRC校验值 9 异常响应中其他常见的异常码: 01:非法的功能码,表示接收到的功能码从机不支持 03:非法的数据值,表示接收到主机发送的数据值超出从机相应地址的数据范围 04:读取数据失败,表示从机执行请求的操作时,产生不可重新获得的差错 三、什么是Modbus-TCP? Modbus消息结构是一种应用协议,定义了独立于数据传输介质的数据组织和解释规则。TCP/IP是指传输控制协议和互联网协议,为Modbus TCP/IP消息提供传输介质。 从本质上讲,Modbus TCP/IP消息只是封装在以太网TCP/IP封装器中的Modbus通信。Modbus-TCP将标准Modbus数据帧嵌入到TCP帧中,没有Modbus校验。为什么不需要Modbus校验呢?因为相较于UDP协议,TCP/IP是一种可靠传输,其使用标准以太网TCP/IP链路层校验和方法来保证数据的完整性。 通信方式 Modbus设备可分为主站(poll)和从站(slave)。主站只有一个,从站有多个,主站向各从站发送请求帧,从站给予响应。在使用TCP通信时,主站为client端,主动建立连接;从站为server端,等待连接。 主站请求:功能码+数据 从站正常响应:请求功能码+响应数据 从站异常响应:异常功能码+异常码,其中异常功能码即将请求功能码的最高有效位置1,异常码指示差错类型 需要超时管理机制,避免无期限的等待可能不出现的应答 IANA(Internet Assigned Numbers Authority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,这是目前在仪表与自动化行业中唯一分配到的端口号。 通信过程 connect 建立TCP连接 准备Modbus报文 使用send命令发送报文 在同一连接下等待应答 使用recv命令读取报文,完成一次数据交换 通信任务结束时,关闭TCP连接 TCP与RTU两种协议的区别 对于Modbus-TCP在数据模型和功能调用上都是相同的,只有封装方式是不同的。Modbus TCP协议是一个运行在TCP/IP网络连接中的一种协议,与传统的串口方式相比,MODBUS TCP插入一个标准的MODBUS报文头到 TCP报文中,不再带有差错校验和地址域,如图1所示。MBAP为报文头,长度为7字节,组成如下表1。 表1 内容 解释 事务处理标识(2Bytes) 可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文 协议标识符(2Bytes) 00 00表示ModbusTCP协议 长度(2Bytes) 表示接下来的数据长度,单位为字节。 单元标识符(1Byte) 可以理解为设备地址。 PDU帧结构由:功能码+数据组成。功能码占一个1字节,后面的数据长度根据功能码的不同,长度也不同。 Modbus-TCP报文示例 请求读取多个输入寄存器: 数据请求:请求读取输入寄存器, MBAP报文头: 事务处理标识:0x9796 协议标识符:0x0000 长度:0x0006 单元标识符(终端的一种标识):0x04 PDU(协议数据单元): 功能码:0x04(读取输入寄存器) 数据:0x007D(寄存器起始地址) 0x007D(要读取的寄存器数量) 数据返回 请求写入多个保持寄存器: 数据请求:请求写入多个保持寄存器 MBAP报文头: 事务处理标识:0x9779 协议标识符:0x0000 长度:0x0009 单元标识符(终端的一种标识):0x04 PDU(协议数据单元): 功能码:0x10(写入保持寄存器) 数据:0x0000(寄存器起始地址) 0x0001(要读取的寄存器数量) 0x02(写入的字节个数) 0x0001(写入的寄存器值) ———————————————— 版权声明:本文为CSDN博主「Aughts」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_48224845/article/details/143091349