恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

从零搭建工业控制系统(十三):安全监控服务——压力超标了怎么办

  • 首页
  • 资讯中心
  • /
  • 从零搭建工业控制系统(十三):安全监控服务——压力超标了怎么办

相关资讯

DeepSeek Harness 又更新了:多模态正式上线,一篇文章讲清新特性、用法与二次创作 2026/8/25 15:10:02
《易学・否䷋|道影子新解 012》 2026/8/25 15:10:01
基于 Android 的本地商城订单 App:SQLite + 多角色架构的技术实践(有源码和文档) 2026/8/25 15:05:01

最新资讯

多智能体深度强化学习在牧场电池管理中的实践与优化
开源编码智能体:从对话到代码的自动化贡献模式解析
用Python写自动化脚本,节省了团队每天两小时
编码智能体进化:从代码补全到任务规划的AI编程新范式
构建上下文感知的密钥扫描器:从非结构化文档自动化挖掘安全风险
Spring Batch批处理核心原理:Chunk机制、重启策略与资源隔离

今日推荐

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南
洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表
Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

本周热门

Nextcloud 桌面客户端:把同步交给它,你只管改文件
如何将 HTML 转成 Word 文档且格式不丢失?html-to-docx 使用教程
Anki 批量操作卡片完整指南:一次搞定上千张,不再逐张修改

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

从零搭建工业控制系统(十三):安全监控服务——压力超标了怎么办

发布时间:2026/8/25 15:10:02
从零搭建工业控制系统(十三):安全监控服务——压力超标了怎么办 安全监控服务压力超标了怎么办这是「从零搭建工业控制系统」系列第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配置、热加载机制怎么设计。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号