一、程序概述
該程序是一個基于 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 必須通過傳遞空字符串(" ")取消,否則會一直顯示。