ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从图标到动画:工控HMI素材库设计与维护实战

从图标到动画:工控HMI素材库设计与维护实战

工控画面里最容易出问题的往往不是变量绑定,而是素材。上周帮一个做水处理项目的朋友看界面,他把上位机截图发过来,逻辑都对,就是看着别扭:离心泵的图标是从某个通用 UI 图标包里抠出来的齿轮形状,配色是那种很潮的紫色渐变,摆在深灰色管道图中间像贴了张表情包。他说找了两天没找到合适的工控素材,网上要么收费、要么风格不统一、要么下载下来发现是位图放大了糊成一片。这个场景我遇到太多次了:工业控制界面设计里,真正耗时间的不是把点表绑上去,而是先攒出一套语义准确、风格统一、能免费拿到手又敢用的素材图片和动画资源。这篇就把我这几年攒库、画图、踩坑的过程完整摊开,包括矢量与位图怎么选、动画有哪几种实现路子、以及素材入库后才会暴露的那些问题。不管你是刚接手 HMI 画面的新人,还是已经画了几十张图想整理素材库的老手,下面这些内容应该都能直接拿去用。

1. 拿互联网 UI 图标凑工控画面,问题到底出在哪

1.1 一个“齿轮”暴露的语义错位

通用 UI 语汇和工业语汇之间隔着一整套行业习惯。在手机 App 里,齿轮代表“设置”,点进去是配置页;但在工业现场的画面里,齿轮通常指的是传动装置、减速机或者某个机械本体的部位,它是被监控的对象,不是入口。你要是把齿轮放在画面右上角当设置按钮,老师傅第一反应会去看是不是减速机报故障了。

类似的错位还有一堆。“扳手”在通用图标里是工具/维护,工控画面里更常用“戴安全帽的人”或“检修牌”表示检修状态;“闪电”在 App 里是快捷、加速,工控里是电气/带电,含义完全不同;“三角形感叹号”在通用 UI 里是普通警告,工控里通常要配合颜色和闪烁频率才能区分提示、报警、联锁。

真正合格的工控图标,第一要求是一眼可辨且唯一可辨。控制室里操作员扫一眼画面,脑子里的识别路径是“形状→设备→状态”,文字标签是补充信息不是主要信息。所以离心泵必须画出蜗壳和切向出口,不能画成一个圆圈加三条线;闸阀要能看出阀体加手轮,球阀和蝶阀也得各有特征,不能三个阀门共用一个图标靠文字区分。这一点在做素材库的时候是硬指标,比好不好看重要得多。

我一般的判断方法是:把图标缩到 32 像素、去掉所有文字,拿给不熟悉这个项目的人看,问“这是什么”。答不出来或者答错的,直接返工。这个土办法筛出来的问题比任何设计规范都管用。

1.2 免费素材的三个硬门槛

网上搜“免费工业图标”,能搜到的资源大致分三类,但真正能落到项目里的不多。我筛素材只看三条,缺一条就不用:

门槛具体要求踩过的坑
授权可用明确允许商用、允许修改、允许二次分发有些包写着 free,实际只允许个人学习使用,项目交付后是隐患
体例完整同一套里泵、阀、罐、电机、管道、仪表都有,风格一致东拼西凑出来的画面,线条粗细和圆角半径全不一样,看着廉价
可编辑提供矢量源文件或分层文件,颜色能改只给 PNG 的,深色主题改浅色主题时全部作废,等于重画

第三条是最容易被忽略的。很多人觉得 PNG 好用,扔进去就行,等到客户说“我们现场屏幕是浅色的,你出个浅色版”,一整套图全部重做。这个学费我交过两次,现在库里没有矢量源文件的素材一律不入库。

1.3 我的实际做法:七分自制、三分收集

