本人对“逻辑程序最好让OB1每个周期都扫描到”不太明白.不是提倡结构化编程吗?对于不符合当前使用的功能或功能块里面的逻辑程序一定要让OB1扫描到吗?那不是浪费OB1的扫描时间吗?那跟线性化编程又有什么区别呢?那条件调用的功能或功能块岂不是不能在OB1中使用?请各位高手再指教?
会写几个FC/FB就叫结构化编程啦?
结构化编程也不应该影响OB对逻辑程序的扫描,这是完全的不同的概念.
PLC的逻辑控制语言起源于继电器控制逻辑,硬件的逻辑电路在软件上我们可以等效认为是全扫描的,从系统的稳定性考虑,逻辑程序虽然可能分布在不同的子程序中,但其执行应该和线性化程序被全扫描的效果是一致的,其时序也应该是固定的,而条件调用的逻辑程序是无法保证逻辑时序的一致性的,从而容易导致控制性能的不稳定.
批评不错,本人得益非浅.其实条件调用功能或功能块时,当条件不满足时,这个功能或功能块,在CPU扫描到这个位置时,是不会进去扫描这个功能或功能里面的程序的,而是跳过直接扫描下一个语句.那你这个功能或功能块里的所有的变量会保持刚调用之前的状态.除非里面的变量给其他的功能或功能块调用并刷新.所以你的定时器及其它变量是保持在刚调用前的状态的.
我以前曾做过一个试验,就是在S7-300CPU的OB100中编了个语句:
AN Q0.7
=Q0.7
只要是这个Q0.7仅在这使用,Q0.7是保持常亮的.
这说明了在S7-300程序中,一个程序块不被扫描时,其中的变量是保持原态的.
班主意思说得很明白了,尽量少用条件调用功量或功量块.调用条件要做在功能或功量块里面.
说白了就是,让系统扫描到你的每个逻辑条件并及时刷新,不要留下死角让系统扫描不到.
楼主的工艺要求每个时期只有一个步骤在进行,这与CPU的扫描是没有冲突的.因为只要逻辑条件满足的才被执行,不满足的就不被执行.扫描时只不过是每个周期不断地刷新你的逻辑结果而已.并不是说扫描到你的程序就一定执行,是不是?
我说的是逻辑程序尽量作到OB1全扫描,但有些算术运算或数据处理的程序完全可以根据需要来决定是条件调用还是无条件调用,事实上有些程序是必须条件调用的,比如一些数据的移位处理,PID等.
另外,逻辑程序被周期扫描,并不一定要输出执行,而是根据条件是否满足才输出执行的,即使是所谓的顺序控制(或称步进控制),其逻辑也应该是被全扫描更好一些,因为一些安全自锁信号(如某个电机的紧急停车)需要被尽快及时地处理,而不是等到下一个条件满足周期才响应.
当然,事物不是绝对的,对于初学者来说,遵循这条原则是比较有帮助的,而且这也适用与普遍的逻辑控制,当你们不断的进步,对于PLC的逻辑控制有着更深一层的了解和理解后,你们也可以在一些特定的场合尝试编写一些条件调用的逻辑程序,比如大量的逻辑是在中断中处理的,有点类似于计算机语言中所谓基于事件的编程,这样的编程就是看你考虑得是否周全,即使在这时候,OB1周期全扫描的概念对于一些基础的逻辑的处理还是很重要的.