当前位置: 首页 > news >正文

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) THENPositionDisplayX := 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) THENOUTflag_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) THENOUTflag_DIVERS_OFF := TRUE;  // 关闭设备
END_IF;OUTflag_MOVE_ENABLE := TRUE;  // 移动使能// 如果程序激活,开始读取
IF (INflag_PRO_ACT = TRUE) THENOUTflag_STARTREAD := TRUE;Indicate_Runing := TRUE;
ELSEOUTflag_STARTREAD := FALSE;
END_IF;

6. 程序有效性与确认

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

// 外部启动逻辑
IF(FlagStartEXT = TRUE) THENtimer[13](IN := TRUE, PT := T#0.5S);IF(timer[13].Q = TRUE AND OUTflag_DIVERS_OFF = TRUE) THENOUTflag_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) THENOUTflag_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) THENOUTflag_CONF_MESS := FALSE;OUTflag_EXT_START := TRUE;timer[16](IN := TRUE, PT := T#0.5S);IF(timer[16].Q = TRUE) THENIF(INflag_PRO_ACT = TRUE AND INflag_PGNO_REQ = TRUE) THENOUTflag_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) THENIF (STOP_RESTART = TRUE) THENOUTflag_DRIVES_ON := TRUE;timer[19](IN := TRUE, PT := T#0.5S);IF (timer[19].Q = TRUE AND INflag_PERI_RDY = TRUE) THENOUTflag_DRIVES_ON := FALSE;OUTflag_CONF_MESS := TRUE;timer[20](IN := TRUE, PT := T#0.5S);IF (timer[20].Q = TRUE) THENOUTflag_CONF_MESS := FALSE;OUTflag_EXT_START := TRUE;END_IF;END_IF;END_IF;
END_IF;

http://www.mrgr.cn/news/54182.html

相关文章:

  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(3)
  • 科研进展 | RSE:全波形高光谱激光雷达数据Rclonte系列处理算法一
  • 通过OpenCV实现 Lucas-Kanade 算法
  • AI驱动的支持截图或线框图快速生成网页应用的开源项目
  • 贪心day3
  • 鹏哥C语言86-1---第14次作业:操作符的使用
  • 【动手学深度学习】8.3 语言模型(个人向笔记)
  • 计算机通信与网络实验笔记
  • FL Studio 2024 发布,添加 FL Cloud 插件、AI 等功能
  • NVIDIA NIM平台利用AI的功能,AI驱动知识问答助手的实现
  • 风速weibull分布随机风速生成【基础代码】
  • 【动手学深度学习】8.2. 文本预处理(个人向笔记)
  • 2024年-2025年Java毕业设计怎样选题?1000个计算机毕业热门选题推荐
  • llm-action,让天下没有难学的大模型
  • 同一个交换机不同vlan的设备为什么不能通信
  • 如何用代码将网页打开
  • 2024年第四届“网鼎杯”网络安全大赛-赛前模拟训练
  • 空开老化损坏更换
  • MatLab Desired port was :31515解决方案
  • 关于串口中断时的一些问题
  • C++ Socket通讯连接Server,并可设置连接超时时间
  • 2060:【例1.1】计算机输出
  • 【Java】—一篇搞懂POJO和VO、BO、DTO、PO模型
  • 程序员是否要考研?结合当前环境和形势的分析
  • linux线程 | 全面理解同步与互斥 | 同步
  • SpringBoot配置文件敏感信息如何加密?及踩坑总结(全面讲解)