累加器有时也需要转换数据类型
众所周知,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控制中总结出来的关于累加器应用的一个注意事项。希望大家参与讨论。