TorqueWrench/架构重构方案.md

8.0 KiB
Raw Blame History

电动扳手系统架构重构方案

📊 当前架构问题分析

现状

  1. 设备管理前端本地存储device_manager.py
  2. 在线检测前端调用后端API后端执行连接检测
  3. 拧紧过程前端执行wrench_gui.py
  4. 数据存储:后端负责

问题

  • 前端调用后端检测在线状态,增加网络延迟
  • 后端需要导入WrenchController职责不清晰
  • 设备配置分散在前端,不便于集中管理

🎯 重构目标架构

职责划分

🖥️ 客户端Frontend职责

  1. 在线状态检测:直接连接扳手检测,无需经过后端
  2. 拧紧过程控制:设定扭矩、启动扳手、等待结果
  3. 实时数据采集:接收扳手返回的实时数据
  4. UI交互:显示工单、螺栓列表、进度

🌐 服务端Backend职责

  1. 设备管理:设备列表、配置的增删改查
  2. 工单管理:工单的创建、认领、查询
  3. 结果存储:保存拧紧结果到数据库
  4. 数据查询:提供历史数据查询接口
  5. 不再负责:设备在线检测、扳手连接

🔧 具体重构步骤

步骤1修改客户端在线检测逻辑

修改文件frontend/wrench_gui.py

当前代码第1196-1253行

def start_device_status_check(self):
    """启动设备状态检测(后台线程)"""
    def check_status():
        while True:
            # 调用后端API检测设备状态
            check_url = f"{self.api_base_url}/wrench-devices/{device_id}/check-status"
            check_response = requests.post(check_url, timeout=3)

重构后

def start_device_status_check(self):
    """启动设备状态检测(后台线程)- 客户端直接检测"""
    def check_status():
        while True:
            # 从后端获取设备列表
            devices = self.fetch_devices_from_backend()
            
            # 客户端直接检测每个设备的在线状态
            for device in devices:
                status = self.check_device_online(device)
                device['status'] = status
                # 可选:将状态上报给后端(仅用于记录)
                self.report_device_status(device['id'], status)
            
            self.wrench_devices = devices
            self.root.after(0, self.update_device_combo)
            time.sleep(10)
    
    threading.Thread(target=check_status, daemon=True).start()

def check_device_online(self, device):
    """客户端直接检测设备在线状态"""
    try:
        config = {
            "ip_address": device.get('ip_address'),
            "port": device.get('port', 7888),
            "address_code": device.get('address_code', 1)
        }
        wrench = WrenchController(device_config=config)
        is_online = wrench.connect()
        if is_online:
            wrench.disconnect()
            return 'online'
        return 'offline'
    except:
        return 'offline'

步骤2简化后端设备API

修改文件backend/app.py

删除或简化

# 删除check-status接口第376-427行
# 或改为可选的状态上报接口
@app.route('/api/wrench-devices/<int:device_id>/status', methods=['POST'])
def report_device_status(device_id):
    """客户端上报设备状态(可选,仅用于记录)"""
    data = request.get_json()
    status = data.get('status', 'offline')
    db.update_wrench_device_status(device_id, status)
    return jsonify({"success": True})

保留的接口

  • GET /api/wrench-devices - 获取设备列表
  • POST /api/wrench-devices - 创建设备
  • PUT /api/wrench-devices/<id> - 更新设备
  • DELETE /api/wrench-devices/<id> - 删除设备

步骤3移除后端对WrenchController的依赖

修改文件backend/app.py

删除导入

# 删除这行
from wrench_controller import WrenchController

删除相关代码

  • 第376-427行check_device_status 函数
  • 第429-460行query_device_sn 函数(如果有)

步骤4优化延时配置

修改文件config.json

添加延时配置

{
  "api": {
    "base_url": "http://localhost:5000/api"
  },
  "delays": {
    "wrench_init": 1.5,
    "param_set": 2.0,
    "retry": 1.0,
    "bolt_complete": 0.5,
    "status_check_interval": 10
  }
}

修改文件wrench_controller.py第448行

def set_torque_parameters(self, ...):
    # 发送命令
    self._send_command(bytes(data))
    
    # 从配置读取延时
    delay = self.config.get('delays', {}).get('param_set', 2.0)
    time.sleep(delay)

修改文件frontend/wrench_gui.py第932行

def work_thread(self):
    # 启用远程控制
    self.wrench.enable_remote_control(True)
    
    # 从配置读取延时
    init_delay = self.load_delay_config('wrench_init', 1.5)
    time.sleep(init_delay)

📋 重构后的架构图

┌─────────────────────────────────────────────────────────────┐
│                        客户端 (Frontend)                      │
├─────────────────────────────────────────────────────────────┤
│  1. 从后端获取设备列表                                        │
│  2. 直接连接扳手检测在线状态 ✅                               │
│  3. 设定扭矩参数 ✅                                           │
│  4. 启动扳手、等待结果 ✅                                     │
│  5. 采集实时数据 ✅                                           │
│  6. 提交结果到后端                                            │
└─────────────────────────────────────────────────────────────┘
                            ↕ HTTP API
┌─────────────────────────────────────────────────────────────┐
│                        服务端 (Backend)                       │
├─────────────────────────────────────────────────────────────┤
│  1. 设备管理 (CRUD) ✅                                        │
│  2. 工单管理 (CRUD) ✅                                        │
│  3. 结果存储 ✅                                               │
│  4. 数据查询 ✅                                               │
│  5. 不再负责:设备连接、在线检测 ❌                           │
└─────────────────────────────────────────────────────────────┘

重构优势

  1. 职责清晰:客户端负责硬件交互,服务端负责数据管理
  2. 性能提升:在线检测无需经过后端,减少网络延迟
  3. 解耦合后端不再依赖WrenchController便于部署
  4. 灵活配置:延时参数可配置,适应不同扳手型号
  5. 易于扩展:客户端可以直接添加更多硬件交互功能

🚀 实施建议

优先级

  1. 高优先级修改客户端在线检测步骤1
  2. 高优先级优化延时配置步骤4
  3. 中优先级简化后端API步骤2
  4. 低优先级清理后端依赖步骤3

风险控制

  • 保留后端check-status接口作为备用
  • 分阶段实施,每步测试后再进行下一步
  • 保留旧代码注释,便于回滚

测试要点

  • 多台客户端同时检测设备状态
  • 不同型号扳手的延时适配
  • 网络断开时的容错处理