同UCanCode一起释放 Visual C++, C# 的巨大能量!
UC UCanCodeSCADA / DCS / HMI
第 5 章

HMICare 运行健康看护

进程与服务器看护 + 磁盘/链路/安全/可用性四维自检:让运行质量可观测、可自愈、可交付

HMICare 不是一个「监控现场设备」的组件,而是平台对自身运行质量负责的组件。它回答工业现场最容易被忽略的两个问题:SCADA 进程是否还活着,以及它是否还在干活。前者通过指标与自愈解决,后者通过「磁盘 → 链路 → 安全 → 可用性」四维运行自检解决。

5.1 设计目标与定位

SCADA 系统上线之后,真正的风险往往来自「软件自身的长期运行状态」,而不是「现场设备」。现场反复出现的失效模式有:

典型失效模式现场表现HMICare 的应对
进程崩溃 / 挂起运行站意外退出或消息循环卡死,画面停留在最后一帧崩溃、挂起、内存越限自动拉起;重启前抓 minidump 与画面截图
内存单向增长进程 RSS 逐日上涨,最终 OOM 或被运维定期重启最小二乘斜率判定「正常波动」与「泄漏」;到线主动重启保护
静默功能失效进程没崩,但已不再写历史库 / 不再发布报警关键功能探针(HTTP / TCP / file / process)+ 数据新鲜度判定
磁盘写满历史库所在分区占满,归档无声停止,数据正在丢失逐卷容量与 I/O 延迟监测、历史库「多久没写入」直接告警
链路劣化到 PLC/RTU 丢包、超时、扫描落后,界面数据不再刷新读取运行站的通道诊断快照,逐设备在线/离线/隔离与 RTT/丢包统计
时钟不一致多机 SOE 时间错位,事故分析时事件顺序无法对齐SNTP 对时偏差 + 本地时钟阶跃检测,并在消息中写明快/慢方向
审计缺失 / 被篡改关键操作无留痕,或操作日志被修改看护自身操作写入 SHA-256 哈希链,只读消费 SCADA 操作审计日志
看护器自身失效自愈能力静默消失,无人察觉对看护器自身做同等体检(句柄/内存增长、CPU 满载)并告警
注
核心理念:进程活着 ≠ 功能在干活。 一个「没崩但不再写历史库」的 SCADA,比一个崩溃的 SCADA 更危险——因为它不会触发任何重启逻辑。HMICare 的第二组能力就是专门用来抓这类静默失效的。

5.1.1 两组能力模型

图 16  HMICare 看护引擎总体结构与自愈闭环
图 16 HMICare 看护引擎总体结构与自愈闭环
能力组覆盖维度回答的问题
第一组:进程与服务器性能指标监控、故障自动重启、内存精细化管理、看护器自身体检目标进程与服务器还活着吗?CPU/内存/句柄/线程/IO 是否异常?
第二组:环境与功能磁盘与存储、网络与通信链路、运行安全与访问审计、运行状态与可用性软件还能不能持续干活?它所在的环境是否正常?

5.2 体系结构与运行形态

HMICare 采用单线程看护引擎:采样、判定、重启、落库全部跑在创建它的事件循环里,仅由 QTimer 驱动,不创建任何线程。这带来两个工程收益——没有采样竞争、没有锁等待;同时行为完全可预期(唯一会短暂阻塞的是低频的 minidump 写盘与磁盘空间读取)。

5.2.1 三种运行形态

形态启动方式适用场景特点
界面自带看护双击 hmicare.exe调试、单机、临时巡检界面进程自己抢到看护角色,立刻开始监护与自愈
服务化(推荐生产)hmicare.exe --install --start7×24 运行开机自启 + SCM 失败自动重启;无人登录也在岗
前台守护hmicare.exe --console现场排查无界面,日志直接打到控制台,最容易看清正在做什么

