当前位置:首页|资讯

PLC异步工作机制造成的程序书写先后的问题

作者:飞翔的储蓄罐发布时间:2024-09-29


***声明:以下内容仅基于个人在写程序中的理解及有限实验。如有误,欢迎留言***

一、一个TON执行异常现象

    今天写程序的时候发现一个比较有意思的现象,稍微做了些验证,现在把现象和个人理解记录下来。

    首先,下面的这段程序看看有没有问题:

    TON是PLC中的延时指令,在定时器指令中(包括TON和TOR指令,以及基于此的TP指令),数据类型为TON_TIME,让程序实现在延时1S后在Q端发出一个真值。    

    西门子PLC是不能做并行的,所以TON指令仍然是以单线程运行,那么语句书写的前后顺序也就意味着程序执行的前后顺序。按照程序书写顺序执行,程序会不间断循环判断#IEC_Timer_0_Instance.Q是否为真。当计时器达到1S时,#IEC_Timer_0_Instance.Q输出为真,#sum自增1。下个循环计时器IN输入假,#IEC_Timer_0_Instance.Q按TON规则输出假。之后再下一个循环,开始计时,直到1S,再次#IEC_Timer_0_Instance.Q输出为真。但,事实是,#IEC_Timer_0_Instance.Q偶尔为真。调用trace如图(图中把计时改成了10ms):

trace图

二、改变程序的书写先后顺序

    如果在调用TON后面再使用TON.Q做判断条件,则TON.Q一直不会触发。但是,如果将判断条件放到TON前面,那么就可以顺利完成TON.Q的触发。程序就需要写出这样:

三、PLC异步机制

    参考大学时学的单片机,PLC芯片中应该有类似的时钟计数机制,可以让TON指令到1S时,Q端输出为1。因为上面的程序本身就一个IF判断,而且程序做IF的判断的时间很短,大概在1ms以下,所以当Q端为1时,程序绝大多数时间已经完成IF判断,进入下一个周期。只有极少数情况下,程序刚刚好要运行IF判断,于是就有了上图中个别情况在下执行IF中的语句。在下个周期,先运行TON语句,这时IN的值为假,TON.Q再次复位为假。

    为了证明上述机制的真伪,我们又在程序中加入了一个100000次的FOR循环,循环大约用时60ms,让TON.Q输出1的时机绝大多数落在FOR循环时间中。当我们把循环加到最后的时候,#sum自加的语句就根本不会运行了。但当我们把FOR循环加入到TON和IF语句中间的时候,#sum自加就基本正常运行了。这也印证了我们上面所述的机制。把FOR循环加入到TON和IF中间的程序如下:


    



Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1