菜鸟:
我这有个别人做的程序,分别是在FC1和FC9中同时输出一个M75.0的线圈,且这两个功能同时被OB1调用,这在我感觉不应该出现这样的情况,但为什么编程软件还允许通过呢?
侠士:
我觉得可能是虽然这样做有时候不符合逻辑,但语法没问题
我们公司的报警通用程序就是每个可能产生报警的程序一个FC,每个报警FC的输出(高报警)都是一个点,所有的报警FC都在一个FC中调用,虽然看着奇怪但一直这么用
OB1是循环扫描的,扫描到FC1,以FC1的输出M75.0生效,扫描到FC9就以FC9的输出生效,这时正常的。
菜鸟:
其实一般PLC的工作周期是:输入采样-程序执行-输出刷新。
本问题涉及到的是程序执行-输出刷新这两步,PLC一般是将所有的程序都执行完再进行输出刷新的。
所以如果把同时输出给M75.0的程序都编写在OB1中,那么只能是*后一行输出给M75.0的程序有效,前面的都失效了。
因为前面的程序在给M75.0赋值的时候如果给其赋“1”,此时程序没有全部执行完,不会刷新输出,而如果后面的程序却给其赋“0”,若此后没有其它给M75.0赋值的程序了,那么M75.0便为“0”,然后等程序都执行完会刷新输出时M75.0便为“0”。
因此,无论前面的程序使之为“1”还是“0”,后面的程序使之为“0”,*终的输出便为“0”;而同样,不管前面的程序使之为“1”还是“0”,后面的程序使之为“1”,*终的输出便为“1”。
但是如果将这两个同时对M75.0的程序编写在不同的FC中,且后面的FC在OB1中调用时前面增加一个调用条件。当其不满足时,后面的FC便不会调用,也就不会去执行,那么前面的FC如执行完,如果后面没有别的程序就会进入到输出刷新这步了。这时两个同时对M75.0写的程序就不会有冲突。但当后面那个FC的调用条件满足时,情况就和前面说的同在OB1中的情况一样了。
这些是我刚刚用PLC试过的。
斑竹:
双线圈是可以通过编译的
侠士:
双线圈可以通过编译的,程序扫描的时候以后一个满足条件的输出
斑竹:
西门子PLC可以,三菱的PLC就不允许有双线圈的现象,建议编写时合到一处。
侠士:
虽然不会检查出错误,可以执行,但我认为这在编程中就是个错误,两个线圈同时发挥作用,这很明显**个永远也不会执行。