现场装软件最常见的方式是什么?U 盘拷个文件夹,右键压缩包解压到桌面,双击 exe,跑不起来,微信问开发,远程捣鼓两小时。这不是段子,是大部分中小工控项目的日常。这篇讲交付物该长什么样:一个自包含的安装包、一段诚实的首次运行向导、一套不会把现场搞挂的升级覆盖策略。
一、自包含:交付物里必须有"世界的一切假设"
裸拷 exe 最大的问题是它对目标机器有假设:假设装了某个版本的运行库、假设有某个字体、假设系统变量设了、假设驱动打过。开发机全都有,现场全新装的 Win10 LTSC 什么都没有。
自包含清单,装包前逐项打勾:
- 运行库随包。Python 程序用嵌入式发行版打包(python embeddable package),C# 程序带上目标框架的离线安装器或直接自包含发布(self-contained,体积大一点但省一晚上远程),VC++ 运行库别赌机器上有。
- 配置模板与配置分离。程序目录里放
config.default.*,首启时复制成config.*。模板随升级更新,客户改过的配置永远不被动。 - 数据目录外置。安装目录只放代码,数据库、日志、备份全放
ProgramData\你的产品名\。这一条直接消灭 article-2 里讲过的 UAC 写入失败坑——不是绕过它,是从目录规划上让它不存在。 - 文档进包。README、常见问题、日志位置说明,放在开始菜单入口旁边。现场断网时,班长能自己找到日志在哪。
安装器本身用 Inno Setup 或 WiX 这类成熟工具,别手写批处理。理由很实际:成熟安装器自带回滚、自带卸载登记、自带依赖检测,你手写的 copy 脚本一条失败就停在半路。
二、首次运行向导:把两小时的远程,变成三分钟的自助
程序第一次跑起来,是整个交付生命周期里信息最不对称的时刻:机器什么配置、串口长什么样、PLC 地址多少,只有现场的人知道。首启向导的本质是把远程问答脚本化。
向导四步,一步一验证:
第一步环境自检。串口在不在(列出现有 COM 口)、数据库文件可不可写、磁盘剩余多少、防火墙对目标端口放行没放行。每项给"通过/警告/失败"三态,失败项给一句人话的原因和一条可执行的动作(“COM3 被 XX 程序占用,关闭后重试”),而不是一个错误码。
第二步链路连通。填 PLC 地址、串口参数,点"测试连接",成功读一个已知寄存器并显示当前值。这一步把"程序装好了但连不上"的定位成本从一次远程降到现场自助。四要素不一致的坑(article-13 讲过偶通偶断的原理)在这里被前置拦截。
第三步初始化数据。建库、建表、写入默认点表模板。所有动作打日志——向导的每一步都按分级日志落盘,将来排障时能还原"装的时候到底配成了什么样"。日志格式直接套 A16 的纪律,别另起炉灶。
第四步生成装机快照。向导结束前把环境信息(机器名、OS 版本、COM 口分配、连接参数、程序版本)写成一个快照文件。将来升级、排障、换机重装,第一件事就是看这份快照——它是这台工位机的"出生证明"。
三、升级覆盖:现场最贵的十分钟
升级翻车是工控软件特有的痛:车间不可能给你停线两小时慢慢调试,覆盖到一半断电、新版本起不来、旧版本回不去,这三个里中任何一个,代价都是停产。
升级覆盖三原则:
原则一:旧版完整保留。升级不是覆盖,是"新目录+切换"。app\v1.2\、app\v1.3\并存,一个current指针(快捷方式或启动器读取的版本文件)指向当前版本。新版本起不来,把指针拨回去,一分钟恢复生产。旧目录保留最近两个版本,再旧的自动清。
原则二:升级器独立于主程序。别让主程序自己升级自己——文件被占用,Windows 下正在运行的 exe 删不掉。独立的小升级器:主程序退出、升级器接手做复制和校验、完成后拉起新版。升级器要极简,越简单越不会坏。
原则三:数据迁移单向、有备份、可跳过。版本间数据库结构变了,迁移脚本按版本号链式执行(1.2→1.3 有 01_12_to_13.sql)。执行前自动备份数据库文件,迁移失败恢复备份并回拨版本指针——这是"升级失败=回到升级前"的完整闭环。断电发生在复制中途也不怕:文件级的原子切换(先写临时名再改名)加上目录级的新旧并存,天然满足 A18 讲的断电可恢复语义,升级这件事本身就是断电续跑设计的一个特例。
升级完成后首启自动比对快照:串口配置没变、点表数量对得上、版本号符合预期,三项绿了才算升级成功,任何一项红了直接回滚并报警。别让"升级成功了但产线数据少了三成"这种事发生在客户发现之后。
四、一张部署检查表
装包前过一遍:自包含四项勾了吗?向导四步能在无网环境走通吗?升级演练做过"升级中断电"吗?回滚实测过吗?快照能重放出配置吗?这五问就是部署质量的验收标准。工控软件的交付物,从"一个 exe"进化成"安装包+向导+升级器+快照"四件套,多花的是两天开发时间,省下的是每次现场问题的两小时远程和每次升级时的心跳加速。
完整可运行的部署工程模板(Inno Setup 脚本、首启向导 C#/Python 双语言源码、目录切换升级器、断电中断演练步骤)我整理放作者付费资源,改产品名就能用。