工控这个垂直领域的素材,指望找到一套完全贴合的资源不现实。我的做法是拿开源的通用图形做底子,改造成工业符号。比如开源图标库里有很多通用设备轮廓,拿过来加个出口法兰、改一下比例、统一线宽,十分钟就能得到一个新符号。真正需要完全从零画的,其实只有那些有明确工艺特征的:离心泵蜗壳、列管换热器管束、塔器的裙座、阀门的执行机构。

这样做的另一个好处是风格统一。同一套底稿改出来的东西,线宽、圆角、视觉重心天然一致,不会出现“左边是粗描边扁平风、右边是细线描边风”的尴尬。

提示:改造开源图形时注意保留原始授权文件和来源链接,很多开源协议要求署名或保留版权声明,交付时打包在素材说明里最省事。

2. 一套能上线的工控素材库,实际要分几层

2.1 设备本体层:泵、阀、罐、管道这四样占七成

不管你做什么行业的画面,设备本体层里泵、阀、罐、管道这四类能占到七成以上的使用量。所以素材库的优先级也按这个来排,先把这四类画齐、画细,其他设备边用边补。

尺寸上我固定四档:24、32、48、64 像素,对应画面里的小型状态点、一般设备、主要设备、大屏重点展示。为什么不干脆用一档然后缩放?因为工控图标的细节密度和尺寸是绑定的,24 像素的泵再放大到 96 像素,笔画之间会空得难受;反过来 64 像素的图标缩到 24,细节全糊成一团。四档分别画,工作量大概是画一档的 2.5 倍,但用起来省心太多。

设备分类我按工艺习惯来,而不是按字母顺序:

assets/devices/ pump/ centrifugal / diaphragm / screw / vacuum valve/ gate / globe / ball / butterfly / control / check tank/ vertical / horizontal / cone-bottom / agitator pipe/ straight / elbow / tee / reducer / flange exchanger/ shell-tube / plate / air-cooler instrument/ pressure / temperature / flow / level motor/ motor / fan / compressor / conveyor

这样分的好处是找东西快。画面上要加一个气动调节阀,直接进valve/control,不用在几百个文件里翻。

2.2 状态与动效层:状态比形状更值钱

设备形状画对只是及格线,真正决定画面专业度的是状态表达。同一台泵,至少有停止、运行、故障、检修、本地/远程五种状态要表达,如果只用一个灰色图标然后靠旁边的文字标签说明,画面信息密度就浪费了。

我库里的做法是形状只有一套,状态用配色和附加符号表达,通过图层组合实现:

状态主色附加视觉元素常见误用
运行绿叶轮旋转、出口管道流动用亮绿加发光,深色底上刺眼
停止中灰静止,无附加元素用纯黑,深色主题下看不见
故障红图标外框加红环或角标整块红色填充,盖住设备特征
检修/维护黄或橙加检修牌小角标用黄色填充代替角标,看着像报警
手动/本地蓝加手形或 L 角标和远程状态共用同一种蓝,分不清

配色这块必须提醒一句:红色代表停止还是代表故障、绿色代表运行还是代表安全,不同行业、不同现场的约定并不一致。我做过的一个项目里,客户现场的操作习惯是红色按钮=停止、绿色按钮=启动,而画面上的设备状态色他们要求红色=故障、绿色=运行,两者并存在同一张画面上,一开始把我绕晕了。所以素材库里的颜色不要写死,做成可替换的色板变量,进场前先跟甲方对一遍颜色语义,这半小时能省掉后面两周的返工。

2.3 交互与导航层、底图层

这两层最不起眼,但缺了画面就“不像个系统”。交互层包括按钮(普通、按下、禁用、危险操作)、导航(首页、上一页、下一页、返回、趋势、报警、报表、设置)、输入框边框、下拉箭头。底图层包括标题栏、面板背景、九宫格边框、分割线、网格纹理、角落装饰。

九宫格这个词值得单独说一下。面板边框如果用一整张图拉伸,圆角会被拉成椭圆,边框粗细也会不均匀。正确做法是把边框切成九块,四个角固定尺寸不拉伸,四条边单向拉伸,中间区域平铺。多数组态平台支持这种贴图方式,做素材的时候直接把边框按九宫格切好导出,比在平台里再切一遍省事。我库里的面板边框统一按圆角 8 像素切,边宽 2 像素,切出来是 24×24 的角块。

