2015年是我第一次使用博途软件,这一年也是小弟初入工控这行业的起点。未参加工作以前在学校里学的是西门子的step7 v5.5这个编程软件,感觉这个软件相对于同为plc厂家三菱的gx强大的不是一点半点,然而在我初次使用了西门子的tia portal之后,心中的感触用一句话来形容就是“五岳归来不看山,黄山归来不看岳”。好了扯的有点远啦,言归正传,我掉进的这个坑,还要从第一次使用博途软件说起。
那是15年的夏天,甲方上了我公司一套大型的设备,对工期催促的比较急,说是设备晚投入生产一天就会损失好几万,相应的就要扣工程款5%。于是乎为了赶进度,设备还没有安装好,我和我的同事们就匆匆赶赴现场,进行调试前的准备工作。因为这是第一次使用新的软件,出厂之前对柜子进行了尤为仔细的检查,相应的功能也都单独试了一遍。到了现场也如我预料的前期的各个部分的单独测试也都十分的顺利,就在当我信心满满的开始进行设备的顺序启动运行的时候,奇怪的事情发生了。开机后就发生了惊人的连续噼里啪啦的接触器断开吸合的声音,吓的我直接把总闸都拉了,WTF! 刚才发生了什么?脑子里第一个想法就是是不是一个变量给了多个输出点,然后就小心翼翼的把电上了,plc打在线监控程序。不得不说博途的查找交叉使用功能很赞,对于复用的变量可以很快查到其位置,很快都查了一遍,输出的各个逻辑部分都正常的。这个时候我突然想到以前遇到过M点地址重叠的故障,比如说程序里用到两个变量,一个mw0另外一个MW1,这样他们有一部分地址重叠,cpu就会报错。为了防止接触器反复吸合产生巨大的响声,我把输出点全部屏蔽了,然后启动顺序运行,满心希望cpu会报故障然而并没有。这个时候我就有点慌,心里默念冷静点、冷静点,要一步步的查,既然接触器会吸合,那么肯定有输出,于是我从输出开始向前查找。(话说这个时候已经夜里11点了,早下班了,而我还蹲在现场忍受着蚊虫叮咬,还没有吃晚饭)就这样一个个的查找,突然眼前一段程序引起了我的注意,一个temp变量在FB程序中做逻辑输出,输入点没有得电而temp却得电了,什么鬼!脑子里飞速想到了一个念头,这个temp变量在其他地方使用过,这是一个局部的临时变量查找起来倒是很快,结局是不幸的,我没有找到其他地方使用过这个变量。这个时候到了12点,我有点崩溃了,于是又没头没脑的把硬件检查了一遍,再次确定硬件没有毛病(这个时候已经糊涂了)。为了不耽误明天的工作,我拖着疲惫的身体带着对temp变量的疑惑回宾馆了,这个时候已经凌晨一点了。
那个时候刚进入工控这个行业,不知道有西门子论坛西门子客服这好东西,不然我想我会少走一些弯路。第二天一大早我有匆匆赶往现场,在现场一待又是到了夜里10点多,所有的temp变量都被我看了几遍,想从中找出一点规律。但是却令我倍感失望,这哪有什么规律,我这个时候甚至都开始怀疑博途软件有问题了!心里暗骂博途软件太坑了,为什么step7 5.5 FB中输出变量也可以在FB内部做输入,而博途中的却需要用temp来做这中间变量的工作!这个时候突然的灵感让我想到一些什么,于是我把一个FB块中的所有temp变量全部换成static类型的,激动的把改好的块下了进去,好了!这可把我高兴坏,虽然不知道为什么,但我还是把所有的FB块的TEMP变量都改了,编译,下载!开始启动运行,随着设备的轰鸣声,设备终于会按着程序运行了。而这两天的种种苦累也在这一刻得到了最好的回报!
后来设备正常运行后,我才有空仔细的研究关于TEMP变量的问题。“临时变量可以在组织快OB、功能FC和功能块FB中使用,当块执行时它们被用来临时存储数据,一旦块执行结束,堆栈的地址将被重新分配用于其它程序块使用,此地址上的数据不会被清零,直到被其他程序块赋予新值。需要遵循“先赋值,再使用”的原则“。虽然知道了原理,至今仍然喜欢在bit类型的变量使用static,其他类型使用temp变量。虽然我遇到的这个问题是个小问题,也许大神们都不把它当问题,但这里仅为抛砖引玉。在工控行业,才刚刚入门,愿以后的日子里与大家共同进步!最后把官方关于temp变量的分析贴出来给像我一样的小白看——
有常见的几种情况导致程序运行不正常:
1. 某个块程序运行时好时坏,其中某个数值或多个数值偶尔不正常
此问题在于,一定遵循“先赋值,再使用”。否则,TEMP的数值在每个扫描周期开始未有明确的赋值,此地址的数值将是随机的。
2. 多个块使用TEMP,单独使用任意一个都正常,无法一起正常使用
此问题在于,TEMP未能先赋值,再使用;程序块1的TEMP中的数值并没有清零,而是CPU运行机制调用此地址使用或直接分配给程序块2使用,导致这个TEMP地址并不为0,因此程序混乱。
由于内存运行机制并不公开,因此,这一分配过程看起来是随机的。这可能导致,程序多次运行情况下正常,运行一段时间后出现问题。
只要遵循“先赋值,再使用”的原则,就可避免。
3. TEMP无法实现自锁
此问题在于,TEMP数值无法像M点或Q点一样保持上一个周期的数值;TEMP需要在每个扫描周期有一个明确的赋值,即先赋值(写),再使用(读写)
解决方式,FB可使用STAT静态变量;FC可使用M区或全局DB地址。
总结,在使用临时变量TEMP时:
1.不能先使用,再赋值
2.不适用于自锁线圈
3.不适用于上升,下降沿
遇到如上情况,FC块可采用M区或全局DB地址;FB块也可采用自身背景DB的STAT静态变量
在FB,FC中使用第一次调用的某个临时变量,必须先对其赋值即写指令,而不能是读指令。