界面与服务可以同时运行而不冲突:二者通过命名管道通信,并由命名互斥体 Global\HMICareWatchdogRole 保证同一时刻只有一个「看护者」。先拿到角色的一方执行监护与重启,另一方自动退化为只读观测 + 指令下发。状态栏第一格会明确标注当前角色,避免运维误判「谁在管事」。

5.2.2 自愈兜底链

目标进程崩了    →  HMICare 重启它(带重启风暴保护与退避)
HMICare 崩了    →  Windows SCM 重启 HMICare(服务化部署)
服务器重启了    →  服务开机自启 → 延迟 5 秒 → 拉起目标

两端都有兜底,这是「专业看护」与「脚本轮询重启」的本质区别:脚本一旦自己被杀,整条自愈链就断了,而系统不会有任何提示。

5.2.3 控制通道与角色互斥

服务运行在 Session 0、界面运行在交互会话,两者是不同进程。它们通过本地命名管道交换快照与控制指令:真正执行监护的一侧启动 ControlServer,另一侧以 ControlClient 异步收发(同一时刻只发一条请求,收到回复再发下一条,不阻塞事件循环)。

指令 / 通道方向用途
快照(snapshot)引擎 → 界面状态、PID、运行时长、当前告警、最近事件与重启、看护器自身开销;含实时环形缓冲(趋势用)
deep界面 → 引擎,按需拉取四维自检明细(逐卷 I/O、设备清单、探针、关键功能)。刻意不放进每拍快照——设备多的现场可达数十 KB,每 2 秒塞进管道会白白浪费带宽
selfcheck界面 → 引擎不等周期,立即重跑历史库探针与关键功能检查
cleanup界面 → 引擎按策略清理陈旧文件。弹窗二次确认,且操作写入防篡改审计链
start / stop / restart / reset / clearAlarms界面 → 引擎对应工具条的启动/停止/重启/复位看护/清告警;stop 是「人工停机」语义
clientsChanged引擎 → 界面客户端接入/断开时留痕与提示(审计用)

角色互斥由命名互斥体 Global\HMICareWatchdogRole 保证:服务与界面都可能具备看护能力,但同一时刻只有一个真正执行重启,否则会出现「双看护互抢」把进程反复重启。判角色时必须用只观察不抢占地探测(watchdogRoleBusy() + 读 var/watchdog.pid),而不是查「本进程是否持锁」——后者在独立进程里永远为 false,会让 --status 误报「无人看护」。

注
角色持有者 pid 落盘(var/watchdog.pid)是一个小而有用的设计:运维在任意一台机器上执行 hmicare.exe --status,就能知道「现在到底是谁在看护、被监护进程的 pid 是多少」,而不必登录到服务宿主或交互会话去翻进程列表。

5.2.4 服务宿主的线程约束

Windows 服务的 ServiceMain 由 SCM 在另一个线程上回调,而 Qt 的事件循环与 QTimer 必须活在本进程创建它们的那个线程。因此实现上让 SCM 调度器(StartServiceCtrlDispatcher)跑在一个独立线程上,Qt 主事件循环留在主线程,两边用互斥体 + 条件变量握手,服务控制码(停止/暂停等)只置原子标志、由主线程轮询处理。

这带来两个结果:引擎本身仍是单线程的(采样、判定、重启、落库都在主事件循环内),没有锁与竞争;而服务控制不会因为在错误线程等待而挂死。安装服务时一次性配好「开机自启 + 延迟启动 + SCM 级失败自动重启(5 s / 15 s / 60 s 三次)」——这是自愈链路的最后一道保险。

5.3 故障自愈与现场保护

自愈不是「发现不在就拉起」这么简单。工业现场需要回答三个问题:为什么重启(原因可追溯)、重启前有没有留下现场(可分析)、会不会越重启越糟(风暴保护)。

5.3.1 恢复状态机

阶段动作说明
WaitShot请求用户会话助手抓取画面截图服务运行在 Session 0,看不到交互桌面,需助手跨会话抓图
Stop先发 WM_CLOSE 优雅关闭,超时才强杀给目标进程落盘与收尾的机会
Start重新拉起并在确认窗口内验证进程存活拉起失败会累计,避免「拉不起还一直拉」

