TorqueWrench/架构重构方案.md

231 lines
8.0 KiB
Markdown
Raw Permalink Normal View History

2026-03-18 17:13:20 +08:00
# 电动扳手系统架构重构方案
## 📊 当前架构问题分析
### 现状
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行
```python
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)
```
**重构后**
```python
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`
**删除或简化**
```python
# 删除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`
**删除导入**
```python
# 删除这行
from wrench_controller import WrenchController
```
**删除相关代码**
- 第376-427行`check_device_status` 函数
- 第429-460行`query_device_sn` 函数(如果有)
### 步骤4优化延时配置
**修改文件**`config.json`
**添加延时配置**
```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行
```python
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行
```python
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接口作为备用
- 分阶段实施,每步测试后再进行下一步
- 保留旧代码注释,便于回滚
### 测试要点
- 多台客户端同时检测设备状态
- 不同型号扳手的延时适配
- 网络断开时的容错处理