跟我一起玩200smart PLC
关于特殊标志位SM0.0的应用续篇
今天在论坛上看到一位资深网友发帖,求助有实体plc的网友测试一个控制程序,具体测试要求及内容参见链接:http://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1387818&b_id=64&b_sid=0&s_id=83&num=18&myreply=1#anch
在此之前,曾经也有关于特殊标志位的应用说明,链接:说说西门子200的SM0.0特殊标志位。
http://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1326902&b_id=3&s_id=1&num=14#anch
问题的发现:
我回家后测试了一下,没有发现什么异样。但在测试过程中发现了一个新的问题,即沿在诸如外部中断子程序应用中的一些问题,需要进一步加深理解,先在这里挖个“坑”试试。
测试器材:200 mart CR60及外部按钮
定义一个外部I0.0的上升沿中断,中断事件号0,开中断,并在主程序中调用中断初始化,在外部中断子程序中编辑需要测试的程序。
程序:
外部中断初始化:

主程序调用:

外部I0.0上升沿中断子程序:

在外部I0.0上升沿中断中编辑2个简单的程序,即一个加上升沿后输出Q0.0,另一个不加上升沿,直接输出Q0.1。
当我按下连接外部按钮I0.0,启动外部I0.0上升沿中断时,加了上升沿的程序没有输出,另一个不加上升沿的输出正常,图示:

我又将Q0.0输出用置位指令锁存这个输出信息,看是否能够锁住这个Q0.0的输出,图示:

测试结果仍然无法锁存,说明在这个外部上升沿中断时被执行时,这个上升沿根本没有起到作用。既然是这样一种特性,我脑子里马上想到用下降沿来测试,看结果如何,图示:

测试结果仍然与上升沿测试的结果一样,无效。
当执行外部上升沿或下降沿中断时,SM0.0 = 1(始终为1),(P或N = ?),输出没有被驱动。另一个程序段,SM0.0 = 1,驱动输出Q0.1,当外部中断执行一个周期后离去,输出的状态被“锁存”在被执行中断时。
为了进一步验证沿在中断中的应用,再编辑一个定时中断,中断事件号10,对应于SMB34。
程序部分省略,仅仅列举了定时中断的中断子程序部分,为验证沿的作用,分别建2个INC_B指令,图示:

没有加沿的INC_B指令能够执行。
既然是这样一种情况,我又想到用实际的外部输入地址替代SM0.0,看2个加1指令是否能够被正常执行?图示:SM0.0 = I0.0

用外部实际输入地址触发加1指令,均有被执行。
重新确认执行程序元素,(SM0.0)ways_On:该位始终接通。 (设置为 1);(P沿)正跳变触点指令(上升沿)允许能量在每次断开到接通转换后流动一个扫描周期。
分析原因:
中断子程序相当于一个特殊的子程序,工作时仅仅有效一个周期。当中断被执行时,由于特殊标志位SM0.0始终为1,沿无法在一个周期内设别到SM0.0的跳变,故无法执行沿后面的指令。而采用其它位信号,如I0.0由于与周期无法在接通瞬间的同步,故能够被设别到存在一个沿的跳变,指令被执行。
逆向思维看问题,如果这个特殊标志位及沿在其它程序段中应用,情况又将如何?图示:

结果与分析的一致,没有被执行指令。
总结:
测试结果说明与在中断子程序中调用沿指令无关(用外部输入I0.0就证明了这个问题),与特殊标志位SM0.0的特性有关。有趣的是我开始在中断子程序中一直用SM0.0作为连接左母线的条件,而这个特殊标志位又具有它的特性一直为ON状态。纵然是第一次调用(中断子程序的特性)也仍然一样。
借于网友提出的“坑论”,一般大坑容易被发现或者容易被规避,而那些坑挖的比较小的还真容易被坑到,不知道是不是这个理?