KUKA外部自动配置(下)
本章用于分析KUKA外部自动的上级控制系统端的控制程序。
1. 机器人状态字的定义
这里定义了一系列的状态字,使用INflag_*
变量来接收来自kukaStatus
数组的状态信息用于监控机器人的不同状态,如工作模式、位置、报警状态等。这些状态存储在相应的标志变量中。通过kukaStatus
字数组中的不同位,代表机器人各种运行状态。
(*#############################1.机器人状态字######################################*)
INflag_T1 := kukaStatus[1].0; // T1模式标志
INflag_T2 := kukaStatus[1].1; // T2模式标志
INflag_AUT := kukaStatus[1].2; // 自动模式标志
INflag_EXT := kukaStatus[1].3; // 外部自动模式标志
INflag_ON_PATH := kukaStatus[1].4; // 机器人是否在轨迹上
INflag_PGNO_FBIT := kukaStatus[1].6; // 程序号标志
INflag_IN_HOME := kukaStatus[1].7; // 是否回到HOME位置
INflag_ROB_CAL := kukaStatus[1].8; // 机器人是否标定
INflag_ALARM_STOP_INTERN := kukaStatus[1].9;// 内部急停
INflag_STOP_MESS := kukaStatus[2].1; // 停止信息标志
INflag_USER_SAFE := kukaStatus[2].2; // 用户安全标志
INflag_PERI_RDY := kukaStatus[2].3; // 外部设备准备就绪标志
INflag_ALARM_STOP := kukaStatus[2].4; // 急停标志
INflag_PRO_ACT := kukaStatus[2].12; // 程序激活状态
INflag_PRO_MOVE := kukaStatus[2].13; // 程序移动状态
INflag_ROB_STOPPED := kukaStatus[2].14; // 机器人停止标志
2. 获取KUKA机器人的实时位置
这一部分代码调用了GetKukaPosition
函数,获取机器人在X、Y、Z、A、B、C轴上的实时位置以及外部设备(Fx, Fy, Fz等)的位置。这些数据可以用于实时监控机器人的状态和位置。
(* 获取kuka实时位置 *)
PositionDisplayX := GetKukaPosition(MotorStatus1:=kukaStatus[4], MotorStatus2:=kukaStatus[5]);
PositionDisplayY := GetKukaPosition(MotorStatus1:=kukaStatus[6], MotorStatus2:=kukaStatus[7]);
PositionDisplayZ := GetKukaPosition(MotorStatus1:=kukaStatus[8], MotorStatus2:=kukaStatus[9]);
PositionDisplayA := GetKukaPosition(MotorStatus1:=kukaStatus[10], MotorStatus2:=kukaStatus[11]);
PositionDisplayB := GetKukaPosition(MotorStatus1:=kukaStatus[12], MotorStatus2:=kukaStatus[13]);
PositionDisplayC := GetKukaPosition(MotorStatus1:=kukaStatus[14], MotorStatus2:=kukaStatus[15]);
PositionDisplayA1 := GetKukaPosition(MotorStatus1:=kukaStatus[16], MotorStatus2:=kukaStatus[17]);
PositionDisplayA2 := GetKukaPosition(MotorStatus1:=kukaStatus[18], MotorStatus2:=kukaStatus[19]);
PositionDisplayA3 := GetKukaPosition(MotorStatus1:=kukaStatus[20], MotorStatus2:=kukaStatus[21]);
PositionDisplayA4 := GetKukaPosition(MotorStatus1:=kukaStatus[22], MotorStatus2:=kukaStatus[23]);
PositionDisplayA5 := GetKukaPosition(MotorStatus1:=kukaStatus[24], MotorStatus2:=kukaStatus[25]);
PositionDisplayA6 := GetKukaPosition(MotorStatus1:=kukaStatus[26], MotorStatus2:=kukaStatus[27]);
// 机器人末端力和力矩获取
Fx := GetKukaPosition(MotorStatus1:=kukaStatus[29], MotorStatus2:=kukaStatus[30]);
Fy := GetKukaPosition(MotorStatus1:=kukaStatus[31], MotorStatus2:=kukaStatus[32]);
Fz := GetKukaPosition(MotorStatus1:=kukaStatus[33], MotorStatus2:=kukaStatus[34]);
Mx := GetKukaPosition(MotorStatus1:=kukaStatus[35], MotorStatus2:=kukaStatus[36]);
My := GetKukaPosition(MotorStatus1:=kukaStatus[37], MotorStatus2:=kukaStatus[38]);
Mz := GetKukaPosition(MotorStatus1:=kukaStatus[39], MotorStatus2:=kukaStatus[40]);
3. 初始化实时位置为零-清零
如果readIsZero
标志为TRUE
,则所有位置变量被清零,并将readIsZero
标志设置为FALSE
,确保位置数据的初始化。
IF (readIsZero = TRUE) THEN
PositionDisplayX := PositionDisplayY := PositionDisplayZ := PositionDisplayA := PositionDisplayB := PositionDisplayC :=
PositionDisplayA1 := PositionDisplayA2 := PositionDisplayA3 := PositionDisplayA4 := PositionDisplayA5 := PositionDisplayA6 :=
Fx := Fy := Fz := Mx := My := Mz := 0;
readIsZero := FALSE;
END_IF;
4. 机器人控制字的定义
该部分是控制KUKA机器人的指令。kukaControl
数组用来发送机器人控制信号,比如启动程序、驱动使能等。
(*#############################2.机器人控制字######################################*)
kukaControl[0].8 := OUTflag_PROG_VALID; // 程序有效标志
kukaControl[0].9 := OUTflag_EXT_START; // 外部启动
kukaControl[0].10 := OUTflag_MOVE_ENABLE; // 移动使能
kukaControl[0].11 := OUTflag_CONF_MESS; // 确认信息
kukaControl[0].12 := OUTflag_DIVERS_OFF; // 设备关闭标志
kukaControl[0].13 := OUTflag_DRIVES_ON; // 驱动开启标志
kukaControl[0].14 := OUTflag_I_O_ACT; // I/O激活标志
kukaControl[0].15 := OUTflag_STARTREAD; // 读取启动
(* 测试中断程序实现 *)
kukaControl[1].0 := OUTflag_TEST_INTERRUPT;
IF(OUTflag_TEST_INTERRUPT = TRUE) THEN
OUTflag_TEST_INTERRUPT := FALSE;
END_IF;
程序编号控制:使用ProgNum
变量来选择和控制程序编号。
// ProgNum程序编号选择
kukaControl[0].0 := ProgNum.0;
kukaControl[0].1 := ProgNum.1;
kukaControl[0].2 := ProgNum.2;
kukaControl[0].3 := ProgNum.3;
kukaControl[0].4 := ProgNum.4;
kukaControl[0].5 := ProgNum.5;
kukaControl[0].6 := ProgNum.6;
kukaControl[0].7 := ProgNum.7;
5. 外部自动控制
该部分处理外部自动模式的控制逻辑,并确保I/O使能以及程序的启动。
(* 外部自动 *)
OUTflag_I_O_ACT := TRUE;
IF (OUTflag_DIVERS_OFF = FALSE) THEN
OUTflag_DIVERS_OFF := TRUE; // 关闭设备
END_IF;
OUTflag_MOVE_ENABLE := TRUE; // 移动使能
// 如果程序激活,开始读取
IF (INflag_PRO_ACT = TRUE) THEN
OUTflag_STARTREAD := TRUE;
Indicate_Runing := TRUE;
ELSE
OUTflag_STARTREAD := FALSE;
END_IF;
6. 程序有效性与确认
当FlagStartEXT
为TRUE
时,表示需要启动程序,并通过一系列计时器和标志位来处理外部启动和驱动的激活。
// 外部启动逻辑
IF(FlagStartEXT = TRUE) THEN
timer[13](IN := TRUE, PT := T#0.5S);
IF(timer[13].Q = TRUE AND OUTflag_DIVERS_OFF = TRUE) THEN
OUTflag_DRIVES_ON := TRUE;
timer[14](IN := TRUE, PT := T#0.5S);
IF(timer[14].Q = TRUE AND INflag_PERI_RDY = TRUE AND INflag_I_O_AVTCONF = TRUE) THEN
OUTflag_DRIVES_ON := FALSE;
OUTflag_CONF_MESS := TRUE;
timer[15](IN := TRUE, PT := T#0.5S);
IF(timer[15].Q = TRUE AND INflag_STOP_MESS = FALSE) THEN
OUTflag_CONF_MESS := FALSE;
OUTflag_EXT_START := TRUE;
timer[16](IN := TRUE, PT := T#0.5S);
IF(timer[16].Q = TRUE) THEN
IF(INflag_PRO_ACT = TRUE AND INflag_PGNO_REQ = TRUE) THEN
OUTflag_EXT_START := FALSE;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
7. 急停后的重启逻辑
在机器人急停后,这段代码处理重新启动的逻辑,确保机器人驱动能够重新开启并继续执行任务。
// 路径保持急停后的重新启动
IF (INflag_EXT = TRUE AND INflag_ON_PATH = TRUE AND INflag_ALARM_STOP = TRUE) THEN
IF (STOP_RESTART = TRUE) THEN
OUTflag_DRIVES_ON := TRUE;
timer[19](IN := TRUE, PT := T#0.5S);
IF (timer[19].Q = TRUE AND INflag_PERI_RDY = TRUE) THEN
OUTflag_DRIVES_ON := FALSE;
OUTflag_CONF_MESS := TRUE;
timer[20](IN := TRUE, PT := T#0.5S);
IF (timer[20].Q = TRUE) THEN
OUTflag_CONF_MESS := FALSE;
OUTflag_EXT_START := TRUE;
END_IF;
END_IF;
END_IF;
END_IF;
原文地址:https://blog.csdn.net/weixin_56773716/article/details/143084215
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!