admin 发表于 6 天前

通过一个简易的功能块来学习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]
查看完整版本: 通过一个简易的功能块来学习Codesys下动作、方法、属性