如图,用一个按钮来控制3组灯;在3个灯全部熄灭的情况下,按下按钮,第一个灯会点亮;在第一个灯点亮的情况下,按下按钮,第二个灯会点亮;在第一第二个灯都点亮的情况下,按下按钮,第三个灯会点亮;在三个灯都点亮的情况下,按下按钮,三个灯一起熄灭。
I/O分配如下表,有1个输入点,3个输出点。
1.错误的写法
如下图这种写法是错误的,是误以为当X1的上升沿导通时,下面的4个分支只能选择其一去执行;
其实这是对plc的扫描周期不理解造成的错误,程序应该是从上往下,从左往右执行的,执行的步骤为图中红色的文字的顺序。
X1是一个上升沿,它只能导通一次(即一个扫描周期),因此程序启动只需要分析程序的一个执行过程就好;在3个灯都熄灭时,按下X1,程序是按照上述的步骤,从左往右,从上往下扫描的,当执行到第5步时,Y1点亮了;由于第6、7、8步的触点都导通,第9步置位指令控制Y2置位,Y2会被点亮;扫描第10、11、12步,都是导通状态,控制第13步置位Y3;扫描第14、15、16步,都是导通状态,第17步的批量复位控制复位所有Y点;程序扫描第18步END指令,扫描完毕;执行输出刷新,所有灯输出为0,因此程序达不到想要的控制效果。
下面我们来看下3种正确的思路。
正确写法1
如下图,这是一种正确的写法,本程序的扫描步骤在图中用红色的文字标明了;
在3盏灯都没有输出时,按下X1,进入程序扫描,程序2、3、4步都不导通,所以第5、6步不执行;程序扫描7、8、9、10都导通,执行第11、12步,置位Y1灯,导通M2线圈;因为Y1置位了,第13步导通,第14、15、16步也是导通,因为M2线圈导通了,M2常闭触点断开,因此第17步不导通Y2不能置位;程序扫描下一行,第21、24步不能导通,因此Y3不能置位;程序扫描一遍完毕,最终只有Y1有输出。(因为上升沿只能导通一次,程序只执行一遍,只需要分析一个扫描周期即可)
在只有Y1有输出时,按下X1,进入程序扫描,程序第2步导通,第3、4步不导通,此分支后面不执行;程序第7步断开,此分支后面不执行;程序第13~17步导通,执行第18步,置位Y2,导通M3线圈;程序第25步由于M3线圈通电,其常闭触点就会断开,因此Y3的置位指令不能执行;程序扫描第27步END,扫描完毕;输出刷新,程序输出Y1、Y2。
在只有Y1、Y2有输出时,按下X1,进入程序扫描,程序第1、2、3步导通,第4步不导通,此分支后面不执行;程序第7、8步断开,此分支后面不执行;程序第13步导通,到第14步由于Y2线圈置位了,因此Y2常闭触点断开,此分支后面的程序不能执行;程序第20~25步,这几个触点都导通,因此Y3的置位指令执行;程序扫描第27步END,扫描完毕;输出刷新,程序输出Y1、Y2、Y3。
当Y1、Y2、Y3有输出时,按下X1,进入程序扫描,程序第1、2、3、4步导通,第5、6步有输出,第5步的批量复位把Y1到Y3全部复位了,第6步的线圈M1导通;后面程序分支都串入了M1的常闭触点,因此后面几条置位指令都断开了不执行;程序扫描27步的END指令,扫描结束;输出刷新,Y1、Y2、Y3全部停止输出。
正确写法2
如下图,这也是一种正确的写法,本程序的扫描步骤在图中用红色的文字标明了;
在3盏灯都没有输出时,按下X1,程序扫描1、2、3、4步,这几个条件都不导通,M0没输出;程序扫描6、7、8步,这3个条件都导通了,第9步的M1线圈导通;程序扫描10、11、12步,第10步的Y1常开触点是断开的,所以这条指令的M2线圈不导通;程序扫描14、15、16步,第14、15步的Y1、Y2常开触点是断开的,所以这条指令的M3线圈不导通;后面4行程序,由于只有前面只有M1线圈导通,所以只有Y1被置位了;程序扫描END指令,程序扫描结束;程序扫描一遍完毕,最终只有Y1有输出。
在只有Y1有输出时,按下X1,程序扫描1、2、3、4步,Y2、Y3不导通,M0没输出;程序扫描6、7、8步,由于Y1线圈导通导致Y1常闭触点断开了,第9步的M1线圈不导通;程序扫描10、11、12步,第10步的Y1常开触点导通,Y2、Y3由于其线圈没有输出,所以Y2、Y3常闭触点导通,所以第13步的M2线圈导通了;程序扫描14、15、16步,第15步的Y2常开触点是断开的,所以这条指令的M3线圈不导通;后面4行程序,由于只有前面只有M2线圈导通,所以只有Y2被置位了;程序扫描END指令,程序扫描结束;程序扫描一遍完毕,最终只有Y1、Y2有输出。
在只有Y1、Y2有输出时,按下X1,程序扫描1、2、3、4步,Y3不导通,M0没输出;程序扫描6、7、8步,由于Y1、Y2线圈导通导致Y1、Y2常闭触点断开了,第9步的M1线圈不导通;程序扫描10、11、12步,第11步的Y2常闭触点因为其线圈导通而断开了,所以第13步的M2线圈不导通;程序扫描14、15、16步,这3个触点都是导通的,所以第17步的M3线圈导通;后面4行程序,由于只有前面只有M3线圈导通,所以只有Y3被置位了;程序扫描END指令,程序扫描结束;程序扫描一遍完毕,最终Y1、Y2、Y3都有输出。
当Y1、Y2、Y3有输出时,按下X1,程序扫描1、2、3、4步,Y1、Y2、Y3都导通,M0有输出;程序扫描6、7、8步,由于Y1、Y2、Y3线圈导通导致Y1、Y2、Y3常闭触点断开了,第9步的M1线圈不导通;程序扫描10、11、12步,第11、12步的Y2、Y3常闭触点因为其线圈导通而断开了,所以第13步的M2线圈不导通;程序扫描14、15、16步,由于Y3的线圈置位了,其常闭触点断开了,所以第17步的M3线圈不导通;后面4行程序,由于只有前面只有M0线圈导通,控制Y1、Y2、Y3批量复位;程序扫描END指令后扫描结束,最终Y1、Y2、Y3都有停止输出。
正确的写法3
如下图,这是一种正确的写法,本程序的扫描步骤在图中用红色的文字标明了;
通过计数器结合触点比较指令,可以忽略扫描周期的问题,X1按钮 每按下一次,计数器的值加1。
当计数器大于等于1时输出Y0;
当计数器大于等于2时输出Y2;
当计数器大于等于3时输出Y3;
当计数器等于4时,复位计数器,所有输出停止输出。