• 沒有找到結果。

机器人编程 3

N/A
N/A
Protected

Academic year: 2022

Share "机器人编程 3"

Copied!
89
0
0

加載中.... (立即查看全文)

全文

(1)

发布日期 : 22.12.2011

版本 : P3KSS8 Roboterprogrammierung 3 V1 zh

(2)

© 版权 2011

KUKA Roboter GmbH Zugspitzstraße 140 D-86165 Augsburg 德国

此文献或节选只有在征得库卡机器人集团公司明确同意的情况下才允许复制或对第三方开放。

除了本文献中说明的功能外,控制系统还可能具有其他功能。 但是在新供货或进行维修时,无权要 求库卡公司提供这些功能。

我们已就印刷品的内容与描述的硬件和软件内容是否一致进行了校对。 但是不排除有不一致的情况,

我们对此不承担责任。 但是我们定期校对印刷品的内容,并在之后的版本中作必要的更改。

我们保留在不影响功能的情况下进行技术更改的权利。

本文件为原版文件的翻译。

KIM-PS5-DOC

Publication: Pub COLLEGE P3KSS8 Roboterprogrammierung 3 (PDF-COL) zh Bookstructure: P3KSS8 Roboterprogrammierung 3 V1.1

版本 : P3KSS8 Roboterprogrammierung 3 V1 zh

(3)

2 SUBMIT 解释器 ... 13

2.1 使用 SUBMIT 解释器 ... 13

3 KRL 工作空间 ... 17

3.1 使用工作空间 ... 17

3.2 练习: 工作空间监控 ... 26

4 用 KRL 进行信息编程 ... 29

4.1 用户自定义信息提示概述 ... 29

4.2 提示信息方面的工作 ... 36

4.3 练习: 给提示信息编程 ... 37

4.4 状态信息方面的工作 ... 38

4.5 练习: 给状态信息编程 ... 39

4.6 确认信息方面的工作 ... 40

4.7 给确认信息编程练习 ... 41

4.8 等待信息方面的工作 ... 42

4.9 练习: 给等待信息编程 ... 43

4.10 对话信息方面的工作 ... 44

4.11 给对话编程练习 ... 47

5 中断编程 ... 49

5.1 给中断例程编程 ... 49

5.2 练习: 中断方面的工作 ... 57

5.3 练习: 用中断来取消运行 ... 59

6 给撤回策略编程 ... 61

6.1 给撤回策略编程 ... 61

6.2 练习: 给撤回策略编程 ... 62

7 模拟信号方面的工作 ... 65

7.1 给模拟输入端编程 ... 65

7.2 给模拟输出端编程 ... 67

7.3 练习: 有关模拟输入 / 输出端方面的工作 ... 69

8 外部自动运行模式的过程和配置 ... 71

8.1 配置并采用外部自动运行 ... 71

8.2 练习: 外部自动运行 ... 79

9 给碰撞识别编程 ... 81

9.1 给具有碰撞识别的运动编程 ... 81

索引 ... 87

(4)
(5)

以清晰易懂的方式展示基本方法 (无需深度编程知识)

提高维护、修改和扩展程序的效率 前瞻性程序规划可:

使复杂的任务得以分解成几个简单的分步任务

降低编程时的总耗时

使相同性能的组成部分得以更换

单独开发各组成部分

对一个机器人程序的 6 个要求:

1. 高效 2. 无误 3. 易懂 4. 维护简便 5. 清晰明了

6. 具有良好的经济效益

1.2 创建结构化机器人程序的辅助工具

注释有什么用处? 注释是在编程语言中补充 / 说明的部分。 所有编程语言都由计算机指令 (代 码)和对文本编辑器的提示 (注释)组成。 如果进一步处理源程序 (编译、

解释等)时,处理软件则会忽略注释,因此不会影响结果。

在 KUKA 控制器中使用行注释,即注释在行尾自动结束。

单凭注释无法使程序可读,但它可以提高结构分明的程序的可读性。 程序员可 通过注释在程序中添加说明、解释,而控制器不会将其理解为句法。

程序员负责使注释内容与编程指令的当前状态一致。 因此在更改程序时还必须 检查注释,并在必要时加以调整。

注释的内容以及其用途可由编辑人员任意选择,没有严格规定的句法。 通常以

“ 人类 ” 语言书写注释,或使用作者的母语或常用语言。

对程序内容或功能的说明

内容和用途可任意选择

改善程序的可读性

有利于程序结构化

注释的时效性由程序员负责

KUKA 使用行注释

控制器不会将注释理解为句法 在什么时候和什么

地方使用注释?

关于整个源程序的信息:

作者可在源程序开头处写上引言,包括作者说明、授权、创建日期、出现疑问 时的联系地址以及所需其它文件的列表等等。

(6)

源程序的分段:

标题和段落可以这样标出。在此通常不仅会使用语言表达方式,而且还使用可 由文字转换为图形的方式。

单行的说明:

这样可以说明文本段 (例如程序行)的工作原理或含义,以便于其他人或作 者本人以后理解。

对需执行的工作的说明:

注释可以标记不完整的代码段,或者标记完全没有代码段的通配符。

变为注释:

DEF PICK_CUBE()

; 该程序将方块从库中取出

; 作者: Max Mustermann

; 创建日期:2011.08.09 INI

...

END

DEF PALLETIZE()

;*****************************************************

;* 该程序将 16 个方块堆垛在工作台上 *

;* 作者: Max Mustermann---*

;* 创建日期: 2011.08.09---*

;*****************************************************

INI ...

;--- 位置的计算 --- ...

;---16 个方块的堆垛 --- ...

;---16 个方块的卸垛 --- ...

END

DEF PICK_CUBE() INI

PTP HOME Vel=100% DEFAULT PTP Pre_Pos ; 驶至抓取预备位置 LIN Grip_Pos ; 驶至方块抓取位置 ...

END

DEF PICK_CUBE() INI

; 此处还必须插入货盘位置的计算!

PTP HOME Vel=100% DEFAULT PTP Pre_Pos ; 驶至抓取预备位置 LIN Grip_Pos ; 驶至方块抓取位置

; 此处尚缺少抓爪的关闭 END

(7)

在机器人程序中使 用 FOLD 有什么作 用?

在 FOLD 里可以隐藏程序段

FOLD 的内容对用户来说是不可见的

FOLD 的内容完全如通常情况在程序运行流程中得到处理

通过使用 Fold 可改善程序的可读性 Fold 应用示例有哪

些?

在 KUKA 控制器上通常由系统使用准备好的 Fold,例如在显示联机表单时。

这些 Fold 使联机表单中输入的值更为简洁明了,并为操作人员隐藏无关的程 序段。

除此之外,用户 (专家用户组以上)还可以创建自己的 Fold。这些 Fold 例如 可以由程序员使用,使用时虽然可以通知操作人员在程序的一定位置处发生的 事件,但在后台仍保持实际的 KRL 句法。

Fold 通常在创建后首先显示成关闭状态。

;CUBE_TO_TABLE() CUBE_TO_MAGAZINE() END

DEF Main() ...

INI ; KUKA FOLD 关闭 SET_EA ; 由用户建立的 FOLD 关闭 PTP HOME Vel=100% DEFAULT ; KUKA FOLD 关闭 PTP P1 CONT Vel=100% TOOL[2]:Gripper BASE[2]:Table ...PTP HOME Vel=100% Default

END DEF Main() ...

INI ; KUKA FOLD 关闭 SET_EA ; 由用户建立的 FOLD 打开

$OUT[12]=TRUE

$OUT[102]=FALSE PART=0

Position=0

PTP HOME Vel=100% DEFAULT ; KUKA FOLD 关闭 ...PTP P1 CONT Vel=100% TOOL[2]:Gripper BASE[2]:Table PTP HOME Vel=100% Default

