Skip to content

B8. 梯形图 Modbus 多路轮询框架 ​

梯形图例程。Modbus 串口指令见 05-06 通信指令;完整 Modbus 例程见 B7。 这一页给的是"一台 PLC 读多个从站"的标准状态机框架,可直接照搬。

适用:全机型 | 难度:★★☆

场景:一台 PLC 通过 RS485 读多块表/多个从站。梯形图做这个比 Lua 合适——周期固定、时序可预期。


完整框架(指令表 IL,可直接下载) ​

梯形图:与下方指令表同一段程序

LD   M8000
MOV  K2004  D8126        ; 选串口 2
EXTR K9600  K0 K81 K2    ; 9600 · 8N1 · RTU 主机
MOV  K2008  D8126        ; 切到「串口 2 · MODBUS RTU · 连续读写」

LDI  T3                  ; 自复位定时:每 0.3 秒走一步
OUT  T3     K3
LDP  T3
INC  D99                 ; D99 = 当前轮询到第几路

LD=  D99 K0
EXTR H103  K0 K4 D0      ; 第 1 路:站号 1,功能码 03,读 4 点 → D0
LD=  D99 K1
EXTR H203  K0 K4 D4      ; 第 2 路:站号 2 → D4
LD=  D99 K2
EXTR H303  K0 K4 D8      ; 第 3 路:站号 3 → D8
LD=  D99 K3
RST  D99                 ; 回到第 1 路
END

要点:

  1. 用一个计数器 + 一个自复位定时器做状态机,一次只发一路。绝不能同一周期发多条 EXTR,串口会撞车。
  2. 每路的源地址(D0 / D4 / D8…)要错开,间隔留够——一个浮点占 2 个连续 D,只留 1 个会覆盖。
  3. LD= 比较的是 16 位整数,注意 D99 别溢出。
  4. 定时器时基:T0-T199 是 100ms(K3 = 0.3 秒),不是 3 秒。

验证方法:

  • 看 D0 / D4 / D8 是不是在轮流刷新(不是只有一个在动)。
  • 把某一路从站断电,看其它路是否还在正常刷新——合格的轮询状态机不能因为一路挂了就整个停摆。

注意事项:

  • 省掉计数器、每个周期都发 EXTR → 串口撞车,数据乱跳。
  • 只靠"读到了就存"不判超时 → 从站掉线后那一格数据一直停在旧值,看起来一切正常。
  • 路数增加时,把 K3(第 3 路比较值)和对应的 EXTR 行按同样格式往下加即可;RST 的比较值要等于"路数 - 1"。

LPPLC 工业物联网云平台 · 软硬件与云平台全栈自研