外部模式启动程序

FB的建立:

(*华数III型  外部模式启动模块*)
FUNCTION_BLOCK HS3RobotExtStart
VAR_INPUT
    //外部控制按钮
    in_Start_NO:       BOOL;  //启动----上升沿有效
    in_Pause_NC:       BOOL;  //暂停----下降沿有效
    in_Stop_NC:        BOOL;  //停止----下降沿有效
    in_Reset_NO:       BOOL;  //复位----上升沿有效
    
    //机器人外部信号输出
    oROBOT_READY:      BOOL;  //机器人准备好
    oFAULTS:           BOOL;  //机器人报警
    oENABLE_STATE:     BOOL;  //使能状态
    oPRG_UNLOAD:       BOOL;  //卸载程序
    oPRG_READY:        BOOL;  //程序准备好
    oPRG_RUNNING:      BOOL;  //运行状态
    oPRG_ERR:          BOOL;  //程序报错
    oPRG_PAUSE:        BOOL;  //暂停状态
    oIS_MOVING:        BOOL;  //有动作,速度不为0
    oMANUAL_MODE:      BOOL;  //手动模式
    oAUTO_MODE:        BOOL;  //自动模式
    oEXT_MODE:         BOOL;  //外部模式
    oREF_0:            BOOL;  //引用0
    oREF_1:            BOOL;  //引用1
    oREF_2:            BOOL;  //引用2
END_VAR
VAR_OUTPUT
    //机器人外部信号输入
    iPRG_START_N:      BOOL;  //启动
    iPRG_PAUSE_N:      BOOL;  //暂停
    iPRG_STOP_N:       BOOL;  //停止
    iPRG_LOAD_P:       BOOL;  //加载程序
    iPRG_UNLOAD_N:     BOOL;  //卸载程序
    iENABLE:           BOOL;  //使能
    iCLEAR_FAULTS_P:   BOOL;  //清除报警
END_VAR
VAR
    iDelay:            INT;   //延时
    RUNSTATE:          INT;   //启动状态机
    block:             BOOL;  //互锁信号
    bResetSingle:      BOOL;  //复位标志位
    bEnableMid:        BOOL;  //使能中间变量
    
    //下降沿
    in_Pause_NC_F_TRIG:            F_TRIG;
    in_Stop_NC_F_TRIG:             F_TRIG;
    
    //上升沿
    in_Start_NO_R_TRIG:            R_TRIG;
    in_Reset_NO_R_TRIG:            R_TRIG;
