Appearance
操作员界面与维护诊断分层
一套上位机软件经常同时面对两类人:
- 操作员 / 测试人员:关心设备能不能用、当前在做什么、出了什么事、下一步怎么办;
- 维护 / 调试人员:关心哪条命令失败、错误码是什么、协议返回了什么、线程和状态在哪一步异常。
把两类信息全部堆在一个界面上,软件会越来越像开发调试器;只保留“通信失败”这种一句话,又会让现场问题无法定位。
V10 的目标是:操作层简洁明确,诊断层证据完整。
1. 两层信息模型
OperatorSummary
面向操作员,特点是:
- 中文短句;
- 先说结果;
- 说明当前状态;
- 告诉用户下一步能做什么;
- 不要求理解协议、寄存器、异常类型和内部模块名。
例如:
text
设备连接失败,请检查网线和设备电源后重试。text
示波器未准备完成,本次采集未开始。请确认设备状态后重新自检。DiagnosticDetail
面向维护人员,保留:
- SCPI / Modbus / 自定义协议原文;
- TX/RX 原始数据;
- 错误码、寄存器、状态字;
- 设备错误队列;
- 异常类型和堆栈;
- request/session/通道信息;
- 时间戳、超时和重试次数;
- 关键状态机位置。
例如:
text
2026-08-25 14:31:22.184 [Scope] READ_RAW failed
Command=:WAV:DATA?
Session=scope-1
Timeout=3000ms
Error=-410 Query INTERRUPTED
State=StopWindow.RawRecovery这两层不是互相替代,而是同一个事件的两种表达。
2. 一条异常应该怎样从底层走到界面
推荐思路:
text
底层异常 / 设备返回
↓
DiagnosticDetail
↓
业务语义判断
↓
Event Consequence
↓
OperatorSummary
↓
界面状态 / 弹窗 / 状态栏 / 日志中间必须先经过“业务语义判断”。
例如同样是磁盘空间低:
text
底层事实: D: 剩余 4.7 GB
业务分类: Advisory
操作员显示: 磁盘空间不足 5 GB,建议清理后继续。是否继续测试?
维护诊断: drive=D:\ free=4.7GB threshold=5GB check=PreStart不要因为底层返回了 error,就自动把事件升级成 InterlockFault。
3. 操作员真正需要看到的 5 类信息
3.1 设备身份
操作员应该知道:
- 这是哪台设备;
- 当前连接的是哪个实例;
- 是否在线;
- 是否被占用;
- 是否允许操作。
比“进程 PID 18240 已启动”更有价值的是:
text
高压电源 1 在线 可控制
示波器 1 在线 采集中
信号源 1 离线 重新连接3.2 当前业务状态
状态应使用操作语义:
text
待机
自检中
准备就绪
测试中
停止中
已完成
故障不要直接把内部枚举、线程状态或通信状态原样暴露给操作员。
3.3 关键结果
操作员需要看到:
- 当前值;
- 目标值;
- 是否达标;
- 当前步骤;
- 剩余时间;
- 结果是否有效。
不是所有原始采样、寄存器和协议字段都应该常驻主界面。
3.4 异常后果
异常信息必须让人知道“现在还能不能继续”。
建议与事件后果一致:
| 类型 | 操作员感知 |
|---|---|
| Information | 状态提示,不打断 |
| Advisory | 需要注意或确认,但可以继续 |
| AlarmOnly | 明确报警并记录,流程继续 |
| InterlockFault | 明确说明流程已停止/被阻断 |
详见 行为与告警语义。
3.5 下一步动作
好提示不是:
text
CommunicationException而是:
text
设备连接已中断,当前测试已暂停。
请检查设备连接后点击“重新连接”。如果软件不能自动恢复,也要说清楚用户能做什么。
4. 主界面、详细信息和日志怎么分工
建议三层:
text
主界面
→ 当前状态 + 关键数据 + 高频操作 + 重要异常
详细信息 / 维护页
→ 设备参数 + 连接详情 + 错误码 + 当前模式 + 诊断状态
日志 / 导出证据
→ 原始命令 + 原始响应 + 时间线 + 堆栈 + 完整上下文主界面不是“信息越少越高级”,而是只放对当前操作决策有用的信息。
详细信息页也不是“把所有变量 dump 出来”,而是保留维护人员真正能用来定位问题的证据。
5. 中英文和设备原文怎么处理
常见错误是:
text
设备通信失败 Communication failed如果两句意思完全重复,操作员层只需要:
text
设备通信失败,请检查连接后重试。而底层原文:
text
SocketException: Connection reset by peer保留在 DiagnosticDetail 或日志中。
什么时候应该保留英文原文
- 设备厂商错误文本本身有诊断价值;
- 错误码需要和手册对应;
- SCPI / API 原文是定位依据;
- 翻译可能丢失技术含义。
这时不是把英文塞进主弹窗,而是在“详细信息”中可查看。
6. 一条消息的推荐结构
yaml
EventId: ScopeConnectionLost
Severity: AlarmOnly
OperatorSummary:
Title: 示波器连接中断
Message: 当前采集已停止,请检查网线和设备状态后重新连接。
NextAction: 重新连接
DiagnosticDetail:
Device: DHO900-1
Endpoint: 192.168.1.20:5555
Exception: SocketException
RawMessage: Connection reset by peer
WorkflowState: Acquiring
Timestamp: 2026-08-25T14:31:22.184+08:00不要求项目必须真的使用这个类或结构;它表达的是信息边界。
7. 什么时候要弹窗,什么时候只放状态栏
适合弹窗 / 强提示
- 需要用户做决定;
- 当前操作无法继续;
- 危险操作需要确认;
- 用户必须知道状态已经发生重大变化。
适合状态栏 / 非阻塞提示
- 自动恢复成功;
- 信息性状态变化;
- 不影响当前流程的提醒;
- 高频但无需人工处理的状态。
不适合不停弹窗
- 设备轮询每秒失败一次;
- 同一个故障持续存在;
- 后台正在自动重连;
- 已经有持续状态指示。
高频异常应该聚合和去重,否则操作员只能不停点“确定”。
8. 报警去重、节流和恢复提示
长时间运行设备常见:同一个故障每个轮询周期都产生一条消息。
需要区分:
text
FaultEnter
FaultStillActive
FaultRecovered操作员可能只需要:
text
14:31 示波器连接中断
14:31 自动重连中…
14:32 示波器连接已恢复诊断日志仍然可以记录每次底层尝试。
不要为了“日志完整”让主界面每秒刷几十条重复错误。
9. 状态颜色不能代替文字
工业界面不要只靠红/黄/绿:
text
● 在线
● 报警
● 故障颜色用于加速识别,文字负责明确语义。
尤其要区分:
- 离线;
- 未配置;
- 连接中;
- 被占用;
- 报警但可继续;
- 故障已阻断。
它们不应该都只是“红色”。
10. 面向实验人员,不要暴露开发者概念
主界面通常不需要显示:
- PID;
- 线程 ID;
- 类名;
- 方法名;
- DLL 名;
- 内部服务名;
- “进程启动成功”;
- “Task 状态 = RanToCompletion”。
除非这些内容对现场维护确实有价值,否则放到诊断页或日志。
对操作员更有用的是:
text
设备已连接
自检通过
测试进行中
数据保存正常
示波器离线
高压电源故障,测试已停止11. AI 修改提示语时不要自动造抽象
单个页面一句文案改错:
text
直接 MicroPatch不要为了“一致性”马上创建新的 MessageFormatter、ErrorPresenter、ResourceManager 层。
只有同一类格式问题已经在两个以上入口重复出现,而且确实需要统一行为,才考虑抽取公共 Formatter / Mapping。
这能避免一个小文案修改变成半天重构。
12. Review 清单
改操作员提示或诊断信息时检查:
- 操作员是否知道发生了什么;
- 是否知道流程当前还能不能继续;
- 是否知道下一步能做什么;
- 中文是否足够清晰;
- DiagnosticDetail 是否保留底层证据;
- 错误码、单位、时间戳是否可追踪;
- 同一故障是否重复轰炸 UI;
- 恢复后是否有明确状态;
- AlarmOnly 是否被误实现成 Stop;
- Information / Advisory 是否变成新的启动门禁;
- 单点文案是否引入了不必要的新抽象。
13. 可直接复制的 Prompt
text
$host-computer-dev
请检查这次上位机提示/异常显示是否正确分层。
目标用户:
【操作员 / 测试人员 / 调试工程师 / 维护人员】
当前提示:
【填写】
实际底层证据:
【异常、错误码、协议原文、日志】
请分别给出:
1. OperatorSummary:简短中文,说明结果、当前后果和下一步动作;
2. DiagnosticDetail:保留定位问题需要的原始技术证据;
3. 这条事件属于 Information / Advisory / AlarmOnly / InterlockFault 哪一种;
4. 是否需要弹窗、状态栏、日志,还是组合展示;
5. 是否需要去重/节流/恢复提示。
如果只是单点文案问题,按 MicroPatch 修改,不要新建公共格式化架构。下一步
- WPF 页面与状态:WPF 上位机 AI 开发流程
- 报警、故障和流程后果:行为与告警语义
- 通信原始证据:通信证据包
- 测量值和单位:测量值语义
一句话原则
操作员看“发生了什么、还能不能继续、下一步怎么办”;维护人员看“为什么发生、底层证据是什么”。两层都要有,但不要混在一起。