主题
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要点:
- 用一个计数器 + 一个自复位定时器做状态机,一次只发一路。绝不能同一周期发多条
EXTR,串口会撞车。 - 每路的源地址(D0 / D4 / D8…)要错开,间隔留够——一个浮点占 2 个连续 D,只留 1 个会覆盖。
LD=比较的是 16 位整数,注意 D99 别溢出。- 定时器时基:
T0-T199是 100ms(K3= 0.3 秒),不是 3 秒。
验证方法:
- 看 D0 / D4 / D8 是不是在轮流刷新(不是只有一个在动)。
- 把某一路从站断电,看其它路是否还在正常刷新——合格的轮询状态机不能因为一路挂了就整个停摆。
注意事项:
- 省掉计数器、每个周期都发
EXTR→ 串口撞车,数据乱跳。 - 只靠"读到了就存"不判超时 → 从站掉线后那一格数据一直停在旧值,看起来一切正常。
- 路数增加时,把
K3(第 3 路比较值)和对应的EXTR行按同样格式往下加即可;RST的比较值要等于"路数 - 1"。