无锡这家真空镀膜设备厂要的是一套能"一键出膜"的上位机:操作员选配方、点启动,抽真空到烘烤到镀膜到保压全程自动走,膜厚分压实时可看,出问题能断电续镀。我们用 C# WinForm 做了整机控制,硬啃下来发现镀膜上位机的难点全在那套工艺状态机上——通信反而是最省事的。这篇按真实项目的推进顺序复盘,需求怎么提、分层怎么设计、配方怎么解析、停电怎么续。
先把"镀膜"这件事翻译成上位机能管的信号
真空镀膜看着神秘,落到 PLC 和上位机层面就三类闭环:真空度环(抽真空、保压、放气,PID 控蝶阀);靶材电流环(磁控溅射靶电源,控膜厚均匀度);气体流量环(氩气/氮气质量流量计 MFC)。上位机不参与每个环的毫秒级闭环比,PLC和变频器/电源做内环,上位机盯工艺阶段的状态流转和各阶段的目标参数,出偏差就走联锁。这个分工想清楚,代码就不容易糊。
需求的骨架,我们用一张需求-方案映射表拢清楚,这也是后面验收的依据——锅是锅、盖是盖,别让工艺科跟开发各说一版:
| 工艺需求 | 上位机技术方案 |
|---|---|
| 一键自动出膜 | 工艺状态机把 抽真空→升温→清洗→镀膜→保压→冷却→放气 七个阶段串起来,操作员只按【启动】 |
| 膜厚分压实时看 | 石英测厚仪+真空规/残余气体分析 RGA 通过串口/网口采集,曲线叠加在工艺画面上,秒级刷新 |
| 配方换型快 | 配方做成 XML 文件下发 PLC,配内联引用(调用子配方),改参数不改程序 |
| 镀一半停电不废工件 | 阶段+时间戳持久化,上电检测残余膜厚与真空度,选"续镀"从断电阶段继续 |
| 出问题可追溯 | 所有工艺参数、设备状态、报警按时间戳入流水库,一键导出配方执行报告 |
代码分层:把"会变的"和"不变的"分开,是这次不返工的主因
镀膜上位机最容易写烂的是把通信、工艺、界面糊在一个 Form 里,一改工艺就动 UI,一调通信全崩。这次一开始就按职责切成四层,边界定死:
C# 里状态机别手写一堆 if 嵌套。我们用一个 阶段定义表 + 状态机引擎跑:每阶段是个配置项(阶段号、名称、进入条件、进入动作、超时时间、失败动作),引擎循环检测条件并迁移。这样加一个"镀铬层"的新工艺,只在配置里加一个 Phase 记录,代码一行不动。后台状态机线程消费 PLC 的采集数据,触发迁移后把阶段变更推给 UI 订阅,界面刷新的永远是最新阶段。
配方是 XML 还是数据库?我们最后两样都用了
直接下发给 PLC 的配方我们选了 XML——原因很简单:现场工程师要能在设备离线时用记事本快速调参数,XML 给机器读、给工艺科手动改都友好。结构上留了一个很值钱的特性:内联引用。一个"打底PI+镀铬"的复合膜,底层配方文件里直接 <include> 引用基础配方,避免同一段参数在多个文件里重复维护,改基础配方全链生效。
▲ 配方 XML:phase 定义到段,param 支持名称/单位/值三元组,include 实现内联复用
但配方本身也要入库做版本管理,所以设计成双轨:XML 是下发载体,数据库存版本号+修改人+发布状态。保存为草稿、发布生效、回滚上一版,C# 里封装一个 RecipeService 管这一套,操作全留审计。选配方也靠服务层读库拿最新已发布版,不给现场留"读了个未发布配方"的坑。
断电续镀:镀一半停电,工件为什么还能救
镀膜最怕镀到一半停电,真空没到位,膜层算废。续镀的核心思路是把"工艺进度"持久化,而不是靠内存记。每进入一个新 Phase,上位机立刻写一条"当前阶段+开始时间+当时的关键参数(真空度、膜厚采集值)"到本地库。上电后程序先读这条记录,再让操作员确认:设备里残余工件、真空度还够的,允许从断电时那个阶段继续跑剩下的时长;真空度已经崩了的,就提示回抽真空步骤而不是硬续。
这套上位机,现在成了设备厂的招牌配置
项目上线后,无锡这家厂的单机从原来"老师傅守半天手动调"改成"新学徒点一下启动",换型时间从 40 分钟压到 8 分钟,镀膜良率从 88% 提到 94%。当然这是工艺和设备本身优化的结果,上位机只是把流程和追溯理顺了。可单看软件侧,最大的收获是那个四层结构 + 阶段配置表——第二台、第三台不同腔体的镀膜机拿来,改配置就跑了,交付周期砍了一半。
你要做镀膜上位机,第一步干什么?
行动建议:别急着写 UI。先把这台设备的工艺阶段清单拉出来,每一阶段问三件事:进入条件是什么、这一阶段要控制什么参数、阶段超时了怎么办。这张清单研究明白,状态机和配方表就有了一半,剩下的都是把它填进去的活。