END_VAR
//外部启动状态机
CASE RUNSTATE OF
    0://初始化
        in_Start_NO_R_TRIG(CLK:= in_Start_NO, Q=> );
        iENABLE := FALSE;      //Enble
        iPRG_LOAD_P:= FALSE; //load
        iPRG_START_N := FALSE; //Start
        
        //启动运行
        IF in_Start_NO_R_TRIG.Q AND NOT oFAULTS AND in_Pause_NC AND in_Stop_NC 
        AND NOT oMANUAL_MODE AND (oAUTO_MODE OR oEXT_MODE) THEN
            RUNSTATE := 10;
        END_IF
        
        //复位复位信号
        IF NOT(oFAULTS) AND NOT(oPRG_RUNNING) AND oPRG_UNLOAD THEN
          bResetSingle:= FALSE;
          block:= FALSE;//互锁
        END_IF
       
    10://上使能
        iENABLE:= TRUE;
        IF oENABLE_STATE THEN    //使能已上
            RUNSTATE:= 20;
            iPRG_LOAD_P:= FALSE; //load
        END_IF
        IF NOT in_Stop_NC THEN
            RUNSTATE:= 0;
        END_IF
 
    20://加载程序
        iPRG_LOAD_P:= TRUE; //load
        //机器人已经准备好
        IF  oROBOT_READY THEN
             iPRG_START_N:= TRUE; //Start
             RUNSTATE :=30;
        END_IF
        IF NOT in_Stop_NC THEN
            RUNSTATE:= 0;
        END_IF
    
    30://运行启动
        iPRG_START_N:= FALSE; //Start
        
        //已经启动
        IF  oPRG_RUNNING THEN
          RUNSTATE :=40;
        END_IF
        IF NOT in_Stop_NC THEN
            RUNSTATE:= 0;
        END_IF
        
    40://运行中
        //停止
        in_Stop_NC_F_TRIG(CLK:= in_Stop_NC, Q=> );
        IF  in_Stop_NC_F_TRIG.Q THEN
           iPRG_STOP_N:= TRUE;  //Stop
           RUNSTATE:= 50;
        END_IF
        
        //暂停
        in_Pause_NC_F_TRIG(CLK:= in_Pause_NC, Q=> );
        IF in_Pause_NC_F_TRIG.Q THEN
           iPRG_PAUSE_N:= TRUE; //pause
           RUNSTATE:= 80;
        END_IF 
        
    50://停止程序
        iPRG_STOP_N:= FALSE; //Stop
        //已经停止,非运行状态
        IF NOT(oPRG_RUNNING) THEN
            iPRG_UNLOAD_N:= TRUE;
            RUNSTATE:= 60;
        END_IF
        
    60://卸载程序
        iPRG_UNLOAD_N:= FALSE;
        
        //程序已经卸载
        IF oPRG_UNLOAD THEN
           RUNSTATE:= 70;
        END_IF
        
    70: //掉使能
        iENABLE:= FALSE;
        
        //使能已经掉
        IF NOT(oENABLE_STATE) THEN
           RUNSTATE:= 0;
        END_IF
        
    80: //暂停程序
        iPRG_PAUSE_N:= FALSE; //pause
        
        //暂停状态(暂停后包含掉使能)
        IF oPRG_PAUSE THEN
          RUNSTATE:= 90;
        END_IF
        
    90: //暂停状态--掉使能
        iENABLE:= FALSE;
        
        //掉使能,并处于暂停状态
        IF NOT(oENABLE_STATE) AND oPRG_PAUSE THEN
            //1://启动
            in_Start_NO_R_TRIG(CLK:= in_Start_NO, Q=> );
            IF in_Start_NO_R_TRIG.Q THEN
                 bEnableMid:= TRUE;
            END_IF
            
            //暂停启动延时
            IF bEnableMid THEN
                iDelay:= iDelay + 1;
                IF iDelay> 5 THEN
                   bEnableMid:= FALSE;
                   iDelay:= 0;
                   RUNSTATE:= 100;
                END_IF
            END_IF
            
            //2:停止
            in_Stop_NC_F_TRIG(CLK:= in_Stop_NC, Q=> );
            IF in_Stop_NC_F_TRIG.Q THEN
                 iPRG_STOP_N:= TRUE;  //Stop
                 RUNSTATE:= 50;
            END_IF
        END_IF
        
    100://暂停后上使能
        iENABLE:= TRUE;
        //已经使能
        IF (oENABLE_STATE) THEN
             iPRG_START_N:= TRUE; //Start
             RUNSTATE :=30;
        END_IF
END_CASE

//////////////---处理报错
//处理完一次整体的报错后的流程(下载程序,掉使能)
in_Reset_NO_R_TRIG(CLK:= in_Reset_NO, Q=> );
IF in_Reset_NO_R_TRIG.Q AND oFAULTS THEN
    bResetSingle:= TRUE;
END_IF

IF bResetSingle THEN
     in_Reset_NO_R_TRIG(CLK:= in_Reset_NO, Q=> );
     iCLEAR_FAULTS_P:= TRUE;  //复位
     
     //无错情况下去执行
     IF NOT(oFAULTS) AND NOT(block) THEN
          block:= TRUE;//互锁
          //程序有加载
          IF NOT(oPRG_UNLOAD) THEN
               iPRG_STOP_N:= TRUE;  //先停止程序
               RUNSTATE:= 6;
          ELSE
               RUNSTATE:= 8;
          END_IF
     END_IF
