4、HMI基础控件:按钮、指示灯、数值显示、文本标签、位图与矢量图

好,咱们今天聊聊HMI上最基础、也最常用的几个控件。说实话,不管你的界面做得多么花哨,最后跟操作员打交道的,就是这些基础元件。按钮、指示灯、数值显示、文本标签,还有位图和矢量图。我做了这么多年项目,发现很多新手容易在这上面栽跟头——不是功能实现不了,而是交互细节没处理好。

嗯,咱们一个一个来看。

4.1 按钮:不只是“点一下”那么简单

按钮是HMI上最频繁使用的控件。你想想看,操作员一天可能要点击几百次启动、停止、确认。如果按钮的反馈不够清晰,很容易误操作。

我个人习惯把按钮分为三类:

  • 瞬时按钮:按下时触发动作,松开后复位。比如“启动”按钮。
  • 切换按钮:按一下保持状态,再按一下切换。比如“手动/自动”模式切换。
  • 急停按钮:这个比较特殊,通常需要硬件配合,但软件上也要做互锁逻辑。

我在项目中遇到过一个问题:操作员反映按钮“不灵敏”。后来排查发现,是按钮的防抖时间设置得太短了。PLC扫描周期和HMI刷新周期没对齐,导致信号丢失。所以,我建议按钮的触发逻辑最好加上50-100ms的延时滤波。

小技巧:按钮的“按下”和“弹起”状态,最好用两种不同的颜色或阴影来区分。别只靠文字变化,操作员在紧急情况下没时间看字。

代码示例(基于Python + PyQt5模拟按钮状态机):

class HMIButton:
    def __init__(self, name):
        self.name = name
        self.state = "released"  # released / pressed
        self.timer = 0

    def on_press(self):
        self.state = "pressed"
        self.timer = time.time()
        # 触发按下动作
        print(f"{self.name} 按下")

    def on_release(self):
        elapsed = time.time() - self.timer
        if elapsed > 0.05:  # 50ms防抖
            self.state = "released"
            print(f"{self.name} 弹起,有效点击")
        else:
            print(f"{self.name} 弹起,忽略抖动")

4.2 指示灯:颜色和闪烁有讲究

指示灯说白了就是给操作员看的“信号牌”。但很多人把它做成了“装饰品”。

我见过最典型的错误:一个界面上有20多个指示灯,全是绿色常亮。操作员根本分不清哪个是运行中,哪个是待机状态。

我的建议

  • 绿色:正常运行、已启动、无故障。
  • 红色:故障、报警、急停。
  • 黄色/橙色:警告、待机、手动模式。
  • 蓝色:一般用于状态指示,比如“远程控制中”。
  • 白色/灰色:未激活、断电、无信号。

闪烁频率也有讲究。我曾经在一个项目中,把报警灯的闪烁频率设成了5Hz,结果操作员说看得头晕。后来改成了1Hz(每秒闪一次),配合声音提示,效果就好多了。

注意:指示灯不要用纯色块,最好加一个外发光或边框阴影。否则在强光环境下,操作员根本看不清颜色差异。

4.3 数值显示:精度和单位是命根子

数值显示控件,看起来简单,不就是显示个数字吗?但这里坑最多。

你想想看,一个温度值,PLC传过来的是整数100,但实际温度是100.5℃。如果你直接显示“100”,操作员可能以为温度没变化。但如果你显示“100.5”,操作员就知道还在微调。

我个人习惯

  • 整数型数据:显示整数,不保留小数。
  • 浮点型数据:根据精度要求保留1-2位小数。
  • 百分比:保留1位小数,并显示“%”符号。
  • 时间:格式化为“时:分:秒”,别直接显示秒数。

我曾经犯过一个低级错误:数值显示控件没有设置上下限。结果PLC通讯异常时,显示了一个巨大的负数,操作员以为设备爆炸了。从那以后,我每个数值显示控件都会加上范围限制,超出范围就显示“---”或者“ERR”。

核心原则:数值显示不仅要“看得见”,还要“看得懂”。单位、精度、范围,一个都不能少。

4.4 文本标签:别让操作员猜谜语

文本标签,就是界面上的文字说明。很多人觉得这有什么好讲的?但恰恰是这些文字,决定了操作员能不能快速理解界面。

我见过一个界面,按钮上写着“F1”,没有任何说明。操作员根本不知道F1是干嘛的。后来改成了“启动传送带”,一目了然。

我的建议

  • 动词开头:比如“启动”、“停止”、“确认”、“复位”。
  • 避免缩写:除非是行业通用缩写(比如PID、PLC),否则别用。
  • 字体大小:主标题用18-24px,按钮文字用14-16px,辅助说明用12px。
  • 多语言支持:如果设备出口,文本标签最好做成可切换的字符串表。

嗯,这里要注意:文本标签的对齐方式也很重要。左对齐适合阅读,居中对齐适合标题。别所有文字都居中对齐,看起来会很乱。

4.5 位图与矢量图:性能与美观的平衡

终于说到图形了。位图和矢量图,是HMI界面的“颜值担当”。但很多人只追求好看,忽略了性能。

位图(BMP/PNG/JPG)

  • 适合显示照片、复杂渐变、真实纹理。
  • 缺点是放大后会模糊,而且文件体积大。
  • 我建议:位图只用于背景图或设备照片,不要用于按钮图标。

矢量图(SVG/WMF)

  • 适合显示图标、流程图、管道、阀门。
  • 放大缩小不失真,文件体积小。
  • 我建议:所有按钮图标、状态指示、管道线条,都用矢量图。

我在一个项目中,用位图做了整个工厂的布局图,结果HMI加载要5秒钟。后来全部换成SVG矢量图,加载时间降到了0.5秒。操作员再也不用对着白屏发呆了。

性能优化技巧:如果必须用位图,尽量压缩到实际显示尺寸。别用1920x1080的图片,然后缩小到100x100显示。那是在浪费内存。

代码示例(SVG矢量图在HMI中的使用):

<!-- 一个简单的阀门图标,矢量格式 -->
<svg width="50" height="50" viewBox="0 0 50 50">
  <circle cx="25" cy="25" r="20" fill="#4CAF50" stroke="#333" stroke-width="2"/>
  <rect x="22" y="10" width="6" height="30" fill="#fff"/>
  <rect x="10" y="22" width="30" height="6" fill="#fff"/>
</svg>

这个SVG代码,画了一个绿色的圆形阀门,中间有白色的十字标识。你可以直接用在HMI上,放大到200px也不会模糊。

4.6 综合实战:一个简单的控制面板

说了这么多,咱们来组合一下。假设你要做一个“水泵控制面板”,需要包含:

  • 一个“启动”按钮(瞬时按钮,绿色)
  • 一个“停止”按钮(瞬时按钮,红色)
  • 一个“运行指示灯”(绿色常亮/熄灭)
  • 一个“故障指示灯”(红色闪烁)
  • 一个“当前压力”数值显示(单位:MPa,保留2位小数)
  • 一个“设备名称”文本标签(显示“1号水泵”)
  • 一个水泵的矢量图标

布局上,我习惯把按钮放在右侧,指示灯放在左侧,数值显示放在中间下方。这样操作员右手操作按钮,左手余光看指示灯,眼睛看数值,符合人体工程学。

记住:HMI设计不是画画,是为人机交互服务的。每一个控件的位置、大小、颜色,都要有理由。

好了,这一章的内容就到这里。下一章咱们聊聊“动画与状态切换”,到时候我会分享一些让界面“活起来”的技巧。你想想看,一个会动的HMI界面,操作员用起来得多舒服?