无锡这家真空镀膜设备厂要的是一套能"一键出膜"的上位机:操作员选配方、点启动,抽真空到烘烤到镀膜到保压全程自动走,膜厚分压实时可看,出问题能断电续镀。我们用 C# WinForm 做了整机控制,硬啃下来发现镀膜上位机的难点全在那套工艺状态机上——通信反而是最省事的。这篇按真实项目的推进顺序复盘,需求怎么提、分层怎么设计、配方怎么解析、停电怎么续。

先把"镀膜"这件事翻译成上位机能管的信号

真空镀膜看着神秘,落到 PLC 和上位机层面就三类闭环:真空度环(抽真空、保压、放气,PID 控蝶阀);靶材电流环(磁控溅射靶电源,控膜厚均匀度);气体流量环(氩气/氮气质量流量计 MFC)。上位机不参与每个环的毫秒级闭环比,PLC和变频器/电源做内环,上位机盯工艺阶段的状态流转和各阶段的目标参数,出偏差就走联锁。这个分工想清楚,代码就不容易糊。

需求的骨架,我们用一张需求-方案映射表拢清楚,这也是后面验收的依据——锅是锅、盖是盖,别让工艺科跟开发各说一版:

工艺需求上位机技术方案
一键自动出膜工艺状态机把 抽真空→升温→清洗→镀膜→保压→冷却→放气 七个阶段串起来,操作员只按【启动】
膜厚分压实时看石英测厚仪+真空规/残余气体分析 RGA 通过串口/网口采集,曲线叠加在工艺画面上,秒级刷新
配方换型快配方做成 XML 文件下发 PLC,配内联引用(调用子配方),改参数不改程序
镀一半停电不废工件阶段+时间戳持久化,上电检测残余膜厚与真空度,选"续镀"从断电阶段继续
出问题可追溯所有工艺参数、设备状态、报警按时间戳入流水库,一键导出配方执行报告

代码分层:把"会变的"和"不变的"分开,是这次不返工的主因

镀膜上位机最容易写烂的是把通信、工艺、界面糊在一个 Form 里,一改工艺就动 UI,一调通信全崩。这次一开始就按职责切成四层,边界定死:

L1通信层封装 PLC(MC协议)、测厚仪(RN-222)、RGA、MFC四种协议,对外统一读/写/订阅接口
L2工艺状态机7阶段状态流转+迁移条件+进入动作,独立于UI,可单测
L3配方解析读XML配方→生成参数报文→下发PLC,含版本与内联解析
L4人机界面WinForm绑定状态机事件刷新,只管展示与操作入口

C# 里状态机别手写一堆 if 嵌套。我们用一个 阶段定义表 + 状态机引擎跑:每阶段是个配置项(阶段号、名称、进入条件、进入动作、超时时间、失败动作),引擎循环检测条件并迁移。这样加一个"镀铬层"的新工艺,只在配置里加一个 Phase 记录,代码一行不动。后台状态机线程消费 PLC 的采集数据,触发迁移后把阶段变更推给 UI 订阅,界面刷新的永远是最新阶段。

配方是 XML 还是数据库?我们最后两样都用了

直接下发给 PLC 的配方我们选了 XML——原因很简单:现场工程师要能在设备离线时用记事本快速调参数,XML 给机器读、给工艺科手动改都友好。结构上留了一个很值钱的特性:内联引用。一个"打底PI+镀铬"的复合膜,底层配方文件里直接 <include> 引用基础配方,避免同一段参数在多个文件里重复维护,改基础配方全链生效。

<recipe name="Cr_Bottom_Top" version="2.1"> <include src="/recipes/base_ti.xml"/> <!-- 内联:底层钛 PI 参数 --> <phase id="5" target="coat_cr"> <param name="sputter_current" unit="A">32.5</param> <param name="ar_flow" unit="sccm">120</param> <param name="vacuum_floor" unit="Pa">6.0e-3</param> </phase> </recipe>

▲ 配方 XML:phase 定义到段,param 支持名称/单位/值三元组,include 实现内联复用

但配方本身也要入库做版本管理,所以设计成双轨:XML 是下发载体,数据库存版本号+修改人+发布状态。保存为草稿、发布生效、回滚上一版,C# 里封装一个 RecipeService 管这一套,操作全留审计。选配方也靠服务层读库拿最新已发布版,不给现场留"读了个未发布配方"的坑。

断电续镀:镀一半停电,工件为什么还能救

镀膜最怕镀到一半停电,真空没到位,膜层算废。续镀的核心思路是把"工艺进度"持久化,而不是靠内存记。每进入一个新 Phase,上位机立刻写一条"当前阶段+开始时间+当时的关键参数(真空度、膜厚采集值)"到本地库。上电后程序先读这条记录,再让操作员确认:设备里残余工件、真空度还够的,允许从断电时那个阶段继续跑剩下的时长;真空度已经崩了的,就提示回抽真空步骤而不是硬续。

这次项目踩最深的坑:最初续镀只记了阶段号没记真空度,结果断电 5 分钟内的续镀因为真空早泄了,镀出来花膜。后来把"进入阶段时的真空度快照"也存进续镀点,续镀判断加一道"残余真空是否达标"的闸,花膜问题绝迹。判断续镀能不能续,永远别只看阶段,要看当时的关键工艺环境参数。

这套上位机,现在成了设备厂的招牌配置

项目上线后,无锡这家厂的单机从原来"老师傅守半天手动调"改成"新学徒点一下启动",换型时间从 40 分钟压到 8 分钟,镀膜良率从 88% 提到 94%。当然这是工艺和设备本身优化的结果,上位机只是把流程和追溯理顺了。可单看软件侧,最大的收获是那个四层结构 + 阶段配置表——第二台、第三台不同腔体的镀膜机拿来,改配置就跑了,交付周期砍了一半。

你要做镀膜上位机,第一步干什么?

行动建议:别急着写 UI。先把这台设备的工艺阶段清单拉出来,每一阶段问三件事:进入条件是什么、这一阶段要控制什么参数、阶段超时了怎么办。这张清单研究明白,状态机和配方表就有了一半,剩下的都是把它填进去的活。