a
This commit is contained in:
@@ -0,0 +1,324 @@
|
||||
# 设备参数管理
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [DialShowDevParam.cpp](file://cpp/Views/DialShowDevParam.cpp)
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp)
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp)
|
||||
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h)
|
||||
- [DialShowDevParam.h](file://h/DialShowDevParam.h)
|
||||
- [DevOperator.h](file://h/DevOperator.h)
|
||||
- [devmngframe.h](file://h/devmngframe.h)
|
||||
- [DevManager.h](file://h/DevManager.h)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [核心功能概述](#核心功能概述)
|
||||
3. [UI结构与数据绑定](#ui结构与数据绑定)
|
||||
4. [消息处理链分析](#消息处理链分析)
|
||||
5. [参数读取、修改与持久化机制](#参数读取修改与持久化机制)
|
||||
6. [用户操作指南](#用户操作指南)
|
||||
7. [开发者扩展指南](#开发者扩展指南)
|
||||
8. [安全访问与异常处理](#安全访问与异常处理)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
设备参数管理功能是Geomative Studio系统中的核心模块之一,负责设备基本信息查看、运行参数配置和固件升级流程。该功能通过DialShowDevParam对话框提供用户界面,结合CDevMngFrame的消息处理机制和DevOperator类的操作接口,实现了对设备参数的全面管理。系统支持参数查询、配置修改、设备注册/注销等操作,并提供了安全访问控制和异常处理策略。
|
||||
|
||||
## 核心功能概述
|
||||
设备参数管理模块主要包含以下功能:
|
||||
- 设备基本信息查看:显示设备序列号、硬件/软件版本、温度、电池电压等信息
|
||||
- 运行参数配置:配置电源频率、电缆类型、接地电阻阈值、迭代次数等运行参数
|
||||
- 固件升级流程:支持设备固件的在线升级
|
||||
- 参数持久化:将修改后的参数保存到设备和云端
|
||||
- 安全验证:在关键操作前进行用户确认和参数合法性验证
|
||||
|
||||
该模块通过STSynDevParam数据结构统一管理设备参数,确保了数据的一致性和完整性。
|
||||
|
||||
**Section sources**
|
||||
- [DialShowDevParam.cpp](file://cpp/Views/DialShowDevParam.cpp#L1-L500)
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L1-L800)
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L1-L800)
|
||||
|
||||
## UI结构与数据绑定
|
||||
### DialShowDevParam对话框UI结构
|
||||
DialShowDevParam对话框采用标准的MFC对话框设计,包含以下主要控件:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["DialShowDevParam对话框"] --> B["基本信息显示区"]
|
||||
A --> C["可配置参数区"]
|
||||
A --> D["操作按钮区"]
|
||||
B --> B1["设备SN: 编辑框"]
|
||||
B --> B2["硬件版本: 编辑框"]
|
||||
B --> B3["软件版本: 编辑框"]
|
||||
B --> B4["温度: 编辑框"]
|
||||
B --> B5["电池电压: 编辑框"]
|
||||
C --> C1["电源频率: 下拉框"]
|
||||
C --> C2["电缆类型: 下拉框"]
|
||||
C --> C3["接地电阻阈值: 编辑框"]
|
||||
C --> C4["电量报警: 下拉框"]
|
||||
C --> C5["迭代次数: 编辑框"]
|
||||
C --> C6["最大下发点数: 编辑框"]
|
||||
D --> D1["配置设备参数按钮"]
|
||||
D --> D2["检查服务器信息按钮"]
|
||||
D --> D3["关闭按钮"]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [DialShowDevParam.cpp](file://cpp/Views/DialShowDevParam.cpp#L52-L251)
|
||||
- [DialShowDevParam.h](file://h/DialShowDevParam.h#L1-L50)
|
||||
|
||||
### 数据绑定机制
|
||||
DialShowDevParam类通过以下机制实现UI与数据的绑定:
|
||||
|
||||
1. **初始化绑定**:在OnInitDialog方法中,将STSynDevParam结构体中的数据绑定到相应的UI控件
|
||||
2. **双向同步**:支持从UI读取数据到结构体,以及从结构体更新UI显示
|
||||
3. **状态管理**:通过m_iOperStatus变量管理编辑状态,区分查看模式和编辑模式
|
||||
|
||||
数据绑定的关键代码路径:
|
||||
- 初始化数据绑定:`DialShowDevParam::OnInitDialog()`
|
||||
- 控件数据映射:`DDX_Control`宏定义
|
||||
- 状态切换逻辑:`OnButtonCfgDevParam()`方法
|
||||
|
||||
**Section sources**
|
||||
- [DialShowDevParam.cpp](file://cpp/Views/DialShowDevParam.cpp#L52-L251)
|
||||
- [DialShowDevParam.h](file://h/DialShowDevParam.h#L49)
|
||||
|
||||
## 消息处理链分析
|
||||
### CDevMngFrame::OnModifyDeviceParameter消息处理链
|
||||
CDevMngFrame类的OnModifyDeviceParameter方法是设备参数修改的入口点,其处理链如下:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant 用户 as 用户
|
||||
participant CDevMngFrame as CDevMngFrame
|
||||
participant DevOperator as CDevOperator
|
||||
participant Device as CDevice
|
||||
participant DialShowDevParam as CDialShowDevParam
|
||||
用户->>CDevMngFrame : 点击"修改设备参数"
|
||||
CDevMngFrame->>DevOperator : ModifyDeviceParameter()
|
||||
DevOperator->>Device : GetDeviceByID()
|
||||
Device->>Device : ModifyParameter()
|
||||
Device->>DialShowDevParam : 创建对话框实例
|
||||
DialShowDevParam->>DialShowDevParam : SetDevParam()
|
||||
DialShowDevParam->>用户 : 显示参数配置对话框
|
||||
用户->>DialShowDevParam : 修改参数并确认
|
||||
DialShowDevParam->>CDevMngFrame : DoModal()返回IDOK
|
||||
CDevMngFrame->>网络 : 发送参数修改请求
|
||||
CDevMngFrame->>云端 : 上传设备信息
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L533-L537)
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L435-L461)
|
||||
- [DialShowDevParam.cpp](file://cpp/Views/DialShowDevParam.cpp#L268-L403)
|
||||
|
||||
### 消息处理流程详解
|
||||
1. **用户触发**:用户在设备管理界面点击"修改设备参数"菜单项
|
||||
2. **框架处理**:CDevMngFrame接收到IDM_OP_DE_REG_O_MP命令消息
|
||||
3. **操作委托**:调用DevOperator的ModifyDeviceParameter方法
|
||||
4. **设备获取**:通过设备句柄获取对应的CDevice实例
|
||||
5. **参数修改**:调用设备实例的ModifyParameter方法
|
||||
6. **对话框显示**:创建并显示DialShowDevParam对话框
|
||||
7. **结果处理**:根据用户操作结果决定是否发送参数修改请求
|
||||
|
||||
**Section sources**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L92-L93)
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L435-L461)
|
||||
|
||||
## 参数读取修改与持久化机制
|
||||
### 参数数据结构
|
||||
设备参数通过STSynDevParam结构体进行管理,主要包含以下字段:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 范围 |
|
||||
|-------|------|------|------|
|
||||
| uiMachineID | UINT32 | 设备机器ID | 无限制 |
|
||||
| ucHWVer[2] | BYTE | 硬件版本 | 0-99 |
|
||||
| ucSWVer[4] | BYTE | 软件版本 | 0-99 |
|
||||
| fTemperature | float | 温度 | 0.0-150.0℃ |
|
||||
| fBatteryVol | float | 电池电压 | 0.0-10.0V |
|
||||
| ucPowerFreq | BYTE | 电源频率 | 0(50Hz), 1(60Hz) |
|
||||
| ucCableType | BYTE | 电缆类型 | 0-2 |
|
||||
| iGrThreshold | int | 接地电阻阈值 | 0-30000Ω |
|
||||
| ucBatteryAlarm | BYTE | 电量报警 | 0(关闭), 1(开启) |
|
||||
| ucStacking | BYTE | 迭代次数 | 0-255 |
|
||||
| ucChannelNum | BYTE | 通道数 | 无限制 |
|
||||
| ucDownLoadNum | BYTE | 最大下发点数 | 通道数-20 |
|
||||
|
||||
**Diagram sources**
|
||||
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h#L78)
|
||||
- [DialShowDevParam.h](file://h/DialShowDevParam.h#L49)
|
||||
|
||||
### 参数读取流程
|
||||
参数读取主要通过以下步骤实现:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[开始] --> B[选择目标设备]
|
||||
B --> C[发送同步请求 EN_CTRL_SYN_DEV_PARAM]
|
||||
C --> D{网络请求成功?}
|
||||
D --> |是| E[接收STSynDevParam数据]
|
||||
D --> |否| F[显示错误信息]
|
||||
E --> G[字节序转换]
|
||||
G --> H[温度/电压范围验证]
|
||||
H --> I[创建DialShowDevParam实例]
|
||||
I --> J[调用SetDevParam方法]
|
||||
J --> K[显示参数对话框]
|
||||
K --> L[结束]
|
||||
F --> L
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L670-L723)
|
||||
- [DialShowDevParam.cpp](file://cpp/Views/DialShowDevParam.cpp#L442-L495)
|
||||
|
||||
### 参数修改与持久化
|
||||
参数修改和持久化过程包含客户端验证、设备更新和云端同步三个阶段:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[用户修改参数] --> B[客户端验证]
|
||||
B --> C{验证通过?}
|
||||
C --> |否| D[显示错误提示]
|
||||
C --> |是| E[准备STModifyDevParam结构]
|
||||
E --> F[发送EN_CTRL_SET_DEV_PARAM命令]
|
||||
F --> G{设备响应成功?}
|
||||
G --> |否| H[显示设置失败]
|
||||
G --> |是| I[更新本地缓存]
|
||||
I --> J[上传到云端]
|
||||
J --> K[更新UI显示]
|
||||
K --> L[完成]
|
||||
D --> L
|
||||
H --> L
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L421-L532)
|
||||
- [DialShowDevParam.cpp](file://cpp/Views/DialShowDevParam.cpp#L268-L403)
|
||||
|
||||
**Section sources**
|
||||
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h#L78-L89)
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L421-L532)
|
||||
|
||||
## 用户操作指南
|
||||
### 参数查询操作
|
||||
1. 在设备管理界面选择目标设备
|
||||
2. 右键点击设备或通过菜单选择"查看设备参数"
|
||||
3. 系统自动从设备读取参数并显示在对话框中
|
||||
4. 查看设备基本信息和运行参数
|
||||
|
||||
### 配置修改操作
|
||||
1. 在设备管理界面选择目标设备
|
||||
2. 点击"修改设备参数"菜单项
|
||||
3. 在弹出的对话框中修改所需参数
|
||||
4. 点击"下发"按钮提交修改
|
||||
5. 系统会提示确认操作,确认后参数将被发送到设备
|
||||
|
||||
### 设备注册/注销操作
|
||||
**设备注册流程:**
|
||||
1. 点击"注册新设备"菜单项
|
||||
2. 系统自动检测并注册新设备
|
||||
3. 注册完成后设备将出现在设备列表中
|
||||
|
||||
**设备注销流程:**
|
||||
1. 选择要注销的设备
|
||||
2. 点击"注销设备"菜单项
|
||||
3. 确认注销操作
|
||||
4. 设备将从系统中移除
|
||||
|
||||
**Section sources**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L533-L561)
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L435-L482)
|
||||
|
||||
## 开发者扩展指南
|
||||
### 添加新的参数配置项
|
||||
要添加新的参数配置项,需要执行以下步骤:
|
||||
|
||||
1. **扩展数据结构**:在STSynDevParam结构体中添加新字段
|
||||
2. **更新UI界面**:在DialShowDevParam对话框中添加相应的控件
|
||||
3. **实现数据绑定**:在OnInitDialog和OnButtonCfgDevParam方法中添加数据绑定逻辑
|
||||
4. **更新协议**:确保新参数在网络传输中正确序列化和反序列化
|
||||
|
||||
示例代码路径:
|
||||
- 数据结构定义:`CtrlProtocolDef.h`
|
||||
- UI控件定义:`DialShowDevParam.h`
|
||||
- 数据绑定实现:`DialShowDevParam.cpp`
|
||||
|
||||
### 扩展设备参数模型
|
||||
扩展STSynDevParam模型的步骤:
|
||||
|
||||
1. 在`CtrlProtocolDef.h`中修改STSynDevParam结构体
|
||||
2. 更新所有使用该结构体的类和方法
|
||||
3. 确保字节序转换函数支持新字段
|
||||
4. 更新网络协议版本号以确保兼容性
|
||||
|
||||
### 参数变更验证与回调机制
|
||||
系统提供了多层次的参数验证机制:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class ParameterValidator {
|
||||
+ValidatePowerFreq(BYTE freq) bool
|
||||
+ValidateCableType(BYTE type) bool
|
||||
+ValidateGrThreshold(int threshold) bool
|
||||
+ValidateStacking(BYTE stacking) bool
|
||||
+ValidateDownLoadNum(BYTE num, BYTE channelNum) bool
|
||||
}
|
||||
class ParameterCallback {
|
||||
+OnBeforeModify(STSynDevParam* param) bool
|
||||
+OnAfterModify(STSynDevParam* param) void
|
||||
+OnModifyFailed(STSynDevParam* param, int errorCode) void
|
||||
}
|
||||
ParameterValidator <|-- DeviceParameterValidator
|
||||
ParameterCallback <|-- DeviceParameterCallback
|
||||
DeviceParameterValidator --> DeviceParameterCallback : "uses"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [DialShowDevParam.cpp](file://cpp/Views/DialShowDevParam.cpp#L296-L379)
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L433-L444)
|
||||
|
||||
**Section sources**
|
||||
- [DialShowDevParam.cpp](file://cpp/Views/DialShowDevParam.cpp#L296-L379)
|
||||
|
||||
## 安全访问与异常处理
|
||||
### 安全访问策略
|
||||
系统通过以下机制确保设备参数操作的安全性:
|
||||
|
||||
1. **操作确认**:在关键操作前要求用户确认
|
||||
2. **参数验证**:对所有输入参数进行范围和合法性验证
|
||||
3. **状态检查**:确保设备处于可操作状态
|
||||
4. **权限控制**:某些操作需要管理员权限
|
||||
|
||||
### 异常处理机制
|
||||
系统实现了完善的异常处理策略:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[异常发生] --> B{异常类型}
|
||||
B --> C[网络异常]
|
||||
B --> D[参数验证异常]
|
||||
B --> E[设备响应异常]
|
||||
B --> F[其他异常]
|
||||
C --> G[显示连接中断提示]
|
||||
D --> H[显示具体参数错误]
|
||||
E --> I[显示设备响应错误]
|
||||
F --> J[记录日志并提示]
|
||||
G --> K[结束]
|
||||
H --> K
|
||||
I --> K
|
||||
J --> K
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [DialShowDevParam.cpp](file://cpp/Views/DialShowDevParam.cpp#L296-L379)
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L442-L495)
|
||||
|
||||
**Section sources**
|
||||
- [DialShowDevParam.cpp](file://cpp/Views/DialShowDevParam.cpp#L296-L379)
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L442-L495)
|
||||
|
||||
## 结论
|
||||
设备参数管理功能通过DialShowDevParam对话框、CDevMngFrame消息处理链和DevOperator操作类的协同工作,实现了对设备参数的全面管理。系统提供了友好的用户界面、可靠的数据持久化机制和安全的访问控制策略。开发者可以通过扩展STSynDevParam数据结构和相应的验证回调机制来添加新的参数配置项,满足不断变化的业务需求。
|
||||
@@ -0,0 +1,212 @@
|
||||
# 设备状态监控
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [appdevolview.cpp](file://cpp/Views/appdevolview.cpp)
|
||||
- [appdevolview.h](file://h/appdevolview.h)
|
||||
- [appdevoldetaillistview.h](file://h/appdevoldetaillistview.h)
|
||||
- [appdevolgrlistview.h](file://h/appdevolgrlistview.h)
|
||||
- [appdevolacview.h](file://h/appdevolacview.h)
|
||||
- [DialPlcStatusShow.cpp](file://cpp/Views/DialPlcStatusShow.cpp)
|
||||
- [DialPlcStatusSetting.cpp](file://cpp/Views/DialPlcStatusSetting.cpp)
|
||||
- [OperPLC.cpp](file://cpp/Tools/OperPLC.cpp)
|
||||
- [StateProcessor.cpp](file://cpp/Tools/StateProcessor.cpp)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
本文档全面记录了GeomativeStudio中的设备实时状态监控系统,重点涵盖PLC状态查询、定时任务监控和运行日志显示功能。系统通过UI消息机制触发状态轮询,并在appdevolview中实现状态视图的数据刷新。文档详细描述了关键状态字段如m_bDevState、m_iPlcTimerInterval的含义与更新逻辑,为用户提供操作指南,为开发者提供扩展接口说明。
|
||||
|
||||
## 项目结构
|
||||
设备状态监控功能主要分布在cpp/Views和h目录下,以appdevolview为核心视图容器,包含多个子视图组件。系统通过分层架构实现状态监控,包括UI层、业务逻辑层和设备通信层。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "UI层"
|
||||
appdevolview["appdevolview (主容器)"]
|
||||
appdevoldetaillistview["appdevoldetaillistview (详情列表)"]
|
||||
appdevolgrlistview["appdevolgrlistview (图形列表)"]
|
||||
appdevolacview["appdevolacview (活动状态)"]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
DevManager["DevManager (设备管理)"]
|
||||
StateProcessor["StateProcessor (状态处理)"]
|
||||
end
|
||||
subgraph "设备通信层"
|
||||
OperPLC["OperPLC (PLC操作)"]
|
||||
SComPort["SComPort (串口通信)"]
|
||||
end
|
||||
appdevolview --> appdevoldetaillistview
|
||||
appdevolview --> appdevolgrlistview
|
||||
appdevolview --> appdevolacview
|
||||
appdevolview --> DevManager
|
||||
DevManager --> StateProcessor
|
||||
DevManager --> OperPLC
|
||||
OperPLC --> SComPort
|
||||
```
|
||||
|
||||
**图示来源**
|
||||
- [appdevolview.cpp](file://cpp/Views/appdevolview.cpp#L1-L120)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L50)
|
||||
|
||||
**本节来源**
|
||||
- [appdevolview.cpp](file://cpp/Views/appdevolview.cpp#L1-L120)
|
||||
- [h](file://h#L1-L10)
|
||||
|
||||
## 核心组件
|
||||
设备状态监控系统的核心组件包括主视图容器CAppDevOLView及其三个子视图:设备详情列表视图、图形列表视图和活动状态视图。这些组件通过CSplitterWnd实现分屏布局,提供一体化的状态监控界面。
|
||||
|
||||
**本节来源**
|
||||
- [appdevolview.cpp](file://cpp/Views/appdevolview.cpp#L18-L120)
|
||||
- [appdevolview.h](file://h/appdevolview.h#L13-L54)
|
||||
|
||||
## 架构概述
|
||||
系统采用MVC架构模式,CAppDevOLView作为视图控制器,管理三个子视图的布局和显示。状态数据通过DevManager从底层设备获取,经由StateProcessor处理后更新到UI组件。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as "UI界面"
|
||||
participant View as "CAppDevOLView"
|
||||
participant Manager as "DevManager"
|
||||
participant PLC as "OperPLC"
|
||||
participant Device as "PLC设备"
|
||||
UI->>View : OnRemQueryPlcStatus消息
|
||||
View->>Manager : 请求PLC状态
|
||||
Manager->>PLC : 执行查询命令
|
||||
PLC->>Device : 发送查询指令
|
||||
Device-->>PLC : 返回状态数据
|
||||
PLC-->>Manager : 解析状态数据
|
||||
Manager-->>View : 返回设备状态
|
||||
View->>View : 更新m_bDevState等状态字段
|
||||
View->>UI : 刷新视图显示
|
||||
```
|
||||
|
||||
**图示来源**
|
||||
- [appdevolview.cpp](file://cpp/Views/appdevolview.cpp#L68-L105)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L15-L80)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 主视图容器分析
|
||||
CAppDevOLView是设备在线状态监控的主视图容器,负责创建和管理三个子视图的分屏布局。通过CSplitterWnd实现灵活的窗口分割,提供最佳的用户体验。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CAppDevOLView {
|
||||
+CView* m_pDevOLDetailListView
|
||||
+CView* m_pDevOLGRListView
|
||||
+CView* m_pDevOLACListView
|
||||
-CSplitterWnd m_firstSplitter
|
||||
-CSplitterWnd m_secondSplitter
|
||||
+Create() bool
|
||||
+OnSize() void
|
||||
+OnDraw() void
|
||||
}
|
||||
class CAppDevOLDetailListView {
|
||||
+int m_iRowCount
|
||||
-CListCtrl* m_pDetailList
|
||||
+OnInitialUpdate() void
|
||||
+OnDraw() void
|
||||
}
|
||||
class CAppDevOLGRListView {
|
||||
+OnInitialUpdate() void
|
||||
+OnRButtonDown() void
|
||||
+OnOpDevRefreshGR() void
|
||||
}
|
||||
class CAppDevOLACView {
|
||||
+OnInitialUpdate() void
|
||||
+OnDraw() void
|
||||
}
|
||||
CAppDevOLView --> CAppDevOLDetailListView : "包含"
|
||||
CAppDevOLView --> CAppDevOLGRListView : "包含"
|
||||
CAppDevOLView --> CAppDevOLACView : "包含"
|
||||
```
|
||||
|
||||
**图示来源**
|
||||
- [appdevolview.h](file://h/appdevolview.h#L13-L54)
|
||||
- [appdevoldetaillistview.h](file://h/appdevoldetaillistview.h#L13-L53)
|
||||
- [appdevolgrlistview.h](file://h/appdevolgrlistview.h#L13-L52)
|
||||
- [appdevolacview.h](file://h/appdevolacview.h#L13-L51)
|
||||
|
||||
**本节来源**
|
||||
- [appdevolview.cpp](file://cpp/Views/appdevolview.cpp#L18-L120)
|
||||
- [appdevolview.h](file://h/appdevolview.h#L13-L54)
|
||||
|
||||
### 状态轮询机制分析
|
||||
系统通过UI消息OnRemQueryPlcStatus和OnRemGD10TimerTdRun触发状态轮询。当用户请求或定时器触发时,系统调用PLC状态查询接口,实现设备状态的实时监控。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([用户操作或定时器]) --> CheckMessage{"消息类型?"}
|
||||
CheckMessage --> |OnRemQueryPlcStatus| QueryPLC["调用PLC状态查询"]
|
||||
CheckMessage --> |OnRemGD10TimerTdRun| CheckInterval["检查m_iPlcTimerInterval"]
|
||||
CheckInterval --> Valid{"间隔有效?"}
|
||||
Valid --> |是| QueryPLC
|
||||
Valid --> |否| End
|
||||
QueryPLC --> SendCommand["发送PLC查询指令"]
|
||||
SendCommand --> ReceiveData["接收PLC响应数据"]
|
||||
ReceiveData --> ParseData["解析状态数据"]
|
||||
ParseData --> UpdateState["更新m_bDevState等字段"]
|
||||
UpdateState --> RefreshView["刷新appdevolview显示"]
|
||||
RefreshView --> End([完成])
|
||||
```
|
||||
|
||||
**图示来源**
|
||||
- [DialPlcStatusShow.cpp](file://cpp/Views/DialPlcStatusShow.cpp#L1-L50)
|
||||
- [OperPLC.cpp](file://cpp/Tools/OperPLC.cpp#L15-L100)
|
||||
|
||||
**本节来源**
|
||||
- [DialPlcStatusShow.cpp](file://cpp/Views/DialPlcStatusShow.cpp#L1-L50)
|
||||
- [OperPLC.cpp](file://cpp/Tools/OperPLC.cpp#L15-L100)
|
||||
|
||||
## 依赖分析
|
||||
设备状态监控系统依赖于多个核心组件和工具类,形成完整的监控链条。系统通过清晰的依赖关系确保各组件职责分明,便于维护和扩展。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
appdevolview --> DevManager
|
||||
DevManager --> StateProcessor
|
||||
DevManager --> OperPLC
|
||||
OperPLC --> SComPort
|
||||
DevManager --> TdManager
|
||||
appdevolview --> DialPlcStatusShow
|
||||
DialPlcStatusShow --> DialPlcStatusSetting
|
||||
StateProcessor --> FileOperTools
|
||||
DevManager --> IOManager
|
||||
style appdevolview fill:#f9f,stroke:#333
|
||||
style DevManager fill:#bbf,stroke:#333
|
||||
style OperPLC fill:#f96,stroke:#333
|
||||
```
|
||||
|
||||
**图示来源**
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L30)
|
||||
- [OperPLC.cpp](file://cpp/Tools/OperPLC.cpp#L1-L20)
|
||||
- [StateProcessor.cpp](file://cpp/Tools/StateProcessor.cpp#L1-L15)
|
||||
|
||||
**本节来源**
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L50)
|
||||
- [OperPLC.cpp](file://cpp/Tools/OperPLC.cpp#L1-L30)
|
||||
|
||||
## 性能考虑
|
||||
系统在设计时充分考虑了性能因素,通过合理的更新频率控制和数据缓存机制,确保监控系统的高效运行。m_iPlcTimerInterval字段控制PLC状态查询的间隔,避免频繁查询导致的性能问题。
|
||||
|
||||
## 故障排除指南
|
||||
当设备状态显示异常时,应首先检查串口通信是否正常,然后验证PLC设备是否在线。可通过DialPlcStatusShow对话框手动触发状态查询,诊断通信问题。日志文件位于Install/Geomative Studio/LOG目录下,可用于分析历史问题。
|
||||
|
||||
**本节来源**
|
||||
- [DialPlcStatusShow.cpp](file://cpp/Views/DialPlcStatusShow.cpp#L10-L50)
|
||||
- [OperPLC.cpp](file://cpp/Tools/OperPLC.cpp#L45-L80)
|
||||
|
||||
## 结论
|
||||
GeomativeStudio的设备状态监控系统通过分层架构和模块化设计,实现了PLC状态查询、定时任务监控和运行日志显示等核心功能。系统具有良好的可扩展性,开发者可以基于现有框架添加新的监控指标和告警规则,满足不断变化的监控需求。
|
||||
@@ -0,0 +1,291 @@
|
||||
# 设备管理界面
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp)
|
||||
- [devmngframe.h](file://h/devmngframe.h)
|
||||
- [appdevview.cpp](file://cpp/Views/appdevview.cpp)
|
||||
- [appdevview.h](file://h/appdevview.h)
|
||||
- [appdevolview.cpp](file://cpp/Views/appdevolview.cpp)
|
||||
- [appdevolview.h](file://h/appdevolview.h)
|
||||
- [navdevview.cpp](file://cpp/Views/navdevview.cpp)
|
||||
- [navdevview.h](file://h/navdevview.h)
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp)
|
||||
- [DevOperator.h](file://h/DevOperator.h)
|
||||
- [appdevdetaillistview.cpp](file://cpp/Views/appdevdetaillistview.cpp)
|
||||
- [appdevoldetaillistview.cpp](file://cpp/Views/appdevoldetaillistview.cpp)
|
||||
- [appdevolgrlistview.cpp](file://cpp/ProblemZone/appdevolgrlistview.cpp)
|
||||
- [appdevolacview.cpp](file://cpp/Views/appdevolacview.cpp)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
设备管理界面是Geomative Studio软件中的一个核心功能模块,负责设备的连接状态监控、串口配置、PLC状态查询与参数显示。该界面通过`devmngframe`框架与多个视图(如`appdevview`、`appdevolview`)协同工作,为用户提供设备列表、详细信息面板和实时状态窗口。用户可以通过该界面执行设备发现、参数查看与状态诊断等操作。对于开发者而言,该框架提供了扩展设备信息展示、添加新的诊断功能或集成新型硬件协议的接口。
|
||||
|
||||
## 项目结构
|
||||
设备管理界面的相关文件主要分布在`cpp/Views`和`h`目录下。`devmngframe.cpp`和`devmngframe.h`定义了设备管理框架的核心逻辑,而`appdevview.cpp`、`appdevolview.cpp`等文件则实现了具体的应用视图。`DevOperator.cpp`和`DevOperator.h`提供了设备操作的业务逻辑,包括设备注册、参数修改和状态查询等功能。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "视图层"
|
||||
devmngframe["devmngframe (设备管理框架)"]
|
||||
appdevview["appdevview (应用设备视图)"]
|
||||
appdevolview["appdevolview (在线设备视图)"]
|
||||
navdevview["navdevview (导航设备视图)"]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
DevOperator["DevOperator (设备操作器)"]
|
||||
end
|
||||
subgraph "数据模型"
|
||||
Device["Device (设备类)"]
|
||||
end
|
||||
devmngframe --> appdevview
|
||||
devmngframe --> appdevolview
|
||||
devmngframe --> navdevview
|
||||
devmngframe --> DevOperator
|
||||
DevOperator --> Device
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L1-L1806)
|
||||
- [appdevview.cpp](file://cpp/Views/appdevview.cpp#L1-L102)
|
||||
- [appdevolview.cpp](file://cpp/Views/appdevolview.cpp#L1-L120)
|
||||
- [navdevview.cpp](file://cpp/Views/navdevview.cpp#L1-L180)
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L1-L1604)
|
||||
|
||||
**章节来源**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L1-L1806)
|
||||
- [appdevview.cpp](file://cpp/Views/appdevview.cpp#L1-L102)
|
||||
- [appdevolview.cpp](file://cpp/Views/appdevolview.cpp#L1-L120)
|
||||
- [navdevview.cpp](file://cpp/Views/navdevview.cpp#L1-L180)
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L1-L1604)
|
||||
|
||||
## 核心组件
|
||||
设备管理界面的核心组件包括`CDevMngFrame`、`CAppDevView`、`CAppDevOLView`和`CNavDevView`。`CDevMngFrame`是设备管理框架的主窗口,负责协调各个视图的显示和交互。`CAppDevView`和`CAppDevOLView`分别用于显示离线和在线设备的详细信息,而`CNavDevView`则提供设备的导航树视图。`CDevOperator`类封装了设备操作的业务逻辑,如设备注册、参数修改和状态查询。
|
||||
|
||||
**章节来源**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L1-L1806)
|
||||
- [appdevview.cpp](file://cpp/Views/appdevview.cpp#L1-L102)
|
||||
- [appdevolview.cpp](file://cpp/Views/appdevolview.cpp#L1-L120)
|
||||
- [navdevview.cpp](file://cpp/Views/navdevview.cpp#L1-L180)
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L1-L1604)
|
||||
|
||||
## 架构概述
|
||||
设备管理界面采用MVC(Model-View-Controller)架构模式。`CDevMngFrame`作为控制器,负责协调视图和模型之间的交互。`CAppDevView`、`CAppDevOLView`和`CNavDevView`作为视图,负责显示设备信息和用户界面。`CDevOperator`和`CDevice`作为模型,负责处理设备数据和业务逻辑。这种架构使得界面逻辑与业务逻辑分离,提高了代码的可维护性和可扩展性。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CDevMngFrame {
|
||||
+CView* m_pAppDevView
|
||||
+CView* m_pNavDevView
|
||||
+CDevOperator* m_pDevOperator
|
||||
+ShowAppView(DWORD, UINT)
|
||||
+OnModifyDeviceParameter()
|
||||
+OnRegisterNewDevice()
|
||||
}
|
||||
class CAppDevView {
|
||||
+CView* m_pDevDetailListView
|
||||
+CView* m_pDevContentListView
|
||||
}
|
||||
class CAppDevOLView {
|
||||
+CView* m_pDevOLDetailListView
|
||||
+CView* m_pDevOLGRListView
|
||||
+CView* m_pDevOLACListView
|
||||
}
|
||||
class CNavDevView {
|
||||
+CTreeCtrl m_devTree
|
||||
}
|
||||
class CDevOperator {
|
||||
+CStateProcessor m_stateProcessor
|
||||
+CHandleProcessor m_handleProcessor
|
||||
+InitialNavDevView(CNavDevView*)
|
||||
+ShowFLDeviceInfo(DWORD, CView*)
|
||||
+ShowOLDeviceInfo(DWORD, CView*)
|
||||
+ModifyDeviceParameter(CNavDevView*, CListCtrl&)
|
||||
}
|
||||
class CDevice {
|
||||
+CString m_szDevSN
|
||||
+UINT m_uState
|
||||
+DWORD m_dwID
|
||||
+ShowOLDetailInfo(CListCtrl&)
|
||||
+ShowGRInfo(CListCtrl&)
|
||||
+ShowACInfo(CListCtrl&)
|
||||
}
|
||||
CDevMngFrame --> CAppDevView : "包含"
|
||||
CDevMngFrame --> CAppDevOLView : "包含"
|
||||
CDevMngFrame --> CNavDevView : "包含"
|
||||
CDevMngFrame --> CDevOperator : "使用"
|
||||
CDevOperator --> CDevice : "操作"
|
||||
CAppDevView --> CDevice : "显示"
|
||||
CAppDevOLView --> CDevice : "显示"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L1-L1806)
|
||||
- [appdevview.cpp](file://cpp/Views/appdevview.cpp#L1-L102)
|
||||
- [appdevolview.cpp](file://cpp/Views/appdevolview.cpp#L1-L120)
|
||||
- [navdevview.cpp](file://cpp/Views/navdevview.cpp#L1-L180)
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L1-L1604)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### CDevMngFrame 分析
|
||||
`CDevMngFrame`是设备管理框架的主窗口类,继承自`CMDIChildWnd`。它负责创建和管理设备管理界面的布局,包括导航视图和应用视图。通过`OnCreateClient`方法,它使用`CSplitterWnd`将窗口分割为左右两部分,左侧为`CNavDevView`,右侧为`CAppDevView`或`CAppDevOLView`。`ShowAppView`方法根据设备状态动态切换右侧视图。
|
||||
|
||||
#### 类图
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CDevMngFrame {
|
||||
+CView* m_pAppDevView
|
||||
+CView* m_pNavDevView
|
||||
+CDevOperator* m_pDevOperator
|
||||
+CSplitterWnd m_splitter
|
||||
+ShowAppView(DWORD, UINT)
|
||||
+OnMDIActivate(BOOL, CWnd*, CWnd*)
|
||||
+OnClose()
|
||||
}
|
||||
CDevMngFrame --|> CMDIChildWnd
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L1-L1806)
|
||||
- [devmngframe.h](file://h/devmngframe.h#L1-L108)
|
||||
|
||||
#### 消息处理流程
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant 用户
|
||||
participant CDevMngFrame
|
||||
participant CDevOperator
|
||||
participant CDevice
|
||||
用户->>CDevMngFrame : 选择设备
|
||||
CDevMngFrame->>CDevMngFrame : OnSelchangedNavDevTree
|
||||
CDevMngFrame->>CDevMngFrame : OnSchedule
|
||||
CDevMngFrame->>CDevOperator : ShowOLDeviceInfo 或 ShowFLDeviceInfo
|
||||
CDevOperator->>CDevice : 获取设备信息
|
||||
CDevice-->>CDevOperator : 返回设备信息
|
||||
CDevOperator-->>CDevMngFrame : 更新视图
|
||||
CDevMngFrame-->>用户 : 显示设备详细信息
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L1-L1806)
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L1-L1604)
|
||||
|
||||
**章节来源**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L1-L1806)
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L1-L1604)
|
||||
|
||||
### CAppDevView 与 CAppDevOLView 分析
|
||||
`CAppDevView`和`CAppDevOLView`分别用于显示离线和在线设备的详细信息。`CAppDevView`包含`CAppDevDetailListView`和`CAppDataTdListView`,用于显示设备基本信息和测试数据。`CAppDevOLView`包含`CAppDevOLDetailListView`、`CAppDevOLGRListView`和`CAppDevOLACView`,用于显示在线设备的详细信息、接地电阻和交流信息。
|
||||
|
||||
#### 布局流程图
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([创建视图]) --> CreateSplitter["创建分割窗口"]
|
||||
CreateSplitter --> CreateDetail["创建详细信息列表"]
|
||||
CreateDetail --> CreateContent["创建内容列表"]
|
||||
CreateContent --> SetStyle["设置列表样式"]
|
||||
SetStyle --> InsertColumns["插入列表列"]
|
||||
InsertColumns --> InsertItems["插入列表项"]
|
||||
InsertItems --> End([视图创建完成])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [appdevview.cpp](file://cpp/Views/appdevview.cpp#L1-L102)
|
||||
- [appdevolview.cpp](file://cpp/Views/appdevolview.cpp#L1-L120)
|
||||
|
||||
**章节来源**
|
||||
- [appdevview.cpp](file://cpp/Views/appdevview.cpp#L1-L102)
|
||||
- [appdevolview.cpp](file://cpp/Views/appdevolview.cpp#L1-L120)
|
||||
|
||||
### CNavDevView 分析
|
||||
`CNavDevView`提供设备的导航树视图,用户可以通过树形结构浏览和选择设备。它通过`CTreeCtrl`控件实现树形视图,并在`OnInitialUpdate`方法中初始化树的样式。`OnRclickNavDevTree`方法处理右键点击事件,弹出上下文菜单。
|
||||
|
||||
#### 交互流程图
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A([用户右键点击设备]) --> B{是否在设备上?}
|
||||
B --> |是| C[选择设备]
|
||||
C --> D[获取设备句柄和状态]
|
||||
D --> E[发送调度消息]
|
||||
E --> F[更新应用视图]
|
||||
F --> G[显示设备详细信息]
|
||||
B --> |否| H[无操作]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [navdevview.cpp](file://cpp/Views/navdevview.cpp#L1-L180)
|
||||
- [navdevview.h](file://h/navdevview.h#L1-L70)
|
||||
|
||||
**章节来源**
|
||||
- [navdevview.cpp](file://cpp/Views/navdevview.cpp#L1-L180)
|
||||
|
||||
### CDevOperator 分析
|
||||
`CDevOperator`类封装了设备操作的业务逻辑,包括设备注册、参数修改和状态查询。它通过`InitialNavDevView`方法初始化导航视图,通过`ShowOLDeviceInfo`和`ShowFLDeviceInfo`方法显示在线和离线设备的详细信息。`ModifyDeviceParameter`方法用于修改设备参数。
|
||||
|
||||
#### 业务逻辑流程图
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([修改设备参数]) --> GetSelection["获取选中设备"]
|
||||
GetSelection --> GetHandle["获取设备句柄"]
|
||||
GetHandle --> GetID["获取设备ID"]
|
||||
GetID --> GetDevice["获取设备对象"]
|
||||
GetDevice --> ModifyParam["修改设备参数"]
|
||||
ModifyParam --> ShowInfo["更新视图显示"]
|
||||
ShowInfo --> End([参数修改完成])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L1-L1604)
|
||||
- [DevOperator.h](file://h/DevOperator.h#L1-L59)
|
||||
|
||||
**章节来源**
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L1-L1604)
|
||||
|
||||
## 依赖分析
|
||||
设备管理界面的组件之间存在紧密的依赖关系。`CDevMngFrame`依赖于`CDevOperator`来执行设备操作,`CDevOperator`又依赖于`CDevice`来获取设备信息。视图组件如`CAppDevView`和`CAppDevOLView`依赖于`CDevOperator`来更新显示内容。这种依赖关系通过指针成员变量和方法调用实现。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
CDevMngFrame --> CDevOperator
|
||||
CDevOperator --> CDevice
|
||||
CDevMngFrame --> CNavDevView
|
||||
CDevMngFrame --> CAppDevView
|
||||
CDevMngFrame --> CAppDevOLView
|
||||
CAppDevView --> CDevice
|
||||
CAppDevOLView --> CDevice
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L1-L1806)
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L1-L1604)
|
||||
- [appdevview.cpp](file://cpp/Views/appdevview.cpp#L1-L102)
|
||||
- [appdevolview.cpp](file://cpp/Views/appdevolview.cpp#L1-L120)
|
||||
|
||||
**章节来源**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L1-L1806)
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L1-L1604)
|
||||
|
||||
## 性能考虑
|
||||
设备管理界面在处理大量设备时可能会遇到性能瓶颈。建议在初始化导航视图时,采用异步加载的方式,避免阻塞UI线程。此外,对于频繁更新的实时状态数据,可以采用定时器机制,定期刷新视图,而不是实时更新,以减少CPU和内存的消耗。
|
||||
|
||||
## 故障排除指南
|
||||
当设备管理界面无法正常显示设备信息时,首先检查设备连接状态和串口配置。如果设备在线但无法通信,可以尝试重启设备或重新插拔串口线。如果问题仍然存在,可以使用`OnGetAnlyseInfo`功能获取诊断信息,分析日志文件以定位问题。
|
||||
|
||||
**章节来源**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L600-L640)
|
||||
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L609-L639)
|
||||
|
||||
## 结论
|
||||
设备管理界面通过`devmngframe`框架与多个视图协同工作,为用户提供了一个功能丰富的设备管理环境。其MVC架构设计使得界面逻辑与业务逻辑分离,便于维护和扩展。开发者可以通过扩展`CDevOperator`类来添加新的诊断功能或集成新型硬件协议,满足不断变化的需求。
|
||||
@@ -0,0 +1,264 @@
|
||||
# 设备连接与发现
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp)
|
||||
- [DialFindComShow.cpp](file://cpp/Views/DialFindComShow.cpp)
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp)
|
||||
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h)
|
||||
- [DevManager.h](file://h/DevManager.h)
|
||||
- [DetcGD10Dev.h](file://h/DetcGD10Dev.h)
|
||||
- [SComPort.h](file://h/SComPort.h)
|
||||
- [DevOperator.h](file://h/DevOperator.h)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
本文档深入文档化GeomativeStudio软件中设备连接与发现功能的实现机制。重点描述了串口扫描、设备识别协议(GD10)和通信建立流程。详细解释了CDevMngFrame中OnRefreshNavDevice消息处理如何触发设备列表更新,以及DialFindComShow对话框在串口配置中的作用。提供了用户操作指南,涵盖手动/自动设备发现、串口参数设置与连接测试。为开发者说明了如何扩展支持新型设备型号、修改设备识别逻辑或集成网络设备发现协议(如UDP广播)。结合DevManager的设备枚举接口,阐述了底层通信层与UI层的数据同步机制。
|
||||
|
||||
## 项目结构
|
||||
GeomativeStudio项目是一个用于地质勘探设备管理的桌面应用程序。项目结构清晰,主要分为以下几个部分:
|
||||
- **CACHE**: 缓存文件目录
|
||||
- **DB**: 数据库相关文件
|
||||
- **Install**: 安装包和部署文件
|
||||
- **LOG**: 日志文件目录
|
||||
- **Release**: 发布版本文件
|
||||
- **cpp**: C++源代码目录,包含主要的业务逻辑
|
||||
- **h**: C++头文件目录
|
||||
- **res**: 资源文件目录
|
||||
- **tools**: 工具脚本
|
||||
|
||||
核心的设备连接与发现功能主要实现在`cpp/Managers`、`cpp/Operator`和`cpp/Tools`目录下的源文件中。
|
||||
|
||||
## 核心组件
|
||||
|
||||
设备连接与发现功能的核心组件包括:
|
||||
- **CDevManager**: 设备管理器,负责设备的增删改查和状态管理
|
||||
- **CDetcGD10Dev**: GD10设备检测器,负责通过USB接口发现和连接GD10设备
|
||||
- **CSComPort**: 串口通信类,提供底层串口读写功能
|
||||
- **CDevMngFrame**: 设备管理框架窗口,处理UI与设备管理的交互
|
||||
- **CDevOperator**: 设备操作员,协调UI和设备管理器之间的操作
|
||||
|
||||
这些组件共同协作,实现了从设备发现、连接到参数配置的完整流程。
|
||||
|
||||
**本文档引用的文件**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp)
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp)
|
||||
- [DevManager.h](file://h/DevManager.h)
|
||||
- [DetcGD10Dev.h](file://h/DetcGD10Dev.h)
|
||||
- [SComPort.h](file://h/SComPort.h)
|
||||
- [DevOperator.h](file://h/DevOperator.h)
|
||||
|
||||
## 架构概述
|
||||
|
||||
设备连接与发现功能的架构可以分为三层:用户界面层、业务逻辑层和通信层。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "用户界面层"
|
||||
UI[CDevMngFrame]
|
||||
Dialog[DialFindComShow]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
Operator[CDevOperator]
|
||||
Manager[CDevManager]
|
||||
end
|
||||
subgraph "通信层"
|
||||
Detector[CDetcGD10Dev]
|
||||
ComPort[CSComPort]
|
||||
Protocol[CtrlProtocolDef]
|
||||
end
|
||||
UI --> Operator
|
||||
Operator --> Manager
|
||||
Manager --> Detector
|
||||
Detector --> ComPort
|
||||
ComPort --> Protocol
|
||||
```
|
||||
|
||||
**本文档引用的文件**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp)
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp)
|
||||
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### CDevMngFrame分析
|
||||
CDevMngFrame是设备管理的主框架窗口,负责处理用户界面与设备管理功能的交互。
|
||||
|
||||
#### 消息处理机制
|
||||
CDevMngFrame通过Windows消息机制与系统其他部分通信。关键的消息处理函数包括:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User as "用户"
|
||||
participant UI as "CDevMngFrame"
|
||||
participant Operator as "CDevOperator"
|
||||
participant Manager as "CDevManager"
|
||||
User->>UI : 点击"刷新设备"
|
||||
UI->>UI : 发送WM_REFRESH_NAV_DEVICE消息
|
||||
UI->>Operator : 调用InitialNavDevView()
|
||||
Operator->>Manager : 获取设备列表
|
||||
Manager-->>Operator : 返回设备列表
|
||||
Operator-->>UI : 更新设备树
|
||||
UI-->>User : 显示更新后的设备列表
|
||||
```
|
||||
|
||||
**本文档引用的文件**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp)
|
||||
- [DevOperator.h](file://h/DevOperator.h)
|
||||
|
||||
#### OnRefreshNavDevice消息处理
|
||||
当收到WM_REFRESH_NAV_DEVICE消息时,CDevMngFrame会触发设备列表的更新。这个过程是设备发现和状态同步的核心。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> CheckNull["检查m_pNavDevView和m_pDevOperator是否为空"]
|
||||
CheckNull --> |否| CallInitial["调用m_pDevOperator->InitialNavDevView()"]
|
||||
CallInitial --> UpdateTree["更新设备树视图"]
|
||||
UpdateTree --> End([结束])
|
||||
CheckNull --> |是| ShowError["显示错误消息"]
|
||||
ShowError --> End
|
||||
```
|
||||
|
||||
**本文档引用的文件**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L586-L596)
|
||||
|
||||
### CDetcGD10Dev分析
|
||||
CDetcGD10Dev类负责GD10设备的检测和连接,是设备发现功能的核心。
|
||||
|
||||
#### 设备检测流程
|
||||
CDetcGD10Dev通过枚举系统中的可移动驱动器来发现GD10设备。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> GetDrivers["获取所有逻辑驱动器"]
|
||||
GetDrivers --> LoopDrivers["遍历每个驱动器"]
|
||||
LoopDrivers --> IsRemovable["是否为可移动驱动器?"]
|
||||
IsRemovable --> |是| GetVolumeInfo["获取卷信息"]
|
||||
GetVolumeInfo --> CompareName["卷名是否为GD10/GD20?"]
|
||||
CompareName --> |是| FoundDevice["找到设备,返回驱动器路径"]
|
||||
CompareName --> |否| CheckSDFolder["检查是否存在\\SD\\equipment目录"]
|
||||
CheckSDFolder --> |存在| FoundDevice
|
||||
CheckSDFolder --> |不存在| NextDriver["下一个驱动器"]
|
||||
IsRemovable --> |否| NextDriver
|
||||
NextDriver --> LoopDrivers
|
||||
FoundDevice --> End([结束])
|
||||
LoopDrivers --> |所有驱动器检查完毕| End
|
||||
```
|
||||
|
||||
**本文档引用的文件**
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L100-L173)
|
||||
|
||||
### CSComPort分析
|
||||
CSComPort类提供了底层串口通信功能,是设备通信的基础。
|
||||
|
||||
#### 串口初始化流程
|
||||
CSComPort在打开串口时会进行一系列配置,确保通信的稳定性和可靠性。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> CheckHandle["检查串口句柄是否已打开"]
|
||||
CheckHandle --> |否| SetComName["设置串口名称"]
|
||||
SetComName --> CreateFile["创建串口文件句柄"]
|
||||
CreateFile --> |成功| SetupComm["设置通信缓冲区"]
|
||||
SetupComm --> GetCommState["获取当前通信状态"]
|
||||
GetCommState --> SetBaudRate["设置波特率为115200"]
|
||||
SetBaudRate --> SetDataBits["设置数据位为8"]
|
||||
SetDataBits --> SetParity["设置无奇偶校验"]
|
||||
SetParity --> SetStopBits["设置停止位为1"]
|
||||
SetStopBits --> SetCommState["应用通信设置"]
|
||||
SetCommState --> SetCommMask["设置事件掩码"]
|
||||
SetCommMask --> End([结束])
|
||||
CreateFile --> |失败| ReturnFalse["返回FALSE"]
|
||||
ReturnFalse --> End
|
||||
```
|
||||
|
||||
**本文档引用的文件**
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L127-L196)
|
||||
|
||||
## 依赖分析
|
||||
|
||||
设备连接与发现功能的组件之间存在明确的依赖关系。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CDevMngFrame {
|
||||
+CDevOperator* m_pDevOperator
|
||||
+OnRefreshNavDevice()
|
||||
+PreNetResponse()
|
||||
}
|
||||
class CDevOperator {
|
||||
+CDevManager* m_pDevManager
|
||||
+InitialNavDevView()
|
||||
+ShowOLDeviceInfo()
|
||||
}
|
||||
class CDevManager {
|
||||
+CLinkList<CDevice*> m_devLinkList
|
||||
+InitialDevLinkList()
|
||||
+AddDevice()
|
||||
+DeleteDevice()
|
||||
}
|
||||
class CDetcGD10Dev {
|
||||
+static CDetcGD10Dev* m_pDetcDev
|
||||
+DetectGD10Dev()
|
||||
+GetGD10DevAddr()
|
||||
}
|
||||
class CSComPort {
|
||||
+HANDLE m_hCom
|
||||
+OpenComm()
|
||||
+SendDataDirectly()
|
||||
+ReceiveDataDirectly()
|
||||
}
|
||||
CDevMngFrame --> CDevOperator : "使用"
|
||||
CDevOperator --> CDevManager : "使用"
|
||||
CDevManager --> CDetcGD10Dev : "使用"
|
||||
CDetcGD10Dev --> CSComPort : "使用"
|
||||
```
|
||||
|
||||
**本文档引用的文件**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp)
|
||||
- [DevOperator.h](file://h/DevOperator.h)
|
||||
- [DevManager.h](file://h/DevManager.h)
|
||||
- [DetcGD10Dev.h](file://h/DetcGD10Dev.h)
|
||||
- [SComPort.h](file://h/SComPort.h)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
设备连接与发现功能在设计时考虑了以下性能因素:
|
||||
1. **异步通信**: 使用重叠I/O(Overlapped I/O)实现异步串口通信,避免阻塞UI线程
|
||||
2. **缓存机制**: CDevManager维护设备链表缓存,减少数据库访问频率
|
||||
3. **批量操作**: 设备列表更新采用批量处理,减少UI重绘次数
|
||||
4. **资源管理**: 及时释放串口句柄和内存资源,防止资源泄漏
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
| 问题现象 | 可能原因 | 解决方案 |
|
||||
|---------|--------|---------|
|
||||
| 无法发现GD10设备 | 设备未正确连接或驱动未安装 | 检查USB连接,安装正确的驱动程序 |
|
||||
| 串口通信失败 | 波特率或参数设置不匹配 | 确认设备和软件的串口参数一致 |
|
||||
| 设备列表不更新 | 消息处理异常 | 重启软件或检查日志文件 |
|
||||
| 连接超时 | 设备响应慢或网络问题 | 延长超时时间或检查设备状态 |
|
||||
|
||||
**本文档引用的文件**
|
||||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp)
|
||||
|
||||
## 结论
|
||||
GeomativeStudio的设备连接与发现功能通过分层架构实现了稳定可靠的设备管理。从底层的串口通信到上层的UI交互,各组件职责明确,协作良好。系统支持自动和手动设备发现,提供了完整的设备生命周期管理功能。通过理解本文档描述的实现机制,用户可以更好地使用该功能,开发者也可以在此基础上进行功能扩展和优化。
|
||||
Reference in New Issue
Block a user