Modbus 通讯入门
Modbus 是工业自动化领域应用最广泛的通信协议之一。PLC在线模拟器 支持 Modbus RTU 主站与 Modbus RTU 从站两种模式,可让模拟器与真实的串口设备(变频器、仪表、其他 PLC)进行数据交换。本教程带你从协议基础开始,完成一次真实的主站读写。
Modbus 基础概念
协议帧
Modbus RTU 报文以二进制帧传输,结构如下:
┌──────┬────────┬───────┬───────┐
│地址 │功能码 │数据 │ CRC校验 │
│1字节 │1字节 │N字节 │2字节 │
└──────┴────────┴───────┴───────┘- 地址:从站地址(1~247);
- 功能码:决定操作类型(读线圈、写寄存器等);
- 数据:寄存器地址、数量与数据内容;
- CRC:16 位循环冗余校验,保证帧数据完整。
功能码与数据区
| 数据区 | 功能码 | 说明 |
|---|---|---|
| 线圈 Coil | 0x01 读 / 0x05 写单个 / 0x0F 写多个 | 位输出(如接触器、指示灯) |
| 离散输入 Discrete | 0x02 读 | 位输入(如限位开关) |
| 保持寄存器 Holding | 0x03 读 / 0x06 写单个 / 0x10 写多个 | 可读写的 16 位寄存器 |
| 输入寄存器 Input | 0x04 读 | 只读 16 位寄存器(如传感器值) |
主站与从站
- 主站:主动发起读写请求,一个总线上只能有一个主站;
- 从站:响应请求,地址唯一,可同时存在多个。
主站示例:读取从站保持寄存器
第一步:创建变量
| 变量名 | 类型 | 说明 |
|---|---|---|
M0.0 | Bool | 主站初始化完成标志(Done) |
M0.1 | Bool | 通信完成标志 |
M0.2 | Bool | 1 秒触发脉冲(用 SM0.5 上升沿) |
MB0 | Uint8 | 初始化错误码 |
MB1 | Uint8 | 通信错误码 |
VB100 | Uint8 | 接收数据区起始(DataPtr = &VB100) |
第二步:梯形图
网络 1:MBUS_CTRL 主站初始化(必须每个周期保持使能)
SM0.0
--| |------------------------------[MBUS_CTRL]-- M0.0(Done)
Mode = 1 MB0(Error)
Baud = 2(9600)
Parity = 0(无校验)
Port = 0
Timeout = 1000网络 2:定时触发读取(每 1 秒读一次)
用 SM0.5(1 秒时钟)的上升沿触发 MBUS_MSG,避免连续发送:
SM0.5
--|P|------------------------------[MBUS_MSG]-- M0.1(Done)
First = SM0.5(上升沿触发)
Slave = 1
RW = 0(读取)
Addr = 0
Count = 3
DataPtr = &VB100
MB1(Error)读取成功后,从站地址 1 的 3 个保持寄存器数据会依次写入 VB100、VB101、VB102,可直接参与梯形图逻辑。
多个
MBUS_MSG不能同时执行;如需轮询多个从站,可在完成标志M0.1的上升沿触发下一条消息,串行执行。
从站示例:模拟器作为从站
网络 1:MBUS_INIT 从站初始化(持续使能)
SM0.0
--| |------------------------------[MBUS_INIT]-- M0.3(Done)
Mode = 1
Addr = 2(本机从站地址)
Baud = 2(9600)
Parity = 0
Port = 0
Delay = 0
MaxIQ = 256
MaxAI = 56
MaxHold = 1000
HoldStart = &VB0
MB2(Error)网络 2:MBUS_SLAVE 每周期响应(持续使能)
SM0.0
--| |------------------------------[MBUS_SLAVE]-- M0.4(Done)
MB3(Error)外部主站即可通过 Modbus 读写模拟器的 V 区(保持寄存器映射自 &VB0 起)与 I/Q 区(数字量)。
串口联调
主站与从站之间通过串口(如 USB 转 RS485 网关)连接,联调时注意:
- 波特率与校验位必须一致(主站与从站配置相同);
- 主站使用
MBUS_CTRL,从站使用MBUS_INIT,二者不能在同一台设备上混用同一逻辑口; - 串口号对应同一物理串口(Port 0 / Port 1 为两个独立逻辑口);
- 通信失败时根据
Error错误码排查:
| 错误码 | 含义 |
|---|---|
| 0 | 无错误 |
| 1 | 奇偶校验错误(含 CRC 校验失败) |
| 2 | 未使能(未执行 MBUS_CTRL 或配置未就绪) |
| 3 | 超时,从站无响应(含串口未连接) |
| 4 | 参数非法(地址/寄存器越界) |
进阶阅读
- 指令参数的完整说明见 Modbus RTU 通信指令;
- 想让 3D 场景参与 Modbus 数据交换?见 PLC 与场景 ModbusRTU 通讯;
- 需要在 iScene 中直接连接串口设备,可使用其内置的 ModbusRTU 主站/从站通讯组件。