WinForms + Modbus RTU/TCP 的气压表老化监控上位机
目录前言项目介绍项目功能项目特点项目技术项目效果项目源码总结前言做硬件测试的都懂72台气压表同时跑老化一个人根本盯不过来。以前现场是靠人工看压力值、手动开关阀夜班最容易出岔子——压力超标没及时发现一批产品全废。后来琢磨着写个上位机把这事儿自动化于是就有了这套系统。项目从最初只能看数据到现在能自动跑完整个老化流程算是现场真正在用的一套工具了。项目介绍一套WinForms桌面程序用来监控72路气压表的真空压力同时控制72路真空电磁阀和72路载台上电。说白了就是让气压表的老化测试实现自动化——设好配方扫个码绑定工位点一下启动剩下的交给程序去跑压力异常会自动关阀断电并报警测试结束自动记录日志。接入的设备包括72台Modbus RTU气压表通过CH340转USB、1台显耀IO耦合器80入160出、1台冷却送风机Modbus TCP和一把霍尼韦尔扫码枪。所有设备同时跑数据刷新1秒一次。项目功能功能模块具体说明气压表监控实时读取72台真空压力值显示在工位面板上超标立即报警设备控制每台独立控制真空阀开关、载台上电断电老化测试流程扫码绑定SN→设配方→一键启动→真空确认→计时老化→自动停止报警联动压力越限/通讯失联/真空建立超时→自动关阀断电记录日志送风机控制根据测试台数自动启停也可手动定值控制温湿度实时显示扫码录入扫码枪自动识别串口扫SN自动填入绑定窗口权限管理操作员/技术员/管理员三级菜单按钮按角色控制数据落盘测试事件CSV日志、气压表扫描记录方便追溯通讯诊断通讯测试窗体可单独测每个DO输出送风机测试窗体独立调试项目特点共享连接设计通讯测试和送风机测试窗体不自己建TCP连接直接复用主程序的连接避免端口冲突状态也实时同步IO读-改-写写DO时先读整字再改目标位不会误伤同字里其他通道比如0x2004低字节是电磁阀、高字节是载台上电各管各的双信号判定气压值走RTU用于软件判报警硬件DI触点只读进UI显示互不干扰送风机IP自动识别现场设备换IP也不怕程序会按候选列表挨个试找到后缓存下来串口自动匹配CH340的VID/PID做识别不用手工指定COM口换电脑插上就能用Mock模式一键切换没接硬件时把UseMockCommunication改成true就能演示全部功能BeginInvoke传参包装界面更新用BeginInvoke时数组参数必须new object[]{arg}包一层不然会报TargetParameterCountException项目技术技术项具体内容框架.NET Framework 4.7.2 WinForms语言C#通讯协议Modbus RTU气压表、Modbus TCPIO耦合器/送风机串口System.IO.Ports WMI自动识别数据存储JSON用户/配置、CSV测试日志设备规模72气压表 80DI/160DO 1送风机 1扫码枪架构分层视图层→对话框层→服务层DeviceManager编排项目效果主界面是9×8的工位面板矩阵每块面板显示压力值、SN、配方、状态灯空闲/运行/报警/故障/真空建立。右侧操作区放启动、停止、复位、急停等按钮状态栏显示连接状态和当前登录用户。实际跑起来的效果扫码绑定完工位后点“启动”对应工位真空阀打开、载台上电同时送风机自动启动。压力在15秒内降到正常区间就开始计时老化到了设定时长自动关阀断电。如果压力越限或通讯断了对应的面板会变红报警阀和电自动切断日志里记一笔。通讯测试窗体用SunnyUI重构过两页分别对应电磁阀和载台上电9×8的灯按钮点一下就能通断一键遍历功能可以跑马灯式检查所有通道现场排查DO通道特别方便。项目源码主要目录结构如下├── Views/ │ ├── MainForm.cs │ ├── WorkstationPanelView.cs │ └── Dialogs/ │ ├── SettingsForm.cs │ ├── StationSettingsForm.cs │ ├── CommunicationTestForm.cs │ ├── FanTestForm.cs │ ├── IdBindingForm.cs │ └── InputLotForm.cs ├── Services/ │ ├── DeviceManager.cs │ ├── ModbusRtuBarometerReader.cs │ ├── ModbusTcpIoController.cs │ ├── FanControllerClient.cs │ ├── ScannerService.cs │ ├── IoMapBuilder.cs │ ├── TestEventLogger.cs │ ├── UserManager.cs │ └── Mock*.cs ├── Models/ │ ├── BarometerData.cs │ ├── FanData.cs │ ├── IoStatus.cs │ ├── RecipeConfig.cs │ ├── StationInfo.cs │ └── UserModel.cs ├── App.config └── Users.json配置文件里关键参数都有注释现场调试时改App.config就行不用动代码。气压表串口和送风机IP都有缓存文件下次启动优先复用上次成功的配置。GitHubhttps://github.com/lq700212/BarometerWinform总结这套系统从最开始只能看数据一步步迭代到现在的全自动老化测试闭环中间踩了不少坑——串口丢包、IO地址换算、线程安全、事件订阅导致窗体释放后报错……每个坑都在代码里留下了对应的处理逻辑。几个比较重要的经验共享连接比重复建连靠谱测试窗体复用主程序连接后再没出现过端口占用问题读-改-写是IO控制的底线整字直写早晚出问题尤其是高低字节分属不同业务时日志得早做没日志的时候出了问题全靠猜有了CSV日志排查时间从半天缩短到几分钟WinForms的BeginInvoke要小心数组参数不包装直接传会变成params展开异常不好定位如果你也在做类似的多路设备监控上位机希望这篇能帮上点忙。引入地址