故事是这样的。。。
为了偷懒,我做了个限制参数设定范围的子程序。总共涉及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么?那不是要跟我的掉电保持和程序块争地方?
呃。。。都看不懂?不会吧。。。都在装谦虚?
简单说,就是我做了个子程序,然后在主程序当中每个扫描周期里反复调用20多遍,然后程序就跑飞了。。。
具体原因分析,可能是子程序太短,L区的地址来不及释放和再赋值。因为都是用的同样的那几个LD地址。CPU不停的把不同的数值写入一个地址,读取这个地址,运算,再写入新值,再读取,再运算,再写入,再读取。。。
我的扫描周期大概4~5mS,具体到那个问题网络估计1mS都不到,因为后面还有PID运算之类的内容,同样的活在不到1mS的时间内连着干了20多遍,于是就把CPU给惹毛了,还冲我咆哮。。。话说我内个冤
那段程序已经去见马克思了。。。我重写了一段如下
LD SM0.0
LPS
AR> #地址:LD8, #上限:LD0
MOVR #上限:LD0, #地址:LD8
AENO
= #超限:L12.0
LPP
AR< #地址:LD8, #下限:LD4
MOVR #下限:LD4, #地址:LD8
AENO
= #超限:L12.0
至于理解不充分。。。这就这么两行代码3个地址,很难理解么?类似的子程序我不是第一次用,以前都用得蛮好的,不过以前都是一两个跑一下,一点问题都没有。这次多了点,而且还都放在一起,可能问题就在这里。
如果是代码的问题,那么我把同样的代码拉出来放主程序里就没事,也排了一大排。一个参数就是2行指令。二十多个,就有四五十行。唯一的区别,是在主程序里,不涉及L区地址。
汗,我可没有精力去帮西门大官人找BUG,既然叫我遇到了,那以后就注意就好了,等有时间了再试试你说的放到二十多个网络的办法哈。。。
不过貌似我好像有点孤僻动作似的,能放一个网络绝不分两个网络,大家说说这个习惯是好还是不好?