:安全監控服務——壓力超標了怎么辦)
安全監控服務壓力超標了怎么辦這是「從零搭建工業控制系統」系列第13篇。燈塔能顯示狀態但光顯示不夠。壓力超標了得自動關閥門斷電了得自動啟動保護。這篇講安全監控服務怎么執行安全動作。一次差點炸腔的事故去年冬天Chamber腔體正在抽真空壓力傳感器突然故障——讀數卡在0。系統以為還在真空狀態繼續抽。實際上腔體已經漏氣壓力回到大氣壓了。如果繼續抽下去泵會過載。那次靠操作員手動按了急停才沒出大事。事后我花了兩天寫了ChamberSafetyControlService讓系統自己處理這種故障。核心思路壓力數據無效時按最安全的狀態處理。不知道壓力是多少就當它不安全。雙重壓力監控架構系統有兩套壓力監控保護不同的設備監控服務監控對象閾值保護設備ChamberPressureMonitorService腔體壓力模擬量輸入大氣壓閾值腔體閥PumpPressureMonitorService泵口壓力安全閾值泵控制輸出Chamber監控保護腔體蓋的安全泵口壓力監控保護真空泵的安全。兩套獨立運行互不干擾。Chamber安全控制服務ChamberSafetyControlService監聽壓力變化自動控制AutoChamberValve自動腔體閥和ManualChamberValve手動腔體閥publicpartialclassChamberSafetyControlService:ObservableObject,IRecipientHeaterPCWConfigChangedMessage,IDisposable{privatereadonlyIDeviceCmdService_deviceCmdService;privatereadonlyChamberPressureMonitorService_pressureMonitor;[ObservableProperty]privateboolautoAllowControl;// False: AutoChamberValve直接關閉; True: 基于壓力智能控制[ObservableProperty]privateboolmanualAllowControl;// False: ManualChamberValve直接關閉; True: 啟用壓力保護[ObservableProperty]privateboolautoValveAutoEnable;// AutoChamberValve自動開關計算結果[ObservableProperty]privateboolmanualValveManualEnable;// ManualChamberValve手動開關計算結果}構造函數里訂閱壓力監控的屬性變化publicChamberSafetyControlService(IDeviceCmdServicemcuCmdService,ChamberPressureMonitorServicepressureMonitor){_deviceCmdServicemcuCmdService;_pressureMonitorpressureMonitor;// 訂閱壓力監控變化事件_pressureMonitor.PropertyChangedOnPressureMonitorPropertyChanged;// 注冊消息接收器監聽配置變更WeakReferenceMessenger.Default.Register(this);InitializeConfiguration();}壓力變化的響應邏輯壓力監控服務的IsPressureAboveThreshold變化時安全控制服務收到通知privatevoidOnPressureMonitorPropertyChanged(objectsender,PropertyChangedEventArgse){if(e.PropertyNamenameof(ChamberPressureMonitorService.IsPressureAboveThreshold)){UpdateControlOutputs();}elseif(e.PropertyNamenameof(ChamberPressureMonitorService.IsDataValid)){// 數據無效時也要更新——按最安全狀態處理UpdateControlOutputs();}}關鍵設計數據無效也觸發更新。傳感器故障時IsDataValidfalse這時候不能放任不管要按不安全處理。控制輸出計算privateasyncvoidUpdateControlOutputs(){// 計算AutoChamberValve自動控制if(!autoAllowControl){autoValveAutoEnablefalse;// 配置禁用直接關}elseif(!_pressureMonitor.IsDataValid){autoValveAutoEnablefalse;// 數據無效按不安全處理}else{autoValveAutoEnable_pressureMonitor.IsPressureAboveThreshold;// 正常邏輯}// 計算ManualChamberValve手動控制if(!manualAllowControl){manualValveManualEnablefalse;}elseif(!_pressureMonitor.IsDataValid){manualValveManualEnablefalse;}else{manualValveManualEnable_pressureMonitor.IsPressureAboveThreshold;}// 寫入硬件awaitWriteCoilValueAsync(_autoValveCoil,_autoValveCoil.GetWriteValue(autoValveAutoEnable));awaitWriteCoilValueAsync(_manualValveCoil,_manualValveCoil.GetWriteValue(manualValveManualEnable));}三層判斷配置是否啟用 → 數據是否有效 → 壓力是否達標。任何一層不通過都關閥門。跨線程寫入的坑安全控制服務運行在后臺線程但線圈寫入涉及UI綁定的ModbusCoil對象。直接調用WriteValueManuallyCommand會報跨線程異常。解決方案繞過Command直接調用底層API// 錯誤做法通過Command寫入會觸發UI確認對話框 跨線程異常// await coil.WriteValueManuallyCommand.ExecuteAsync(value);// 正確做法直接調用底層APIawait_deviceCmdService.WriteCoilValueAsync(coil,coil.GetWriteValue(enable));這個問題排查了很久。現象是啟動后偶現InvalidOperationException: 調用線程無法訪問此對象。最后發現是安全控制服務的Timer回調在后臺線程觸發了UI綁定屬性的更新。配置熱響應配置變更時不需要重啟服務。通過消息機制實時響應publicvoidReceive(HeaterPCWConfigChangedMessagemessage){// 配置變了重新計算控制輸出UpdateControlOutputs();}操作員在設置界面修改AutoAllowControl后保存安全控制服務立即收到消息并更新硬件輸出。線圈監控防止外部篡改除了響應壓力變化還有定時器監控線圈狀態。如果有人手動操作了AutoChamberValve或ManualChamberValve服務會檢測到并糾正privateasyncvoidOnCoilMonitorTick(objectstate){if(_isApplyingControl)return;// 自己寫入時跳過varautoValveActual_autoValveCoil.IsActive();if(autoValveActual!autoValveAutoEnable){_logger.Warn($AutoChamberValve被外部修改: 期望{autoValveAutoEnable}, 實際{autoValveActual}, 正在糾正);awaitWriteCoilValueAsync(_autoValveCoil,_autoValveCoil.GetWriteValue(autoValveAutoEnable));}}_isApplyingControl標志位防止自己寫入時觸發監控糾正形成死循環。三大觸發時機安全服務的啟動有三個入口1. 應用啟動App.xaml.cs里延遲2秒自動啟動2. 設備連接設備連上后檢查是否需要啟動安全服務3. 配置保存操作員修改配置后立即響應// DeviceCmdService中的設備連接回調privatevoidOnDeviceStatusChanged(objectsender,DeviceStatusEventArgse){if(e.DeviceTypeDeviceType.DigitalIOe.IsConnected){// DigitalIO連接了檢查Chamber控制服務CheckAndStartChamberSafetyService();}}安全監控踩坑清單坑現象解決跨線程寫入InvalidOperationException繞過Command直接調API傳感器故障讀數卡0繼續抽真空IsDataValidfalse時按不安全處理外部篡改手動操作后狀態不一致定時器監控糾正配置不生效改了配置要重啟消息機制實時響應死循環監控糾正觸發監控_isApplyingControl標志位本篇小結知識點關鍵做法雙重監控腔體壓力 泵口壓力獨立監控三層判斷配置啟用→數據有效→壓力達標數據無效按最安全狀態處理不放任跨線程繞過Command直接WriteCoilValueAsync線圈監控定時檢測外部篡改并糾正三入口啟動/設備連接/配置保存安全監控的核心原則不知道狀態時按最危險的情況處理。下期預告第14篇配置系統基礎安全服務靠配置驅動下篇講配置系統——INI文件、JSON配置、熱加載機制怎么設計。