故事是这样的。。。
为了偷懒,我做了个限制参数设定范围的子程序。总共涉及3个局部变量,上限、下限(这俩是IN型)、地址(这个是IN/OUT型)
因为都是实数类型,所以LD0/LD4/LD8三个双字地址被占用。
很简单的子程序,无非就是地址大于上限,将上限写入地址。地址小于下限,将下限写入地址。当发生任何强制写入的时候,都将激活一个超限位。
然后,我的设定项有点多。。。大概有个二十多条吧(貌似这也不算多吧。。。)
然后就在一个网络中,把这个子程序调用了二十多遍。。。用SM0.0来导入,然后很二的把那个公共超限开关导出到Q0.4上。
开CPU,正发愣的工夫,就听见我的二手PLC跟打铃似的,嗷嗷的!然后手忙脚乱把CPU关了。心疼半天把那个超限放到一个M位上,然后把最前面的SM0.0换成I0.3,先跑跑程序看看排除其他的问题。等其他的问题都搞定了,回过头来再强制I0.3闭合,然后实时监测子程序的进出数据。很快就发现不对劲了,因为我的设定项都在数据块里做过定义了,绝对没有任何一条超出上下限范围的。而且在开始的时候这些数据还是很正常的,但跑了大概有两三秒之后,所有的设定项都逐渐变成了不是上限就是下限。。。而且有的是这个设定值成了另一个设定值的上限或者下限之类的。。。到所有设定项都沦陷时,我才发现我连开机都没开,系统还在待机状态下。。。
这算是打摆子打疯了么?我那个子程序编的确实有点像打摆子。。。
然后一怒之下,把那个上下限子程序删了,然后把所有的计算内容都放到主程序里面来摆桌面上,一个临时地址都不用,我看T娘D谁还犯毛病!还是用SM0.0做导游,然后并上N条通路,后来一个网络都放不下了,分两个网络才放完。。。
开CPU,一次性通过。。。在TD里试验了一下超限设置,发现还不错,一旦确认了超限值,立马写成最大值或者最小值。
感想:
1、以后临时变量能不用就不用吧,出于井绳心理,真心不大敢了。。。反正V区地址多得是,老子以后都用全局地址,看你还跟我来劲?
2、TD组态怎么那么占地方?我不过搞了二十多个设定和显示项,数据块就5K多个字节了,就跟写小说似的。。。我有那么啰嗦么?另外,这数据块都存在哪里啊?是EEPROM么?那不是要跟我的掉电保持和程序块争地方?
对呀,那个出毛病的子程序就是这样的啊,在主程序里的一个网络之内调用了二十多遍。。。。这个程序的逻辑上存在问题么?
哦,你是说应该把超限位放在下面而不是后面,对么?不过这个问题也不至于导致跑飞啊。。。
哦,你说的有道理。超限开关应该是置位,而不是线圈。超限开关嗷嗷叫的原因就在于此了,谢谢你,是我马虎了!
至于说LD8的值前后不一。。。在我看来,程序走得每一步他都有一个唯一的值啊。比如说,输入15,ENTER确认,此时开始就是15了,然后走到大于的比较器那里还是15,于是激活大于比较,然后走完传送就是10了,再给出超限输出,然后下来一行,小于比较的时候,LD8就是10啊,于是没有激活小于比较,然后往下走了,这个过程不是很正常么?
可我在数据块设置的初始值绝对是非常安全的值,既不超上限也不超下限。可走个几秒就都给我甩到上下限去了。。。