3. 位图和矢量的账怎么算

3.1 缩放这一关:从设计稿到现场大屏

这是我最想强调的一点。做画面的时候在 1920×1080 的笔记本上看着挺好,投到现场 55 寸或拼接屏上,位图图标就露馅了——边缘发虚、细线断成虚线、渐变出现色带。

算一笔账:一个图标在设计稿里按 32 像素设计,投到 4K 分辨率(3840×2160)的屏幕上,如果画面做了等比放大,实际显示尺寸是 64 像素,位图需要 2 倍图才不会糊,投到拼接屏(通常单屏 1920×1080 拼成 7680×2160)就是 4 倍。也就是说按 32 像素画的 PNG,最好准备 32/64/128 三档,加起来体积是单档的三倍多。

而矢量只要一个文件,任意缩放都清晰。所以我的原则很简单:图标类、线条类、文字类用矢量,设备实物图、复杂渐变底图、纹理用位图。设备照片、三维渲染图这类本来就没法矢量的东西,按最高目标分辨率的 1.5 倍出图,宁可大一点再缩小。

3.2 改色成本:一次主题切换的对比实验

我做过一次实际的对比。同一个罐体图标,一套是 PNG(64 像素,带透明背景),一套是 SVG。要求是把运行/停止/故障三种状态色各出一版,也就是 3 个颜色变体。

PNG 那套:要在位图软件里逐个打开、选中主体、替换颜色、导出,每个图标大概 3 分钟,一套 40 个图标就是 2 小时,而且换颜色时抗锯齿边缘容易发灰。SVG 那套:改一个 CSS 变量或者直接改填充色,批量脚本一跑,40 个图标 20 秒出完,边缘完全干净。这个差距在需要出深色/浅色双主题的时候会被放大到不可接受。

3.3 体积与渲染性能的实测数据

矢量不是没有代价。SVG 里包含大量路径节点、滤镜、蒙版的时候,解析和渲染开销会明显上升,而部分组态平台对 SVG 的支持只到“能显示”的程度,复杂特性直接忽略或者渲染错。

我在自己的机器上做过一次粗略统计(同一台机器,同一画面,200 个图标对象):

素材形式单文件平均体积200 个对象加载耗时缩放后清晰度
PNG 32px约 1.2 KB约 0.3 s放大后发虚
PNG 128px约 8 KB约 1.1 s2 倍内可用
SVG 简化路径约 2.5 KB约 0.6 s无损
SVG 含滤镜与渐变20 KB 以上3 s 以上,偶发卡顿无损但渲染慢

结论很明确:用 SVG,但导出前把滤镜、投影、模糊全部栅格化或去掉,把文字转成路径,把多余的图层合并。清理过的 SVG 体积比 PNG 大不了多少,还省掉了多倍图的麻烦。含滤镜的 SVG 我是绝对不入库的,那玩意在某些平台上就是性能杀手。

4. 从零画一套图标:可复用的六步流程

4.1 先定栅格和线宽基准,别一上来就画

新手最容易犯的错是打开软件直接描形状,画到第十个图标才发现前九个的线宽都不一样。正确顺序是先定规矩:

以 24 像素这一档为基准建立栅格。画布 24×24,四周留 2 像素安全边距,实际绘制区 20×20。主要线条宽度 2 像素,次要细节 1.5 像素。所有水平线、垂直线尽量对齐到 0.5 像素格,避免抗锯齿产生灰边。圆形和斜线允许不对齐,但视觉重心要落在画布中心。

24 这一档定好之后,48 和 64 是它的整数倍放大加细节,32 是单独调整——因为 32 不是 24 的整数倍,直接缩放比例会很别扭,需要手动调整笔画位置。这就是为什么我说四档要分别画,不能纯靠缩放。

