Modbus RTU 通信指令
Modbus 是工业自动化领域应用最广泛的通信协议之一。PLC在线模拟器 支持 Modbus RTU 主站与 Modbus RTU 从站两种模式,可让模拟器与真实的串口设备(如变频器、仪表、其他 PLC)进行数据交换。
- 主站模式:由模拟器主动发起通信,读取或写入从站设备的数据。
- 从站模式:模拟器作为从站,响应外部主站设备的读写请求。
通信指令位于工具栏 "通信" 类别中,共包含 4 条指令:MBUS_CTRL、MBUS_MSG、MBUS_INIT、MBUS_SLAVE。指令名称与参数语义与西门子 S7-200 SMART 的 Modbus 库保持一致。
MBUS_CTRL —— 主站模式控制
MBUS_CTRL 用于配置串口并初始化主站协议。程序运行中,它必须在 每个扫描周期持续使能(EN 保持接通),主站才可正常工作。
<???>
MBUS_CTRL
EN
Done
Mode
1
Baud
Parity
Port
Timeout
Error
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| Mode | Bool | 模式:必须为 1(启用主站协议)。每次由 0 变 1 时重新初始化串口 |
| Baud | Uint32 | 波特率码(见下方波特率表) |
| Parity | Uint8 | 校验位:0=无校验,1=奇校验,2=偶校验 |
| Port | Uint8 | 串口号:0 或 1 |
| Timeout | Int16 | 通信超时时间(毫秒),范围 1~32767 |
| Done | Bool | 初始化完成标志:本周期执行完成后置 1 |
| Error | Uint8 | 错误码,0 表示无错误 |
波特率码
| 代码 | 波特率 | 代码 | 波特率 |
|---|---|---|---|
| 0 | 2400 | 4 | 38400 |
| 1 | 4800 | 5 | 57600 |
| 2 | 9600 | 6 | 115200 |
| 3 | 19200 |
错误码
| 代码 | 含义 |
|---|---|
| 0 | 无错误 |
| 1 | 校验位参数无效(Parity 只能为 0/1/2) |
| 2 | 波特率参数无效 |
| 3 | 超时参数无效(必须为 1~32767) |
| 4 | 模式参数无效(仅支持 1:RTU 主站) |
MBUS_MSG —— 主站消息指令
MBUS_MSG 用于执行一次读或写操作,与指定的单个从站交换数据。它由 First 输入的上升沿触发,每次只执行一次(不要求持续使能)。
<???>
MBUS_MSG
EN
Done
First
Slave
RW
Addr
Count
Error
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| First | Bool | 通信请求触发:该输入产生上升沿时执行一次通信 |
| Slave | Uint8 | 从站地址:1~247 |
| RW | Uint8 | 0=读取,1=写入 |
| Addr | Uint32 | 从站中的起始寄存器地址 |
| Count | Int16 | 数据个数(读/写的寄存器或线圈数量) |
| DataPtr | V 地址 | 数据在 V 区的起始地址(文本输入,如 &VB500),用于存放读到的数据或待发送的数据 |
| Done | Bool | 通信完成标志 |
| Error | Uint8 | 错误码,0 表示无错误 |
支持的功能码
MBUS_MSG 根据 RW 与操作对象自动选择功能码:
| 功能码 | 说明 | 功能码 | 说明 |
|---|---|---|---|
| 0x01 | 读线圈 | 0x05 | 写单个线圈 |
| 0x02 | 读离散输入 | 0x06 | 写单个寄存器 |
| 0x03 | 读保持寄存器 | 0x0F | 写多个线圈 |
| 0x04 | 读输入寄存器 | 0x10 | 写多个寄存器 |
错误码
| 代码 | 含义 |
|---|---|
| 0 | 无错误 |
| 1 | 奇偶校验错误(含响应 CRC 校验失败) |
| 2 | 未使能(未执行 MBUS_CTRL 或配置未就绪) |
| 3 | 超时,从站无响应(含串口未连接导致的通信失败) |
| 4 | 参数非法(Slave/RW/Addr/Count/DataPtr 越界) |
| 5 | 响应中数据地址非法(从站异常 0x02 等) |
| 6 | 响应中数据值非法(从站异常 0x03 等) |
MBUS_INIT —— 从站初始化
MBUS_INIT 用于将模拟器配置为 Modbus RTU 从站。程序运行中需持续使能(EN 保持接通),从站协议才保持有效。
<???>
MBUS_INIT
EN
Done
Mode
1
Addr
Baud
Parity
Port
Delay
MaxIQ
256
MaxAI
56
MaxHold
1000
Error
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| Mode | Uint8 | 0=关闭从站,1=使能从站 |
| Addr | Uint8 | 从站地址:1~247 |
| Baud | Uint32 | 波特率码(同上文波特率表) |
| Parity | Uint8 | 校验位:0=无校验,1=奇校验,2=偶校验 |
| Port | Uint8 | 串口号:0 或 1(独立逻辑口) |
| Delay | Uint16 | 响应延时(毫秒) |
| MaxIQ | Uint16 | 数字量 I/Q 区范围上限,默认 256 |
| MaxAI | Uint16 | 模拟量输入字数,默认 56 |
| MaxHold | Uint16 | 保持寄存器字数,默认 1000 |
| HoldStart | V 地址 | 保持寄存器在 V 区的起始地址(如 &VB0) |
| Done | Bool | 初始化完成标志 |
| Error | Uint8 | 错误码,0 表示无错误 |
错误码
| 代码 | 含义 |
|---|---|
| 0 | 无错误 |
| 1 | 从站地址非法(0 或大于 247) |
| 2 | 波特率参数非法 |
| 3 | 校验位参数非法(非 0/1/2) |
| 9 | 保持寄存器区非法(HoldStart 非 V 区,或超出 V 区/上限) |
MBUS_SLAVE —— 从站使能
MBUS_SLAVE 用于在每个扫描周期处理主站请求并回送响应。它没有输入参数,只需保持使能(EN 接通)。
<???>
MBUS_SLAVE
EN
Done
Error
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| Done | Bool | 本周期是否处理了主站请求 |
| Error | Uint8 | 错误码,0 表示无错误 |
错误码
| 代码 | 含义 |
|---|---|
| 0 | 无错误 |
| 1 | 未使能(未执行 MBUS_INIT 或配置未就绪) |
| 2 | 非法功能码(从站异常 0x01) |
| 3 | 非法数据地址(从站异常 0x02) |
| 4 | 非法数据值(从站异常 0x03) |
主站与从站配合
一条完整的 Modbus RTU 通信链路至少包含一个主站和一个从站:
主站(PLC在线模拟器) 从站(外部设备)
┌──────────────────┐ ┌──────────────────┐
│ MBUS_CTRL (每周期) │─── 串口 RS-485 ───▶│ 变频器/仪表/PLC │
│ MBUS_MSG (触发) │◀── 响应帧 ─────────│ 等 Modbus 设备 │
└──────────────────┘ └──────────────────┘- 主站程序:
MBUS_CTRL持续使能完成初始化,然后用MBUS_MSG按需读写从站数据。读回的数据存放在指定的 V 区变量中,可直接参与梯形图逻辑。 - 从站程序:
MBUS_INIT完成从站配置,MBUS_SLAVE每周期使能响应。外部主站读写的是模拟器 V 区中对应的数据区域。
使用注意事项
- 持续使能:
MBUS_CTRL、MBUS_INIT、MBUS_SLAVE必须在每个扫描周期保持 EN 接通,否则通信会被中断或重新初始化。 - 边沿触发:
MBUS_MSG由First输入上升沿触发,同一时刻只允许一个MBUS_MSG处于通信中。 - DataPtr 与 HoldStart:使用 V 区起始地址(如
&VB500、&VB0)文本填写,对应变量表中的 V 区变量。 - 波特率与校验位:主站与从站必须配置相同的波特率与校验位,且串口号对应同一物理串口。