前面(17)讲的是用比较指令控制点数长度可调的广告灯的往亮复灭移动程序,如要全亮后延时10秒,全灭后延时10秒,且看下面能否实现。
案例要求:
一开关控制5个小灯的循环点亮,每次隔1秒钟,依次点亮Y0~Y4亮灯个数可调为2-5个,全亮后延时10秒。
再返回依次熄灭Y4~Y0,全灭后延时10秒,往复循环移动。
直到开关断开,全部灯都灭掉。
X1为设定亮灯个数的按钮,需要在5秒钟内设定,按一次加一个,长按5秒时间,设定个数归零。
软元件分配/使用如下表:
Y0
| 灯1 | HL1
| Y1
| 灯2 | HL2 | Y2 | 灯3 | HL3 | Y3 | 灯4 | HL4 | Y4 | 灯5 | HL5 | X0 | 开关 | SB1
| X1
| 按钮
| SB2
|
设计思路:
按钮按动次数计数,并对次数用乘法指令MUL乘10运算,因要延时,需要加上100。结果做为定时器的时间设定值。
定时器每动作一次,用交替输出指令ALTP或FF,把移位条件M0反向,刚好在设定时间内左移或右移完成。
按钮设定次数需要在5秒钟之内设定完成,否则长按按钮5秒次数复位。
接线简图同上回:
编写程序:
首先,我们用梯形图语言来编写,打开三菱PLC编程软件MELSOFT GX Works3,新建一个工程,选择系列、机型,选择梯形图语言编写:
梯形图逻辑程序如下:
▲ 初始化及亮灯个数设置
▲ 主程序
这里可初始化复位T0-T2,也可不复位。如复位后,要重新设定亮灯个数。
注意:乘法的积是用32位寄存器来保存的,后面的+就需要用32位的D+。
乘法指令解释:
其次,我们再用ST语言来编写,打开三菱PLC编程软件MELSOFT GX Works3,新建一个工程,选择系列、机型,选择ST语言编写:
ST语言程序如下:
MOV(SM402 OR NOT X0,K0,K4Y0);//初始化
OUT_C(X1,C0,K5);//移位长度限位5位 OUT_T(X1,T0,K50);//移位长度5秒复位 MOV(T0,K0,C0);
MOV(X0,C0,D3);//C0的值要转换一下 OUT_T(X0 AND NOT C1 AND NOT T1,T1,K10);//1秒脉冲
OUT_C(X0 AND NOT C1 AND T1,C1,D3);//亮灯数
RST(T2,C1);//这里不能用传送0的方式复位。
D1:=C0*10; D10:=D1+K100;//T2的计时
OUT_T(X0 AND NOT T2,T2,D10);//反转定时
FF(X0 AND NOT T2,M0);//移位条件反转
SFTLP(X0 AND T1 AND M0,SM400,K16,K1,Y0);//左移位 SFTRP(X0 AND T1 AND NOT M0,SM401,K16,K1,Y0);//右移位
ST语言程序2:
MOV(SM402 OR NOT X0,K0,K4Y0);//初始化
OUT_C(X1,C0,K5);//移位长度限位5位 OUT_T(X1,T0,K50);//移位长度5秒复位 MOV(T0,K0,C0);
MOV(X0,C0,D3);//C0的值要转换一下 OUT_T(X0 AND NOT C1 AND NOT T1,T1,K10);//1秒脉冲
OUT_C(X0 AND NOT C1 AND T1,C1,D3);//亮灯数
RST(T2,C1);//这里不能用传送0的方式复位。
D1:=C0*10;
IF M0 THEN//左移时间延时选择10秒 D10:=D1+K100;//T2的计时数 END_IF; IF NOT M0 THEN//右移时间延时选择5秒 D10:=D1+K50;//T2的计时数 END_IF; OUT_T(X0 AND NOT T2,T2,D10);//反转定时
FF(X0 AND NOT T2,M0);//移位条件反转
SFTLP(X0 AND T1 AND M0,SM400,K16,K1,Y0);//左移位 SFTRP(X0 AND T1 AND NOT M0,SM401,K16,K1,Y0);//右移位
▲ 左右移位延时时间不同的程序
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |