Modbus TCP / RTU 协议介绍
协议概述
Modbus 由 Modicon(现 Schneider Electric)于 1979 年发布,是工业自动化领域应用最广泛的通信协议。它采用简单的主从(Master/Slave)请求-响应模型,广泛用于 PLC、RTU、传感器、变频器等设备的互联。
EMS Simulate 基于 pymodbus 库实现 Modbus 协议,支持 Modbus TCP(以太网)与 Modbus RTU(RS-232/RS-485 串口)两种常见变体,可配置为服务端(模拟从站)或客户端(作为主站读取真实设备)。
支持的模式
| 模式 | 物理介质 | 特点 |
|---|---|---|
| Modbus TCP | 以太网 | 基于 TCP 502 端口,帧 = MBAP 头 + PDU,无需校验码 |
| Modbus RTU | RS-232 / RS-485 | 基于串口,帧 = 地址 + 功能码 + 数据 + CRC16 校验,报文间需 ≥3.5 字符间隔 |
Modbus ASCII 变体暂不支持。
数据模型(四类数据区)
Modbus 以"数据区 + 地址"寻址,共四类数据区:
| 数据区 | 地址范围 | 读写属性 | 典型用途 |
|---|---|---|---|
| 线圈(Coil) | 0xxxx | 可读可写 | 开关量输出(继电器等) |
| 离散输入(Discrete Input) | 1xxxx | 只读 | 开关量输入(按钮、限位等) |
| 保持寄存器(Holding Register) | 4xxxx | 可读可写 | 参数、设定值(16 位) |
| 输入寄存器(Input Register) | 3xxxx | 只读 | 采集量(16 位) |
每个寄存器为 16 位,多个寄存器可组合表示 32 位整数或 IEEE 754 浮点数(由解析码决定解释方式)。
支持的功能码
| 功能码 | 名称 | 操作对象 |
|---|---|---|
| 01 | 读线圈 | 线圈 |
| 02 | 读离散输入 | 离散输入 |
| 03 | 读保持寄存器 | 保持寄存器 |
| 04 | 读输入寄存器 | 输入寄存器 |
| 05 | 写单个线圈 | 线圈 |
| 06 | 写单个寄存器 | 保持寄存器 |
| 15 | 写多个线圈 | 线圈 |
| 16 | 写多个寄存器 | 保持寄存器 |
解析码系统
不同厂商设备的寄存器字节序各异,EMS Simulate 内置 27 种解析码,覆盖常见的数据格式:
- 8 位:Byte(无符号 / 有符号);
- 16 位:Short AB(大端)、Short BA(字节交换)、Short CD(小端),各有符号/无符号;
- 32 位整数:Long AB CD(大端)、Long BA DC(大端字交换)、Long DC BA(小端)、Long CD AB(小端字交换),各有符号/无符号;
- 32 位浮点:Float AB CD、Float BA DC、Float CD AB(对应不同字节序);
- 64 位:Int64、Double(大端 / 小端)。
配合乘法系数与加法系数可将原始值换算为工程值:
真实值 = 寄存器原始值 × 乘法系数 + 加法系数角色说明
| 角色 | 行为 |
|---|---|
| 服务端(Server / 从站) | 软件监听端口(TCP)或串口,维护四类数据区内容,响应主站的读/写请求 |
| 客户端(Client / 主站) | 软件主动发起请求,读取或写入真实从站的数据 |
常用术语
| 术语 | 含义 |
|---|---|
| 从站地址(Slave ID / Unit ID) | RTU 中为 1~247,TCP 中为单元标识符 |
| PDU | 协议数据单元(功能码 + 数据) |
| 事务标识符 | TCP 帧中用于匹配请求与响应的编号 |
| 解析码(Decode Code) | 决定寄存器原始值如何解释为数值 |
📄 详细操作见 Modbus 操作指南,报文结构见 Modbus 报文查看。