END

(8)

为什么要使用子程 序技术进行工作?

在编程中,子程序主要用于实现相同任务部分的多次使用,从而避免程序码重 复。 另外,采用子程序后也可节省存储空间。

使用子程序的另一个重要原因是由此会使程序结构化。

子程序应该能够完成包含在自身内部并可解释详明的分步任务。

子程序现在主要是通过其简洁明了、条理清晰的特点而使得维护和排除程序错 误更为方便,因为现代计算机内部用于调用子程序的时间和管理成本实际上已 经无足轻重了。

可以多次使用

避免程序码重复

节省存储空间

各组成部分可单独开发

随时可以更换具有相同性能的组成部分

使程序结构化

将总任务分解成分步任务

维护和排除程序错误更为方便 子程序的应用

指令行的缩进有什 么作用?

为了便于说明程序模块之间的关系,建议在程序文本中缩进嵌套的指令列,并 一行紧挨一行地写入嵌套深度相同的指令。

DEF Main() ...

INI ; KUKA FOLD 关闭 SET_EA ; 由用户建立的 FOLD 关闭 PTP HOME Vel=100% DEFAULT ; KUKA FOLD 打开

$BWDSSTART=FALSE PDAT_ACT=PDEFAULT FDAT_ACT=FHOME BAS(#PTP_PARAMS,100)

$H_POS=XHOME PTP XHOME ...

PTP P1 CONT Vel=100% TOOL[2]:Gripper BASE[2]:Table PTP HOME Vel=100% Default

END

DEF MAIN() INI LOOP

GET_PEN() PAINT_PATH() PEN_BACK() GET_PLATE() GLUE_PLATE() PLATE_BACK() IF $IN[1] THEN EXIT ENDIF ENDLOOP END

(9)

合理命名的数据名 称有什么作用?

为了能够正确解释机器人程序中的数据和信号函数,应在为其命名时使用意义 明确的概念。 其中包括:

输入和输出信号的长文本名称

工具与基坐标的名称

输入和输出的信号协定

点的名称

1.3 如何创建程序流程图

什么是程序流程图 (PAP)?

程序流程图 (PAP) 是一个程序的流程图,也称为程序结构图。 它是在一个程 序中执行某一算法的图示,描述了为解决一个课题所要进行的运算之顺序。 程 序流程图中所用的图标在 DIN 66001 标准中作了规定。 程序流程图也常常用 于图示过程和操作,与计算机程序无关。

与基于代码的描述相比,提高了程序算法的易读性,因为通过图示可明显地便 于识别结构。

以后转换成程序代码时可方便地避免结构和编程错误,因为使用正确的程序流 程图 PAP 时可直接转换成程序代码。 同时,创建程序流程图时将得到一份待 编制程序的文献。

用于程序流程结构化的工具

程序流程更加易读

结构错误更加易于识别

同时生成程序的文献

程序流程图图标 一个过程或程序的开始或结束

指令与运算的连接

if 分支

PTP XP5 ENDFOR ...ENDLOOP

图  1-1

图  1-2

(10)

程序代码中的一般指令

子程序调用

输入 / 输出指令 图  1-3

图  1-4

图  1-5

图  1-6

(11)

如何创建程序流程 图

用户总是希望问题会逐步得到细化,直至制定出的组成部分清楚到可以转换成 KRL 程序。

在依次逐步开发的过程中出现的设计方案会不断地深化细节。

1. 在约 1 至 2 页的纸上将整个流程大致地划分 2. 将总任务划分成小的分步任务

3. 大致划分分步任务 4. 细分分步任务 5. 转换成 KRL 码 图  1-7

(12)
(13)

控制解释器 (运行一个并行控制程序)

程序 SPS.SUB 的结构

SUBMIT 解释器的状态

控制解释器

可自动或手动启动

可手动停止或反选

可承担机器人环境的操作和控制任务

默认情况下以名称 SPS.sub 建立在目录 R1/SYSTEM 下

可用 KRL 指令语句编程

不能处理与机器人运动有关的 KRL 指令

允许附加轴的异步运动

可对系统变量进行读写访问

可对输入 / 输出端进行读写访问 给 SUBMIT 解释器

编程时的关联

自动启动 SUBMIT 解释器

SUBMIT 解释器在机器人控制系统接通时自动启动

启动的是在 KRC/STEU/MADA/$custom.dat 文件中定义的程序

1 DEF SPS ( ) 2 DECLARATIONS 3 INI

4 5 LOOP

6 WAIT FOR NOT($POWER_FAIL) 7 TORQUE_MONITORING() 8

9 USER PLC 10 ENDLOOP

SUBMIT 解释器正在运

行 SUBMIT 解释器停止 反选了 SUBMIT 解释

注意!SUBMIT 解释器不能用于对时间要求严格的应用场合! 对这类情况必须采用 PLC。 原因:

SUBMIT 解释器与机器人解释器和 I/O 管理器共享系统功率,其中,机器 人解释器和 I/O 管理器具有更高的优先级。 因此,SUBMIT 解释器不会定 期在机器人控制系统的 12 ms 插值周期内连续运行。

此外,SUBMIT 解释器的运行时间也无规律可循。 SUBMIT 解释器的运 行时间受 SUB 程序行数的影响。 注释行和空行对此也有影响。

(14)

手动操作 SUBMIT 解释器

通过菜单序列配置 > SUBMIT 解释器 > 启动 / 选择选择操作。

通过状态显示 SUBMIT 解释器中的状态栏直接操作。 触摸时将打开一 个含有可执行选项的窗口。

给 SUBMIT 解释器编程时的特点

不能执行任何机器人运动指令,如

PTP、 LIN、 CIRC 等等

包含机器人运动的子程序调用

针对机器人运动的指令, TRIGGER 或 BRAKE

可控制异步轴,如 E1

位于 LOOP 和 ENDLOOP 行之间的指令始终在 “ 后台 ” 处理

要避免由等待指令或等待循环造成任何会进一步推迟处理 SUBMIT 解释器 的停止

可切换输出端

给 SUBMIT 解释器 编程时的操作步骤

1. 在停止或反选的状态编程

2. 标准程序 SPS.sub 被载入编辑器

3. 执行必要的声明和初始化。 为此应使用准备好的 Fold 4. 在 Fold USER PLC 中扩展程序

5. 关闭并保存 SUBMIT 解释器

6. 如果不能自动提交 (Submit),则手动启动

$PRO_I_O[]="/R1/SPS()"

如果一个诸如 $config.dat 或 $custom.dat 的系统文件被改动因而出错,则 SUBMIT 解释器将被自动反选。 纠正了系统文件中的错误后,必须再手动选 择 SUBMIT 解释器。

IF (($IN[12] == TRUE) AND ( NOT $IN[13] == TRUE)) THEN ASYPTP {E1 45}

...

IF ((NOT $IN[12] == TRUE) AND ($IN[13] == TRUE)) THEN ASYPTP {E1 0}

警告!对机器人解释器与 SUBMIT 解释器是否同时访问同一个输出端不予检查,因 为在某些情况下可能希望如此。

因此,用户必须仔细检查输出端的分配。 否则可能会在例如安全装置处出现 意外的输出信号。 会造成死亡、重伤或巨大的财产损失。

在测试运行方式下,不能从 SUBMIT 解释器写入 $OV_PRO,

因为对于在工业机器人处工作的用户来说,这种变化可能是意 想不到的。 可能会造成人员死亡、严重身体伤害或巨大的财产损失。

警告!尽量避免通过 SUBMIT 解释器更改与安全相关的信号和变量 (例如:运行方 式、紧急停止、保护门触点)。

如需进行更改,则在连接所有与安全有关的信号和变量时必须使其不会由 SUBMIT 解释器或 PLC 引致威胁安全的状态。

(15)

...

USER PLC

IF ($TIMER[32]>500) AND (flash==FALSE) THEN flash=TRUE

ENDIF

IF $TIMER[32]>1000 THEN flash=FALSE

$TIMER[32]=0 ENDIF

; 分配给一个灯 (输出端 99)

$OUT[99] = flash ...ENDLOOP

(16)
(17)

SafeOperation 设置

用 KUKA 系统软件 8.x 可为机器人配置工作空间。 这些工作空间只用于保 护设备。

非安全性工作空间

这些非安全性工作空间直接在 KUKA 系统软件中进行配置

最多可建立 8 个轴坐标工作空间

用轴坐标工作空间可以进一步限定由软件限位开关所确定的区域,以保护 机器人或工具和工件。

可建立 8 个笛卡尔工作空间 图  3-1: 示例:A1 轴相关的工作空间

(18)

在笛卡尔工作空间中,仅 TCP 的位置受到监控。 无法监控机器人的其它 部件是否超出工作空间

为了形成复杂的形状,可激活多个工作空间,并且这些工作空间可以相互 重叠

不允许的空间: 只允许机器人在此类空间之外运动 图  3-2: 笛卡尔工作空间举例

图  3-3: 不允许的空间

(19)

机器人超出工作空间时会有何种反应出现,则取决于其配置情况

每个工作空间可发出一个输出信号 工作空间锁定和工

作空间的原理

工作空间锁定

直接耦合 (无 PLC)时的过程

使用一个 PLC 时的过程; PLC 只能传递信号或额外采用逻辑控制 图  3-4: 允许的空间

图  3-6

(20)

直接传递信号 (采用 PLC 时: 无逻辑控制)

无等待时间: 有进入要求时,如果相关区域未锁闭,则机器人允许立 即进入该区域。

有监控时间: 提出进入要求时,将自己的区域锁闭。 在经过了一段监 控时间后才检查新的区域。 如果相关区域未锁闭,则机器人允许立即 进入该区域。 如果两个要求几乎同时提出,则锁闭区域。

带逻辑控制 (优先级)的信号传递

进入要求与进入许可通过逻辑彼此相联。 当同时出现进入要求时,优 先级控制也负责控制允许哪个机器人进入共同的工作区域。

除了优先级控制外,还可为进入许可检查机器人 (机器人 TCP)是否 在工作区域内。 为此须定义工作空间。

工作空间配置原理 工作空间模式

#OFF

工作空间监控已关闭。

#INSIDE

笛卡尔工作空间: 当 TCP 或法兰位于工作空间内时,给定义的输出端 赋值。

轴坐标工作空间: 当轴位于工作空间内时,给定义的输出端赋值。

#OUTSIDE

笛卡尔工作空间: 当 TCP 或法兰位于工作空间外时,给定义的输出端 赋值。

轴坐标工作空间: 当轴位于工作空间外时,给定义的输出端赋值。

#INSIDE_STOP

笛卡尔工作空间: 当 TCP、法兰或腕点位于工作空间内时,设置定义 的输出端。 (腕点 = 轴 A5 的中点)

轴坐标工作空间: 当轴位于工作空间内时,给定义的输出端赋值。

另外还停住机器人,并显示信息提示。 只有在关闭或桥接了工作空间监控 之后,机器人才可重新运行。

图  3-10

但如果两个机器人同时都收到了进入要求并得到进入许可,则 一般情况下也可能引起碰撞。

(21)

工作空间的尺寸 (以原点为出发点)

配置和使用工作空 间时的操作步骤

配置轴坐标工作空间

1. 在主菜单中选择配置 > 其它 (或工具) > 工作空间监控 > 配置。

笛卡尔工作空间窗口打开。

2. 按轴坐标,以切换至轴坐标工作空间。

图  3-13: 笛卡尔工作空间,原点 U

图  3-14: 笛卡尔工作空间,尺寸

(22)

3. 输入值并按保存键。

4. 按信号键。 信号窗口打开。

图  3-15: 示例:A1 轴相关的工作空间

图  3-16: 轴坐标工作空间举例

(23)

如果在超出工作空间时不应给输出端赋值,则必须输入 FALSE。

5. 在轴坐标组中: 在工作空间编号处输入当超出工作空间时应赋值的输出 端。

6. 按保存键。

7. 关闭窗口。

配置笛卡尔工作空间

1. 在主菜单中选择配置 > 其它 (或工具) > 工作空间监控 > 配置。

笛卡尔工作空间窗口打开。

2. 输入值并按保存键。

3. 按信号键。 信号窗口打开。

4. 在笛卡尔组中: 在工作空间编号处输入当超出工作空间时应赋值的输出 端。

5. 按保存键。

6. 关闭窗口。

笛卡尔工作空间举例

如果点 “P2” 位于工作空间的原点,则只需确定 “P1” 的坐标。

图  3-17: 工作空间信号

项号 说明

1 笛卡尔工作空间的监控输出端 2 轴坐标工作空间的监控输出端

(24)

在此示例中,工作空间的尺寸为 x=300mm,y=250mm,z=450mm。 相 对世界坐标系,该空间的 Y 轴转过 30 度。 原点 “U” 非长方体的中心。

图  3-18: 笛卡尔工作空间举例 (P2 位于原点)

图  3-19: 笛卡尔工作空间配置举例 (P2 位于原点)

(25)

有关工作空间的工作

轴坐标工作空间 (R1\Mada\$machine.dat)

笛卡尔工作空间 (STEU\Mada\$custom.dat)

工作空间信号 (STEU\Mada\$machine.dat) 图  3-20: 笛卡尔工作空间 (转过了一定角度)举例

图  3-21: 笛卡尔工作空间 (转过了一定角度)配置举例

DEFDAT $MACHINE PUBLIC ...

$AXWORKSPACE[1]={A1_N 0.0,A1_P 0.0,A2_N 0.0,A2_P 0.0,A3_N 0.0,A3_P 0.0,A4_N 0.0,A4_P 0.0,A5_N 0.0,A5_P 0.0,A6_N 0.0,A6_P 0.0,E1_N 0.0,E1_P 0.0,E2_N 0.0,E2_P 0.0,E3_N 0.0,E3_P 0.0,E4_N 0.0,E4_P 0.0,E5_N 0.0,E5_P 0.0,E6_N 0.0,E6_P 0.0,MODE #OFF}

$AXWORKSPACE[2]={A1_N 45.0,A1_P 160.0,A2_N 0.0,A2_P 0.0,A3_N 0.0,A3_P 0.0,A4_N 0.0,A4_P 0.0,A5_N 0.0,A5_P 0.0,A6_N 0.0,A6_P 0.0,E1_N 0.0,E1_P 0.0,E2_N 0.0,E2_P 0.0,E3_N 0.0,E3_P 0.0,E4_N 0.0,E4_P 0.0,E5_N 0.0,E5_P 0.0,E6_N 0.0,E6_P 0.0,MODE #INSIDE_STOP}

DEFDAT $CUSTOM PUBLIC ...

$WORKSPACE[1]={X 400.0,Y -100.0,Z 1200.0,A 0.0,B 30.0,C 0.0,X1 250.0,Y1 150.0,Z1 200.0,X2 -50.0,Y2 -100.0,Z2 -250.0,MODE #OUTSIDE}

$WORKSPACE[2]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0,X1 0.0,Y1 0.0,Z1 0.0,X2 0.0,Y2 0.0,Z2 0.0,MODE #OFF}

(26)

用 KRL 开、关工作空间

3.2 练习: 工作空间监控

练习目的 成功完成此练习后,您可执行下列操作:

工作空间的配置

使用与工作空间有关的各种模式

桥接工作空间监控

前提 为成功完成此练习,必须满足以下前提条件:

具有有关工作空间监控的理论知识

练习内容 分步任务 1

1. 将工作空间 1 配置成边长 200 mm 的正方体。

2. 在进入该区域时发送一个信号。 为此请使用输出端 14.

3. 将工作空间 2 配置成边长 200 mm 的正方体。

4. 在离开该区域时发送一个信号。 为此请使用输出端 15.

5. 测试这两个工作空间并将 (得到的)信息与操作台上的显示进行比较

分步任务 2

1. 将工作空间 3 配置成边长为 400 mm 和 200 mm 的长方体。

2. 请锁闭该工作空间,禁止进入,并发送一个信号。 为此请使用输出端 16。

3. 测试该工作空间并将 (得到的)信息与操作台上的显示进行比较。

4. 为离开该工作空间,使用预设的菜单项将其桥接

DEFDAT $MACHINE PUBLIC ...

SIGNAL $WORKSTATE1 $OUT[912]

SIGNAL $WORKSTATE2 $OUT[915]

SIGNAL $WORKSTATE3 $OUT[921]

SIGNAL $WORKSTATE4 FALSE ...

SIGNAL $AXWORKSTATE1 $OUT[712]

SIGNAL $AXWORKSTATE2 $OUT[713]

SIGNAL $AXWORKSTATE3 FALSE

DEF myprog( ) ...

$WORKSPACE[3].MODE = #INSIDE ...

$WORKSPACE[3].MODE = #OFF ...

$AXWORKSPACE[1].MODE = #OUTSIDE_STOP ...

$AXWORKSPACE[1].MODE = #OFF

图  3-22

(27)

现在您应能回答以下问题:

1. 最多可配置多少个工作空间?

. . . . . . 2. 配置工作空间时在模式 (MODE) 方面有哪些设定选项?

. . . . . . 3. 在配置笛卡尔工作空间时原点 (URSPRUNG) 以哪一坐标系为参照?

. . . . . . 4. 一个通过直接输入 / 输出耦合和监控时间实现的机器人闭锁有哪些优点?

. . . . . . 5. 如果无监控时间,上述情况 (第 4 个问题)中有哪些缺点?

. . . . . . 图  3-23

(28)
(29)

同时可生成多条信息提示

生成的信息提示保存在一个信息缓存器中,直至它们重又被删除为止

提示信息不在信息缓存器中管理。 (“fire and forget” 原则,即指发出消息 后,不再去处理与该消息相关的操作)

可简便地检查或删除信息提示,但提示信息除外

每条信息提示中可集入 3 个参数

在 KUKA.HMI 的信息窗口中对每一条信息提示均显示一个相应的图标。 图标 与信息提示类型固定对应,无法由程序员改变。

可对下列类型的信息提示进行编程:

信息提示的生成、删除或检验通过预先编制的 KUKA 标准函数进行。 为此需 要各种变量。

信息编程的函数

生成信息提示

检查信息提示

删除信息提示

生成对话

检查对话 信息编程的复杂变量

发送人、信息号、信息文本的结构

用于 3 个可能参数的通配符式结构

通用信息提示特性的结构

对话信息中按键标注结构

图标 类型

确认信息

状态信息 提示信息

等待信息

对话信息 (显示在一个独自的弹出式窗口中)

对机器人系统针对各种信息提示类型应有的反应未做规定 (例如机 器人制动或暂停程序运行)。 必须对所需的反应进行编程。

(30)

用户自定义的信息 编程原理 变量 / 结 构

发送人、信息号、信息文本的结构

预定义的 KUKA 结构: KrlMsg_T

发送人: Modul[ ]"College" (模块 [ ]“ 库卡学院 ”)

最多 24 个字符

显示时发送的文字由系统置于 “< >” 中

信息号: Nr 1906 ( 第 1906 号 )

可自由选择的整数

双重选择的编号不被识别

信息文本: Msg_txt[ ]“My first Message” (我的第一条消息)

最多 80 个字符

文字显示在信息提示的第二行 发送信息提示时必须选择信息提示类型:

枚举数据类型 EKrlMsgType

#Quit: 将该信息提示作为确认信息发出

#STATE: 将该信息提示作为状态信息发出

#NOTIFY: 将该信息提示作为提示信息发出

#WAITING: 将该信息提示作为等待信息发出

在一条信息文本中应显示一个变量的值。 例如应显示当前件数。 为此,在信息 文本中需要使用所谓的通配符。 通配符的数量最多为 3 个。用 %1、 %2 和 %3 表示。

因此,需要 3 组参数。 每组参数由 KUKA 结构 KrlMsgPar_T 构成:

图  4-1: 提示信息

STRUC KrlMsg_T CHAR Modul[24], INT Nr, CHAR Msg_txt[80]

DECL KrlMsg_T mymessage

mymessage = {Modul[ ] "College", Nr 1906, Msg_txt[ ] "My first Message"}

ENUM EKrlMsgType Notify, State, Quit, Waiting

(31)

#KEY: 该参数是一个为载入相应的文本用于在信息提示数据库中进行 查找的关键词

#EMPTY: 参数是空的

Par_txt[26]: 参数的文字或关键词

Par_Int: 将一个整数值作为参数传递

Par_Real: 将一个实数值作为参数传递

Par_Bool: 将一个布尔值作为参数传递,显示的文字为 TRUE 或 FALSE 将参数直接代入通配符的程序举例

信息文本为 Msg_txt[ ] "Stoerung am %1" (%1 处出现故障)

信息提示输出: Stoerung am Greifer (抓爪处出现故障)

加点号将参数代入通配符的程序举例

信息文本为 Msg_txt[ ] "Es fehlen %1 Bauteile"(缺少 %1 个构件)

信息提示输出: 缺少 13 个构件

DECL KrlMsgPar_T Parameter[3] ; 建立 3 组参数 ...Parameter[1] = {Par_Type #VALUE, Par_txt[ ] "Finisher"}

Parameter[2] = {Par_Type #EMPTY}

Parameter[3] = {Par_Type #EMPTY}

...

由于参数极少通过输入常数生成,因此,加点号传递单个集合。

DECL KrlMsgPar_T Parameter[3] ; 建立 3 组参数 DECL INT missing_part

...missing_part = 13

...Parameter[1] = {Par_Type #VALUE}

Parameter[1].Par_Int = missing_part Parameter[2] = {Par_Type #EMPTY}

Parameter[3] = {Par_Type #EMPTY}

...

(32)

对话框中的按键配置结构:

预定义的 KUKA 结构: KrlMsgDlgSK_T

Sk_Type: 按键标注的形式

#VALUE: 参数直接以传递的形式代入信息文本中

#KEY: 该参数是一个为载入相应的文本用于在信息提示数据库中进行 查找的关键词

#EMPTY: 按键未配置

Sk_txt[ ]: 按键的文字或关键词 一个对话框的 7 个按键标注程序举例

在生成一条信息提示或对话时还将传递 4 种信息提示选项。 用这些选项可对预 进、信息提示的删除和 Log 数据库发生影响。

通用信息提示选项的结构

预定义的 KUKA 结构: KrlMsgOpt_T

VL_Stop: TRUE 触发一次预进停止 缺省值: TRUE

图  4-2: 对话信息

Enum KrlMsgParType_T Value, Key, Empty

Struc KrlMsgDlgSK_T KrlMsgParType_T Sk_Type, Char SK_txt[10]

DECL KRLMSGDLGSK_T Softkey[7] ; 准备 7 个可能的软键 ...softkey[1]={sk_type #value, sk_txt[] "key1"}

softkey[2]={sk_type #value, sk_txt[] "key2"}

softkey[3]={sk_type #value, sk_txt[] "key3"}

softkey[4]={sk_type #value, sk_txt[] "key4"}

softkey[5]={sk_type #value, sk_txt[] "key5"}

softkey[6]={sk_type #value, sk_txt[] "key6"}

softkey[7]={sk_type #value, sk_txt[] "key7"}

...

每个按键最多可配上 10 个字符。 按键可有不同的宽度,视所用的字 符而定。

STRUC KrlMsgOpt_T BOOL VL_Stop, BOOL Clear_P_Reset, BOOL Clear_SAW, BOOL Log_To_DB

(33)

缺省值: FALSE

Log_To_DB: TRUE 使该信息提示记录在 Log 数据库中

缺省值: FALSE 用户自定义的信息

提示编程原理 功能

设置、检验和删除一条信息提示

设置或生成一条信息提示

用该功能可在 KRL 程序中设置一条信息提示。 也就是说,将相应的信息 提示加入内部信息缓存器中。 例外情况是,提示信息不在信息缓存器中管 理。

生成一条信息提示的內建函数 (build-in function)

Type (类型): 信息提示的种类 (#Notify, #State, #Quit, #Waiting)

MyMessage: 信息提示的一般信息 (发送人、信息号、信息文本)

Parameter[ ]: 通配符 %1、%2 和 %3 的 3 个可能参数 (即使不 用,也必须代入)

Option (选项): 一般信息提示选项 (预进停止、记录在信息提示 数据库中、程序复位或选择语句时连带删除信息提示)

函数的返回值: 称为 “ 句柄 ”(handle,也用作票号)。 用该句柄可检查 是否成功生成了信息提示,同时,句柄也用作信息缓存器中的识别 号。 这样便可检查或删除一条特定的信息提示。

handle == -1: 无法生成信息提示。 (例如因为信息缓存器已过 满。)

handle > 0: 信息提示已成功生成并以相应的识别号保存在信息 缓存器中管理。

信息提示检验

用该功能可检查一条带有定义句柄的特定信息提示是否还存在。 即检查该 信息提示是否还在信息缓存器中。

用于检查一条信息提示的內建函数 (build-in function)

DEFFCT INT Set_KrlMsg(Type:IN, MyMessage:OUT, Parameter[ ]:OUT, Option:OUT)

DECL EKrlMsgType Type DECL KrlMsg_T MyMessage DECL KrlMsgPar_T Parameter[ ] DECL KrlMsgOpt_T Option

DEF MyProg( ) DECL INT handle ...

handle = Set_KrlMsg(Type, MyMessage, Parameter[ ], Option)

提示信息根据 “fire and forget” 原则 (指发出消息后,不再去处理与 该消息相关的操作)处理。 对提示信息来说,如果信息成功生成,则 始终返回一个 handle = 0。

DEFFCT BOOL Exists_KrlMsg(nHandle:IN) DECL INT nHandle

(34)

nHandle: 由函数 “Set_KrlMsg(…)” 提供的信息提示句柄

函数的返回值:

present == TRUE: 该信息提示还存在于信息缓存器中

present == FALSE: 该信息提示不再位于信息缓存器中 (即已 被确认或删除)

删除一条信息提示

用该功能可删除一条信息提示。 也就是说,将相应的信息提示从内部信息 缓存器中删除。

用于检查一条信息提示的內建函数 (build-in function)

nHandle: 由函数 “Set_KrlMsg(…)” 提供的信息提示句柄

函数的返回值:

erase == TRUE: 该信息提示已可删除

erase == FALSE: 该信息提示不可删除

用户自定义的对话 编程原理: 功能

设置并检验一则对话

设置或生成一则对话

用函数 Set_KrlDlg( ) 可生成一则对话信息。 这意味着,该信息提示被 传递到信息缓存器中并显示在单独的一个带有按键的信息提示窗口中。

生成一则对话的內建函数 (build-in function)

DEF MyProg( ) DECL INT handle DECL BOOL present ...

handle = Set_KrlMsg(Type, MyMessage, Parameter[ ], Option) ...

present= Exists_KrlMsg(handle)

DEFFCT BOOL Clear_KrlMsg(nHandle:IN) DECL INT nHandle

DEF MyProg( ) DECL INT handle DECL BOOL erase ...

handle = Set_KrlMsg(Type, MyMessage, Parameter[ ], Option) ...

erase = Clear_KrlMsg(handle)

用函数 Clear_KrlMsg(handle) 删除的特殊功能:

Clear_KrlMsg(-1): 删除所有由该过程引入的信息提示。

Clear_KrlMsg(-99): 删除所有引入的 KRL 用户信息提示。

DEFFCT Extfctp Int Set_KrlDlg (MyQuestion:OUT, Parameter[ ]:OUT, Button[ ]:OUT, Option:OUT)

DECL KrlMsg_T MyQuestion DECL KrlMsgPar_T Parameter[ ] DECL KrlMsgDlgSK_T Button[ ] DECL KrlMsgOpt_T Option

(35)

handle == -1: 不能生成对话 (例如因为另一则对话仍处于激活 状态、还未得到回答或信息缓存器已过满)

handle > 0: 对话已成功生成并以相应的识别号保存在信息缓存 器中管理。

检查对话

用函数 Exists_KrlDlg( ) 可检查一则特定的对话是否还存在。 即检查 该对话是否还在信息缓存器中。

用于检查一条信息提示的內建函数 (build-in function)

nHandle: 由函数 “Set_KrlDlg(…)” 提供的对话句柄

answer: 有关哪个按键被按动的反馈。 这样,被定义为 “Button[1]”

的按键 1 便返回值 1

函数的返回值:

present == TRUE: 该对话还存在于信息缓存器中

present == FALSE: 该对话不再位于信息缓存器中 (即已得到 回答)

DEF MyProg( ) DECL INT handle ...

handle = Set_KrlDlg(MyQuestion, Parameter[ ], Button[ ], Option)

只有当无其它对话存在时,才能生成一则对话。

用函数仅仅可生成对话。 但该函数不等到对话得到回答。

DEFFCT BOOL Exists_KrlDlg(INT nHandle:IN, INT Answer:OUT) DECL INT nHandle, answer

函数不等到对话得到回答,而是仅仅在缓存器中查找带有该句柄的对话。 因 此,KRL 程序中的询问必须循环进行,直至对话得到回答或被删除。

DEF MyProg( )

DECL INT handle, answer DECL BOOL noch_da ...

handle = Set_KrlDlg(MyQuestion, Parameter[ ], Button[ ], Option) ...

noch_da = Exists_KrlDlg(handle, answer)

answer (回答)现在以按下的按键的值返回写入。 有效值为 1 到 7,取决 于编程设定的按键号。

(36)

4.2 提示信息方面的工作 用户自定义的提示

信息说明

提示信息不在信息缓存器中管理

提示信息只能通过按键 “OK” 或 “ 全部 OK” 删除 用户自定义的提示

信息功能

提示信息适用于显示通用信息。

仅仅生成提示信息。 可能会检查信息提示是否成功到达。

由于对提示信息不进行管理,故可生成约 3 百万条信息提示 给用户自定义的提

示信息编程

1. 将主程序载入编辑器 2. 为以下对象声明工作变量:

发送人、信息号、信息文本 (自 KrlMsg_T)

具有 3 个用于参数的元素的数组 (自 KrlMsgPar_T)

通用信息提示选项 (自 KrlMsgOpt_T)

“ 句柄 ” (作为 INT)

3. 用所需的值对工作变量进行初始化 4. 给函数调用 Set_KrlMsg(…) 编程 5. 需要时分析 “ 句柄 ”,以确定是否成功生成 6. 关闭并保存主程序

上述显示的编程举例:

图  4-3: 提示信息

图  4-4: 提示信息

DECL KRLMSG_T mymessage DECL KRLMSGPAR_T Parameter[3]

DECL KRLMSGOPT_T Option DECL INT handle

...

mymessage={modul[] "College", Nr 1906, msg_txt[] "My first Message"}

Option= {VL_STOP FALSE, Clear_P_Reset TRUE, Clear_P_SAW FALSE, Log_to_DB TRUE}

; 通配符为空通配符 [1..3]

Parameter[1] = {Par_Type #EMPTY}

Parameter[2] = {Par_Type #EMPTY}

Parameter[3] = {Par_Type #EMPTY}

handle = Set_KrlMsg(#NOTIFY, mymessage, Parameter[ ], Option)

(37)

具有编程语言 KRL 的知识

具有给信息提示编程的理论知识 练习内容 分步任务 1: 提示信息

1. 创建一条含有以下文字的提示信息:“ 料库几乎空了,请补加料 ”。

2. 应借助操作台上的输入端 13 来显示这条信息提示。

3. 按规定测试您的程序。

分步任务 2: 带参数的提示信息

1. 创建一条含有以下文字的提示信息:“ 完成了第 xxx 号构件 ”。

2. 应借助于操作台上的输入端 16 使该条信息提示得到显示,将该构件计入 件数计数器,使计数提高,并将计数显示在 xxx 的位置上。

3. 按规定测试您的程序。

现在您应能回答以下问题:

1. 如何能重新删除一条提示信息?

. . . . . . 2. 信息提示结构的哪个组成部分负责信息文字的 “ 发出 ”?

(38)

4.4 状态信息方面的工作 用户自定义的状态

信息说明

状态信息在信息缓存器中管理

状态信息不可用按键 “ 全部 OK” 重又删除

状态信息必须通过程序中的一个函数删除

状态信息同样可在程序复位或退出程序或选择语句时通过信息提示选项中 的设置删除

用户自定义的状态 信息功能

状态信息适用于显示一个状态的变化 (例如一个输入端消失)

在信息缓存器中最多可管理 100 条信息提示

例如可在一段时间内停止程序运行,直到触发的状态不复存在。

用函数 Clear_KrlMsg( ) 可重又删除状态信息

给用户自定义的状 态信息编程

1. 将主程序载入编辑器 2. 为以下对象声明工作变量:

发送人、信息号、信息文本 (自 KrlMsg_T)

具有 3 个用于参数的元素的数组 (自 KrlMsgPar_T)

通用信息提示选项 (自 KrlMsgOpt_T)

“ 句柄 ” (作为 INT)

检查结果的变量 (作为 BOOL)

用于删除结果的变量 (作为 BOOL)

3. 用所需的值对工作变量进行初始化 4. 给函数调用 Set_KrlMsg(…) 编程

5. 用一个循环停止程序,直到触发的状态不复存在。

6. 调用函数 Clear_KrlMsg( ) 删除状态信息 7. 关闭并保存主程序

上述显示 / 信息提示的编程举例:

图  4-5: 状态信息

对机器人系统针对各种信息提示类型应有的反应未做规定 (例如机 器人制动或暂停程序运行)。 必须对所需的反应进行编程。

图  4-6: 状态信息

(39)

4.5 练习: 给状态信息编程

练习目的 成功完成此练习后,您可执行下列操作:

给自己的状态信息编程

在信息提示中给出任意个参数

前提 为成功完成此练习,必须满足以下前提条件:

具有编程语言 KRL 的知识

具有给信息提示编程的理论知识 练习内容 分步任务 1: 状态信息

1. 创建一条含有以下文字的状态信息:“ 料库几乎空了 ”。

2. 应借助操作台上的输入端 14 来显示这条信息提示。

3. 通过取消操作台上的输入端 14 应将这条信息提示重新删除。

4. 按规定测试您的程序。

分步任务 2: 含参数的状态信息

1. 创建一条含有以下文字的状态信息:“ 料库中还有 xxx 个 yyy 的方块 ”。

2. 应借助操作台上的输入端 15 来显示这条信息提示。

3. 通过取消操作台上的输入端 15 应将这条信息提示重新删除。

4. 按规定测试您的程序。

现在您应能回答以下问题:

1. 在信息文本中 %2 表示什么?

. . . . . .

DECL INT handle

DECL BOOL present, erase ...

IF $IN[17]==FALSE THEN

mymessage={modul[] "College", Nr 1909, msg_txt[] "My Messagetext"}

Option= {VL_STOP FALSE, Clear_P_Reset TRUE, Clear_P_SAW FALSE, Log_to_DB TRUE}

; 通配符为空通配符 [1..3]

Parameter[1] = {Par_Type #EMPTY}

Parameter[2] = {Par_Type #EMPTY}

Parameter[3] = {Par_Type #EMPTY}

handle = Set_KrlMsg(#STATE, mymessage, Parameter[ ], Option) ENDIF

erase=FALSE

; 用于在删除信息提示前停住程序的循环 REPAEAT

IF $IN[17]==TRUE THEN

erase=Clear_KrlMsg(handle) ; 删除信息提示 ENDIF

present=Exists_KrlMsg(handle) ; 附加的检测 UNTIL NOT(present) or erase

(40)

4.6 确认信息方面的工作 用户自定义的确认

信息说明

确认信息在信息缓存器中管理

确认信息可通过按键 “OK” 或 “ 全部 OK” 重新删除

确认信息也可通过程序中的一个函数删除

确认信息同样可在程序复位或退出程序或选择语句时通过信息提示选项中 的设置删除

用户自定义的确认 信息功能

确认信息适用于显示用户必须了解的信息。

在信息缓存器中最多可管理 100 条信息提示

与提示信息相反,用确认信息可检查用户是否对其进行了确认

例如可在一段时间内停住程序,直到信息提示得到了确认

给用户自定义的确 认信息编程

1. 将主程序载入编辑器 2. 为以下对象声明工作变量:

发送人、信息号、信息文本 (自 KrlMsg_T)

具有 3 个用于参数的元素的数组 (自 KrlMsgPar_T)

通用信息提示选项 (自 KrlMsgOpt_T)

“ 句柄 ” (作为 INT)

检查结果的变量 (作为 BOOL)

3. 用所需的值对工作变量进行初始化 4. 给函数调用 Set_KrlMsg(…) 编程 5. 用一个循环止住程序

6. 调用函数 Exists_KrlMsg(...) 检查是否用户已确认了信息提示,如果 已确认,则退出上述循环

7. 关闭并保存主程序

上述显示 / 信息提示的编程举例:

图  4-7: 确认信息

对机器人系统针对各种信息提示类型应有的反应未做规定 (例如机 器人制动或暂停程序运行)。 必须对所需的反应进行编程。

图  4-8: 确认信息

生成信息提示后程序被停住。 通过按按键 “OK” 或 “ 全部 OK”(Alle

(41)

4.7 给确认信息编程练习

练习目的 成功完成此练习后,您可执行下列操作:

给自己的确认信息编程

在信息提示中给出任意个参数

前提 为成功完成此练习,必须满足以下前提条件:

具有编程语言 KRL 的知识

具有给信息提示编程的理论知识 练习内容 分步任务 1: 确认信息

1. 创建一条含有以下文字的确认信息:“ 确认故障 — 未达到真空 ”。

2. 应借助操作台上的输入端 15 来显示这条信息提示。

3. 按规定测试您的程序。

分步任务 2: 含确认信息的状态信息

1. 创建一条含有以下文字的状态信息:“ 故障 — 未达到真空 ”。

2. 应借助操作台上的输入端 18 来显示这条信息提示。

3. 输入端复位后应撤回状态信息而显示您在分步任务 1 中编程设计的确认信 息。

4. 按规定测试您的程序。

现在您应能回答以下问题:

1. xxx?

. . . . . .

; 通配符为空通配符 [1..3]

Parameter[1] = {Par_Type #EMPTY}

Parameter[2] = {Par_Type #EMPTY}

Parameter[3] = {Par_Type #EMPTY}

handle = Set_KrlMsg(#QUIT, mymessage, Parameter[ ], Option)

; 用于在删除信息提示前停住程序的循环 REPAEAT

present=Exists_KrlMsg(handle) UNTIL NOT(present)

(42)

4.8 等待信息方面的工作 用户自定义的等待

信息说明

等待信息在信息缓存器中管理

等待信息可用按键 “ 模拟 ” (simuliere) 重又删除

等待信息不可用按键 “ 全部 OK” 重新删除

等待信息同样可在程序复位或退出程序或选择语句时通过信息提示选项中 的设置删除。

用户自定义的等待 信息功能

等待信息适用于等待一个状态并在此过程中显示等待图标

在信息缓存器中最多可管理 100 条信息提示

例如可在一段时间内停止程序运行,直到出现等待的状态。

通过函数 Clear_KrlMsg( ) 可重又删除等待信息 给用户自定义的等

待信息编程

1. 将主程序载入编辑器 2. 为以下对象声明工作变量:

发送人、信息号、信息文本 (自 KrlMsg_T)

具有 3 个用于参数的元素的数组 (自 KrlMsgPar_T)

通用信息提示选项 (自 KrlMsgOpt_T)

“ 句柄 ” (作为 INT)

检查结果的变量 (作为 BOOL)

用于删除结果的变量 (作为 BOOL)

3. 用所需的值对工作变量进行初始化 4. 给函数调用 Set_KrlMsg(…) 编程

5. 用一个循环停住程序,直到出现所期待的状态或通过 “ 模拟 ”(Simuliere) 按键删除了信息提示

6. 调用函数 Clear_KrlMsg( ) 删除等待信息 7. 关闭并保存主程序

上述显示 / 信息提示的编程举例:

图  4-9: 等待信息

图  4-10: 等待信息

生成信息提示后程序被停住。 通过输入端 17 的状态 (TRUE) 删除信息 提示。 然后程序继续运行。

同样,当程序复位或退出程序时信息提示也将消失。 可通过在信息提

(43)

4.9 练习: 给等待信息编程

练习目的 成功完成此练习后,您可执行下列操作:

给自己的等待信息编程

在信息提示中给出任意个参数

前提 为成功完成此练习,必须满足以下前提条件:

具有编程语言 KRL 的知识

具有给信息提示编程的理论知识 练习内容 分步任务 1: 等待信息

1. 创建文为 “ 等待操作员输入 ” 的等待信息。

2. 提供 4 个不同的构件并将第 5 个软键配置为 “ENDE” (结束)

3. 选择了构件后给出一条提示信息 “ 选择了构件 xxx”。 为此,请使用可能已 有的基础模块。

4. 按规定测试您的程序。

现在您应能回答以下问题:

1. “STATE” 和 “WAITING” 信息提示之间有何区别?

. . . . . .

Log_to_DB TRUE}

; 通配符为空通配符 [1..3]

Parameter[1] = {Par_Type #EMPTY}

Parameter[2] = {Par_Type #EMPTY}

Parameter[3] = {Par_Type #EMPTY}

handle = Set_KrlMsg(#WAITING, mymessage, Parameter[ ], Option) ENDIF

erase=FALSE

; 用于在删除信息提示前停住程序的循环 REPAEAT

IF $IN[17]==TRUE THEN

erase=Clear_KrlMsg(handle) ; 删除信息提示 ENDIF

present=Exists_KrlMsg(handle) ; 可能已通过 “ 模拟 ” (simuliere) 删除 UNTIL NOT(present) or erase

(44)

4.10 对话信息方面的工作 用户自定义的对话

信息说明

只有当无其它对话存在时,才能生成一则对话

对话信息可用一个软键删除,该软键的标注由程序员定义

最多能定义 7 个软键 用户自定义的对话

信息功能

对话信息适用于显示用户必须回答的问题

用函数 Set_KrlDlg( ) 可生成一条对话信息

用函数仅仅可生成对话

但该函数不等到对话得到回答

用函数 Exists_KrlDlg() 可检查一则特定的对话是否还存在

该函数也不等到对话得到回答,而是仅仅在缓存器中查找带有该句柄的对 话

因此,KRL 程序中的询问必须循环进行,直至对话得到回答或被删除

接下来的程序流程根据用户所选的软键而定

按键分析

按键的声明和初始化 图  4-11: 对话信息

图  4-12: 对话信息

(45)

通过 Exists_KrlDlg() 进行分析: 在索引 4 下创建的按键也以 4 作为 反馈应答。

给用户自定义的对 话信息编程

1. 将主程序载入编辑器 2. 为以下对象声明工作变量:

发送人、信息号、信息文本 (自 KrlMsg_T)

具有 3 个用于参数的元素的数组 (自 KrlMsgPar_T)

7 个可能的按键 (自 KrlMsgDlgSK_T)

通用信息提示选项 (自 KrlMsgOpt_T)

“ 句柄 ” (作为 INT)

检查结果的变量 (作为 BOOL)

回答按了哪个按键的结果变量 (作为 INT)

3. 用所需的值对工作变量进行初始化 4. 给函数调用 Set_KrlDlg(…) 编程

5. 用一个循环停止程序,直到对话得到了回答 6. 调用函数 Exists_KrlDlg( ) 来分析对话信息 7. 规划程序中的其它分支并进行编程

8. 关闭并保存主程序

; 第 4 号软键以 4 作为反馈应答 softkey[4]={sk_type #value, sk_txt[] "key4"}

图  4-13: 带有 3 个按键的对话信息

若未给所有按键编程或有间断地编程 (编号 1、4、6),则按键将并 列排布。 若仅使用了按键 1、4、6,则也只能给出 1、4、6 反馈。

(46)

上述显示 / 信息提示的编程举例:

图  4-14: 对话信息

生成对话后程序被停住。 回答后信息提示被删除。 然后程序继续运行。 接着 给 switch-case 分支编程

同样,当程序复位或退出程序时信息提示也将消失。 可通过在信息提示选项 中的设置 Clear_P_Reset TRUE 引发这种情况。

DECL KRLMSG_T myQuestion DECL KRLMSGPAR_T Parameter[3]

DECL KRLMSGDLGSK_T Softkey[7] ; 准备 7 个可能的软键 DECL KRLMSGOPT_T Option

DECL INT handle, answer DECL BOOL present ...

myQuestion={modul[] "College", Nr 1909, msg_txt[] "My Questiontext"}

Option= {VL_STOP FALSE, Clear_P_Reset TRUE, Clear_P_SAW FALSE, Log_to_DB TRUE}

; 通配符为空通配符 [1..3]

Parameter[1] = {Par_Type #EMPTY}

Parameter[2] = {Par_Type #EMPTY}

Parameter[3] = {Par_Type #EMPTY}

softkey[1]={sk_type #value, sk_txt[] "key1"} ; 按键 1 softkey[2]={sk_type #value, sk_txt[] "key2"} ; 按键 2 softkey[3]={sk_type #value, sk_txt[] "key3"} ; 按键 3 softkey[4]={sk_type #value, sk_txt[] "key4"} ; 按键 4 softkey[5]={sk_type #value, sk_txt[] "key5"} ; 按键 5 softkey[6]={sk_type #value, sk_txt[] "key6"} ; 按键 6 softkey[7]={sk_type #value, sk_txt[] "key7"} ; 按键 7 ...

handle = Set_KrlMsg(#STATE, mymessage, Parameter[ ], Option) ENDIF

erase=FALSE

; 用于在删除信息提示前停住程序的循环 REPAEAT

IF $IN[17]==TRUE THEN

erase=Clear_KrlMsg(handle) ; 删除信息提示 ENDIF

present=Exists_KrlMsg(handle) ; 附加的检测 UNTIL NOT(present) or erase

(47)

4.11 给对话编程练习

练习目的 成功完成此练习后,您可执行下列操作:

给自己的提示、状态和确认信息编程 •

给自己的对话询问编程

在信息提示中给出任意个参数

前提 为成功完成此练习,必须满足以下前提条件:

具有编程语言 KRL 的知识

具有给信息提示编程的理论知识 练习内容 分步任务 1: 对话信息

1. 创建一条含有以下文字的对话信息:“ 请选择一个新的构件 ”。

2. 提供 4 个不同的构件并将第 5 个软键配置为 “ENDE” (结束)

3. 选择了构件后给出一条提示信息:“ 选择了构件 xxx”。 为此,请使用可能 已有的基础模块。

4. 按规定测试您的程序。

现在您应能回答以下问题:

1. 软键 (即快捷键)的按键是如何标注的?

. . . . . .

; 按键 1 的操作 ...CASE 2 ; 按键 2

; 按键 2 的操作 ......

CASE 7 ; 按键 7

; 按键 7 的操作 ENDSWITCH ...

(48)
(49)

当出现诸如输入等定义的事件时,控制器中断当前程序,并处理一个定义 的子程序

由中断而调用的子程序被称为中断程序

允许同时最多声明了 32 个中断。

在同一个时间最多允许有 16 个中断激活 使用中断时的重要步骤

中断声明

启动 / 关闭或禁止 / 开通中断

需要时停住机器人

需要时废弃当前的轨迹规划,运行一条新的轨迹

中断声明的原理 中断声明概述

当出现诸如输入等定义的事件时,控制器中断当前程序,并处理一个定义 的子程序。

事件和子程序用 INTERRUPT ... DECL ... WHEN ... DO ... 来定 义。

中断声明的句法

Global (全局)

中断只有从对其进行声明的层面起才被识别。

图  5-1: 以中断例程工作

中断声明是一个指令。 它必须位于程序的指令部分,不允许位于声明部分!

声明后先将取消中断 (Interrupt)。 必须先激活中断,然后才能对定义的事件 作出反应!

<GLOBAL> INTERRUPT DECL Prio WHEN 事件 DO 中断程序

(50)

在一个子程序中声明的中断在主程序中是未知的 (此处为中断 23)

一个在声明的开头写有关键词 GLOBAL 的中断在上一层面也是已知的

(此处为中断 2)

Prio: 优先级

有优先级 1、2、4 - 39 和 81 - 128 可供选择。

优先级 3 和 40 - 80 是预留给系统应用的

某些情况下中断 19 预留给制动测试

如果多个中断同时出现,则先执行最高优先级的中断,然后再执行优 先级低的中断。 (1 = 最高优先级)

图  5-2: 中断的有效性

<GLOBAL> INTERRUPT DECL Prio WHEN 事件 DO 子程序

(51)

中断程序

应处理的中断程序的名称。

该子程序被称为中断程序

运行时间变量不允许作为参数传递给中断程序

允许使用在一个数据列表中声明的变量

示例: 声明中断

非全局中断

优先级: 23

事件: 输入端 12 脉冲正沿

中断程序: INTERRUPT_PROG(20,VALUE)

启动 / 关闭 / 禁止 / 开通中断说明

对中断进行了声明后必须接着将其激活。

用指令 INTERRUPT ... 可

激活一个中断。

取消激活一个中断。

禁止一个中断。

开通一个中断。

句法

INTERRUPT 操作 < 编号 >

操作

ON: 激活一个中断。

OFF: 取消激活一个中断。

DISABLE: 禁止一个中断。

ENABLE: 开通一个原本禁止的中断。

编号

对应于应执行操作的那一中断的编号 (= 优先级)。

编号可以省去。

在这种情况下, ON 或 OFF 针对所有声明的中断, DISABLE 或 ENABLE 针对所有激活的中断。

激活和取消激活中断

INTERRUPT DECL 23 WHEN $IN[12]==TRUE DO INTERRUPT_PROG(20,VALUE)

声明后先将取消中断 (Interrupt)。 必须先激活中断,然后才能对定义的事件 作出反应!

(52)

激活和取消激活中断: 按键弹跳

中断的禁止和开通

有关制动机器人或 用中断例程中断当 前运行的说明

制动机器人

应在出现一个事件后立即停住机器人

有两个制动斜坡可供选择 (STOP 1 和 STOP 2)

机器人停下时,中断程序先继续运行

中断程序一结束,已开始的机器人运动就将继续进行。

句法:

BRAKE: STOP 2

BRAKE F: STOP 1

INTERRUPT DECL 20 WHEN $IN[22]==TRUE DO SAVE_POS( ) ...

INTERRUPT ON 20

; 中断被识别并被执行 (脉冲正沿)

...INTERRUPT OFF 20 ; 中断已关闭

这种情况下,中断由状态的转换而触发,例如,对于 $IN[22]==TRUE 而 言,通过 FALSE 到 TRUE 的转换。 也就是说,在 INTERRUPT ON 时不 允许已是该状态,否则就无法触发中断!

在此情况下,还必须注意: 状态转换最早允许在 INTERRUPT ON 后的 一个插值周期进行。

(可通过在 INTERRUPT ON 后编程设定 WAIT SEC 0.012 来实现。 若不 希望出现预进停止,则可另外在 WAIT SEC 前再编入一个

CONTINUE。)

原因是 INTERRUPT ON 需要一个插值周期 (= 12 ms),直到中断真正激 活。 如果先前变换了状态,中断不能识别这一变换。

如果存在通过敏感的传感系统错误地两次触发中断的危险 (“ 按键弹跳 ”),

则可通过关闭中断程序第一行中的中断来避免这种情况发生。

当然,这样在中断处理过程中也不再能识别真正该出现的中断。 跳回前必须 重新启动仍应为激活状态的中断。

INTERRUPT DECL 21 WHEN $IN[25]==TRUE DO INTERRUPT_PROG( ) ...

INTERRUPT ON 21

; 中断被识别并被立即执行 (脉冲正沿)

...INTERRUPT DISABLE 21

; 中断被识别和保存,但未被执行 (脉冲正沿)

...INTERRUPT ENABLE 21

; 现在才执行保存的中断

...INTERRUPT OFF 21 ; 中断已关闭 ...

一个被禁的中断被识别和保存。 开通中断后立即执行。 执行运动时此处应注 意避免碰撞。

參考文獻

相關文件

float voxelToPos(int p, int axis) const { return bounds pMin[axis]+p*Width[axis];. return

[r]

△ABC 為上底面、△DEF 為下底面,且上底面△ABC 與下底面△DEF 互相平行、△ABC △DEF;矩形 ADEB、矩形 BEFC 與 矩形 CFDA 皆為此三角柱的側面,且均同時與△ABC、△DEF

int main(int argc, char** argv).

public static double calculate(int i, int j) throws ArithmeticException,

Binomial Option Pricing

polymorphic behavior of known primitive-type variables polymorphic behavior of known classes (extended types) polymorphic behavior of known parameter types... Unknown Stuff:

• As n increases, the stock price ranges over ever larger numbers of possible values, and trading takes place nearly continuously. • Any proper calibration of the model parameters