4.2 用几何体拼,别用自由曲线

工控图标的美感来自规整,不是来自手绘感。离心泵我用一个正圆(蜗壳)加一个切向矩形(出口)加一个小圆(吸入口)拼出来,全是对称几何体;闸阀用矩形阀体加一个正圆手轮加三条辐条;列管换热器就是一个大矩形里排几行小圆点。

好处有三个:一是快,拼比画快得多;二是统一,所有图标的圆角半径、笔画收尾都一致;三是可维护,三个月后要改细节,拆开几何体就行,不用重新描。

具体操作上,我会把常用零件做成一个小零件库:标准法兰(三种口径)、标准手轮、标准接线盒、标准支腿、标准仪表表盘。画新设备时复制粘贴修改,效率比从零画高好几倍。

4.3 转曲、清理、导出三件套

导出前有三步固定动作,一步都不能省:

  1. 文字转曲。图标里如果有字母(比如泵上的 P、罐上的 V-101),必须转成路径。不转的话,换一台没装这个字体的机器打开就变成方框或者默认字体,字号位置全乱。我吃过一次亏,交付后客户打开发现所有仪表位号都变成了宋体,位置还偏了 5 像素。
  2. 清理无用节点和空图层。路径节点过多的 SVG,文件大、渲染慢,还容易出现毛刺。用“简化路径”功能把节点数压到必要程度,但注意别压过头,直线会变弯。
  3. 展开描边、合并可见图层。描边如果保留为描边属性,某些平台的描边宽度默认值不同,会画出来粗细不一。展开成填充后就没有这个风险。

4.4 命名和目录:三个月后的你还得找得到

命名规则我用了很多年,一直是这个结构:

dev_pump_centrifugal_run_64.svg | | | | | 类型 设备 子类型 状态 尺寸

类型前缀用dev_(设备)、ico_(交互图标)、bg_(背景)、btn_(按钮)、ani_(动画帧序列)。这样在文件夹里按名称排序,同类自动聚在一起。状态字段只有需要区分状态的素材才写,不区分的留空。

动画帧序列的命名要多加两位帧号:ani_pump_rotor_run_64_f01.svg,帧号补零,保证按名称排序时 f01 在 f02 前面而不是 f1 在 f10 后面。这个细节看起来无聊,但批量导入的时候能救命。

5. 四类高频动画:实现方式与性能账

5.1 旋转类:优先用属性旋转,别用帧序列

电机、风机、泵叶轮、搅拌器、传送带滚筒,这五类旋转是画面里最常见的动效。很多教程教你把一个旋转周期拆成 8 帧或 12 帧,导出 PNG 序列,然后循环播放。我早期也这么干,后来发现两个问题:一是帧数少了转动一顿一顿的,帧数多了文件体积爆炸;二是转速变化时(比如变频调速),帧序列没法平滑对应。

更合理的做法是用平台自带的旋转属性:放一张静态的叶轮图,绑定一个角度变量,运行时变量按时间自增,画面就转起来了。这样转速可以通过修改变量步长随意调整,从 30 转/分到 3000 转/分都平滑。代价是有些平台对旋转支持不好,会出现锯齿或者锚点偏离。锚点偏离是常见问题,解决方法是把叶轮的旋转中心做在画布的正中心,不要偏。

实在只能用帧序列的场景(比如做说明书截图、做演示视频),8 帧是底线,12 帧比较流畅,超过 16 帧就没必要了,人眼在 1 秒一圈的速度下分辨不出差别。帧图必须是同一画布尺寸、同一中心点,导出时用统一裁切框,否则播放时会“跳”。

5.2 液位类:遮罩法比逐帧画靠谱

罐体液位是最常被做错的动效。有人把液位画成十张不同高度的静态图,用变量切换,结果液位变化时是跳变的,一格一格往上蹦。正确的做法是三层结构:

  • 底层:罐体的壳,包含高光、刻度线、进出口法兰
  • 中层:液位色块,一个矩形,高度随液位变量变化
  • 顶层:罐体前方的遮挡层,把液位色块超出罐体的部分挡住

