1
0

5 کامیت‌ها de775ef25a ... 2ef4c88a38

نویسنده SHA1 پیام تاریخ
  wmy de775ef25a Merge remote-tracking branch 'origin/master' 2 هفته پیش
  wmy 066a86b448 1:修正cicd 文件 2 هفته پیش
  wmy 7abf8c4a20 1:更新json内容 2 هفته پیش
  wmy 363eae9059 1:拆分超滤训练和开发版本 2 هفته پیش
  wmy d250782772 1:增加逻辑 2 هفته پیش
7فایلهای تغییر یافته به همراه249 افزوده شده و 19 حذف شده
  1. 8 0
      .idea/.gitignore
  2. 8 0
      Dockerfile
  3. 83 0
      Jenkinsfile
  4. 115 0
      README_UPDATES.md
  5. 6 0
      build.sh
  6. 14 19
      device_states.json
  7. 15 0
      docker-compose.yaml

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 8 - 0
Dockerfile

@@ -0,0 +1,8 @@
+# 基于你已构建的基础镜像(包含所有依赖)
+FROM 172.16.0.165:5000/simulations/ultrafiltration_model:v1
+
+WORKDIR /app
+
+COPY . .
+
+CMD ["python", "loop_main.py"]

+ 83 - 0
Jenkinsfile

@@ -0,0 +1,83 @@
+pipeline {
+    agent any
+
+    environment {
+        DEPLOY_SERVER = "greentech@39.105.38.31"
+        DEPLOY_REPO_PATH = "/home/greentech/services/ultrafiltration_model"
+        HARBOR_URL = "172.16.0.165:5000/simulations"
+        IMAGE_NAME = "ultrafiltration_model"
+    }
+
+    stages {
+        stage('获取commit哈希') {
+            steps {
+                git branch: "${APP_GIT_BRANCH}",
+                    url: "${APP_GIT_URL}",
+                    credentialsId: "git-public"
+            }
+        }
+
+        stage('拉取代码') {
+            steps {
+                withCredentials([usernamePassword(
+                    credentialsId: 'gpu1key',
+                    usernameVariable: 'USER',
+                    passwordVariable: 'PWD'
+                )]) {
+                    sh """
+                        sshpass -p '$PWD' ssh -o StrictHostKeyChecking=no $USER@39.105.38.31 "
+                            cd ${DEPLOY_REPO_PATH} &&
+                            git pull origin ${APP_GIT_BRANCH}
+                        "
+                    """
+                }
+            }
+        }
+
+        stage('构建并推送镜像') {
+            steps {
+                script {
+                    def gitCommitShort = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()
+                    withCredentials([usernamePassword(
+                        credentialsId: 'gpu1key',
+                        usernameVariable: 'USER',
+                        passwordVariable: 'PWD'
+                    )]) {
+                        sh """
+                            sshpass -p '$PWD' ssh -o StrictHostKeyChecking=no $USER@39.105.38.31 "
+                                cd ${DEPLOY_REPO_PATH} &&
+                                export HARBOR_URL=${HARBOR_URL} &&
+                                export IMAGE_NAME=${IMAGE_NAME} &&
+                                export GIT_COMMIT_SHORT=${gitCommitShort} &&
+                                chmod +x build.sh &&
+                                ./build.sh
+                            "
+                        """
+                    }
+                }
+            }
+        }
+
+        stage('部署到生产环境') {
+            steps {
+                script {
+                    def gitCommitShort = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()
+                    
+                    withCredentials([usernamePassword(
+                        credentialsId: 'gpu1key',
+                        usernameVariable: 'USER',
+                        passwordVariable: 'PWD'
+                    )]) {
+                        sh """
+                            sshpass -p '$PWD' ssh -o StrictHostKeyChecking=no $USER@39.105.38.31 "
+                            export GIT_COMMIT_SHORT=${gitCommitShort}
+                                cd ${DEPLOY_REPO_PATH} &&
+								docker compose pull && docker compose up -dV 
+                            "
+                        """
+                    }
+                }
+            }
+        }
+    }
+}

+ 115 - 0
README_UPDATES.md

