今天聊的东西是PLC(可编程逻辑控制器),这其实是一种电子电气和自动化等专业才会涉及的技术,并不是我本专业(建筑学)所学内容,所以本人就自己的学习理解来分析自己原先遇到的问题
在最近的PLC学习当中遇到了一个编程案例,可能这是学PLC以来遇到的第一个于我而言无法马上理解的案例,所以会显得尤其感兴趣。而自己在后面反复分析了几遍后,也终于是能够理解其中的逻辑和巧妙之处了,而这篇文章与其说是分享,倒不如说是对自己分析的阐述
下面是案例的任务要求(以三菱FX3U系列为例,采用梯形图编程语言进行编写):
现有一个喷泉,有8个喷口,按下启动按钮,这八个喷口逐个开始喷水,每两个之间间隔1秒。当全部喷口启动完毕后,同时停止喷水,再重新开始逐个喷水,以此不断循环(要求使用PLC内置的变址寄存器 Z / V 来实现)
在正式开始程序编写之前,我们的首要任务是明确该PLC程序的I/O分配表(这其实是一个相对灵活多变的步骤)以下给出本次的分配表:
输入继电器:
功能作用 名称 输入地址
启动 SB1 X0
急停 SB2 X1
输出继电器:
功能作用 名称 输出地址
1号喷口 KM1 Y0
2号喷口 KM2 Y1
3号喷口 KM3 Y2
4号喷口 KM4 Y3
5号喷口 KM5 Y4
6号喷口 KM6 Y5
7号喷口 KM7 Y6
8号喷口 KM8 Y7
通过以上任务需求的描述和自己规定的I/O分配,采用PLC中的基本指令搭配多个内置计时器(T)其实也能够实现,这也是我看到该任务要求时的第一反应,或许这是人总趋于简单想法的原因,当然,也可能是自己还处于PLC的学习阶段,所掌握的知识不足以支撑自己灵活运用的因素。但只要针对要求简单思索片刻,尽管只局限于当时自己所学的范围,也会产生好几种编程思路,例如可以利用内置计数器(C)搭配计时器一起使用,或者在此基础上加入递增指令(加一指令)——INC使计数器自动递增从而控制对应的喷口,这些方案相较于第一种来讲,都可以在一定程度上起到缩减程序,从而缩短扫描周期,减轻PLC运行负担的作用。而题目的要求是利用三菱PLC内置的变址寄存器(Z/V)来进行程序的编写。而变址寄存器,可以算是PLC众多功能指令之中比较高级的一种指令,如果能够灵活的运用,不仅会让程序整体显得相对“高级”,也可以大幅缩减程序,充分提高编程效率。
对于变址寄存器的简单概述:
假设利用PLC中的数据传送指令(MOV)将H1(PLC中1的十六进制表达方式,十进制表达为K1)传送到K1Y0Z0(K1表示一组,一组等于4位,Y0为首地址,所以K1Y0表示从Y3-Y0,其中Y3侧为高位,Y0侧为低位,Z0为变址寄存器),现假设Z0中储存的数为3,则此时的K1Y0Z0实际为K1Y3(0+3=3),也就表示从Y6-Y3。而将H1传送给K1Y3的过程中会先将H1转换为二进制,也就是0001,最后做以下配对(其中会涉及到一些关于计算机的数据类型和PLC处理模式等的知识):
高位 Y6 Y5 Y4 Y3 低位
0 0 0 1
而在PLC中0和1表示开关量,即1表示得电,0表示失电,所以在这里代表Y3这个输出地址处于得电状态,即此时在该地址处接入一个小灯或驱动器等硬件(外接设备),该硬件将会运行
开始解答题目:
首先拿到题目很快能想到用X0来导通中间辅助继电器(M),以此来带动后面的程序运行。这里一般会有两种方法,一种是采用基本指令X0(ld X0)直接导通M0(out M0),然后再在X0处并联上一个M0(or MO)使M0自锁;另一种是利用置位指令(SET)使M0一直得电。这里采用第二种方式
(图1)
接着因为相邻两个喷口之间间隔一秒开始喷水,所以这里采用M0(ld M0)导通计时器T0(out T0 K10——这里表示将计时器T0设置为1秒,其连续得电1秒后,代表该计时器计时完毕,所以该计时器对应的常开触点闭合通电,常闭触点断开失电),再在这之间串入T0的常闭触点(ldi T0),这样就使得在T0得电1秒后T0的常闭触点断开,该线路也随之断开,使得T0失电,这又导致T0的常闭触点恢复闭合的状态,而又因为M0一直得电,所以促使T0再次导通计时,形成不断循环计时,出现无数个1秒钟的效果
(图2)
而根据任务要求,当按下按钮时,第一个喷口会立刻出水,所以M0得电的同时,Y0也同时得电。这里采用传送指令将K1传送至K2Y0(mov K1 K2Y0),为了避免该指令一直得电一直传输,从而降低PLC的运行效率,所以加上上升沿指令(↑)。根据这两条程序可知,在M0得电时,T0和Y0同时得电,而之所以分开编写,是为了后面给两者分别做补充操作,使其互不影响
(图3)
为了使喷口能够达到逐个启动的效果,我们必须充分利用T0得电失电的每一个周期。这里采用T0(ld T0)的常开触点(即T0计时完成后闭合导通)配合递增指令和变址寄存器Z0(INC Z0)来实现Z0储存数字不断在每一个T0周期后的自加1处理,同时导通另一条程序,利用传送指令传送K1到K1Y0Z0(out K1 K1Y1Z0),因为每一秒后Z0储存数字都会加1,所以每一秒后导通的Y也会随着自加1,而原先的Y因为数据已经传送过去,所以不会因为新的Y被导通而断开,这样就实现了喷口逐个启动的设置
(图4)
但喷口只有8个,即Y0-Y7,再根据任务要求,当八个喷口全部启动后,又同时停止,所以不能无限加1下去,由此分析,当Z0储存数字为K8时是一个关键点。当Z0储存数字为8时,根据上述程序可知,PLC会接着让输出地址Y8得电,但这显然不是我们想要的,所以此时采用比较指令(ld= Z0 K8)将Z0=K8这一时刻凸显出来,当该条指令导通时(即Z0=K8时)采用传送指令将K0传送给Z0(MOV K0 Z0)和K2Y0(MOV K0 K2Y0),使得Z0清零的同时使Y0-Y7全部复位,即失电。而为了确保每一次大循环(全部喷口启动完全部停止为一次大循环)之前的状态都是如此,需要并上一个上电初始化的指令(or M8002)
(图5)
接下来要解决的是一次大循环结束后,如何开启下一个大循环,并使之不断循环下去的问题。这里以Y7的断电作为一次大循环结束的结点,采用下降沿(↓)的形式使Y7断电的一瞬间导通一次该条程序,从而置位另外一个中间辅助继电器M1,以此来带动后续的操作(SET M1),并在T0的前面串入一个M0的常闭触点(ldi M0 见图2),这样的目的是使M1得电时该常闭触点断开致使T0断开停止计时,使得在M1得电期间Z0不会因为T0的运行而进行不断的自加1导致不断有Y得电(T0与M1互锁)。而后M1的得电带动另一个计时器T1的导通(out T1 K10),再在带上升沿的M0下面并联上一个T1的常开触点(or T1 见图3),最后以T1(ld T1)的常开触点连接M1的复位指令(RST M1),这样就使得当计时器T1计时完成后,两个T1常开触点闭合导通相应程序。第一个T1常开闭合导通使得Y0重新得电,标志着下一个大循环的开始;第二个T1常开闭合导通M1的复位指令使得M1复位,即失电,与此同时计时器T1停止运作、M1的常闭触点重新闭合导通,致使T0重新导通开始计时,后续重新开始对喷口Y进行逐个启动,以此实现程序的不断循环…
(图6)
但为了保证每次按下启动按钮之前Z0的存储数字为0,即保证每次按下启动按钮之后一开始除了Y0对应的喷口之外没有其他的喷口在喷水,所以在程序的最开始处插入一行初始化程序,即用上电初始化指令(ld M8002)配合传送指令使得Z0存储数字归零(MOV K0 Z0)
(图7)
以下为完整的PLC梯形图语言程序:
(图8)