这样液位就是连续变化的,哪怕每秒刷新一次也很平滑。要做出“波动感”,在液位色块上方叠一条正弦波形的高光带,让这条带子做几像素的上下位移,视觉上就有液体晃动的感觉,实际液位高度还是由变量控制的,不掺假。

提示:遮罩层一定要用和罐体同色的填充,不要用透明加边框,否则液位色块会从边框外面透出来,看着像漏水。

5.3 管道流动:虚线偏移比贴图省事

表示介质流动的传统做法是用箭头贴图沿管道平铺然后位移。这个方法能用,但箭头密度和管道长度要逐个调,管道一改长度全部重做。

更省事的做法是虚线偏移:把管道画成一条粗描边,描边样式设为虚线,然后让虚线的起始偏移量随时间变化,看起来就是虚线在往前跑,非常像流动。颜色、流速、方向都能通过参数控制,改起来几秒钟的事。缺点是有些平台的描边虚线只有实线/点线两档,不能自定义 dash 长度,这时候退回贴图方案。

流向的视觉表达还有个细节:管道流动的速度不应该和实际流速严格成比例。实际流速从 0.5 m/s 到 3 m/s,如果视觉上严格对应,慢的时候几乎看不出在动。行业里的普遍做法是设一个下限速度,只要在流动就用同一个视觉速度,快慢靠旁边的数字仪表体现。这个取舍有点反直觉,但现场反馈是这么做好用。

5.4 闪烁与报警:别让动效变成干扰源

报警闪烁是双刃剑。用对了,操作员一眼看到异常;用错了,整屏都在闪,等于没有提示。

我的经验值:闪烁频率 0.5 到 1 秒一个周期,也就是每秒闪 1 到 2 次。再快会让人烦躁,再慢不够醒目。同屏同时闪烁的元素不要超过两个,超过就说明画面信息设计有问题,应该用报警汇总条来替代。不同级别的报警不要用不同的闪烁频率来区分,因为人眼分辨频率变化的能力很弱,用颜色加静态图标区分更可靠。

还有一类常见的过度设计:设备运行状态也做成呼吸灯效果。运行状态是常态,常态不应该有动效,动效应该留给“需要立即注意”的东西。我见过一个画面,四台泵全部在做呼吸灯,操作员看了半天问我哪台在报警。这个教训很值钱。

6. 素材入库之后才会暴露的坑

6.1 透明背景边缘发黑

这个坑几乎每个做深色主题的人都会踩。PNG 的透明区域在深色背景上显示时,图标边缘会出现一圈深灰色的毛边,看着像描了黑边。

根本原因是抗锯齿产生的半透明像素,在合成时和背景色混合的方式不同。解决办法有两个:一是导出时选择“透明背景”并且不要让边缘带半透明过渡,也就是画的时候关键线条对齐像素格,减少抗锯齿;二是在平台里给图标加一个和背景同色的底板,虽然多一个元素,但视觉上干净。

我现在的习惯是:浅色元素放深色底,边缘这个问题在 32 像素以下最明显,所以小尺寸图标一律手动画对齐像素,不靠缩放生成。

6.2 SVG 被平台吃掉的功能

不同组态平台对 SVG 的支持能力差别很大,我在五个平台上测过同一批文件,结果是这样几类功能容易出问题:

功能常见表现规避方式
文字不显示或字体替换全部转曲
滤镜(模糊、投影)完全不生效或渲染成黑块不用,改用多层色块模拟
渐变方向错乱或颜色翻转简单线性渐变可用,径向渐变少用
蒙版与剪裁内容溢出或丢失展开为实际路径
描边虚线不支持自定义 dash展开成路径或用贴图
外部链接图片不加载全部内嵌为路径

