← 所有文章

FIELD NOTES / 工業通訊與網路

斷線期間命令是否排隊如何建立明確策略

工業通訊與網路作者:站長預估 5 分鐘閱讀

把未送出、完成與結果不明分開,依命令語意和期限決定斷線時拒絕、合併、保存或恢復後核實。

本文目錄

先分未送出與結果不明

通訊恢復後設備突然連做三次動作,常見原因是斷線時按下的命令被悄悄排隊。不要先問佇列能放幾筆,先定義哪種命令允許等待、可以等多久,以及恢復時是否仍符合原來條件。本篇建立一張可驗收的命令政策表。

先分三種狀態:尚未交付傳送的NotSent、已送出但缺少確定結果的OutcomeUnknown,以及已收到並驗證結果的Completed。前者可以依政策取消或排隊,第二種不能只因重連就當成尚未執行,第三種不應再送一次。

送出邊界需依實際介面定義。socket接受資料只表示本地傳送進度,不證明設備已執行;部分傳送、斷線與回覆遺失都可能留下不明結果。保留已送byte數、請求識別與對端回覆,不用一個Connected旗標替代命令狀態。

適用於上位程式、HMI或通訊服務的命令管理設計,不是機台安全回路。Q06UDVCPU與QJ71C24N的指令、連線及接收行為須另查專案。本篇不宣稱任何停機命令可以靠通訊佇列保證及時送達。

政策欄位包括命令類別、是否可排隊、有效期限、重播條件、前置版本、最大筆數與結果查詢方式。操作畫面區分排隊、送出、完成、過期及結果待查;按鈕按下的視覺回饋不能直接標為設備完成。

依命令語意決定是否保留

單純查詢通常只需要恢復後的最新結果。若斷線期間每秒產生一次讀取,沒有必要累積三百筆舊輪詢;可依契約合併為下一次最新查詢,並記錄被取代數。這只適用可重建查詢,不自動適用所有命令。

相對動作例如再加一、送出一件或開始一次循環,重播可能再執行一次。本例將斷線期間新提出的相對動作直接拒絕為Disconnected,不排隊;已送出但結果不明者進待查狀態,禁止以重連當成重新授權。

設定絕對值也不必然可無條件重播。即使把目標設為50兩次看似相同,設備寫入事件可能觸發程序,或期間配方已改版。只有設備契約確認重播語意、請求身份及條件仍成立時,才允許候選設定等待恢復。

本例允許一筆待送設定,帶expected_config_version=7及十秒期限;同一操作者在尚未送出前改成另一個值,可依明確替代規則取消舊候選,產生新識別。不得修改一筆已送出的request_id內容,讓同一身份代表兩種意圖。

涉及停機或保護的功能,應由機台既有控制與安全設計處理通訊失效,不把指令留在一般佇列等網路回來。本篇只要求介面如實回報未送達,具體機台反應仍依工程設計驗證,不能在文章中通用指定全部輸出關閉。

用十五秒斷線案例驗收期限

假設t=0確認斷線,t=1操作員提出讀取狀態,t=2提出相對動作,t=3提出目標值50且有效十秒。直到t=15才恢復,預期讀取被替換成一次新的查詢、相對動作已拒絕、設定在t=13過期而不送出。

若改成t=8恢復,設定仍在期限內,但也不能立即送出。先查設備身份、模式、資料品質與目前設定版本;若已從7變8,回報VersionConflict並保留候選內容,不拿舊前提覆蓋新配方。

若版本仍是7,且專案定義的權限和互鎖全部通過,才可將候選轉入送出流程。完成回覆仍要配對同一request_id;排隊被接受和設備已接受是不同事件,日誌要各有時間。這些步驟才構成恢復後的命令處理。

期限計算使用本地單調經過時間,同時保留可讀的建立時間。若程式重啟使單調時間基準失效,不能把保存的剩餘十秒重新算滿;應依可信持久時間或明訂政策重新驗證,無法確認時將候選置為待審或失效。

本例還要測t=13剛好到期:若定義現在時間大於或等於期限就Expired,那一刻不能送出。把相等邊界寫進測試,不讓不同執行緒一個認為有效、另一個認為過期,造成偶發的恢復後動作。

處理不明結果與持久佇列

另一筆命令在斷線前已發送,設備可能已完成,但回覆沒回來。把它標OutcomeUnknown,恢復後用設備支援的請求結果查詢或其他核實流程確認。僅查目前值剛好等於50,不一定能證明是這筆命令造成,也不能證明某個循環已執行一次。

若設備提供冪等識別,重送必須保留相同身份和內容,並遵守它的保存期限與衝突規則。本地加一個request_id而對端不識別,無法保證動作只執行一次;不能把一般通訊序號直接當成設備的去重契約。

需要跨重啟保存的候選,必須有實際持久化與恢復設計。保存payload、來源、期限、前提版本及狀態,並讓寫入成功與介面回覆一致。若只放在記憶體,應明確表示重啟後可能失去候選,不宣稱已可靠排隊。

容量滿時不默默刪除命令。依政策拒絕新候選、合併可取代查詢,或由操作者處理;保留拒絕原因。恢復後也限速處理,以免所有設備同時重播形成尖峰。任何自動替代只作用於明訂可替代且尚未送出的項目。

取消請求只保證本地政策阻止尚未送出的候選;若正在傳送或已送達,取消不代表設備撤回。取消與送出要有一致狀態切換,結果應回報取消成功或無法確定,而不是不論時機都顯示已取消。

完成結果與常見問題

驗收報告逐筆列斷線時刻、提出時刻、識別、類別、有效期限、恢復版本與最終狀態。正常情境應只有仍有效且前提成立的候選進入傳送;過期、拒絕與結果不明者都不得偷偷消失。

問:連線恢復就把所有命令照順序送出嗎?答:不行。先依類別、期限、身份、版本和現況逐筆檢查,過期或不再適用的命令不可送出。

問:設定固定值一定是冪等嗎?答:不能只憑名稱推定。寫入可能觸發副作用,需查設備的完成與重播契約,並重新確認前提狀態。

問:本地取消是否代表設備已停止執行?答:不是。尚未送出時才能直接阻止;已送出的命令需要設備提供的取消或結果確認機制。

問:斷線前已送但沒回覆,恢復後要怎麼辦?答:先標結果不明並核實,不能當成沒執行而直接重送,也不能當成成功清除證據。

參考:AWS Builders Library:冪等API、遲到請求與相同識別不同意圖的設計背景。

參考:RFC 9110 §9.2.2:HTTP冪等語意參考,不能直接當成PLC動作保證。

延伸閱讀