Files
geomative/GeomativeStudio/.qoder/repowiki/zh/content/核心功能/设备管理/设备管理.md
T
coco df489d5640 a
2026-07-03 16:05:30 +08:00

18 KiB
Raw Blame History

设备管理

**本文引用的文件** - [DevManager.cpp](file://cpp/Managers/DevManager.cpp) - [DevManager.h](file://h/DevManager.h) - [Device.cpp](file://cpp/ProblemZone/Device.cpp) - [Device.h](file://h/Device.h) - [HandleProcessor.cpp](file://cpp/Tools/HandleProcessor.cpp) - [HandleProcessor.h](file://h/HandleProcessor.h) - [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h) - [Constant.h](file://h/Constant.h) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp) - [SptManager.cpp](file://cpp/Managers/SptManager.cpp) - [devmngframe.cpp](file://cpp/Views/devmngframe.cpp) - [checkupdate.cpp](file://cpp/Tools/checkupdate.cpp)

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 组件详解
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件系统性文档化设备管理模块的实现细节,重点覆盖:

  • CDevManager 类如何管理设备生命周期(连接、状态监控、固件升级、删除)
  • 设备链表 m_devLinkList 的数据结构设计与句柄处理器 HandleProcessor 的集成机制
  • CDevice 类的数据模型与其与数据库的交互方式
  • 设备注册、状态变更与异常处理的实际调用路径
  • 与项目管理器、脚本管理器等模块的协作关系
  • 在线/离线模式下的行为差异
  • 设备通信协议、错误码处理与性能优化建议

项目结构

设备管理相关代码主要分布在以下目录与文件:

  • 管理层:DevManager(设备管理器)、ProManager(项目管理器)、SptManager(脚本管理器)
  • 业务层:Device(设备实体)
  • 工具层:HandleProcessor(句柄处理器)、CtrlProtocolDef(通信协议与错误码定义)
  • 视图层:devmngframe(设备管理界面框架),用于触发升级、参数修改等操作
  • 工具:checkupdate(固件升级工具)
graph TB
subgraph "管理层"
DM["CDevManager<br/>设备管理器"]
PM["CProManager<br/>项目管理器"]
SM["CSptManager<br/>脚本管理器"]
end
subgraph "业务层"
DEV["CDevice<br/>设备实体"]
end
subgraph "工具层"
HP["CHandleProcessor<br/>句柄处理器"]
CPD["CtrlProtocolDef<br/>通信协议/错误码"]
CT["Constant<br/>常量/状态/句柄位宽"]
end
subgraph "视图层"
DVF["CDevMngFrame<br/>设备管理界面"]
CU["Ccheckupdate<br/>固件升级工具"]
end
DM --> DEV
DM --> HP
DM --> CPD
DM --> CT
PM --> DM
SM --> DM
DVF --> DM
DVF --> DEV
DVF --> CU

图表来源

章节来源

核心组件

  • CDevManager:负责设备生命周期管理、设备链表维护、句柄分配、数据库交互、在线/离线设备列表构建、远程设备集合维护、设备信息更新等。
  • CDevice:封装设备数据模型(ID、状态、类型、序列号、硬件/软件版本、电池电压、参数等),并提供与数据库交互的方法(展示详情、读取/写入参数、文件收发、GR/AC信息等)。
  • CHandleProcessor:负责句柄生成与解析,将ID与类型打包进统一的DWORD句柄,支持从句柄中提取ID与类型。
  • CtrlProtocolDef:定义控制协议头、设备参数结构、命令字、错误码、远程设备信息等。
  • Constant:定义句柄位宽、状态枚举、消息常量、缓冲区大小、轮询超时等通用常量。

章节来源

架构总览

设备管理模块围绕“设备管理器-设备实体-句柄处理器-通信协议-视图/工具”的分层组织,形成清晰的职责边界与调用链路。

sequenceDiagram
participant UI as "视图/界面"
participant DM as "CDevManager"
participant DEV as "CDevice"
participant HP as "CHandleProcessor"
participant DB as "数据库"
participant NET as "网络/远程设备"
UI->>DM : 请求初始化设备链表
DM->>DB : 查询设备表(device)
DB-->>DM : 返回设备记录集
loop 遍历记录
DM->>DEV : 构造CDevice实例
DM->>HP : 生成句柄(设备ID, 类型)
DM->>DM : m_devLinkList.Add(句柄, 设备)
end
UI->>DM : 获取在线/离线设备列表
DM->>DM : 遍历m_devLinkList
DM-->>UI : 返回在线/离线设备数组
UI->>DM : 更新设备参数/信息
DM->>DB : 写入设备参数/信息
DB-->>DM : 提交成功
UI->>DM : 删除设备
DM->>DB : 删除设备及关联表记录
DB-->>DM : 提交成功
UI->>DM : 远程设备上下线通知
DM->>NET : 维护远程设备集合(set)
DM-->>UI : 同步状态

图表来源

组件详解

CDevManager:设备生命周期与链表管理

  • 初始化设备链表:从数据库读取设备记录,构造 CDevice 对象,生成句柄并加入 m_devLinkList。
  • 设备查询:按ID、句柄、序列号查询设备,并进行MAC白名单匹配。
  • 设备增删改:新增设备(含默认desetting/acds表初始化)、删除设备(级联清理)、设置句柄。
  • 在线/离线列表:遍历链表筛选在线/离线设备。
  • 远程设备集合:维护远程GD10/PLC设备集合,支持增删。
  • 设备信息更新:接收远程设备参数,写入数据库。
flowchart TD
Start(["初始化设备链表"]) --> QueryDB["查询设备表(device)"]
QueryDB --> Loop{"遍历记录"}
Loop --> |是| NewDev["构造CDevice实例"]
NewDev --> GenHandle["生成句柄(设备ID, 类型)"]
GenHandle --> AddList["m_devLinkList.Add(句柄, 设备)"]
AddList --> Loop
Loop --> |否| End(["完成"])
subgraph "查询与筛选"
Q1["按ID查询"] --> Q2["按句柄查询"]
Q3["按序列号查询"] --> Q4["在线/离线列表"]
end

图表来源

章节来源

CDevice:设备数据模型与数据库交互

  • 数据模型:包含设备ID、状态、类型、序列号、名称、型号、硬件/软件版本、生产日期、批次、MAC地址、数据库连接指针等。
  • 数据库交互:展示离线/在线详情、读取/写入desetting/acds参数、读取devgr/devac信息、执行脚本同步等。
  • 文件传输:支持接收/发送文件(Zmodem流程),带重试逻辑。
  • 参数与状态:提供参数修改、时间窗修改、锁机、重置等能力。
classDiagram
class CDevice {
+DWORD m_dwID
+UINT m_uState
+UINT m_uType
+BYTE m_ucDevType
+CString m_szDevSN
+CString m_szDevName
+CString m_szModelNO
+CString m_szHWV
+CString m_szSWV
+CString m_szMacAddress
+_ConnectionPtr m_pConnection
+PrintLog(strLog)
+ShowFLDetailInfo(list)
+ShowOLDetailInfo(list)
+ShowGRInfo(list)
+ShowACInfo(list)
+ReceiveFile(local, host, retry)
+SendFile(host, local, name)
}

图表来源

章节来源

句柄处理器 CHandleProcessorID与类型编码

  • 生成句柄:将设备ID与类型按固定位宽打包,类型高位存放,ID低位存放。
  • 解析句柄:从句柄中提取ID与类型。
  • 位宽定义:来自 Constant 中 HANDLE_OFFSET 常量,确保ID与类型的位域合理分配。
flowchart TD
A["输入: 设备ID, 类型"] --> B["类型左移HANDLE_OFFSET位"]
B --> C["ID按位或运算"]
C --> D["输出: 句柄DWORD"]
D --> E["解析: 取低27位ID, 取高5位类型"]

图表来源

章节来源

设备通信协议与错误码

  • 协议头与参数结构:STCtrlProtoHeader、STSynDevParam、STModifyDevParam 等,定义了控制命令、数据类型、状态码、设备参数等。
  • 命令字与状态:EN_CTRL_CMD_INFO 定义了登录、参数同步、参数设置、任务参数设置、测量数据、心跳等命令字;EN_RCV_MSG_RES/EN_ERROR_MSG 定义了接收结果与错误码。
  • 远程设备信息:STSigRemoteDev 定义远程GD10/PLC设备标识与比较规则。

章节来源

设备注册、状态变更与异常处理

  • 注册查询:GetRegisterDevice 会检查设备是否已在链表中存在,并与当前MAC白名单比对,避免跨网卡误判。
  • 状态变更:CDevice::SetState 设置设备状态;CDevManager::UpdateDevInfo 将远程设备参数写入数据库。
  • 异常处理:数据库事务 Begin/Commit/Rollback 包裹关键操作;捕获_com_error 并弹窗提示;全局钩子用于统一错误提示。

章节来源

与项目管理器、脚本管理器的协作

  • 项目管理器:通过句柄处理器解析工程/测试区句柄,构建数据管理结构(CProject/CTestingZone),并与设备建立关联(dptt表)。
  • 脚本管理器:在离线模式下创建脚本文件,与设备ID关联;在线模式下通过设备与脚本同步(脚本下发/接收)。

章节来源

在线/离线模式行为差异

  • 在线模式:设备状态可能为 EN_DEV_ONLINE 或 NEW;设备参数通过协议同步至数据库;支持实时数据接收与状态通知。
  • 离线模式:设备状态为 OFFLINE;通过数据库直接展示设备参数与历史数据;部分操作(如参数同步)受限。

章节来源

固件升级与参数修改

  • 固件升级:通过 CDevMngFrame 触发升级流程,使用 Ccheckupdate 下载/校验/执行升级,涉及文件发送、命令下发与结果校验。
  • 参数修改:通过 CDevice 接口修改参数,结合 CtrlProtocolDef 中的命令字与参数结构进行下发与确认。

章节来源

依赖关系分析

  • CDevManager 依赖 CDevice、CHandleProcessor、CtrlProtocolDef、Constant、数据库连接。
  • CDevice 依赖数据库连接、文件传输工具、对话框组件。
  • 视图层(CDevMngFrame)依赖设备管理器与升级工具。
  • 项目/脚本管理器通过句柄与设备管理器解耦协作。
graph LR
DM["CDevManager"] --> DEV["CDevice"]
DM --> HP["CHandleProcessor"]
DM --> CPD["CtrlProtocolDef"]
DM --> CT["Constant"]
DEV --> DB["数据库"]
DVF["CDevMngFrame"] --> DM
DVF --> CU["Ccheckupdate"]
PM["CProManager"] --> DM
SM["CSptManager"] --> DM

图表来源

章节来源

性能考量

  • 句柄位宽与哈希/索引:HANDLE_OFFSET 与类型位域设计保证了O(1)的句柄解析与查找效率,适合大规模设备场景。
  • 数据库事务:关键操作(新增/删除设备、参数更新)使用事务包裹,减少中间态风险,但需注意事务开销与锁竞争。
  • 文件传输重试:接收文件具备重试机制,提升稳定性,但应限制最大重试次数与退避策略,避免阻塞UI。
  • 轮询与超时:通信轮询次数与超时常量(MAX_POLLING_TIME、COMM_TIMEOUT)影响响应速度与资源占用,应根据实际通信环境调整。
  • 在线/离线列表构建:遍历链表筛选在线/离线设备为O(N),建议在频繁刷新场景引入增量更新与缓存。

故障排查指南

  • 设备注册失败:检查 GetRegisterDevice 中 MAC 白名单匹配逻辑,确认当前网卡MAC与设备记录一致。
  • 数据库异常:AddDevice/DeleteDevice/UpdateDevInfo 使用事务,捕获_com_error后回滚并弹窗提示,优先检查SQL语句与权限。
  • 文件传输失败:查看 ReceiveFile 的重试逻辑与 EndTransfer 终止流程,确认Zmodem握手与缓冲区大小。
  • 远程设备状态不同步:核对远程设备集合维护逻辑(AddRemoteDevice/DeleteRemoteDevice),确保上下线通知正确到达。

章节来源

结论

设备管理模块通过“设备管理器-设备实体-句柄处理器-通信协议-视图/工具”的分层设计,实现了设备生命周期的完整闭环管理。其数据结构与句柄编码保证了高效稳定的设备索引;数据库事务与错误处理提升了可靠性;与项目/脚本管理器的协作使设备与数据、脚本的联动更加顺畅。在线/离线模式的差异化行为满足多场景需求,配合通信协议与错误码体系,为后续扩展(如云端托管、远程诊断)提供了坚实基础。

附录