好的,那我們現在進入:
第七講:掉電重連后,為什么設備不再上報事件?——持久化與自動恢復的系統設計
關鍵詞:掉電恢復、狀態重建、初始化流程、SecsMessage 緩存機制、自動重連、事件再注冊
本講目標
你將理解:
- 主機掉電或軟件重啟后,設備為啥變得“沉默”了
- 為什么每次都要重新發 S2F33/S2F35/S2F37?
- 如何設計一個“具備恢復能力”的主機系統?
- 在 SECS4NET 中如何優雅處理設備重連與再注冊流程?
這將是你邁向“系統級開發”的關鍵一步。
一、掉電后的“設備失憶”
很多設備的行為非常現實:
“我不認識你了,你要重新告訴我一切。”
所以你之前設置的:
- CEID ? RPTID 映射(S2F33)
- RPTID ? VID 映射(S2F35)
- 啟用了哪些事件(S2F37)
通通 不保留,除非設備支持“非易失性內存存儲”(NVM),而這在中低端設備里并不常見。
所以:
主機必須在每次上線時重新建立這些狀態。
這一步通常叫做:
“Initialization Sequence”(初始化序列)
二、一個標準的初始化流程(EAP Init Sequence)
下面是你上線后需要干的事情:
-
建立連接(S1F13 / S1F14)
-
判斷通信狀態(S1F1 / S1F2)
-
注冊事件與變量
- S2F35 定義 Report
- S2F33 綁定事件
- S2F37 啟用事件
-
設置設備時間(S2F31)
-
請求設備狀態(S1F3 / S1F5)
-
注冊在線狀態(S1F17)
-
訂閱 Alarm(S5F3 / S5F5)
-
觸發設備上報初始狀態(S6F11 或 S1F1響應)
這個流程要么你在啟動時自動做一遍,要么寫在“設備上線事件”的回調里。
三、SECS4NET 中的自動重連機制
SECS4NET 默認有自動重連機制,如果設備斷線后重新上線,你可以注冊 ConnectionChanged
事件來監聽:
gem.ConnectionChanged += (s, e) =>
{if (e.IsConnected){Log("設備上線,開始初始化序列");RunInitSequence(); // 重新初始化事件、報告、變量等}else{Log("設備斷線,等待重連...");}
};
這就是一個典型的“自動恢復”設計。
你不需要人為介入,只要你的 RunInitSequence
寫得好,斷電也不怕。
四、如何“優雅地”持久化系統狀態?
有時候你想把上次定義的 S2F35/S2F33 參數保留下來。建議這樣設計:
1. 用配置文件保存定義
{"Events": [{"CEID": 1,"RPTID": 100,"VIDs": [3001, 3002]},{"CEID": 2,"RPTID": 101,"VIDs": [3003]}]
}
2. 啟動時讀取配置,動態生成報文
foreach (var ev in config.Events)
{rptDefs.Add(Item.L(Item.U2(ev.RPTID), Item.L(ev.VIDs.Select(v => Item.U2(v)).ToArray())));linkDefs.Add(Item.L(Item.U2(ev.CEID), Item.L(Item.U2(ev.RPTID))));
}
3. 動態組合成 S2F35 和 S2F33 的報文發送
這就是“主機狀態持久化”的初級實踐。
五、案例講解:設備斷線后再上線,如何優雅處理?
場景:
- 設備因電源問題斷電,主機仍在運行
- 等設備再次上線后,主機能否“無感知恢復”?
答:可以!
你只需要監聽連接事件 + 初始化流程自動執行,SECS4NET 其實已經幫你鋪好路:
gem.ConnectionChanged += async (s, e) =>
{if (e.IsConnected){await SendInitSequenceAsync(); // 啟動后重新綁定事件、報告}
};
再配合你前面封裝好的:
await gem.SendAsync(DefineReports());
await gem.SendAsync(LinkEventReports());
await gem.SendAsync(EnableAllEvents());
系統就會像沒斷過一樣,自動“恢復通訊”。
第七講 · 小結
概念 | 說明 |
---|---|
掉電后失憶 | 大部分設備不會保留 CEID、RPTID、VID 的設置 |
初始化序列 | 上線后主機要重新定義、綁定、啟用這些信息 |
自動恢復設計 | 利用 ConnectionChanged 事件實現自動重連后的再注冊 |
配置持久化 | 使用配置文件存儲事件-報告-變量定義,實現靈活注冊 |
這是你從“報文級理解”邁向“系統級思維”的重要轉折點。
下一講:
第八講:設備主動發 S6F11 怎么處理?——事件回調與異步監聽機制
你將掌握如何在程序中優雅地接收、解析、響應設備主動發來的 S6F11 報文(Event Report)。
只需你一句:“繼續”。