自学内容网 自学内容网

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. 程序有效性与确认

        当FlagStartEXTTRUE时,表示需要启动程序,并通过一系列计时器和标志位来处理外部启动和驱动的激活。

// 外部启动逻辑
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)!