ELSE
    iCLEAR_FAULTS_P:= FALSE;  //复位
END_IF

IO信号映射:

 定义一个全局变量GVL_EXT,具体内容如下:

(*1、外部启动全局变量*)
VAR_GLOBAL
//机器人外部信号输出
    GC_oROBOT_READY:      BOOL;         //机器人准备好
    GC_oFAULTS:           BOOL;         //机器人报警
    GC_oENABLE_STATE:     BOOL;         //使能状态
    GC_oPRG_UNLOAD:       BOOL;         //卸载程序
    GC_oPRG_READY:        BOOL;         //程序准备好
    GC_oPRG_RUNNING:      BOOL;         //运行状态
    GC_oPRG_ERR:          BOOL;         //程序报错
    GC_oPRG_PAUSE:        BOOL;         //暂停状态
    GC_oIS_MOVING:        BOOL;         //有动作,速度不为0
    GC_oMANUAL_MODE:      BOOL;         //手动模式
    GC_oAUTO_MODE:        BOOL;         //自动模式
    GC_oEXT_MODE:         BOOL;         //外部模式
    GC_oREF_0:            BOOL;         //引用0
    GC_oREF_1:            BOOL;         //引用1
    GC_oREF_2:            BOOL;         //引用2
                                     
//机器人外部信号输入                          
    GC_PRG_START_N:       BOOL;         //启动
    GC_PRG_PAUSE_N:       BOOL;         //暂停
    GC_PRG_STOP_N:        BOOL;         //停止
    GC_PRG_LOAD_P:        BOOL;         //加载程序
    GC_PRG_UNLOAD_N:      BOOL;         //卸载程序
    GC_ENABLE:            BOOL;         //使能
    GC_CLEAR_FAULTS_P:    BOOL;         //清除报警
END_VAR

映射程序如下:

(*
外部模式IO配置,默认输入输出IO从100开始
*)
PROGRAM EXT_StartIO_Mapping
VAR
    bExtStart:         BOOL:= TRUE;  //启动模块
END_VAR


//机器人外部信号输出
GC_oROBOT_READY      :=  DO100;        //机器人准备好
GC_oFAULTS           :=  DO101;        //机器人报警
GC_oENABLE_STATE     :=  DO102;        //使能状态
GC_oPRG_UNLOAD       :=  DO103;        //卸载程序
GC_oPRG_READY        :=  DO104;        //程序准备好
GC_oPRG_RUNNING      :=  DO105;        //运行状态
GC_oPRG_ERR          :=  DO106;        //程序报错
GC_oPRG_PAUSE        :=  DO107;        //暂停状态
GC_oIS_MOVING        :=  DO108;        //有动作,速度不为0
GC_oMANUAL_MODE      :=  DO109;        //手动模式
GC_oAUTO_MODE        :=  DO110;        //自动模式
GC_oEXT_MODE         :=  DO111;        //外部模式
GC_oREF_0            :=  DO112;        //引用0
GC_oREF_1            :=  DO113;        //引用1
GC_oREF_2            :=  DO114;        //引用2
                                     
//机器人外部信号输入                          
DI100 := GC_PRG_START_N       ;        //启动
DI101 := GC_PRG_PAUSE_N       ;        //暂停
DI102 := GC_PRG_STOP_N        ;        //停止
DI103 := GC_PRG_LOAD_P        ;        //加载程序
DI104 := GC_PRG_UNLOAD_N      ;        //卸载程序
DI105 := GC_ENABLE            ;        //使能
DI106 := GC_CLEAR_FAULTS_P    ;        //清除报警

程序实例化如下:

VAR
    //外部启动模块(需要映射示教器外部配置的输入输出IO)
    HS3ExtStart:          HS3RobotExtStart;       //外部模式启动模块实例化

END_VAR

原文地址:https://www.cnblogs.com/csflyw/p/14647933.html