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