|
|
3 недель назад | |
|---|---|---|
| .idea | 1 месяц назад | |
| __pycache__ | 1 месяц назад | |
| analysis_logs | 1 месяц назад | |
| cip | 1 месяц назад | |
| fouling_model_0922 | 1 месяц назад | |
| Dockerfile | 3 недель назад | |
| Jenkinsfile | 3 недель назад | |
| README_simple.md | 3 недель назад | |
| build.sh | 3 недель назад | |
| config.json | 3 недель назад | |
| config_simple.yaml | 1 месяц назад | |
| docker-compose.yaml | 3 недель назад | |
| logging_system.py | 3 недель назад | |
| main_simple.py | 3 недель назад | |
| requirements.txt | 1 месяц назад | |
| smart_monitor.py | 3 недель назад |
基于压差预测数据分析膜污染速率,自动计算最优CIP清洗时机。
核心原理:
主要功能:
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')
启动监控系统:
python smart_monitor.py
监控系统功能:
cip_times.*.actual_timeactual_time 变化时,自动触发预测predicted_time(仅用于记录)工作流程:
修改actual_time → 监控检测 → 执行预测 → 保存predicted_time → 发送回调 → 继续监控
| 策略 | 说明 | 适用场景 |
|---|---|---|
| 1 | 最早时机 - 取一段/二段中较早的 | 保守维护 |
| 2 | 最晚时机 - 取一段/二段中较晚的 | 最大化运行时间 |
| 3 | 加权平均 - 根据k值加权(推荐) | 平衡维护和运行 |
| 4 | 污染严重 - 选k值最大的段 | 基于实际污染程度 |
{
"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回调使用说明:
actual_time 字段,监控系统会自动检测并触发预测核心参数在 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)
2. 机组对比图 (unit_comparison.png)
3. HTML报告 (report.html)
4. 主日志 (.log)
直接修改 config.json 中的 actual_time:
{
"cip_times": {
"RO1": {
"actual_time": "2025-10-12 12:00:00", // 修改这里
"predicted_time": null
}
}
}
监控系统会在5秒内检测到变化并自动触发预测。
系统提供了两个接口函数,用于从外部系统获取实际CIP时间并自动触发预测:
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("更新成功,系统将自动触发预测")
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 '失败'}")
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后,预测完成会自动推送结果:
推送格式:
{
"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:SSRO1, RO2, RO3, RO4 之一fouling_model_0922.predict.Predictor:压差预测模型cip.run_this.main:计算各机组预测周期logging_system.CIPAnalysisLogger:日志和图表生成min_continuous_rising 或 min_delay_daysanalysis_logs/ 目录下的日志文件actual_time 格式为 YYYY-MM-DD HH:MM:SSQ: 如何触发预测?
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时间并更新