@@ -0,0 +1,115 @@
+# 超滤系统 DQN 智能决策模块
+
+## 系统简介
+
+基于 DQN 强化学习模型,自动优化超滤膜的过滤时长和物理清洗时长,提升产水量、延长膜使用寿命。
+
+**核心流程**:
+1. 监控 TMP(跨膜压差)达到阈值(95%)
+2. 采集多次数据计算平均 TMP0
+3. DQN 模型决策最优 L_s(过滤时长)和 t_bw_s(物洗时长)
+4. 生成 PLC 指令并下发执行
+5. 发送决策结果到回调接口
+
+## 快速开始
+
+### 运行服务
+```bash
+python loop_main.py
+```
+
+程序会自动:
+- 加载 `config.json` 配置
+- 连接数据库和 API
+- 持续监控并在 TMP 达到阈值时触发决策
+
+### 配置文件 (config.json)
+
+```json
+{
+  "system": {
+    "use_model": 1,              # 1=启用模型决策,0=仅记录数据
+    "trigger_value": 95,         # TMP触发值(%)
+    "num_values_to_collect": 10, # 采集次数
+    "poll_interval": 2           # 轮询间隔(秒)
+  },
+  "api": {
+    "base_url": "http://example.com",
+    "jwt_token": "your_token"
+  },
+  "database": {
+    "host": "localhost",
+    "user": "root",
+    "password": "password",
+    "database": "scada_db"
+  },
+  "scada": {
+    "secret": "your_secret_key",
+    "project_id": 92
+  }
+}
+```
+
+**动态开关**:修改 `use_model` 后无需重启,下次循环自动生效
+
+## 核心模块
+
+### 1. DQN_decide.py
+- `run_uf_DQN_decide(uf_params, TMP0)`:DQN 模型决策
+- `generate_plc_instructions(...)`:生成 PLC 指令
+- `calc_uf_cycle_metrics(...)`:计算周期指标
+
+### 2. DQN_env.py
+- `UFSuperCycleEnv`:强化学习环境
+- `UFParams`:超滤参数配置
+- 模拟超级周期运行
+
+### 3. loop_main.py
+- 主监控循环
+- 数据采集和决策触发
+- PLC 更新和回调推送
+
+## 工作流程
+
+```
+监控 TMP → 达到阈值 → 采集数据 → 计算平均值 → DQN决策 
+    ↓
+生成指令 → 更新PLC → 回调推送 → 保存历史 → 继续监控
+```
+
+## PLC 数据更新
+
+系统自动通过 API 更新 PLC 参数:
+
+**接口**: `/api/v1/plc/set-var-values`
+
+**签名**: `MD5(record + secret + timestamp).toUpperCase()`
+
+**数据格式**:
+```json
+[{
+  "project_id": 92,
+  "item": "设备名称",
+  "old_value": "旧值",
+  "new_value": "新值",
+  "command_type": 1
+}]
+```
+
+## 日志记录
+
+日志保存在 `monitor_service.log`,自动轮转(单文件5MB,保留3个备份)。
+
+记录内容:
+- 配置加载和变更
+- 数据采集过程
+- 模型决策结果
+- PLC 更新状态
+- API 回调响应
+
+## 注意事项
+
+1. **模型文件**: 确保 `dqn_model.zip` 存在
+2. **数据库连接**: 检查数据库配置和网络连通性
+3. **API 认证**: 确认 JWT Token 和密钥正确
+4. **TMP 阈值**: 根据实际工况调整 `trigger_value`

+ 6 - 0
build.sh

@@ -0,0 +1,6 @@
+#!/bin/bash
+#zoumuyu
+
+docker build -t ${HARBOR_URL}/${IMAGE_NAME}:${GIT_COMMIT_SHORT} .
+docker push ${HARBOR_URL}/${IMAGE_NAME}:${GIT_COMMIT_SHORT}
+docker pull ${HARBOR_URL}/${IMAGE_NAME}:${GIT_COMMIT_SHORT}

+ 14 - 19
device_states.json

@@ -1,32 +1,27 @@
 {
     "_comment": "此文件用于存储每个设备的运行时状态。时间格式为 YYYY-MM-DD HH:MM:SS",
     "UF1": {
-        "model_prev_L_s": 4220.0,
-        "model_prev_t_bw_s": 90.0,
-        "last_cycle_end_time": "2025-10-29 09:29:48",
-         "recent_tmp_values": [
-            0.0246
-        ]
+        "model_prev_L_s": 4160.0,
+        "model_prev_t_bw_s": 92.0,
+        "last_cycle_end_time": "2025-10-23 05:01:24",
+        "recent_tmp_values": []
     },
     "UF2": {
-        "model_prev_L_s": 4280.0,
-        "model_prev_t_bw_s": 88.0,
-        "last_cycle_end_time": "2025-10-29 14:17:57",
-        "recent_tmp_values": [
-            0.0236
-        ]
+        "model_prev_L_s": 4220.0,
+        "model_prev_t_bw_s": 90.0,
+        "last_cycle_end_time": "2025-10-26 15:34:23",
+        "recent_tmp_values": []
     },
     "UF3": {
-        "model_prev_L_s": 4280.0,
-        "model_prev_t_bw_s": 88.0,
-        "last_cycle_end_time": "2025-10-29 16:55:15",
-        "recent_tmp_values": [
-            0.0227
-        ]
+        "model_prev_L_s": 4220.0,
+        "model_prev_t_bw_s": 90.0,
+        "last_cycle_end_time": "2025-10-26 18:17:28",
+        "recent_tmp_values": []
     },
     "UF4": {
         "model_prev_L_s": 4220.0,
         "model_prev_t_bw_s": 90.0,
-        "last_cycle_end_time": "2025-10-27 13:44:35"
+        "last_cycle_end_time": "2025-10-27 13:44:33",
+        "recent_tmp_values": []
     }
 }

+ 15 - 0
docker-compose.yaml

@@ -0,0 +1,15 @@
+version: '3.8'
+
+services:
+  ultrafiltration_model:
+    image: 172.16.0.165:5000/simulations/ultrafiltration_model:${GIT_COMMIT_SHORT}
+    container_name: ultrafiltration_model
+    restart: always
+    environment:
+      - TZ=Asia/Shanghai
+    networks:
+      - ultrafiltration_model
+
+networks:
+  ultrafiltration_model:
+    driver: bridge