通过一个简易的功能块来学习Codesys下动作、方法、属性
前言Codesys 动作、方法、属性 的使用,自学笔记备忘
前言 有朋友在我分享一些关于Codesys下的面对对象的OOP使用。今天刚好休息,就利用空余的时候,把之前的学习到的进行梳理。
正文
1.Code Show1.1 Fb_MotorCtrl 普通电机带编码器反馈控制的正反转功能块
FUNCTION_BLOCK Fb_MotorCtrl
VAR_INPUT
xEnabel : BOOL ; //使能
xFault : BOOL ; //故障
xFwd : BOOL ; //正转
xRev : BOOL ; //反转
xAuto : BOOL ; //自动
xReset : BOOL ; //复位故障
rActPos : REAL ; //当前值
rLimitP : REAL ; //正限位
rLimitN : REAL ; //反限位
rAutoPos : REAL ; //自动位置
rOffset : REAL ; //偏差
UdiOverTime : UDINT ; //超时时间
END_VAR
VAR_OUTPUT
bFault : BOOL ; //外部故障
bOverTime : BOOL ; //编码器超时
yFwd : BOOL ; //正转运行
yRev : BOOL ; //反转运行
bDone : BOOL ; //自动完成
iState : INT ;//-1>>> 反转 0>>>停止 1>>>正转 100>>禁用 1000>>>故障 2000>>>编码器超时
END_VAR
VAR
iAutoStep : INT; //自动流程步
iRecordsStep : INT; //记录流程步
rTempPos : REAL ; //锁位置
tOverTime : Standard.TON ; //计时
END_VAR
ACT_OverTime();
IF NOT xEnabel THEN
METH_Disable();
ELSE
IF NOT xFault OR bOverTime THEN
METH_Error();
ELSE
IF xFwd THEN
METH_FwdOut();
ELSIF xRev THEN
METH_RevOut();
ELSIF NOT bDone AND xAuto THEN
METH_Auto();
ELSE
METH_Stop();
END_IF ;
END_IF ;
END_IF ;
(*ACT_OverTime 内容*)
CASE iRecordsStep OF
0:
IF yFwd OR yRev THEN
rTempPos := rActPos ;
iRecordsStep := 10 ;
END_IF ;
10:
tOverTime.PT := UDINT_TO_TIME(UdiOverTime);
tOverTime.IN := TRUE ;
IF tOverTime.Q THEN
IF rTempPos <> rActPos THEN
tOverTime.IN := FALSE ;
iRecordsStep := 0 ;
ELSE
bOverTime := TRUE ;
iRecordsStep := 100 ;
END_IF ;
ELSIF NOT tOverTime.Q AND NOT yFwd AND NOT yRev THEN
tOverTime.IN := FALSE ;
iRecordsStep := 0 ;
END_IF ;
100:
IF xReset THEN
bOverTime := FALSE ;
tOverTime.IN := FALSE ;
iRecordsStep := 0 ;
END_IF ;
ELSE
;
END_CASE ;
tOverTime();
(*METH_Disable 内容*)
METHOD PUBLIC METH_Disable : BOOL
VAR_INPUT
END_VAR
bFault := FALSE ;
bOverTime := FALSE ;
yFwd := FALSE ;
yRev := FALSE ;
iAutoStep := 0 ;
iRecordsStep := 0 ;
iState := 100 ;
(*METH_Error 内容*)
METHOD PUBLIC METH_Error : BOOL
VAR_INPUT
END_VAR
yFwd := FALSE ;
yRev := FALSE ;
iAutoStep := 0 ;
IF NOT bOverTime THEN
bFault := xFault ;
iState := 1000 ;
ELSE
iState := 2000 ;
END_IF ;
(*METH_FwdOut 内容*)
METHOD PUBLIC METH_FwdOut : BOOL
VAR_INPUT
END_VAR
yRev := FALSE ;
yFwd := xEnabel AND xFault AND NOT yRev AND (rActPos < rLimitP) AND xFwd ;
iState := 1 ;
(*METH_RevOut 内容*)
METHOD PUBLIC METH_RevOut : BOOL
VAR_INPUT
END_VAR
yFwd := FALSE ;
yRev := xEnabel AND xFault AND NOT yFwd AND (rActPos > rLimitN) AND xRev;
iState := -1 ;
(*METH_Auto 内容*)
METHOD PUBLIC METH_Auto : BOOL
VAR_INPUT
END_VAR
CASE iAutoStep OF
0 :
IF (rActPos >= (rAutoPos - rOffset)) AND (rActPos <= (rAutoPos + rOffset)) THEN
yFwd := FALSE ;
yRev := FALSE ;
iState := 0 ;
bDone:= TRUE ;
END_IF ;
IF rActPos < rAutoPos THEN
iAutoStep := 10 ;
ELSIF rActPos > rAutoPos THEN
iAutoStep := 20 ;
END_IF ;
10:
bDone := FALSE ;
yRev := FALSE ;
yFwd := TRUE ;
iState := 1 ;
iAutoStep := 30 ;
20:
bDone := FALSE ;
yFwd := FALSE ;
yRev := TRUE ;
iState := -1 ;
iAutoStep := 30 ;
30:
IF (rActPos >= (rAutoPos - rOffset)) AND (rActPos <= (rAutoPos + rOffset)) THEN
yFwd := FALSE ;
yRev := FALSE ;
iState := 0 ;
bDone := TRUE ;
iAutoStep := 0 ;
END_IF ;
END_CASE ;
(*METH_Stop 内容*)
METHOD PUBLIC METH_Stop : BOOL
VAR_INPUT
END_VAR
yFwd := FALSE ;
yRev := FALSE ;
bDone := FALSE ;
iAutoStep := 0 ;
iState := 0 ;
PROPERTY PUBLIC Prop_AutoStep : INT
Prop_AutoStep := iAutoStep ;
PROPERTY PUBLIC Prop_RecordStep : INT
Prop_RecordStep := iRecordStep ;
1.2 Pro_Main
PROGRAM Pro_Main
VAR
MotorCtrl : Fb_MotorCtrl ;
rCount : REAL ;
iActAutoStep : INT ;
iActRecordStep : INT ;
END_VAR
MotorCtrl.rActPos := rCount ;
MotorCtrl();
IF MotorCtrl.yFwd THEN
rCount := rCount + 0.1 ;
ELSIF MotorCtrl.yRev THEN
rCount := rCount - 0.1 ;
END_IF ;
IF MotorCtrl.bDone THEN
MotorCtrl.xAuto := FALSE ;
END_IF ;
iActAutoStep := MotorCtrl.Prop_AutoStep;
iActRecordStep := MotorCtrl.Prop_RecordStep ;
IF MotorCtrl.xReset THEN
IF (iActRecordStep = 0) THEN
MotorCtrl.xReset := FALSE ;
END_IF ;
END_IF ;
通过上面的程序段可以看出在Codesys下的动作、方法、属性的使用。后续会更多的分享有关于OOP的实际项目使用。结尾 通过一个简易的功能块去理解,在功能块下动作用来做常规一直需要的动作。而方法用来当作过程和结果。而属性用来用于变量在不作为输入输出的情况下,通过属性来实现传递。(当然本文内容仅是笔者个人的理解。)
页:
[1]