以下是引用369710040在2021/9/27 8:20:20的发言:
为什么把功能块局部符号A、B顺序对换一下就没有数据了?
导致该问题的原因是产生了地址重叠,这是程序员的编程错误。
当程序开始运行时,由于A,B变量类型为DWORD,因此系统为其分配了2个Word的地址。
系统分别给A变量赋于了D200开始的起始地址,给B变量赋于了D202开始的地址。
由于使用了DMUL指令,因此运算结果占用2个DWORD空间。
也就是说,第一次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位空间。
Good Luck~
+20