eis/eqpm/eqpm_readme.md

155 lines
6.5 KiB
Markdown
Raw Normal View History

# eqpm — 设备点检与状态管理
## 概述
eqpm**Eq**uipment **P**oint-inspection **M**anagement / 设备点检管理)是 EIS 系统中的设备预测性维护和实时状态监控服务。它做两件事:
1. **预测性维护** — 根据生产累计指标(处理重量、长度或经过天数),计算设备何时需要检修,预测下次检修日期
2. **实时状态监控** — 解码遥测二进制数据,跟踪报警信息,将设备状态推送到 Memcached 供仪表盘使用
## 进程架构
eqpm 作为单个 PACE 平台组件运行,注册 ICE 端点 `"baosight/eqpm"`
```
┌──────────────────────────┐
│ eqpm 进程 │
│ │
ICE TimeNotify ──→│ 事件0 → update_repair() │──→ DB2 T_EQP_REPAIR
ICE SendData ────→│ 事件1 → 状态写入 │──→ Memcached
(1002/99999) │ 事件2 → update_alarm() │──→ DB2
│ 事件3 → update_coil() │
│ │
共享内存 ────────→│ EqpmAlg::update_data() │──→ 产量环形缓冲区
(FV_PDI) │ │
└──────────────────────────┘
```
## ICE 接口
| 方法 | 事件号 | 说明 |
|------|--------|------|
| `SendDataShort` | 99999 | 触发 `update_repair()` 刷新检修计划 |
| `SendDataShort` | 1002 | 解码机组状态二进制遥测数据 |
| `SendDataLong` | — | 未实现 |
| `TimeNotify` | 0 | 更新检修计划 |
| `TimeNotify` | 1 | 获取状态 JSON 写入 Memcachedkey: `"unit_status"` |
| `TimeNotify` | 2 | 更新报警信息 |
| `TimeNotify` | 3 | 更新钢卷信息 |
## 核心模块
### 1. EqpmAlg — 预测性维护引擎
负责设备点检计划的计算。核心数据结构:
```
EqpRule {
int rule_type; // 0=无 1=重量(吨) 2=长度(千米) 3=时间(天)
double data; // 自上次检修后的累计值
TimePoint repair_date; // 上次检修日期
TimePoint repair_plan; // 预测下次检修日期
}
```
**三种检修规则类型**
| rule_type | 名称 | 计算方式 |
|-----------|------|----------|
| 1 | 基于重量 | 从 FV_PDI 累计每日重量(吨),超阈值触发检修,按日均重量外推未来日期 |
| 2 | 基于长度 | 从 FV_PDI 累计每日长度(千米),超阈值触发检修,按日均长度外推未来日期 |
| 3 | 基于时间 | 按日历天数计算,距上次检修超过 interval 天后预测在 interval 天满的那天 |
**工作流程**
1. **`update_data()`** — 从 FV_PDI 视图读取每日钢卷产量长度、重量写入共享内存环形缓冲区10年3650天
2. **`update_slope()`** — 计算 3 日滑动平均的日产量(`length_slope_`、`weight_slope_`),用于外推预测
3. **`update_repair()`** — 从 DB2 加载设备规则配置,针对每条有规则类型的设备计算累计值和下次检修日期
4. **`update_db2()`** — 将计算结果写回 DB2 `T_EQP_REPAIR`
**产量数据流**
```
FV_PDI (钢卷视图) → EqpmAlg::update_data()
EqpmRecord 共享内存 (环形缓冲区)
/users/dsc/shm/EqpmRecord_boost.mmap
update_slope() → 日均产量
update_rule_data() → 预测检修日期
```
### 2. EqpStatus — 实时状态监控
解析来自 PLC 的二进制遥测数据,转换为结构化 JSON。
**解码的数据组**
| 数据组 | 内容 |
|--------|------|
| `status_data` | 泵状态、液位、温度、速度等 25 个数值测点 |
| `tension` | 张力数据2组 × 12个值 |
| `cpc` | CPC 对中数据3组 × 10个值含位掩码处理 |
| `TR` | 运输辊道数据钢卷ID + 5个数值含时间格式转换 |
| `POR` | 卷取机数据(入口/出口共2组钢卷ID + 4个数值 |
**报警跟踪**`update_alarm_info()`
- 查询 DB2 视图 `FV_RESULT_JOIN_EQPID`,统计最近 3 天的报警
- `isAlarm = 0`: 无报警;`isAlarm = 1`: 有新报警(statuscode=100)`isAlarm = 2`: 仅跟踪报警(statuscode=200)
**钢卷信息**`update_coil_info()`
- 从 DB2 `FV_DSC_PDI_DATA` 读取当前生产中的钢卷数据最多4条
- 每条包含入口外径、出口外径、厚度、宽度、重量、长度、钢种等9个字段
### 3. 共享内存环形缓冲区EqpmRecord
- **路径**: `/users/dsc/shm/EqpmRecord_boost.mmap`500MB
- **结构**: `Map<int, EqpmRecord>`,天偏移量为 key存储每日重量和长度
- **容量**: 3650天10年
- **元数据**: `TimeRecord` 记录有效时间范围和日均产量
## 目录结构
```
eqpm/
├── eqpm.cc/h # 进程入口
├── eqpm_icei.cc/h # ICE 接口(处理事件和定时回调)
├── eqpm_alg.cc/h # 预测性维护算法
├── eqp_status.cc/h # 实时状态监控、遥测解码
├── EqpmRecord.h # 共享内存环形缓冲区定义
├── utility.cc/h # 时间工具时区感知、UTC+8
├── jsonReader.hpp # JSON 文件读取工具
├── rule_info.h # 规则信息结构体(暂未使用)
├── table_struct/ # DB2 表结构
│ ├── fv_pdi.h # 卷材产量视图
│ ├── t_eqp_data.h # 设备规则配置
│ ├── t_eqp_repair.h # 检修记录(输出)
│ ├── FV_RESULT_JOIN_EQPID.h # 报警信息视图
│ └── FV_DSC_PDI_DATA.h # 钢卷信息视图
├── json/ # JSON 模板与配置
│ ├── eqp_status.json # 输出模板
│ ├── eqp_status_config.json # 遥测解码映射
│ └── eqpm.json # 测试用 MQ 消息
└── CMakeLists.txt
```
## 与其它进程的关系
| 进程 | 关系 |
|------|------|
| **eqpalg** | eqpalg 产生设备报警 → eqpm 查询 FV_RESULT_JOIN_EQPID 获取报警统计 |
| **RICS** | 同系统内独立模块RICS 做规则配置展示 |
| **dsm** | 同系统内独立模块dsm 做规则数据归档 |
| **前端页面** | eqpm 将实时状态和检修计划写入 Memcached 供前端读取 |
## 作者
- Cat (null.null.null@qq.com)
- 宝信软件Baosight Co. Ltd.