eis/eqpalg/eqpalg_readme.md

13 KiB
Raw Blame History

eqpalg — 设备算法监控进程

概述

eqpalgEquipment Process Algorithm是 EIS 系统中的核心设备监控与报警引擎。它基于宝信 PACE 平台构建,通过 ICE 中间件与系统内其他进程通信,从 iHyperDB 实时数据库和共享内存获取工业现场数据,根据数据库中配置的规则对设备运行状态进行实时监控、统计分析和报警。

进程架构

eqpalg 以 3 个子进程 的形式运行,通过 ICE 通信协作:

进程名 ProcessType 功能
eqpalg-mon kMon 监控进程 — 实时读取共享内存数据,周期性执行所有启用的规则,产出实时报警;同时维护共享内存缓存和数据库时间戳
eqpalg-cron kCron 定时任务进程 — 按固定周期默认24小时查询 iHyperDB 历史数据,执行统计分析(如置信区间更新、样本累积)
eqpalg-task kTask 单次执行进程 — 响应用户在页面上发起的一次性分析任务,从 iHyperDB 拉取指定时间范围的历史数据,运行算法并返回结果

关键依赖

  • ICE — 进程间通信(接收电文、转发请求)
  • DB2 — 存储规则配置、报警记录、样本数据和统计结果
  • iHyperDB — 工业实时/历史数据库,存储设备 tag 点数据
  • 共享内存SHM — 实时数据的低延迟访问通道
  • Boost — 通用工具库filesystem, serialization, stacktrace 等)
  • dlib / mlpack / Armadillo / Eigen3 — 机器学习与数值计算库
  • nlohmann/json — JSON 解析

核心工作流

                    ┌─────────────┐
                    │  DB2 (配置)  │
                    └──────┬──────┘
                           │ 读取规则配置
                           ▼
              ┌────────────────────────┐
              │   AlgorithmManager     │
              │  (构建所有规则实例)      │
              └───────────┬────────────┘
                          │
            ┌─────────────┼─────────────┐
            ▼             ▼             ▼
      ┌──────────┐ ┌──────────┐ ┌──────────┐
      │eqpalg-mon│ │eqpalg-cron│ │eqpalg-task│
      └────┬─────┘ └────┬─────┘ └────┬─────┘
           │             │            │
    共享内存(实时)   iHyperDB(历史)  iHyperDB
           │             │            │
           ▼             ▼            ▼
      ┌─────────────────────────────────────┐
      │         threads::Manager            │
      │  (多线程调度,每个 TaskSeq 一个线程)    │
      └──────────────┬──────────────────────┘
                     │
                     ▼
      ┌─────────────────────────────────────┐
      │           HandlerExec               │
      │  (单个线程的执行句柄,管理规则集)        │
      └──────────────┬──────────────────────┘
                     │
                     ▼
      ┌─────────────────────────────────────┐
      │           AlgBase                   │
      │  (具体算法实例的执行)                  │
      └──────────────┬──────────────────────┘
                     │
                     ▼
              ┌──────────────┐
              │  报警 / 统计结果 │
              └──────────────┘

ICE 电文接口

进程通过 EqpAlgICEI 接收三类 ICE 调用:

  1. SendDataShort(eventNo, seq) — 处理控制指令:

    • eventNo=99999:规则增删改查/执行指令mon 进程转发给 cron
    • eventNo=11111:收到外部报警信息,转发报警
    • eventNo=22222:更新规则的上下限阈值
  2. SendDataLong — 复杂数据接口(当前未实现具体逻辑)

  3. TimeNotify(eventNo) — 定时任务触发:

    • eventNo=1:更新设备运行状态
    • eventNo=2:更新规则统计的共享内存数据
    • eventNo=5:定期向 dsm 进程推送最新 ruleId 列表和共享内存统计

规则生命周期

