三菱 FX3U/FX5U 处理信号排队问题:核心方案 + 实操案例
三菱 FX3U/FX5U 面对的 “信号排队”,本质是多个输入信号(如按钮、传感器、通信指令)同时触发时,PLC 需按预设优先级 / 时序依次响应,避免指令冲突、数据错乱或动作遗漏。常见场景包括:多按钮触发同一执行机构、多通信请求交互、多工位信号抢占等。以下结合 FX3U/FX5U 的硬件特性和编程逻辑,给出分场景的解决方案。
一、先明确 “信号排队” 的核心分类
| 信号类型 | 典型场景 | 核心痛点 |
|---|---|---|
| 数字量输入信号(按钮 / 传感器) | 多按钮触发同一气缸动作、多工位急停 / 启动信号冲突 | 同时触发导致动作混乱、信号丢失 |
| 通信信号(Modbus/MC 协议) | 多从站同时向 FX3U/5U 发送读写请求、上位机 + 触摸屏同时通信 | 通信超时、数据交互错乱 |
| 脉冲 / 运动控制信号 | 多轴脉冲指令同时下发、手动 / 自动脉冲指令冲突 | 脉冲丢失、轴运动失控 |
| 内部逻辑信号(M 寄存器) | 多条件触发同一标志位、多程序段置位同一寄存器 | 逻辑互锁失效、状态判断错误 |
二、通用核心原则:优先级 + 队列缓存 + 互锁
无论哪种信号,处理排队的核心逻辑是:
三、分场景解决方案(FX3U/FX5U 适配)
场景 1:数字量输入信号排队(最常用)
适用场景:多按钮 / 传感器触发同一执行机构(如 3 个工位按钮触发同一机械手)
解决方案:优先级编码 + 移位寄存器队列(FX3U/FX5U 通用)
步骤 1:定义优先级(示例:工位 1>工位 2>工位 3)
| 信号 | 输入点 | 优先级 | 触发位 |
|---|---|---|---|
| 工位 1 请求 | X0 | 最高 | M0 |
| 工位 2 请求 | X1 | 中 | M1 |
| 工位 3 请求 | X2 | 最低 | M2 |
| 处理完成信号 | X3 | - | M10 |
步骤 2:编程逻辑(梯形图核心思路,FX3U/FX5U 均适配)
plaintext
// 1. 信号缓存:将触发信号写入队列(用D100作为队列寄存器,bit0=工位1,bit1=工位2,bit2=工位3) LD X0 OR M0 ANI M100 // 处理中互锁 OUT M0 MOV K1 D100 // 工位1请求写入队列(bit0置1) LD X1 OR M1 ANI M100 OUT M1 MOV K2 D100 // 工位2请求写入队列(bit1置1) LD X2 OR M2 ANI M100 OUT M2 MOV K4 D100 // 工位3请求写入队列(bit2置1) // 2. 优先级处理:先处理工位1,完成后处理工位2,再工位3 LD M0 ANI M100 OUT M100 // 置位处理中标志 // 执行工位1动作(如Y0=1控制机械手) OUT Y0 LD X3 // 工位1动作完成 OUT M10 RST M0 RST M100 MOV K0 D100 // 清除队列 LD M1 ANI M0 ANI M100 OUT M100 OUT Y1 // 工位2动作 LD X3 OUT M10 RST M1 RST M100 MOV K0 D100 LD M2 ANI M0 ANI M1 ANI M100 OUT M100 OUT Y2 // 工位3动作 LD X3 OUT M10 RST M2 RST M100 MOV K0 D100
优化方案(FX5U 专属):使用 ST 语言 + 队列指令
FX5U 支持结构化文本(ST),可直接调用FIFO/LIFO队列指令,更高效处理多信号排队:
st
// 定义FIFO队列(D200=队列首地址,D199=队列长度,最大缓存10个信号) IF X0 THEN // 工位1请求 FIFO_WR(D200, D199, 1); // 优先级1写入队列 END_IF; IF X1 THEN FIFO_WR(D200, D199, 2); // 优先级2写入队列 END_IF; IF X2 THEN FIFO_WR(D200, D199, 3); // 优先级3写入队列 END_IF; // 读取队列并处理 IF D199 > 0 AND M100=0 THEN // 队列非空且未处理中 M100 := 1; FIFO_RD(D200, D199, D300); // 读取队列首信号到D300 CASE D300 OF 1: Y0 := 1; // 处理工位1 2: Y1 := 1; // 处理工位2 3: Y2 := 1; // 处理工位3 END_CASE; END_IF; // 处理完成清除 IF X3 THEN Y0 := 0; Y1 := 0; Y2 := 0; M100 := 0; END_IF;
场景 2:通信信号排队(Modbus/MC 协议)
适用场景:FX3U/FX5U 作为主站,同时向多个从站(变频器 / 仪表)发送读写请求;或多上位机同时访问 PLC
解决方案:分时轮询 + 通信标志位互锁
核心思路:
编程示例(FX5U Modbus RTU 轮询,RS-485 通信):
plaintext
// 定义通信标志位:M200=轮询中,M201=从站1完成,M202=从站2完成,M203=从站3完成 LD M8002 // 上电初始化 MOV K0 D100 // 轮询计数器清零 // 轮询逻辑 LD M8013 // 1秒时钟脉冲 ANI M20 OUT M200 INC D100 MOV D100 D101 MOD D101 K3 D101 // 取模,轮询3个从站 // 从站1(地址1):读取D1000 LD D101=0 MOV K1 D200 // 从站地址 MOV K3 D201 // 读指令 MOV K1000 D202 // 从站寄存器 MOV K2 D203 // 读取字数 SET M300 // 触发Modbus读指令 LD M301 // 读完成标志 OUT M201 RST M300 RST M200 // 从站2(地址2):写入D2000 LD D101=1 MOV K2 D200 MOV K16 D201 // 写指令 MOV K2000 D202 MOV K123 D204 // 写入值 SET M310 // 触发Modbus写指令 LD M311 // 写完成标志 OUT M202 RST M310 RST M200 // 从站3(地址3):读取D3000 LD D101=2 MOV K3 D200 MOV K3 D201 MOV K3000 D202 MOV K2 D203 SET M320 // 触发Modbus读指令 LD M321 // 读完成标志 OUT M203 RST M320 RST M200
FX3U 适配注意:
FX3U 需通过RS指令实现 Modbus,需增加 “通信超时保护”(用 T 定时器),避免某一从站通信失败导致整个轮询卡死:
plaintext
LD M300 // 触发从站1通信 TON T0 K50 // 5秒超时 LD T0 RST M300 RST M200 MOV K1 D100 // 跳过该从站,轮询下一个
场景 3:脉冲 / 运动控制信号排队
适用场景:FX3U/FX5U 控制步进 / 伺服,手动脉冲指令(手轮)与自动脉冲指令(程序)同时触发;多轴脉冲指令冲突
解决方案:优先级互锁 + 脉冲指令排队缓存
核心逻辑:
示例(FX5U 2 轴脉冲排队):
plaintext
// 手动指令(X10触发,优先级高) LD X10 ANI M400 // 自动指令互 OUT M401 // 手动标志位 MOV K5000 D400 // 手动目标位置 MOV K1000 D401 // 手动速度 SET M500 // 触发手动脉冲 // 自动指令(X11触发,优先级低) LD X11 ANI M401 // 手动标志位互锁 OUT M400 MOV K10000 D410 // 自动目标位置 MOV K2000 D411 // 自动速度 SET M510 // 触发自动脉冲 // 脉冲执行逻辑 LD M500 DRVI D400 D401 Y0 Y1 // 相对定位 LD M8029 // 脉冲完成标志 RST M500 RST M401 SET M510 // 触发自动指令 LD M510 DRVI D410 D411 Y0 Y1 LD M8029 RST M510 RST M400
FX3U 适配注意:
FX3U 无专用运动控制指令的完成标志扩展,需用PLSY指令配合计数器判断脉冲完成:
plaintext
LD M500 PLSY D401 D400 Y0 // 脉冲输出 CTU C0 D400 // 计数脉冲数 LD C0=D400 RST M500 RST C0
四、FX3U vs FX5U:信号排队处理的差异优化
| 功能 / 指令 | FX3U | FX5U | 优化建议 |
|---|---|---|---|
| 队列处理 | 仅能通过移位寄存器 / 基本指令 | 支持 FIFO/LIFO 队列指令、ST 语言 | FX5U 优先用结构化指令,FX3U 用移位寄存器 |
| 通信轮询 | 需手动编写轮询逻辑 + 超时保护 | 支持 MC 协议高速通信、自动轮询 | FX5U 可启用 “通信超时自动跳过” 参数 |
| 运动控制排队 | 无专用完成标志,需计数器辅助 | 内置 M8029 完成标志、运动中断 | FX5U 用运动中断触发下一个脉冲指令 |
| 多任务处理 | 仅支持主程序 + 子程序,无多任务 | 支持多程序段并行 + 任务优先级 | FX5U 给高优先级信号分配独立任务 |
五、常见问题与解决
| 问题现象 | 原因分析 | 解决方法 |
|---|---|---|
| 信号排队时丢失 | 无缓存寄存器,仅靠位触发 | 增加 D 寄存器缓存队列,用 FIFO 指令保存所有触发信号 |
| 处理顺序混乱 | 优先级未明确,互锁失效 | 重新定义优先级,增加 “处理中” 标志位(如 M100),禁止并行触发 |
| 通信轮询卡死 | 某从站通信超时,无保护 | 增加 T 定时器超时复位,跳过故障从站 |
| 脉冲指令冲突 | 无优先级互锁,同时触发 | 用标志位(如 M400/M401)互锁,确保手动 / 自动指令不同时执行 |
六、总结
FX3U/FX5U 处理信号排队的核心是:
FX3U 需依赖基础指令手动构建队列,FX5U 可利用结构化指令(FIFO/LIFO)、ST 语言和多任务特性简化逻辑,优先保证 “高优先级信号优先处理、无信号丢失、处理完成后释放资源” 三大原则即可解决绝大多数排队问题。


