quote:以下是引用n次看你的背影在2012-11-18 02:50:18的发言:quote:以下是引用UWE在2012-11-17 23:38:19的发言:
谢谢大家对本话题的热心参与,如以上各位大侠所言,CPU的扫描时间既包括OB1的全部扫描时间(包括可对主程序中断的当前循环中更高优先级的扫描时间),也包括操作系统的运行时间,如周期扫描的系统控制、过程映像的更新、定时器的更新、通信负荷等。其中,OB1的用户程序执行对于CPU资源占用非常关键。如果程序编得不合理或不优化,有可能造成OB1扫描时间大于扫描周期监视时间(SCMT,如150ms),从而导致CPU停机。
下面给大家提个问题:如果主程序的扫描时间超过设置的SCMT,CPU会调用哪个OB?在此OB中采取什么措施可能防止CPU停机?
刚好有块416的CPU,借这个学习、讨论的机会,写了点测试代码,做了一下实验。
1、如果扫描周期超出扫描监控时间,CPU会调用OB80。如果OB80没有下载到PLC,CPU会进入STOP模式,见实验贴图:

2、如果扫描周期超出扫描监控时间,OB80下载到PLC,没有写任何用户程序,CPU不会进入STOP模式,但CPU上INTF红色指示灯会点亮。见实验贴图:

3、后来在OB80里面写了几句代码,发现只要超出扫描监控时间的事件一直存在,OB80每个扫描周期都会被执行,直到事件消失,执行完OB80里面的程序,才离开中断程序,CPU上INTF红色指示灯会熄灭。


通过实验,了解了操作系统调用OB80的机制。在某些场合,我们也可以在OB80里面用一个定时器来做一个延时功能,如果事件发生,启动定时器,延时到那么就调用SFC46,让CPU进入STOP模式。
已经超时了,为什么还要延时呢?与其如此,何不如直接增加超时时间的设定值,也省去编写这些程序了。
OB80基本不使用,系统如果奔溃到要调用OB80,那还是赶快停了的好。