创建例程MainRoutine,并设为主控例程,名为SFC程序下的例程包含了前面在编程步的时候创建的相关的例程,如图17-20所示。
在主例程Main_Routine中,编写调用例程SFC_Test的梯级逻辑,如图17-21所示。这是一个无条件调用,SFC_Test的例程将保持连续扫描。
图17-20 SFC程序下的例程
图17-21 调用例程SFC_Test的梯级逻辑
将项目下载到控制器运行,测试的结果完全正常。但是你有没有疑惑,离开步的时候,这个闪烁的灯会不会有时是熄灭的,有时仍然亮着。你应该没有忘记,当时我们测试Add_On指令就发生了这样的情形,后来我们在扫描模式中编写了梯级条件不成立的处理,解决了这个问题。正是这个梯级条件不成立的逻辑处理帮助我们解决了离开步的善后工作,因为离开步的后扫描令所有的梯级条件不成立,我们得到了想要的梯级条件不成立的结果。如果我们没有在梯级条件不成立的例程中做相应的处理,或者我们希望离开步时具有另外的处理方式,则可以回到Add_On指令进行修改,在后扫描的例程中编写某些处理。
让我们回到Add_On指令的扫描模式的组态页面,增加后扫描例程,如图17-22所示。
图17-22 在扫描模式的组态页面上增加后扫描例程
在Add_On指令的FLASH下面新增加了Postscan例程,作为后扫描的处理,如图17-23所示。
在Postscan例程中编写梯级逻辑,如图17-24所示,复位输出的位状态。当例程经历后扫描时,将关闭这个不确定的状态位。当然这个实例中梯级条件不成立的处理已经做了这个工作,这里似乎是重复了。重要的是,我们关注了后扫描在离开步时指令是如何表现的,一旦我们需要后扫描的不同处理时,就知道在什么地方,以什么样的方式去解决。
图17-23 在Add_On指令的FLASH下面 新增加了Postscan例程
(www.xing528.com)
图17-24 在Postscan例程中编写的梯级逻辑
与此同时,全局的SFC执行组态也要进行相应的设置,在控制器属性的SFC Execution页面设置后扫描为Automatic reset,注意默认设置是Don’t scan,如果此处不改变设置的话,刚才在Add_On指令里面编写的后扫描处理例程是不会起作用的。改变设置后的选择如图17-25所示。
图17-25 改变设置后的选择
现在可以进行完整的调试了,控制器运行,进入初始化步Initial,分配手动操作别名给外部开关进行相应的操作,当步的循环完成3次之后,进入到停止待命,如图17-26所示,可以看到意味着结束的停机待命的Stop_000此时是激活的状态。
图17-26 处于停机待命状态
如果要开始一个新的生产循环,Stop步应该转入SFC_Test的初始化步,这个可以用SFC的复位指令SFR来操作,这条指令应该编写在SFC之外的例程中,并且被持续扫描。在主例程中,我们再添加一个梯级逻辑,如图17-27所示。
用复位操作Reset_SFC_Test位来复位SFC_Test,停机状态位Stop_000.X在Stop激活状态的时候是置位的,复位SFC_Test的同时解锁这个位,作为梯级条件的Stop_000.X被解锁后,令梯级条件消失,这样确保了复位操作只会执行一次。
图17-27 添加复位的梯级逻辑
复位操作Reset_SFC_Test可别名给外部开关点,实现外部手动操作。
刚才,我们用一个简单的例子完成了SFC的全过程,虽然简单,却经历了SFC所有的步骤,即使面对一个真实的应用需求,所实行的也是这样的一个过程,只是在步的Action中有更为复杂的过程处理,或者分支有更多的变化而已。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。