5.3.2 重启风暴保护

保护机制默认值作用
采样周期 sampleIntervalMs2000 ms(现场常见 1000~5000)判定与恢复的节拍
窗口内允许重启次数 maxRestartsInWindow6 次 / 600 秒抑制短时间反复重启
累计失败放弃阈值 giveUpAfter24 次环境问题未解决时停止无意义重启,避免反复破坏现场
放弃后复位F8 / 复位看护现场环境修好后让自愈重新生效
故障后重启延时可配置退避给现场设备与网络恢复的时间

5.3.3 现场保护

  • minidump:非人工重启前抓取内存转储,落在 var/crash,可直接交 WinDbg/cdb 分析。
  • 画面截图:服务在 Session 0 时经「用户会话助手」跨会话抓图;无人登录时跳过并与事件记录,不影响重启。
  • WER LocalDumps:保持开启,让 Windows 在崩溃那一瞬间替我们写 dump——Win32 下进程崩溃后句柄立即失效,事后补抓不可能,两者互补。
  • 留存上限:现场文件按数量上限(默认 120)淘汰最旧,避免长期占用磁盘。
  • 注
    人工停机的语义:停止 (F6) 是「优雅停止且不再自动拉起」,看护会记住这个决定;只有再次手动启动或复位看护后,自愈才会重新生效。这避免了运维主动停机后被立刻拉起的尴尬。

    5.4 内存精细化管理

    内存治理要区分两类现象:正常业务波动与单向泄漏。把前者当泄漏会误重启,把后者当波动会等到 OOM。

    机制判定方式默认参数动作
    阈值主动保护进程物理内存 / 虚拟内存超过重启线即重启,不等崩溃告警 1024 MB / 重启 2048 MB重启(可配置)
    泄漏斜率判定在工作集样本窗口上做最小二乘拟合,斜率持续为正且超过增长上限maxRssKbPerHour=4096,多窗口连续复核默认只告警,可选主动重启
    线性增长复核需连续多个复核窗口同向,过滤启动预热与阶段性缓存统计窗口 + 连续复核窗口数降低误报
    看护器自身体检对看护器自己的句柄数、线程数、工作集、CPU 做同等判定工作集 > 256 MB、CPU 长期 > 25%只告警,不自动重启自己
    注
    泄漏斜率上限与 HMIPlayer 侧的 kSoakMaxRssKbPerHour 对齐,保证「看护的判据」与「运行站自身的长稳目标」保持一致;看护器不自动重启自己,是为了避免「看护器重启看护器」把现场彻底搞乱。

    5.5 运行自检:四维环境与功能体检

    图 17  HMICare 运行自检四维模型与关键功能探针
    图 17 HMICare 运行自检四维模型与关键功能探针

    5.5.1 磁盘与存储

  • 逐卷容量:告警线默认 90%、严重线默认 95%;严重线即历史库停写线。
  • I/O 延迟:按卷读取读写延迟与 % Disk Time,区分「延迟高是因为盘忙」还是「盘本身不行」(经验线 100 ms / 严重 250 ms)。
  • 历史库健康度:连接是否可用、是否可写、探针查询耗时、最近写入/聚合/保留期清理作业时间、陈旧库文件大小。
  • 静默停写告警 storage-db-stale:历史库超过 N 分钟没有写入即告警——这是数据正在丢失的直接信号。
  • 5.5.2 网络与通信链路

  • SCADA 内部通信:看护自身控制通道是否在监听、有多少客户端接入、被监护进程心跳是否正常;主备同步中断必须立刻知道,否则切换时会丢数据。
  • 到现场设备的链路:读取运行站自己写出的通道诊断快照 chmi_channel_diag.json,得到逐设备的在线/离线/隔离数、扫描周期与落后、RTT、超时事件、坏质量点与估算丢包率。
  • 网络硬件健康:TCP 探针(主备服务器、交换机、远程机柜)+ 独立采集模块落盘的环境 JSON(机柜温度、风扇故障、交换机掉电)。
  • 注
    通道诊断快照是四维自检中最有价值的一项:它直接把 FEP 到 PLC/RTU 的真实通信质量引到运维面前,而不需要再打开组态软件逐台查看。

    5.5.3 运行安全与访问审计

  • 进程白名单:默认只观测不启用;现场软件构成复杂,先建立基线再收紧,避免误报。
  • 时钟同步:SNTP 对时偏差 + 本地时钟阶跃;偏差明确写出方向(本机快/慢 N ms),阶跃超过阈值单独记事件(会打乱 SOE 顺序)。
  • 两层审计:看护自身操作写入独立文件 + SHA-256 哈希链(篡改即断链,界面可一键校验);同时只读消费目标的 operator_journal.log(在线改限值、趋势配置、登录登出等)。
  • 5.5.4 运行状态与可用性

    指标口径说明
    软件连续运行时长被监护进程本次连续在岗时间不等于服务器开机时长,这才是 SCADA 可用性口径
    累计在线秒跨看护重启累加,定期快照入 SQLite据此计算窗口可用率
    窗口可用率观察窗口内在线时间占比观察窗口 = 首次观测至今
    未观测时间看护自身不在岗的时段既不算在线也不算停机,从分母剔除并单列
    关键功能健康率健康功能数 / 已检查功能数回答「进程活着但功能是否在干活」

    5.5.5 关键功能探针

    FEP收数@file:C:\scada\chmi_channel_diag.json     # 文件在且新鲜 = 健康
    历史归档@tcp://127.0.0.1:6389                     # 可连接 = 健康
    报警发布@http://127.0.0.1:8080/api/v1/health      # HTTP 200 = 健康
    SCADA主程序@process:HMIPlayer.exe                 # 进程在 = 健康

    四类探针(http: / tcp: / file: / process:)覆盖了「服务是否响应」「端口是否可连」「数据是否新鲜」「进程是否存在」四种典型健康语义;并支持单次超时、连续失败告警与数据陈旧告警,避免单次抖动造成误报。

    5.5.6 「静默失效」的判定规则

    四维自检真正要抓的是静默失效:进程在、端口通,但业务已经不再产生新数据。这类故障不会触发任何重启逻辑,因此必须靠「新鲜度」与「增量」来判定。

    静默失效形态判定依据默认阈值
    历史库停写最近一次采样落库时间距今过久(dbStaleWarnMin)10 分钟
    通道诊断快照停更目标写出的快照文件 mtime 过旧(diagStaleWarnSec)180 秒(写入周期 60 s)
    关键功能数据陈旧file: 类探针成功但文件不新鲜(functionStaleWarnSec)300 秒
    聚合 / 保留期作业未执行作业时间戳超过预期周期(storage-job-rollup / storage-job-retention)按分钟聚合与保留期清理周期
    审计日志不再增长SCADA 操作审计日志长时间无新记录(sec-journal-stale)按配置周期
    机柜环境采集停摆环境信号 JSON 陈旧(link-env-stale)120 秒
    看护器自身失去自愈能力看护器句柄/工作集单向增长、CPU 长期高于 25%工作集告警 256 MB、CPU 25%
    注
    为什么必须区分「失败」与「陈旧」:一次 HTTP 超时可能是网络抖动,而「探针成功但数据 10 分钟没更新」几乎一定是功能停摆。把两者混在一个「不健康」里,现场就无法判断该不该叫人。HMICare 把 failStreak 与 stale 分别计数、分别告警,并给出「最近成功时间」供运维回溯。

    5.6 数据、历史与巡检报告

    HMICare 的历史库为 SQLite(WAL 模式),默认位于 <exe目录>\var\hmicare.db;不可写时回落到 %ProgramData%\HMICare,并可用环境变量 HMICARE_DATA_DIR 覆盖。

    数据类别保留策略用途
    原始采样rawRetentionDays=7 天实时趋势与历史回放
    分钟聚合 / 事件 / 重启aggRetentionDays=180 天长期趋势、事件追溯与验收统计
    现场文件(转储/截图)按数量上限淘汰最旧(默认 120)事故分析
    审计链var\audit\hmicare_audit.log防篡改操作留痕

    5.6.1 巡检报告

    菜单「文件 → 导出运行健康报告(HTML)」或 Ctrl+P 导出自包含 HTML 报告,覆盖十章内容:

  • 监护对象(目标路径、PID、会话、运行时长、看护角色)。
  • 进程级指标(CPU、内存、句柄、线程、I/O 速率)。
  • 服务器级指标(整机 CPU、内存、提交量、磁盘、网卡、硬页错误)。
  • 托管运行时(JVM/.NET 堆与 GC,探测到时才有)。
  • 看护程序自身开销。
  • 当前活动告警。
  • 最近重启记录(原因、PID、退出码、中断时长、现场文件)。
  • 磁盘与存储(容量、I/O 延迟、历史库健康、清理结果)。
  • 网络链路与运行安全(通道/设备/探针/机柜环境 + 白名单/对时/审计链)。
  • 运行状态与可用性(在线时长、窗口可用率、未观测时长、关键功能健康)。
  • 注
    报告是自包含 HTML(内联样式),可直接交付或归档,使「巡检」从口头汇报变成可追溯的交付物。

    5.6.2 历史库的分表设计

    历史库为 SQLite 并启用 WAL 与 busy_timeout,允许「一写多读」——服务与界面可能同时打开同一个库。表结构按「采样 / 事件 / 维度 / 元数据」分类:

    表内容写入频率
    sample原始采样(进程级 + 服务器级 + 托管运行时)默认 2 s 一条
    agg_min分钟聚合(avg / max)每分钟一条
    event事件与告警(分级、分类、代码、说明、详情)按事件
    restart重启记录(原因、新旧 PID、退出码、中断时长、转储与截图路径)按重启
    storage / link / security / availability四维自省的分钟级聚合快照每分钟一条
    function关键功能健康检查明细(可回溯「当时哪一项在偷停」)按检查周期
    audit看护自身审计记录(与文件哈希链互为佐证)按操作
    meta作业时间戳与跨会话累计量(如可用率未观测时长)按周期 / 退出时补写

    为什么新维度不追加到 sample 表:sample 使用位置绑定写入且已在现场部署,追加列会让老库上的写入整体错位;而且四维自省的采集频率与 2 s 采样不同,单独建表既能保持老库原地升级(新增表、不改既有表结构),也不需要为「每 2 秒一行」的存储成本买单。

    保留策略:原始采样默认 7 天、聚合/事件/重启默认 180 天、四维快照与功能明细按深度保留天数滚动清理;审计表永不自动清理——删审计等于销毁证据,哈希链只保证「未被篡改」,不保证「未被删除」。

    注
    缺 sqldrivers\qsqlite.dll 时,open() 返回失败,看护功能继续正常工作,只是不留历史记录,并在事件里明确提示。「看护不能因为记不了账就罢工」是一个刻意的取舍。

    5.7 配置、部署与运维

    5.7.1 配置热更新

  • hmicare.ini 改动后不必重启服务:界面点「重载配置」(Ctrl+R)即热更新。
  • 升级时新增的分节/键只追加缺失项,绝不动现场改过的值与注释。
  • 想恢复新版默认值:删掉 hmicare.ini 或删掉对应那一行,重启即可。
  • 5.7.2 命令行

    hmicare.exe                        打开界面;服务未运行时界面自带看护
    hmicare.exe --console              前台守护,无界面,日志打到控制台
    hmicare.exe --install [--start]    注册为系统服务(需管理员)
    hmicare.exe --status               打印服务、看护角色、被监护进程与历史库状态
    hmicare.exe --ui-selftest          界面自检(验收 / CI 用)
    hmicare.exe --target <exe>         仅本次运行改用其它被监护程序

    5.7.3 目录与文件

    路径内容
    hmicare.ini配置文件(UTF-8,分节名/键名区分大小写)
    var\hmicare.db历史库(SQLite,WAL 模式)
    var\crash\内存转储与画面截图,按数量上限淘汰最旧
    var\audit\hmicare_audit.log防篡改审计链(每行含序号与 SHA-256 哈希链)
    var\log\看护自身日志
    var\watchdog.pid当前看护角色持有者 pid

    5.7.4 界面自检与像素级回归

    看护器的界面是运维与它交互的唯一窗口,因此界面本身也需要被验证。平台提供两级自检,且都不需要人工点界面:

    手段用法验证内容
    数据链路自检hmicare.exe --ui-selftest(环境变量 HMICARE_SELFTEST_SEC 控制稳定时间 3~20 s)界面角色、控制通道、状态栏文案、各组趋势的曲线数与点数、告警/事件/重启表行数、历史库路径、看护器自身开销,以及运行自检页的数据来源、四张卡片文案与四张明细表实际行数
    界面快照HMICARE_SELFTEST_SHOT=<目录>六个页签各存一张 PNG,另存一张整窗快照(唯一包含菜单栏/工具条/状态栏的快照)
    结构体检python tools\ui_snapshot_check.py shots overview deep等级色是否画出、卡片是否成排、仪表盘个数是否正确、工具条按钮图标是否补齐且大小均匀
    指针反解python tools\gauge_needle_check.py shots\ui_overview.png overview 0.29:100 ...把自绘指针的角度折回量程,与同一次快照读到的数值逐个对照(偏差 < 1.5 个百分点为通过)

    为什么需要像素级回归:自检报告能证明「数据绑上了控件」,但仪表盘指针、等级色带、量值条是自绘的——报告里的数字对,不等于图上的画面对。这类缺陷在代码审查与单元测试里都看不见,只能靠「渲染 → 反解 → 比对」自动判定。

    注
    两个脚本依赖 numpy 与 Pillow,只在装维/发版机器上运行,不进入现场部署包,不给运行环境增加任何依赖。自检为了验完链路会把被监护程序拉起来,退出时只关闭自己拉起的那个进程,现场本来就在运行的实例与服务看护的对象不会被碰。

    5.8 告警代码速查

    告警代码是运维与看护之间的通用语言:看到代码就知道该查什么。代码按维度分组,下表摘录最需要现场处置的部分。

    5.8.1 进程与内存

    代码级别含义与处置
    target-missing / target-selfCritical被监护程序不存在 / 目标配成了看护器自身。检查 [target] exe
    proc-hangCritical连续无响应(窗口消息 / 心跳 / TCP 探活均超时)
    proc-mem-warn / proc-mem-critWarning / Critical进程物理内存越告警线 / 越重启线
    proc-virt-warn / proc-virt-critWarning / Critical进程虚拟内存(提交)越告警线 / 越重启线
    mem-leakCritical最小二乘斜率判定为单向增长;结合历史回放斜率与 var\crash 转储定位
    restart-thrashCritical重启过于频繁,已进入风暴保护
    watchdog-giveupFatal累计失败过多已放弃自动重启;修好环境后按 F8 复位
    watchdog-footprint / watchdog-handle-growthCritical / Warning看护器自身工作集超限 / 句柄单向增长——自愈能力可能静默失效,须尽快处理

    5.8.2 磁盘、链路、安全与可用性

    代码级别含义与处置
    storage-db-staleWarning历史库超过 N 分钟没有写入——静默停写的直接信号,数据正在丢
    storage-volumes-warn / disk-critWarning / Critical有卷占用越告警线 / 越严重线(严重线即历史库停写线);先清陈旧文件,再考虑扩容
    storage-io-warn / storage-io-critWarning / Critical卷读写延迟越 100 ms / 250 ms 线
    link-diag-staleWarning目标通道诊断快照停更——写入方可能已失效
    link-device-offline / link-isolatedCritical离线设备数越严重线 / 有设备被隔离;查具体 PLC/RTU
    link-packet-loss / link-rtt / link-scan-lagWarning链路劣化但未完全断:丢包、RTT 超限、采集跟不上
    sec-clock-offset / sec-clock-jumpWarning / Critical对时偏差越限 / 本地时钟阶跃(会打乱 SOE 顺序);消息中会写明本机快或慢
    sec-audit-brokenCritical审计哈希链断裂——按安全事件处理,保留现场并上报
    avail-function-fail / avail-function-staleCritical / Warning关键功能连续失败 / 数据陈旧:进程活着但功能已失效
    watchdog-cpuWarning看护器自身 CPU 长期偏高(只告警,不自动重启自己)

    5.9 安全边界与已知限制

    不做 / 限制原因影响
    不自动重启看护程序自己避免「看护器重启看护器」把现场搞乱自身异常只告警,需运维介入
    默认不自动删除任何文件删现场资料不可逆,必须显式开启自动清理默认关闭,或手动触发
    默认不启用进程白名单现场软件构成复杂,先观测建立基线避免误报
    不碰外部服务 / 其它实例的对象自检只收自己拉起的进程不与第三方看护冲突
    崩溃瞬间无法补抓转储Win32 硬限制依赖 WER LocalDumps
    Session 0 看不见交互桌面Windows 会话隔离截图需用户会话助手,无人登录时跳过
    单线程事件循环无采样竞争与锁等待慢盘上的大批量查询会拖慢采样
    注
    最小暴露面配置(IEC 62443 场景):controlWorldAccess=0 使控制通道不跨会话暴露(界面退化为只读读库);启用进程白名单与信任目录;保持审计链开启并定期离线归档。

    5.10 与其它监控手段的技术对比

    对比项通用 IT 监控(Zabbix / Prometheus 类)SCADA 自带诊断HMICare
    工业语义以主机/端口/进程为主,不理解「通道 / 设备 / 质量码 / SOE」理解通道与设备,但只覆盖采集逐设备在线/离线/RTT/丢包 + 通道诊断快照消费
    静默失效难以判断「进程在但不干活」部分覆盖采集链路关键功能探针 + 数据新鲜度 + 历史库停写告警
    自愈能力通常只告警,不重启业务进程一般不提供崩溃/挂起/内存越限自动重启 + 现场保护 + 风暴保护
    内存治理看总量,不区分波动与泄漏一般不提供阈值主动保护 + 最小二乘斜率泄漏判定
    审计与时钟通用安全能力(需单独建设)操作审计为主哈希链审计 + SNTP 偏差 + 时钟阶跃 + 只读消费操作审计
    可用性口径主机在线率,不等于业务可用率一般不提供业务连续运行时长 + 未观测剔除 + 关键功能健康率
    部署形态需部署服务端/Agent/数据库,架构重随产品内置单 exe 三形态(界面/服务/前台),SQLite 本地落库,零外部依赖
    与采集的关系旁路观测,不接触工业协议直接读通道只读消费运行站已写出的诊断快照,不侵入采集链路

    HMICare 与通用 IT 监控不是替代关系:通用监控负责主机、网络与机房基础设施,HMICare 负责「SCADA 业务是否可用、采集链路是否健康、软件是否需要自愈」。两者可以通过「运维指标快照」与标准接口对接,形成完整的分层监控体系。

    5.11 本章小结

    HMICare 的设计目标可以概括为一句话:让 SCADA 系统的运行质量可观测、可自愈、可追溯、可交付。可观测——进程、服务器、磁盘、链路、安全、可用性六个面全部有指标与告警;可自愈——崩溃、挂起、内存越限自动拉起,并带现场保护与风暴保护;可追溯——事件、重启、审计、可用性全部落库并导出巡检报告;可交付——单文件部署、配置热更新、报告自包含,运维无需专业工具即可上手。