一、程序概述
该程序是一个基于 KUKA 机器人编程语言(KRL,KUKA Robot Language)的消息处理库,用于在机器人程序运行过程中生成、管理各类交互消息(如通知、提示、错误、对话框等)。通过封装标准化的消息处理逻辑,简化了开发者与机器人用户的交互设计,支持消息参数化、日志记录、程序控制等功能。
二、核心接口与功能概览
程序提供了 7 个核心全局子程序 / 函数,覆盖不同类型的消息需求,具体如下:
三、通用参数解释
各函数的参数存在共性,核心参数定义如下:
四、核心函数详解
1. MsgNotify:通知消息功能
生成非阻塞的通知消息,用于提示信息(如运行状态、警告等),不暂停程序执行。
代码逻辑
GLOBAL DEF MsgNotify(sText[]:IN, sModul[]:IN, nNumPar:IN, sTextPar[]:IN, nMsgNr:IN,MsgOpt:IN)
; 1. 处理MsgOpt默认值(若参数无效则设为默认:VL_Stop=TRUE, Clear_P_Reset=TRUE, Log_To_DB=FALSE)
; 2. 校验并截断消息文本(sText[]最大80字符,sModul[]最大24字符)
; 3. 处理参数插入:若nNumPar有效则替换%1为数值,否则替换为sTextPar[]文本
; 4. 调用系统函数Set_KrlMsg生成#NOTIFY类型消息
END
示例
MsgNotify("this is a notify message") ; 简单通知
MsgNotify("this is a %1 notify message", "Tech", , "asd") ; 带文本参数的通知(%1替换为"asd")
2. MsgQuit:退出消息
功能生成阻塞的退出消息,程序会暂停并等待消息被处理(如用户确认)后再继续执行。
代码逻辑
GLOBAL DEF MsgQuit(sText[]:IN, sModul[]:IN, nNumPar:IN, sTextPar[]:IN, nMsgNr:IN,MsgOpt:IN)
; 1. 同MsgNotify的参数处理(默认值、文本截断、参数插入)
; 2. 调用Set_KrlMsg生成#QUIT类型消息
; 3. 循环等待消息处理完成(通过Exists_KrlMsg检查消息句柄是否存在)
WHILE ( Exists_KrlMsg(nHandle) )
WAIT sec 0.1
ENDWHILE
END
示例
MsgQuit("this is a quit message", "myMod") ; 简单退出消息
INT myInt=123
MsgQuit("this is the %1 quit message", "Module", myInt) ; 带数值参数(%1替换为123)
3. MsgState:状态消息
功能生成状态类消息,返回消息句柄(nHandle),用于后续通过句柄管理消息(如更新、清除)。
代码逻辑
GLOBAL DEF MsgState(nHandle:OUT, sText[]:IN, sModul[]:IN, nNumPar:IN, sTextPar[]:IN, nMsgNr:IN,MsgOpt:IN)
; 1. 同MsgNotify的参数处理
; 2. 调用Set_KrlMsg生成#STATE类型消息,返回句柄到nHandle
END
用途
适用于需要持续显示并动态更新的状态信息(如进度、实时数据),通过句柄可后续操作消息。
4. MsgLoop:循环消息
功能
生成持续显示的循环消息(如 “运行中...”),发送空字符串可取消消息。
代码逻辑
GLOBAL DEF MsgLoop(sText[]:IN,sModul[]:IN)
; 1. 截断文本(sText[]最大80字符,sModul[]默认"Appl")
; 2. 若消息文本非空且含有效字符,调用MsgState生成循环消息
; 3. 若消息文本为空或仅空格,清除已有的循环消息(通过句柄lnHandle)
END
示例
MsgLoop("this is the loop message") ;
显示循环消息MsgLoop(" "); 取消循环消息
5. MsgDialog:对话框消息
功能
生成带软键的交互式对话框,等待用户选择后返回结果(nAnswer),支持最多 7 个软键选项。
代码逻辑
GLOBAL DEF MsgDialog(nAnswer:OUT,sText[]:IN,...sDialogSK7[]:IN,NoBrakes:IN, nMsgNr:IN,MsgOpt:IN)
; 1. 处理MsgOpt默认值和文本截断
; 2. 配置软键(sDialogSK1到sDialogSK7),设置软键文本(最大24字符)
; 3. 调用系统函数SET_KRLDLG生成对话框消息
; 4. 循环等待用户选择(通过Exists_KrlDlg检查对话框状态)
; 5. 若NoBrakes=TRUE,保持机器人刹车松开(不锁轴)
END
示例
MsgDialog(DialogAnswer, "StartPTP", "CrossMeld", "Achse 3", "YES", "NO", "Cancel") ;
对话框消息文本为"StartPTP",模块"CrossMeld",参数"Achse 3",软键为YES/NO/Cancel;
用户选择后,DialogAnswer返回对应软键索引(如1=YES,2=NO)
6. MsgNotifyTextPar 与 MsgQuitTextPar:带多文本参数的消息
功能
支持 2 个文本参数的通知 / 退出消息(%1和%2占位符),当nNumPar=0时启用文本参数,nNumPar>0时启用数值参数。
代码逻辑
GLOBAL DEF MsgNotifyTextPar(...)
; 1. 同MsgNotify的参数处理
; 2. 若nNumPar=0,替换%1为sTextPar[],%2为sTextPar2[]
; 3. 若nNumPar>0,替换%1为数值nNumPar
; 4. 调用Set_KrlMsg生成#NOTIFY类型消息
END
示例
MsgNotifyTextPar("Error: %1 - %2", "CrossMeld", 0, "Sensor", "Disconnected", 511);
消息文本为"Error: Sensor - Disconnected",模块"CrossMeld",编号511
7. CheckOfMsgOpt:消息选项校验函数
功能
校验MsgOpt结构体参数的有效性,为未定义或无效的成员设置默认值。
代码逻辑
DEFFCT KrlMsgOpt_TCheckOfMsgOpt(LocalMsgOpt:IN)
; 1. 检查VL_Stop:无效则设为TRUE
; 2. 检查Clear_P_Reset:无效则设为TRUE
; 3. 检查Log_To_DB:无效则设为FALSE
; 4. 返回校验后的MsgOpt
ENDFCT
作用确保所有消息选项有合理默认值,避免因参数缺失导致的程序错误。
五、关键技术细节
文本长度控制:所有文本参数(如sText[]、sModul[])均有长度限制,超过部分会被截断(如sText[]最大 80 字符),避免消息显示异常。
参数占位符:通过%1(单参数)或%1+%2(双参数)在消息文本中插入动态内容,支持数值(nNumPar)或文本(sTextPar[])参数。
阻塞与非阻塞:非阻塞:MsgNotify、MsgState、MsgLoop不暂停程序;阻塞:MsgQuit、MsgDialog会等待消息处理完成后再继续。
消息管理:通过句柄(nHandle)标识消息,可通过系统函数(如Exists_KrlMsg、Clear_KrlMsg)检查或清除消息。
日志与控制:MsgOpt.Log_To_DB控制消息是否记录到系统日志;MsgOpt.VL_Stop控制是否触发程序提前停止。
六、程序用途与优势
标准化交互:统一消息格式和处理逻辑,简化机器人程序的用户交互设计。
灵活参数化:支持动态插入数值 / 文本参数,适应不同场景的消息需求(如错误详情、状态数据)。
程序控制:通过MsgOpt灵活配置消息是否阻塞、是否记录日志、是否自动清除,平衡交互体验与系统性能。
多场景支持:覆盖通知、警告、错误、状态显示、用户确认等多种交互场景,满足机器人调试、运行、维护全流程需求。
七、消息函数调用指南
一、调用前的准备
确保消息库已加载该消息库(MsgLib)需作为子程序被主程序或其他模块引用,通常通过 EXTERN 声明或在程序头文件中包含,确保机器人系统能识别这些全局函数。
参数格式要求
字符串参数(如 sText[]、sModul[])需用双引号包裹(如 "Error")。
数值参数(如 nNumPar、nMsgNr)直接传递数字(如 123)。
可选参数可省略(用逗号分隔占位),系统会自动使用默认值。
二、常用函数调用
示例
1. MsgNotify:发送通知消息(非阻塞)
用途:提示运行状态、警告等,不暂停程序。
示例:; 简单通知(仅消息文本)
MsgNotify("系统启动中...");
带模块名和数值参数(%1替换为数值)
INT temp = 35
MsgNotify("温度警告:当前%1℃", "温控模块", temp)
; 带文本参数(%1替换为文本)
MsgNotify("传感器%1连接正常", "检测模块", , "A1")
2. MsgQuit:发送退出消息(阻塞)
用途:提示严重信息(如错误),程序暂停等待处理后再继续。
示例:
; 简单退出消息MsgQuit("程序执行完成", "主模块");
带消息编号和选项(不记录日志)
KrlMsgOpt_T opt
opt.Log_To_DB = FALSE ; 不写入日志
MsgQuit("机械臂到达极限位置", "运动模块", , , 5001, opt)
3. MsgDialog:显示对话框(等待用户选择)
用途:需要用户确认或选择的场景(如确认启动、选择模式)。
示例:
INT answer ; 存储用户选择结果(1~7对应7个软键)
; 带3个软键的对话框(YES/NO/Cancel)
MsgDialog(answer, "是否执行自动上料?", "上料模块", , "YES", "NO", "Cancel");
根据用户选择执行不同逻辑
IF answer == 1 THEN ; 用户选择第一个软键"YES"
PTP HOME
AUTO_LOAD() ; 调用自动上料程序
ELSEIF answer == 2 THEN ; 用户选择"NO"
MsgNotify("取消自动上料", "上料模块")
ENDIF
4. MsgLoop:显示循环消息(持续提示)
用途:程序运行中持续显示状态(如 “运行中”),完成后取消。
示例:
; 开始循环显示"抓取中..."
MsgLoop("抓取中...", "抓取模块")
; 执行抓取动作(耗时操作)
; 完成后取消循环消息(传递空字符串)
MsgLoop(" ", "抓取模块")
5. MsgNotifyTextPar:带多文本参数的通知
用途:
消息文本中需要插入 2 个文本参数(%1 和 %2)。
示例:
; %1替换为"传送带A",%2替换为"堵塞"
MsgNotifyTextPar("设备%1发生%2故障", "物流模块", 0, "传送带A", "堵塞")
6. MsgState:生成状态消息(返回句柄)
用途:
需要后续管理的状态消息(如动态更新、手动清除)。
示例:
INT msg_handle ; 消息句柄
; 生成状态消息并获取句柄
MsgState(msg_handle, "焊接进度:30%", "焊接模块")
; (后续逻辑)更新进度后清除旧消息,显示新消息
WAIT SEC 5
Clear_KrlMsg(msg_handle)
; 清除旧消息MsgState(msg_handle, "焊接进度:60%", "焊接模块")
三、参数传递技巧
省略可选参数
函数的可选参数(如 nMsgNr、MsgOpt)可省略,只需用逗号占位。例如:
; 省略nNumPar、sTextPar、nMsgNr,仅传递必要参数
MsgNotify("操作完成", "主模块", , , , )
使用消息编号(nMsgNr)
为消息分配编号(如错误码),便于日志检索和问题定位:
MsgQuit("伺服电机故障", "驱动模块", , , 1002) ; 1002为自定义故障码
配置消息选项(MsgOpt)
通过 MsgOpt 控制消息行为(如是否暂停、是否记录日志):
KrlMsgOpt_T opt
opt.VL_Stop = FALSE ; 不触发程序提前停止
opt.Log_To_DB = TRUE ; 写入系统日志
MsgNotify("电量低", "电源模块", , , , opt)
四、注意事项
文本长度限制
sText[] 最大 80 字符,sModul[] 最大 24 字符,超出部分会被截断。
阻塞函数的影响
MsgQuit 和 MsgDialog 会暂停程序执行,直到消息被处理(如用户确认),需合理安排调用时机,避免影响生产效率。
循环消息的取消
MsgLoop 必须通过传递空字符串(" ")取消,否则会一直显示。