您现在所在的是:

台达论坛

回帖:1个,阅读:821 [上一页] [1] [下一页]
* 帖子主题:

功能块计算

50
369710040
文章数:1
年度积分:50
历史总积分:50
品牌积分(台达):0
注册时间:2021/9/25
发站内信
发表于:2021/9/27 8:20:20
#0楼
为什么把功能块局部符号A、B顺序对换一下就没有数据了?
附件 1.jpg

附件 2.jpg

附件 3.jpg



37231
cvlsam 版主
文章数:12401
年度积分:1583
历史总积分:37231
品牌积分(台达):43
注册时间:2001/12/22
发站内信
2018论坛贡献奖
2017论坛贡献奖
2016论坛贡献奖
2015论坛贡献奖
2013论坛贡献奖
2012论坛贡献奖
2011论坛贡献奖
2011国庆活动
2010论坛杰出贡献奖
发表于:2021/9/28 9:37:18
#1楼
以下是引用3697100402021/9/27 8:20:20的发言:
为什么把功能块局部符号A、B顺序对换一下就没有数据了?
附件 1.jpg

附件 2.jpg

附件 3.jpg




导致该问题的原因是产生了地址重叠,这是程序员的编程错误。
当程序开始运行时,由于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~
+20

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

46.8003