登录
首页 PLC论坛 台达PLC
回帖 发帖
正文

主题:功能块计算

点击:808 回复:1

为什么把功能块局部符号A、B顺序对换一下就没有数据了?
附件 1.jpg
附件 2.jpg
附件 3.jpg
21-09-27 08:20

引用 369710040 在 2021/9/27 8:20:20 发言【内容省略】

导致该问题的原因是产生了地址重叠,这是程序员的编程错误。
当程序开始运行时,由于A,B变量类型为DWORD,因此系统为其分配了2个Word的地址。
附件 workpicture1.jpg
附件 workpicture2.jpg
系统分别给A变量赋于了D200开始的起始地址,给B变量赋于了D202开始的地址。
由于使用了DMUL指令,因此运算结果占用2个DWORD空间。
附件 workpicture3.jpg
也就是说,第一次DMUL的运算结果存放在D202开始的连续两个DWORD空间,即D202存放了结果的低DWORD数据,D204存放了高DWORD数据,因为结果是8,因此D202=8,D204=0
同样,第二次DMUL的运行结果存放在D200开始的连续两个DWORD空间,D202存放了高DWORD数据,因为结果是4,因此D200=4,D202=0
由此,产生了地址重叠,导致B的输出变为0。
那么,为什么调换了位置就好了呢?
原因在调换了位置后:
第一次DMUL指令的输出结果A占用了D200,D202,由于其数值比较小,因此数值不足以需要用到D202的位置,所以即使发生了地址重叠,D202的数据依旧被B所覆盖,当A的数值足够大时,结果仍然不会正确。
正确的做法是为A,B分配足够的存储空间,由于台达DVP系列并不支持64位的LWORD数据类型,因此你可以为其定义数组,从而使得变量A,B占用64位空间。
附件 workpicture4.jpg
Good Luck~
21-09-28 09:37

工控新闻

更多新闻资讯