结论是把 SVG 当成“一堆路径的集合”来用,凡是超出路径和基础填充的能力,一律不依赖。这样导出的文件虽然不是最漂亮的,但在任何平台上都能正常显示。多花五分钟清理,能省掉现场调试的两小时。

6.3 风格混搭带来的廉价感

这个问题比技术问题更难治。一个画面里如果出现了三种线宽、两种圆角、两种配色逻辑的素材,哪怕每个单独看都不错,整体也会像拼贴画。

我现在对入库素材有一个强制的“风格检查”步骤:把新素材和库里已有的素材拼在一张 1920×1080 的画布上,缩放同一比例,然后后退两步看整体。如果新素材明显抢眼或者明显单薄,就得调整。调整方向通常是收敛:统一线宽、统一圆角半径、统一饱和度。

具体到参数上,我的库固定在这样几组值:描边宽度 2 像素(48 像素档)、圆角半径 2 像素、设备本体用两个明度层(主色加一个 15% 暗的同色系做暗部)、高光只用一条 1 像素的白色线条不信。这些数字没有权威依据,纯粹是多年试下来最顺眼的组合,你可以直接抄,也可以按自己项目的整体风格定,关键是要定下来并且写进文档。

6.4 来源记录和授权留档

这件事前期嫌麻烦,后期救命。我的做法是在素材根目录放一个说明文件,每个素材记录四项:来源、授权类型、是否修改过、入库日期。格式不用很正式,一个 Markdown 表格就行。

| 文件名 | 来源 | 授权 | 修改 | 日期 | | dev_pump_centrifugal_run_64.svg | 自制 | 项目内使用 | - | 2024-03-11 | | ico_alarm_bell_32.svg | 开源图标库A | 可商用需署名 | 改色 | 2024-03-11 |

项目交付或者换人接手的时候,这张表能直接回答问题“这个东西能不能带走”。我见过因为没有来源记录,交付前把所有来路不明的图标全部重画的案例,两天时间白费。

7. 素材库怎么维护才不至于半年后成一团乱麻

7.1 用版本号而不是“最终版”“最终版2”

素材库和代码一样需要版本管理,只是因为多数人不用版本工具,就得靠命名。我的命名是v主.次,主版本表示整体风格改版(比如统一改了线宽),次版本表示新增或微调。文件名里带版本,比如dev_valve_gate_run_64_v2.1.svg。

同时在根目录维护一个CHANGELOG,每次批量改动写一行:改了什么、为什么改、影响了哪些文件。这一行文字在半年后回看价值极高,尤其是“为什么改”这部分,能防止你再次犯同一个错。

7.2 预览列表让检索不靠记忆

素材多了以后,光看文件名想不起来长什么样,得一个个打开看,效率极低。解决办法是自动生成一张预览图:把所有图标按分类排列,缩放到统一尺寸,拼成一张大图,标上文件名。用脚本批量处理,几十行代码的事,每次素材更新后重新生成一次。

有了这张图,找素材从“打开十个文件看”变成“扫一眼大图”,速度快十倍。而且这张图还能直观暴露风格不一致的问题——一眼就能看出哪个图标画风跑偏了。

7.3 交接时的三样东西

如果这个素材库要交给别人维护,需要准备三样:预览大图、命名与风格规范文档、来源授权表。少一样,接手的人就得重新摸索一遍,通常的结果是他不用你的库,自己另起一套,然后项目里出现两套风格。

我自己踩过的最大的坑不是技术问题,而是当年没写规范文档,换项目后自己都忘了当时的线宽基准是多少,只能靠量现存文件反推。从那以后规范文档变成了硬性交付物,哪怕只有半页纸,也必须有。

最后分享一个我一直在用的小习惯:每次做新项目,第一件事不是画画面,而是先花半天把素材库按这个项目的行业和配色调一遍,调完再动手。这半天看起来是浪费,实际上能省掉后面反复返工的时间。素材库这东西,前期多花的时间,后期会以几倍的效率还回来。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进