← 所有文章

HMI 操作按鈕的回饋狀態如何讓使用者知道命令是否生效

· 站長

以封存已結案通知建立按鈕回饋狀態與冪等重試規則。

先把按鈕動作拆成狀態

按鈕變色只表示畫面收到操作,不能證明控制端已完成。本文用虛構的封存已結案通知命令示範:操作員按下後先進入Pressed,HMI產生唯一commandId並送出;服務端接受後為Accepted,PLC或警報服務真正開始處理才是Executing,完成才是Completed。若權限或前置條件不符是Rejected;等待超時卻沒有可靠回覆則是Unknown,不能擅自改成Rejected。這些名稱是專案狀態契約,不是任何HMI產品內建的固定列舉。

狀態 觸發 畫面文字 允許操作
Pressed 按鈕事件發生 送出中 暫停重按
Accepted 服務端回commandId 已接受,等待執行 等待或查詢
Executing 收到開始回饋 封存處理中 鎖定同一命令
Completed 結果success 已完成 可查結果
Rejected 明確錯誤 未接受:顯示原因 修正後重試
Unknown 逾時無結論 結果未知,請查詢 禁止盲目重送

按鈕事件應先由畫面建立命令資料,再由執行端驗證權限、模式、設備狀態與commandId。HMI不應直接把本地顏色當成PLC狀態;PLC也不會因為使用者登入了HMI就原生知道session、角色或畫面權限。授權服務從受驗證的登入狀態取得角色,控制器另外核對模式和機械條件,不能相信客戶端自行聲稱的角色。

命令模型還要定義資料新鮮度。若畫面五秒沒有收到狀態更新,應顯示最後更新時間和資料過期,而不是維持綠色完成。完成結果可保留,但連線中斷時要讓使用者知道目前看到的是歷史結果。

封存通知案例與重試規則

案例的自訂流程是:14:00:00.000按下封存,HMI產生CMD-781;14:00:00.120服務端回Accepted;14:00:00.300回Executing;14:00:01.100回Completed並帶封存數量3。另做回覆遺失測試:若14:00:02只收到Accepted而之後連線中斷,畫面顯示Unknown,重新連線後先用CMD-781查結果。相同操作重送必須沿用同一命令識別,避免第一次其實已執行而第二次又封存或重設。

時間 回覆 狀態 下一步
14:00:00.000 本地事件 Pressed 禁用重按
14:00:00.120 accepted,CMD-781 Accepted 等待
14:00:00.300 started,CMD-781 Executing 顯示進度
14:00:01.100 success,count=3 Completed 顯示完成
另一案例 timeout無回覆 Unknown 查commandId,不改拒絕

Rejected必須有可行原因,例如角色不足、通知關聯的警報仍Active、設備不在允許模式或命令格式錯誤。Timeout只代表在期限內沒有證據,可能是服務端已做完、網路丟回覆或仍在執行。畫面要同時保存lastUpdate、錯誤碼、來源時間與commandId,讓值班者能查詢而不是連按按鈕。

驗證成功案例時先建立三筆待封存通知,按一次後核對accepted、started、completed及count=3;失敗案例把權限撤回或故意讓回覆延遲,應看到Rejected或Unknown的正確差異。不要用實機輸出宣稱完成,這是離線狀態模型。

拒絕訊息要避免只寫error。可把錯誤分為身份、前置條件、設備忙碌、格式和服務不可用,讓值班者知道可重試或應升級。錯誤碼與人話分開保存,翻譯只改顯示文字。

畫面設計與排錯

狀態文字要比顏色更重要。建議按鈕旁有狀態、命令識別、最後更新時間與結果數量;顏色只作輔助,並搭配圖示或文字。Pressed和Accepted不可共用「成功」;Executing不可顯示「已封存」。重複按下時,若已有相同commandId,顯示原結果;若是不同命令,先拒絕並說明前一命令未結束。

