入门,从一个按钮和灯开始学PLC吧!(一)

#用一个基本的逻辑条件,探索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(取反方法,左图错误,右图正确),采用的是取反方式,参考代码对比,你能找到问题所在吗?聪明的你还可以想出哪些方式。

 

#写在最后#

在项目实践过程中,每个问题都可能会有很多解决方案,解决方案的选择决定了技术实施的复杂程度和时间等成本,我们在选择“最优”方案的同时,也要有备选方案。如果你在工作中有任何疑问,都可以在评论区发表问题,我们一起交流学习,谢谢!

下载链接:

https://download.csdn.net/download/weixin_44166380/89886824icon-default.png?t=O83Ahttps://download.csdn.net/download/weixin_44166380/89886824

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值