三菱 L 系列 PLC:子程序里 D 寄存器值和主程序不一样 ——99% 是这个原因:局部变量(L 区)/ 软元件复用 / 刷新机制
一、最核心、最常见原因(L 系列专用)
子程序用了【局部软元件】,主程序用了【全局软元件】
三菱 L 系列、Q 系列、iQ-R 系列 子程序(子程序调用) 有一个关键特性:
子程序可以使用【局部数据寄存器】(LDxxx)
主程序用:D0、D10、D100(全局,所有程序共享)
子程序用:LD0、LD10、LD100(局部,只在子程序内有效)
结果:
名字看起来一样(D/LD),但根本不是同一个地址!
主程序 D0 = 100
子程序 D0(实际是 LD0)= 200→ 完全不一样
二、第二个常见原因:子程序用了【暂存器】被自动覆盖
L 系列在子程序、中断、脉冲指令中会自动使用:
V0~V7
Z0~Z7这些是索引寄存器,如果主程序和子程序都用,会互相覆盖。
表现:
主程序 D100 = 50
进子程序 D100 突然变了→ 因为索引寄存器改变了偏移地址
三、第三个原因:软元件被多重使用(重复赋值)
例如:
主程序:
MOV K10 D0子程序:
MOV K20 D0→ 执行子程序时,D0 被改写,所以值不一样
四、第四个原因:子程序带了【输入输出参数】,值被传递改写
L 系列子程序可以设置:
输入参数
输出参数
调用时,PLC 会自动把主程序的值传到子程序,再传回来。如果你参数映射错了,值就会乱。
五、最快判断方法(10 秒找到问题)
看子程序开头:
如果看到:
plaintext
LOCAL D D0 D100
或
plaintext
局部软元件 LD0~LD100
→ 100% 是局部变量问题!
你看到的 D 寄存器,其实是 LD(局部),不是全局 D!
六、怎么解决?(3 种方法)
方法 1:子程序不要用局部软元件
子程序内全部使用全局 D 寄存器
D0~D9999 全部程序共享
主程序和子程序值一定一样
方法 2:不要混用 D 和 LD
全局 = D
局部 = LD不要名字相同!
方法 3:检查子程序是否自动赋值了 D 寄存器
搜索子程序里的:
plaintext
MOV ... D ADD ... D.