页面/外部发起 → ICE电文(JSON) → AlgorithmManager.dispose()
                                    │
        ┌────────┬────────┬─────────┼──────────┬────────┐
        ▼        ▼        ▼         ▼          ▼        ▼
    kCreate   kDelete  kUpdate   kEnable    kReset   kExec
    (创建)    (删除)   (更新)    (启/停用)   (重置)  (单次执行)
  • 所有规则操作均通过 JSON 电文驱动
  • 创建/更新时同步维护 DB2 表 T_RULE_CFGT_RULE_RECORD_TIME

算法体系

所有算法类继承自 AlgBaseAlgBase 提供:

  • 表达式解析引擎(基于 mix_cc::matheval
  • iHyperDB/共享内存双数据源
  • 执行间隔控制、心跳日志、前提条件判断
  • 报警/正常数据保存、共享内存统计更新

当前使用的算法18种

algId 类名 名称 说明
1 ExpBase 实时逻辑判断 对监控变量做布尔逻辑判断,触发报警
2 ExpBase 监控变量-上下限 检测变量是否超出上下限区间(含在线自学习)
3 ExpBase 动作反馈-逻辑判断 当触发动作条件后,监测反馈是否在规定时间内到位
4 ExpBase 动作反馈-上下限 触发动作后,监测反馈变量是否回到合理区间
5 ExpBase 上下限-保持时间 变量超出区间并持续超过设定时间才报警
6 ExpTimes 运行时间累计 累计设备/部件运行时长,超阈值报警
7 ExpTimes 出现次数累计 累计事件发生次数,超阈值报警
8 TrendSlope2 斜率监控 监测变量变化趋势(斜率),检测过快变化
9 Roller2 离群检测(百分比) 同组多变量中检测某个值偏离群体百分比
10 FaultCode 故障代码解析(整体) 将数字故障码与 DB2 字典表比对,解析为可读故障信息
11 FaultCode 故障代码解析(按位) 按位解析数字故障码,适用于组合故障信号
12 ExpSample2D 多项式拟合 Cron 累积 XY 样本Mon 用拟合多项式做预测与偏差检测
13 ExpSample2D 皮尔逊相关性 Cron 累积样本计算相关系数Mon 检测相关性偏离
14 TrendSlope3 趋势检测增强版 斜率监控的改进版本
15 GlitchDetection 毛刺检测 检测数据中突发的尖峰/毛刺信号,可联动 Python 算法
16 Roller3 离群检测(百分比v3) 离群检测的改进版本
17 ExpBound 数据超限幅值 检测变量是否超出设定的误差限和警告限
18 Roller3 离群检测(实际值v3) 基于实际值阈值的离群检测

已弃用的算法(位于 .do_not_use/

包括但不限于样板曲线检测、CPC 检测、区间分布统计、波形监控、DTW 动态时间规整、一类 SVM 异常检测、KRR 核岭回归、FFT 频谱统计等实验性算法。这些代码保留供参考但不再参与编译。

表达式系统

基于 mix_cc::matheval 数学表达式解析引擎,规则配置中可书写数学表达式来引用 tag 变量和内置函数:

  • 变量语法: m{tagN} — 引用第 N 个监控 tag 点(如 m{tag1}s{tagN} — 动作开始时的快照值
  • 自定义带状态函数StatExp::FunVars:
    • KeepT(N, T) — tagN 为真后保持 T 分钟
    • KeepC(N) — tagN 为真后累计次数
    • RiseEdge(N) — tagN 的上升沿检测
    • Detect(N, T) — T 分钟内检测 tagN 是否为真
  • hold 函数: hold(N, T) — 将 tagN 保持 T 分钟不变
  • 数学函数: 标准四则运算、三角函数、log、绝对值等

配置格式示例JSON

{
  "exp_str": "m{tag1} > (limit_up_ + 0.251) or m{tag1} < (limit_down_ - 0.251)",
  "limit_up_": 800,
  "limit_down_": 200,
  "hold_time": 5000,
  "delay_time": 1000
}

目录结构

eqpalg/
├── eqpalg.cpp/h              # 进程入口start() 中启动 ICE 服务
├── eqpalg_icei.cpp/h         # ICE 接口实现,处理电文分发
├── algorithm_manager.cpp/h   # 算法管理器:从 DB2 加载规则,协调生命周期
├── build_algorithm.cpp/h     # 算法工厂algId → 具体算法类实例
├── alg_base.cpp/h            # 所有算法的基类,提供表达式引擎、数据获取等
├── gb_logger.cpp/h           # 全局日志模块
├── gb_item_memory.cpp/h      # 全局内存数据管理
├── algs/                     # 算法实现
│   ├── exp_base.*           # 表达式类算法 (algId 1-5)
│   ├── exp_times.*          # 时间/次数累计 (algId 6-7)
│   ├── exp_bound.*          # 限幅值检测 (algId 17)
│   ├── exp_sample2D.*       # 二维拟合/相关性 (algId 12-13)
│   ├── trend_slope2.*       # 斜率监控 (algId 8)
│   ├── trend_slope3.*       # 斜率监控增强版 (algId 14)
│   ├── roller2.*            # 离群检测 (algId 9)
│   ├── roller3.*            # 离群检测 v3 (algId 16,18)
│   ├── fault_code.*         # 故障代码解析 (algId 10-11)
│   ├── glitch_detection.*   # 毛刺检测 (algId 15)
│   └── null.h               # 空算法(未匹配时使用)
├── threads/                  # 多线程调度
│   ├── manager.*            # 线程管理器:按 TaskSeq 分配线程
│   └── handler_exec.*       # 单线程执行句柄:管理队列,调度规则
├── exp_macro/                # 表达式宏delta/max/min/hold/persist 等)
├── feature_extraction/       # 特征提取LSM 拟合 / STA 统计 / 分布分析)
├── utility/                  # 工具类
│   ├── alarm_poster.*       # 报警推送
│   ├── alarm_handler.hpp    # 报警处理器
│   ├── build_alarm_info.*   # 报警信息构造
│   ├── condition_monitor.hpp # 条件监控
│   ├── eqp_stat.*           # 设备统计
│   ├── eqp_status.*         # 设备运行状态
│   ├── ExpModule.*          # 表达式模块
│   ├── HoldTime.*           # 保持时间处理
│   ├── update_data.*        # 共享内存数据更新
│   ├── proxy_py.*           # Python 算法代理
│   ├── StatExp.hpp          # 带状态表达式函数
│   ├── VarsCache.hpp        # 变量缓存
│   └── XorShift128Plus.hpp  # 随机数生成器
├── table_struct/             # DB2 表结构映射ORM
├── define/                   # 全局定义(枚举、常量、结构体)
├── doc/                      # Doxygen 文档
├── .do_not_use/              # 弃用的算法代码(不参与编译)
└── CMakeLists.txt            # 构建配置

数据流

  现场PLC/传感器
       │
       ▼
  iHyperDB (实时/历史数据库) ──← cron/task 查询历史
       │
       ▼
  共享内存 (实时 tag 数据) ──← mon 实时读取
       │
       ▼
  eqpalg 进程
       │
       ├──→ 报警 → ICE电文 → 其他系统 / 页面展示
       ├──→ 统计结果 → DB2 (T_RULE_RESULT, T_RULE_SAMPLE_*)
       └──→ 运行状态 → DB2 (T_RULE_RECORD_TIME, T_EQP_*)

启动流程

  1. eqpalg::start() — 根据模块名确定进程类型mon/cron/task
  2. 创建 EqpAlgICEI 实例 — 注册 ICE 接口
  3. AlgorithmManager 构造 — 从 DB2 T_RULE_CFG 表读取所有规则配置
  4. threads::Manager::start() — 按 TaskSeq 分组创建线程
  5. 每个线程创建 HandlerExec,根据规则 algId 调用 build_algorithm() 创建算法实例
  6. mon 进程额外启动 mem_cached_thread_ — 以约 19ms 间隔刷新共享内存缓存

相关进程

进程 关系
dsm eqpalg-mon 定期向 dsm 推送统计数据
eqpalg-cron eqpalg-mon 收到 99999 电文时转发给 cron
RICS 同系统内其他设备算法进程
页面服务 通过 ICE 发送规则增删改查指令

作者