# RO膜污染监控与CIP预测系统 ## 系统简介 基于压差预测数据分析膜污染速率,自动计算最优CIP清洗时机。 **核心原理**: - 通过滑动窗口计算污染速率 k 值(压差上升速度) - 识别 k 值持续上升的时间段,找出污染最严重的时机 - 综合一段、二段数据,给出最优CIP建议 **主要功能**: - 支持 RO1-RO4 四个机组同时分析 - 提供 4 种决策策略(最早/最晚/加权/严重度) - 自动生成日志、图表、HTML报告 - 支持 API 回调推送决策结果 ## 快速开始 ### 1. 基本运行 ```python from main_simple import main # 使用默认参数(策略3-加权平均,当前时间,所有机组) result_df = main() # 指定策略和时间 result_df = main(strategy=3, start_date='2025-08-26 00:00:00') # 只分析特定机组 result_df = main(strategy=1, unit_filter='RO1') ``` ### 2. 自动监控模式 **启动监控系统:** ```bash python smart_monitor.py ``` **监控系统功能:** - 每5秒检查一次 config.json 中的 `cip_times.*.actual_time` - 检测到 `actual_time` 变化时,自动触发预测 - 保存预测结果到 `predicted_time`(仅用于记录) - 自动发送预测结果到回调接口 - 循环监控,无需人工干预 **工作流程:** ``` 修改actual_time → 监控检测 → 执行预测 → 保存predicted_time → 发送回调 → 继续监控 ``` ### 3. 策略说明 | 策略 | 说明 | 适用场景 | |-----|------|---------| | 1 | 最早时机 - 取一段/二段中较早的 | 保守维护 | | 2 | 最晚时机 - 取一段/二段中较晚的 | 最大化运行时间 | | 3 | 加权平均 - 根据k值加权(推荐) | 平衡维护和运行 | | 4 | 污染严重 - 选k值最大的段 | 基于实际污染程度 | ## 配置文件 (config.json) ```json { "api": { "base_url": "http://example.com", "callback_endpoint": "/api/cip/callback", "jwt_token": "your_token" }, "scada": { "project_id": "12345" }, "cip_times": { "RO1": { "actual_time": "2025-09-11 10:30:00", "predicted_time": null }, "RO2": { "actual_time": "2025-09-30 10:30:00", "predicted_time": null }, "RO3": { "actual_time": "2025-09-12 10:05:00", "predicted_time": null }, "RO4": { "actual_time": "2025-09-29 10:30:00", "predicted_time": null } } } ``` **字段说明**: - `cip_times`:各机组CIP时间状态 - `actual_time`:**实际执行的CIP时间**(修改此字段触发预测) - `predicted_time`:模型预测的下次CIP时间(**仅用于记录**,不参与计算) - `api`:API回调配置,用于推送预测结果 - `scada.project_id`:项目标识,用于API回调 **使用说明**: 1. **手动更新**:直接修改 `actual_time` 字段,监控系统会自动检测并触发预测 2. **API更新**:调用提供的接口函数更新(见下方API集成部分) ## 算法原理 ### 核心逻辑 1. **获取预测数据** → 从污染预测模型获取未来压差数据 2. **计算k值** → 7天滑动窗口线性回归,得到污染速率序列 3. **识别上升段** → 找出k值连续上升的时间段 4. **应用约束** → 至少距离起点30天(避免过早CIP) 5. **找最优点** → 在有效时间段内选k值最大的点 6. **策略综合** → 对一段、二段按策略综合决策 ### 参数调整 核心参数在 `OptimalCIPPredictor` 类中: - `window_days=7`:k值计算窗口,增大平滑噪声,减小提高敏感度 - `min_continuous_rising=3`:k值连续上升最小点数,增大避免误报 - `min_delay_days=30`:最小延迟天数,根据实际CIP周期调整 ## 输出示例 ### 控制台输出 ``` 分析机组 RO1 预测天数: 90天 找到RO1压差列: 2个 C.M.RO1_DB@DPT_1_pred: 2025-10-15 18:00:00 (第71天, k=0.000234) C.M.RO1_DB@DPT_2_pred: 2025-10-18 12:00:00 (第75天, k=0.000198) RO1最优CIP时机: 2025-10-16 08:00:00 ================================================== 分析完成 ================================================== 机组类型 CIP时机 策略说明 RO1 2025-10-16 08:00:00 加权平均策略 (第72天) RO2 2025-11-04 06:00:00 加权平均策略 (第91天) RO3 2025-10-28 14:00:00 加权平均策略 (第84天) RO4 None 无有效CIP时机 ``` ## 日志与图表 系统自动生成完整的分析记录,保存在 `analysis_logs/` 目录: ### 目录结构 ``` analysis_logs/ ├── CIP_Analysis_20251015_095138.log # 主日志 ├── data/ # 数据文件 │ ├── CIP_Analysis_20251015_095138_prediction_data.csv # 原始预测数据 │ ├── CIP_Analysis_20251015_095138_RO1_pressure_data.csv # RO1压差数据 │ ├── CIP_Analysis_20251015_095138_RO2_pressure_data.csv │ └── CIP_Analysis_20251015_095138_final_results.csv # 最终结果 ├── plots/ # 图表 │ ├── CIP_Analysis_20251015_095138_pressure_trends.png # 压差趋势图 │ └── CIP_Analysis_20251015_095138_unit_comparison.png # 机组对比图 └── reports/ # 报告 ├── CIP_Analysis_20251015_095138_analysis_data.json # 完整分析数据 └── CIP_Analysis_20251015_095138_report.html # HTML报告 ``` ### 主要输出 **1. 压差趋势图** (`pressure_trends.png`) - 4个子图,分别展示RO1-RO4的压差变化 - 一段、二段压差曲线对比 - 自动截取到各机组预测周期 **2. 机组对比图** (`unit_comparison.png`) - 左图:各机组预测周期对比(柱状图) - 右图:CIP建议时机分布(距起点天数) **3. HTML报告** (`report.html`) - 会话信息、输入参数、分析结果 - 带样式的表格展示 - 适合分享和存档 **4. 主日志** (`.log`) - 详细记录每个机组的分析过程 - k值计算、时间段识别、策略选择 - API调用结果、耗时统计 ## API集成 ### 方式1:手动更新配置文件 直接修改 `config.json` 中的 `actual_time`: ```json { "cip_times": { "RO1": { "actual_time": "2025-10-12 12:00:00", // 修改这里 "predicted_time": null } } } ``` 监控系统会在5秒内检测到变化并自动触发预测。 ### 方式2:通过代码接口更新 系统提供了两个接口函数,用于从外部系统获取实际CIP时间并自动触发预测: #### 1. 单个机组更新 ```python from smart_monitor import SmartCIPMonitor monitor = SmartCIPMonitor() # 更新RO1的实际CIP时间 success = monitor.update_actual_cip_time('RO1', '2025-10-12 12:00:00') if success: print("更新成功,系统将自动触发预测") ``` #### 2. 批量更新多个机组 ```python from smart_monitor import SmartCIPMonitor # 定义数据获取函数 def get_cip_times_from_database(): """从数据库或其他接口获取实际CIP时间""" # TODO: 实现具体的数据获取逻辑 return { 'RO1': '2025-10-12 12:00:00', 'RO2': '2025-10-13 08:30:00', 'RO3': '2025-10-14 15:45:00', 'RO4': '2025-10-15 10:20:00' } monitor = SmartCIPMonitor() # 批量获取并更新 results = monitor.fetch_and_update_from_api( api_function=get_cip_times_from_database ) # 查看结果 for unit_name, success in results.items(): print(f"{unit_name}: {'成功' if success else '失败'}") ``` #### 3. 完整集成示例 ```python from smart_monitor import SmartCIPMonitor import threading import time # 创建监控器 monitor = SmartCIPMonitor() # 启动监控系统(后台线程) monitor.running = True thread = threading.Thread(target=monitor.monitor_loop, daemon=True) thread.start() # 定期从外部接口获取并更新(主线程) while True: # 从数据库或API获取实际CIP时间 results = monitor.fetch_and_update_from_api( api_function=get_cip_times_from_database ) # 等待1小时后再次检查 time.sleep(3600) ``` ### API回调推送 配置了API后,预测完成会自动推送结果: **推送格式**: ```json { "list": [ { "type": "RO1", "project_id": "12345", "ctime": "2025-10-16 08:00:00" } ] } ``` 失败会自动重试3次,间隔10秒。 ### 接口函数说明 | 函数 | 功能 | 参数 | 返回值 | |------|------|------|--------| | `update_actual_cip_time` | 更新单个机组时间 | `unit_name`, `actual_time_str` | `bool` | | `fetch_and_update_from_api` | 批量获取并更新 | `api_url` 或 `api_function` | `dict` | **注意事项**: - 时间格式必须是 `YYYY-MM-DD HH:MM:SS` - 机组名称必须是 `RO1`, `RO2`, `RO3`, `RO4` 之一 - 更新后无需手动触发预测,监控系统会自动处理 - 相同的时间不会重复触发预测 ### 依赖模块 - `fouling_model_0922.predict.Predictor`:压差预测模型 - `cip.run_this.main`:计算各机组预测周期 - `logging_system.CIPAnalysisLogger`:日志和图表生成 --- ## 注意事项 1. **预测周期不够**:确保预测数据至少覆盖30天以上 2. **频繁无结果**:可以降低 `min_continuous_rising` 或 `min_delay_days` 3. **结果不合理**:检查预测模型质量,或尝试不同策略 4. **查看详细过程**:打开 `analysis_logs/` 目录下的日志文件 5. **配置文件格式**:确保 `actual_time` 格式为 `YYYY-MM-DD HH:MM:SS` 6. **监控系统**:监控系统必须保持运行才能自动触发预测 7. **API集成**:使用接口函数更新时,确保监控系统在后台运行 ## 常见问题 **Q: 如何触发预测?** A: 有两种方式:1) 手动修改 `config.json` 中的 `actual_time`;2) 使用代码接口 `update_actual_cip_time()` **Q: 更新 `actual_time` 后多久会触发预测?** A: 监控系统每5秒检查一次配置文件,所以最多5秒内会触发 **Q: `predicted_time` 有什么用?** A: 仅用于记录模型预测结果,不参与任何计算和判断逻辑 **Q: 如何避免重复预测?** A: 系统自动记录已处理的时间,相同的 `actual_time` 不会重复触发 **Q: 如何集成到现有系统?** A: 参考"API集成"部分,使用提供的接口函数从数据库或API获取实际CIP时间并更新