症狀 先查證據 可能原因 處理
一直送出中 commandId與server log 回覆遺失 重連後查原ID
顯示完成但通知未封存 通知ID與封存結果 結果與目標不相符 查實際條件
按鈕灰掉 權限/前置條件 狀態綁定錯 分開顯示原因
逾時後重複封存 兩個ID 未做冪等 沿用原ID查詢

排錯順序是先看命令識別與來源回覆,再看控制端狀態,最後才檢查CSS或按鈕樣式。若UI顯示Executing但執行端沒有started事件,回饋綁定可能只讀本地旗標。若執行端有Completed而畫面仍Executing,查訂閱、快取、時間戳與版本相容,不要要求操作員多按一次。

當兩個操作員同時送出同一封存要求,兩個客戶端可能產生不同commandId,服務端還要檢查相同目標與資源版本,明確回覆已封存或版本衝突。只有同一logical operation的重送,才按原commandId取得既有結果。不能靠按鈕變灰防止競爭,因為不同客戶端仍可能同時操作。

交付與平台限制

交付前寫出命令契約:request欄位、commandId格式、accepted與executed定義、結果查詢方式、逾時期限、冪等規則、錯誤碼及角色來源。若採Ignition Perspective Button,官方文件說明可在事件觸發Action,並可改變按鈕文字、顏色或啟用狀態;這不等於平台替你完成PLC命令回饋,仍需自建資料流。

平台差異要明示。Vision Button的Enabled只代表元件是否可用;它不證明後端完成。其他HMI可能使用腳本、Tag binding或服務呼叫,不能照抄property或API名稱。涉及安全停機時,這種回饋畫面不可代替硬線或安全控制。

完成結果是操作員能回答「命令是否被接受、是否真的執行、若未知要查哪個ID」。若沒有執行端的完成證據,最安全的畫面語意就是Unknown與查詢入口。

驗收表應包含斷線、重新連線、瀏覽器重新整理與客戶端切換四種情境。每種情境都核對命令是否重複、狀態是否遺失、結果是否可查及畫面是否誠實標示未知。

先把命令作用範圍限定清楚:本文只封存已結案的通知工作項,不刪除Alarm Journal、不Ack警報,也不改變設備故障條件。三筆通知N-11、N-12、N-13在送出前已符合結案條件;命令包含三個目標ID及各自版本,完成結果必須逐筆列出,不能只靠count=3推測封存了哪三筆。

練習讓N-12在確認視窗開啟後被另一人更新。原命令仍帶舊版本,服務端應拒絕該次操作並指出版本衝突,重新載入後由使用者再決定。本文採整組全成或全不成的策略;若系統允許部分成功,必須增加Partial結果和逐筆原因,不能把部分成功包成Completed而不說明。

封存命令沒有取消協定,所以Accepted階段也只提供查詢與等待,不顯示取消按鈕。真的需要取消時,要定義取消請求的識別、何時可取消、已執行如何回覆,以及取消失敗後的顯示。把視窗關掉只關閉畫面,不會撤回已送出的後端命令。

重新整理瀏覽器後,從保存的commandId查命令結果與三個通知狀態。已封存結果可顯示完成時間;查詢服務失聯則另外標示目前查詢不可用,不抹掉既有完成證據。若命令紀錄已超過保留期限,只能回報無法查證,不生成新ID假裝原請求沒有發生。

FAQ與官方來源

FAQ1:按鈕變綠是否代表命令完成?不代表,綠色只能是自訂視覺提示,完成要有執行端結果。

FAQ2:逾時可直接顯示拒絕嗎?不可;逾時沒有結論,應顯示Unknown並用同一commandId查詢。

FAQ3:可用登入使用者名稱當PLC權限嗎?不可假設PLC原生理解HMI session,需有明確授權傳遞和驗證。

FAQ4:重試要產生新ID嗎?同一操作重送應沿用ID或由服務端提供冪等查詢,避免重複執行。

參考:Ignition Perspective Button:事件觸發Action及按鈕狀態屬性。

參考:Ignition Vision Button:Enabled與事件處理說明。

延伸閱讀


使用 PLC 工具箱 →