作者 | 主题 |
---|---|
万泉河 至圣 经验值: 28579 发帖数: 10817 精华帖: 131 |
楼主 2019-07-06 08:32:48
主题:【万泉河】 细扒一下PLC内部变量TEMP 【万泉河】细扒一下PLC内部变量TEMP
这注定是一篇得不到具体结论的文章。
所以,你如果对PLC的内部TEMP变量非常懂,那你整篇文章都没必要看,没有意义。
而如果你不是很懂,那你不妨和我一样,静下心来,一步步地做一遍,仔细观察、思考其中的规律。了解其性质和使用规则。
关于TEMP变量的使用规则,原本很简单。就是在PLC子程序中,在使用它的时候,必须先写值而后再读值。
程序从上到下,如果发现有先读取值的情况,那十有八九,程序是写错了。有可能暂时运行结果正确,那是因为调用的结构简单,等程序逐渐复杂起来,这里的隐患就会逐渐长成一个脓包,会影响你整个系统的调试。
所以,TEMP变量必须先写后读。这是铁律。
由于PLC的OB1是重复无穷循环调用的,在每一次函数调用过程中要求TEMP先写后读,所以,也不要指望任何信息从上一次调用传给下一次。
但是,尽管是铁律,但总有人要挑战这个铁律,总要不厌其烦地讨价还价,问这个能不能,那个能不能。
其中最多的是问上升沿功能使用中间变量。
而那个标准的先读后写的应用场景。
所以,索性做个程序,来测试下TEMP变量的特性。
程序中,前半部,把TEMP的变量值读出来,送到OUT管脚显示。 后半部,通过累加计算得到数值,赋值给TEMP,同时也送到OUT管脚显示。
程序用S7-200 SMART测试。
建立子程序SBR0
变量表
3个OUT,一个temp,都是WORD数据类型
第一段把temp数值送到O1, 第二段,对MW4进行加1,并送到temp和O2;
OB1中调用这个SBR0多次。 同时为了数值重复稳定,在OB1的开始,对MW4进行了清零。
运行的结果:
可以看到,上一次对TEMP的写操作,在下一次调用中被继承下来了。
然后把程序尽量往复杂里去做: 1,SBR0复制为SBR1,并在OB1中同样调用,并与SBR0的调用逐个间隔。 2,建立SBR2,实现同样数据功能的基础上,加入对SBR0, SBR1的多次调用。 3,OB1中重复调用多次SBR2 4,SBR1中对MW4的操作改为MW6
运行监控,可以看到,得到的数值很快就混乱起来了,规律难以发现了。所以就不截图了。
但可以知道,对于嵌套式的调用, CPU是保存了不同的数据区的。即所谓的堆栈功能。
再做一个程序SBR3,管脚和SBR0一样,但逻辑中不写任何内容。 OB1调用时,把O1管脚送到QW0。
运行中发现,QW0的输出状态动起来了!而且与调用的位置相关。
证明,在S7-200中,函数块的输出区,也是被当作TEMP区管理的。会受到上一个函数的运行结果的影响。
对于TEMP变量区域,打一个比方,就好比你外出穷游住一个低档小旅馆,这个旅店住的客人时多时少,但店家不负责给你打扫卫生。所以你住进来需要先自己打扫。在淡季的时候,你早晨离店,第二天晚上回来再入住,期间没有别的客人来住过,所以近来后还是你走的时候的样子。所以你不需要大扫除,自己继续住也挺舒服。而如果在旺季,你晚上回来的时候,就会发现别人住过了,屋里床上尽是别人折腾过的垃圾。你还能忍受直接睡下吗?
所以,建议刚做PLC行业的新手,如果对TEMP属性不够明确,不妨在程序块的开始时,把所有TEMP变量清下0。语法上一定没有错误,所以对正确的程序没有影响。但你错误的程序可能就会提前暴露出来了。
不必等到旺季。
微信公众号:PLC标准化编程,ZHO6371995
|
lf184452 侠圣 经验值: 2440 发帖数: 467 精华帖: 6 |
2楼 2019-07-07 20:55:11
主题:回复:【万泉河】 细扒一下PLC内部变量TEMP 一些编程的基本概念,搞工控好多不是科班编程出身搞不清楚,建议工控人要想搞好工控编程可以去系统的学习下软件编程,推荐谭浩强的C语言编程先入门,再看一些美系的算法和理念书籍。 |