累加器有时也需要转换数据类型 点击:523 | 回复:1



Patiger123

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 9回
  • 年度积分:0
  • 历史总积分:8
  • 注册:2012年6月23日
发表于:2015-05-17 15:25:03
楼主

             累加器有时也需要转换数据类型

    众所周知,S7-200的累加器可以象V存储器那样使用。它可以存储8位、16位和32位的数据,而且不用进行数据转换就可以变换数据类型,用来保存运算的中间结果特别方便。这里的“不用进行数据转换就可以变换数据类型”是有条件的,即累加器所存数据不能超出它已定义(刚存入)的数据类型的长度。否则,在运行程序时会出错。试验程序如下所述。

    下面这段程序是用模拟电位器POT0的SMB28代替模拟量输入AIW0,以方便在办公室调试程序,目的是SMB28乘125,得到一个0至32000(实际是31875)的整数。

    很明显SMB28送入AC0后,AC0即被定义成字节,用MUL_I指令让AC0再乘125并存入AC0,MUL_I中AC0数据类型已不是字节,而是整数,按“不用进行数据转换就可以变换数据类型”的说法是合理的。编译、下载均成功。

    在实际运行时问题来了,在SMB28等于0、1和2时运行正常,只要大于2,程序就报警,实际上这时的AC0的值已大于一个字节。由此可见上图中三个AC0的数据类型都是字节,只是在MUL_I指令中把它作为名义上的整数类型,一旦超出字节范围就会出错。

下面程序是用SMB28乘5,更能看出问题所在。当SMB28=48时,运行正常。

当SMB28=54时,AC0=270>255,运行出错。

为了解决问题,在原程序中插入B_I指令,把字节AC0转换成整数AC0,即可正常运行。

当然,如果用VW10替换原程序的AC0作为中间变量,程序就能正常运行。也更简单,程序如下:

此文是本人在做PID控制中总结出来的关于累加器应用的一个注意事项。希望大家参与讨论。




锤子精神

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 262回
  • 年度积分:13
  • 历史总积分:486
  • 注册:2019年4月10日
发表于:2021-02-17 15:05:14
1楼

感谢楼主分享谢谢楼主分享


热门招聘
相关主题

官方公众号

智造工程师