#用一个基本的逻辑条件,探索PLC的编程技巧#
前言:
有时候看似很简单的问题,实际上也并不复杂(废话文学),但是我们往往是眼高手低。本篇作为入门PLC编程技巧的公开文章,主要想传达我们对自身的PLC编程,逻辑思维了解多少?大部分人可能经历过大大小小各种项目,甚至程序中运用各种计算公式,算法。那么,今天我们不聊“高级”指令,也不聊“复杂”算法,我们一起来看下,用一个按钮和灯,我们能玩出怎样的火花,以下编程环境使用CODESYS软件。
案例1(循环亮灭灯):
1.设计需求
用PLC写一个程序,一个自复位按钮,按下时,灯亮,松开后再按下时,灯灭,循环反复;
2.问题思考:
如果让你来写,那么大概率会用取反指令,可是,除了这种写法,你还有哪些呢,能写出多少种呢?让我们来看下,下面的程序吧。
3.程序代码
PROGRAM PLC_PRG
VAR
// 案例模式
modeNo: ARRAY[1..10] OF INT;
// 案例选择
modeSeclect: INT := 1;
modeNoStr: STRING[255] ;
modeSeclectStr:STRING[255];
commentString:STRING[255];
buttonR: R_TRIG;
commentWString: WSTRING;
Temp: ARRAY[0..10] OF BOOL;
i: INT;
step: INT;
moveRol: BYTE;
TEST: BOOL;
TEST1: BYTE;
LightTP: TP;
END_VAR
//按钮上升沿
buttonR(CLK:=GVL.button);
Temp[0]:=FALSE;
//案例选择
CASE modeSeclect OF
1://案例1
modeSeclectStr:='一个自复位按钮,按下时,灯亮,松开后再按下时,灯灭,循环反复:';
CASE modeNo[modeSeclect] OF
0://取反指令-错误(自复位按钮保持下,出现灯亮灭振荡)
modeNoStr:='使用方法-取反(错误)';
IF GVL.button THEN
GVL.light:=NOT GVL.light ;
END_IF;
1://取反-正确(加上升沿执行一次,可解决振荡问题)
modeNoStr:='使用方法-取反(正确)';
IF buttonR.Q THEN
GVL.light:=NOT GVL.light ;
END_IF;
2://互锁
modeNoStr:='使用方法-互锁';
IF buttonR.Q AND GVL.light=FALSE THEN
GVL.light:=TRUE;
Temp[0]:=TRUE;
END_IF;
IF buttonR.Q AND Temp[0]=FALSE THEN
GVL.light:=FALSE;
END_IF;
3://计数
modeNoStr:='使用方法-计数';
IF buttonR.Q THEN
IF i=0 THEN
GVL.light:=TRUE;
i:=i+1;
ELSE
GVL.light:=FALSE;
i:=0;
END_IF;
END_IF;
4://步序
modeNoStr:='使用方法-步序';
IF buttonR.Q THEN
//初始化
IF step=0 THEN
step:=10;
END_IF;
END_IF;
CASE step OF
10://灯亮
GVL.light:=TRUE;
IF buttonR.Q=FALSE THEN
step:=20;
END_IF;
20://灯灭
IF buttonR.Q THEN
GVL.light:=FALSE;
step:=0;
END_IF;
END_CASE;
5://移位
modeNoStr:='使用方法-移位';
IF Temp[1]=FALSE THEN
moveRol.0:=TRUE;moveRol.2:=TRUE;moveRol.4:=TRUE;moveRol.6:=TRUE;
Temp[1]:=TRUE;
END_IF;
IF buttonR.Q THEN
GVL.light:=moveRol.0;
moveRol:=ROL(moveRol,1);
END_IF;
6://定时
modeNoStr:='使用方法-定时';
IF buttonR.Q AND GVL.light=FALSE THEN
GVL.light:=TRUE;
END_IF;
LightTP(IN:=GVL.light,PT:=T#1MS);
IF buttonR.Q AND LightTP.Q=FALSE THEN
GVL.light:=FALSE;
END_IF;
END_CASE;
2://案例2
CASE modeNo[modeSeclect] OF
0://
;
1://
END_CASE;
;
3://案例3
;
END_CASE;
//文字显示
commentString:=CONCAT(modeSeclectStr,modeNoStr);
//文字转换
commentWString:=TO_WSTRING(commentString);
4.实现结果
按钮和灯
如上所示,本案例使用了6种不同的方法实现此功能,其中方法0和1(取反方法,左图错误,右图正确),采用的是取反方式,参考代码对比,你能找到问题所在吗?聪明的你还可以想出哪些方式。
#写在最后#
在项目实践过程中,每个问题都可能会有很多解决方案,解决方案的选择决定了技术实施的复杂程度和时间等成本,我们在选择“最优”方案的同时,也要有备选方案。如果你在工作中有任何疑问,都可以在评论区发表问题,我们一起交流学习,谢谢!
下载链接: