文档中心
实例教程
Modbus 通讯入门

Modbus 通讯入门

Modbus 是工业自动化领域应用最广泛的通信协议之一。PLC在线模拟器 支持 Modbus RTU 主站与 Modbus RTU 从站两种模式,可让模拟器与真实的串口设备(变频器、仪表、其他 PLC)进行数据交换。本教程带你从协议基础开始,完成一次真实的主站读写。

Modbus 基础概念

协议帧

Modbus RTU 报文以二进制帧传输,结构如下:

┌──────┬────────┬───────┬───────┐
│地址  │功能码   │数据    │ CRC校验 │
│1字节 │1字节   │N字节   │2字节   │
└──────┴────────┴───────┴───────┘
  • 地址:从站地址(1~247);
  • 功能码:决定操作类型(读线圈、写寄存器等);
  • 数据:寄存器地址、数量与数据内容;
  • CRC:16 位循环冗余校验,保证帧数据完整。

功能码与数据区

数据区功能码说明
线圈 Coil0x01 读 / 0x05 写单个 / 0x0F 写多个位输出(如接触器、指示灯)
离散输入 Discrete0x02 读位输入(如限位开关)
保持寄存器 Holding0x03 读 / 0x06 写单个 / 0x10 写多个可读写的 16 位寄存器
输入寄存器 Input0x04 读只读 16 位寄存器(如传感器值)

主站与从站

  • 主站:主动发起读写请求,一个总线上只能有一个主站;
  • 从站:响应请求,地址唯一,可同时存在多个。

主站示例:读取从站保持寄存器

第一步:创建变量

变量名类型说明
M0.0Bool主站初始化完成标志(Done)
M0.1Bool通信完成标志
M0.2Bool1 秒触发脉冲(用 SM0.5 上升沿)
MB0Uint8初始化错误码
MB1Uint8通信错误码
VB100Uint8接收数据区起始(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 网关)连接,联调时注意:

  1. 波特率与校验位必须一致(主站与从站配置相同);
  2. 主站使用 MBUS_CTRL,从站使用 MBUS_INIT,二者不能在同一台设备上混用同一逻辑口;
  3. 串口号对应同一物理串口(Port 0 / Port 1 为两个独立逻辑口);
  4. 通信失败时根据 Error 错误码排查:
错误码含义
0无错误
1奇偶校验错误(含 CRC 校验失败)
2未使能(未执行 MBUS_CTRL 或配置未就绪)
3超时,从站无响应(含串口未连接)
4参数非法(地址/寄存器越界)

进阶阅读