在三菱 PLC 中,实现 “当寄存器(D)的值变化时,触发位元件(M/X/Y)导通” 的核心思路是:通过比较寄存器的当前值与上一扫描周期的值,判断是否发生变化,若变化则置位位元件。以下是具体编程方法,包含基础逻辑、优化方案及应用示例:
一、核心原理
二、基础编程示例(梯形图)
以 “当 D0 的值变化时,M0 导通一个扫描周期” 为例:
ladder
// 步骤1:将D0的当前值与历史值(D10)比较,不等则M0导通 LD M8000 // 常通信号(每个扫描周期执行) CMP D0 D10 // 比较D0(当前值)与D10(历史值) OUT M0 // 当D0≠D10时,M0=1(仅当前扫描周期) // 步骤2:将D0的当前值存入D10,更新历史值(确保下一周期比较正确) LD M8000 MOV D0 D10 // 扫描周期结束前,用当前值覆盖历史值
逻辑说明:
三、扩展需求:位元件保持导通(直到复位)
若需要 “D0 变化后,位元件保持导通,直到手动复位”,可增加锁存逻辑:
ladder
// 步骤1:比较D0与历史值,变化时触发锁存 LD M8000 CMP D0 D10 OR M1 // 锁存当前状态 OUT M1 // M1=1(保持导通,直到复位) // 步骤2:更新历史值 LD M8000 MOV D0 D10 // 步骤3:手动复位(如X0按下时复位M1) LD X0 RST M1
逻辑说明:
四、优化方案:过滤微小波动(防抖动)
若寄存器值因干扰产生微小波动(如模拟量转换的 ±1 误差),需忽略这类 “无效变化”,可通过 “差值范围判断” 优化:
ladder
// 目标:仅当D0的变化量>±2时,M0才导通 LD M8000 // 计算D0与D10的差值(绝对值) SUB D0 D10 D20 // D20 = D0 - D10 ABS D20 D20 // D20 = |D0 - D10|(取绝对值) // 当差值>2时,M0导通 CMP D20 K2 // 比较D20与2 OUT M0 // D20>2时,M0=1 // 更新历史值 LD M8000 MOV D0 D10
逻辑说明:
五、应用场景示例
场景:当温度寄存器(D50,模拟量转换值)变化时,触发数据上传
ladder
// D50:温度值(0-100对应0-100℃) // M10:触发数据上传信号(脉冲) // X10:上传完成反馈 // 检测D50变化 LD M8000 CMP D50 D51 // D51存储历史温度值 OUT M10 // 变化时M10=1(触发上传) // 更新历史值 LD M8000 MOV D50 D51 // 上传逻辑(示例:通过以太网发送数据) LD M10 // 调用数据上传指令(如TCP_SEND) ...
总结
核心逻辑是 “历史值存储→实时比较→触发动作”,通过CMP指令判断寄存器值是否变化,再根据需求设计位元件的导通方式(脉冲 / 保持)。实际应用中,需注意:
这种方法适用于数据监控、状态变化触发、异常报警等场景,是 PLC 中常用的逻辑设计技巧。

