# 设备状态管理 **本文档引用的文件** - [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) - [StateProcessor.cpp](file://cpp/Tools/StateProcessor.cpp) - [StateProcessor.h](file://h/StateProcessor.h) - [DialDevStatusTimerShow.cpp](file://cpp/Views/DialDevStatusTimerShow.cpp) - [DialDevStatusTimerShow.h](file://h/DialDevStatusTimerShow.h) - [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h) - [Constant.h](file://h/Constant.h) ## 目录 1. [系统概述](#系统概述) 2. [CDevManager状态监控机制](#cdevmanager状态监控机制) 3. [CDevice状态字段设计与更新逻辑](#cdevice状态字段设计与更新逻辑) 4. [状态处理器(StateProcessor)作用](#状态处理器stateprocessor作用) 5. [DialDevStatusTimerShow状态可视化](#dialdevstatustimershows状态可视化) 6. [状态同步异常诊断与恢复](#状态同步异常诊断与恢复) ## 系统概述 GeomativeStudio系统通过CDevManager、CDevice、StateProcessor等核心组件实现对设备运行状态的全面监控与管理。系统采用定时轮询和事件驱动相结合的机制,实时监控设备的在线、离线、忙、空闲等状态。CDevManager作为设备管理的核心类,负责设备的生命周期管理和状态维护;CDevice类封装了单个设备的状态信息和行为;StateProcessor负责状态与UI显示之间的转换;DialDevStatusTimerShow对话框则提供了状态的可视化展示界面。整个系统通过心跳包、状态码解析和回调通知等机制,确保设备状态的准确同步和及时更新。 ## CDevManager状态监控机制 CDevManager类通过定时轮询和事件驱动两种机制监控设备状态。在初始化时,通过InitialDevLinkList方法从数据库加载所有设备并设置初始状态为离线(PZ_STATE_OFFLINE)。系统通过GetOLDevList和GetFLDevList方法分别获取在线和离线设备列表,其中在线设备包括状态为PZ_STATE_ONLINE和PZ_STATE_NEW的设备。当设备连接或断开时,通过事件驱动机制更新设备状态:当设备上线时,调用AddRemoteDevice将设备信息加入远程设备集合,并更新设备状态为在线;当设备下线时,调用DeleteRemoteDevice从集合中移除设备,并将状态更新为离线。CDevManager还通过UpdateDevInfo方法接收设备同步参数,更新设备的硬件版本、软件版本、电池电压等信息,并持久化到数据库中。 **Section sources** - [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L160-L201) - [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L485-L591) - [DevManager.h](file://h/DevManager.h#L16-L66) ## CDevice状态字段设计与更新逻辑 CDevice类中的状态字段m_uState是设备状态管理的核心,其设计基于Constant.h中定义的状态常量。设备状态包括PZ_STATE_OFFLINE(离线)、PZ_STATE_ONLINE(在线)和PZ_STATE_NEW(新设备)等。在构造函数中,设备初始状态被设置为PZ_STATE_OFFLINE。状态更新主要通过SetState方法实现,该方法被多个组件调用以反映设备的当前状态。例如,当设备成功连接时,ExecOperator等组件会将状态更新为PZ_STATE_ONLINE;当设备断开连接时,状态被重置为PZ_STATE_OFFLINE。对于新注册的设备,状态被设置为PZ_STATE_NEW,表示设备已注册但尚未建立连接。状态变化时,系统会触发相应的回调通知,更新UI显示和数据库记录。 ```mermaid 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_szMDate +CString m_szHWV +CString m_szSWV +CString m_szMBatch +CString m_szMacAddress +CSComPort m_sComPort +_ConnectionPtr m_pConnection +FILE* m_pLogFile +SetState(UINT uState) +SetID(DWORD dwID) +PrintLog(CString& strLog) } class CDevManager { +CLinkList m_devLinkList +_ConnectionPtr m_pConnection +std : : set m_setRemoteDev +CHandleProcessor m_handleProcessor +GetDeviceByID(DWORD dwDevID) +GetDevice(DWORD dwHandle) +GetDevice(CString szDevSN) +InitialDevLinkList() +AddDevice(CDevice* const pDev) +DeleteObjInMem(DWORD dwHandle) +DeleteObjInMem(CString szDevSN) +AddObjInMem(CString szDevSN) +AddOfflineObjInMem(CString szDevSN) +DeleteDevice(DWORD dwHandle) +GetOLDevList(CPtrArray* pOLDevList) +GetFLDevList(CPtrArray* pFLDevList) +UpdateDevInfo(STSynDevParam stDevParam, BYTE bRemoteDeveTyp) +SetDeviceHandle(CDevice* const pDev) +GetRegisterDevice(CString szDevSN, bool& bIsRegister) +DeleteDevice(CString strDev) +AddRemoteDevice(STSigRemoteDev stDevice) +DeleteRemoteDevice(STSigRemoteDev stDevice) +GetRemoteDeviceInfo() } CDevManager --> CDevice : "管理" CDevice --> CDevManager : "状态更新" ``` **Diagram sources** - [Device.h](file://h/Device.h#L33-L127) - [DevManager.h](file://h/DevManager.h#L16-L66) **Section sources** - [Device.cpp](file://cpp/ProblemZone/Device.cpp#L43-L73) - [Device.h](file://h/Device.h#L88-L105) - [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L191-L192) ## 状态处理器(StateProcessor)作用 StateProcessor类在设备状态管理和UI显示之间起着桥梁作用。其主要功能是实现设备状态与UI图像状态之间的相互转换。通过ChangeToImageState方法,将设备的内部状态值(如PZ_STATE_ONLINE、PZ_STATE_OFFLINE)转换为TreeView控件使用的图像状态掩码,从而在UI上显示对应的状态图标。反之,通过ChangeToItemState方法,将UI的图像状态转换回内部状态值,便于程序逻辑处理。这种转换机制使得UI显示与业务逻辑分离,提高了代码的可维护性和可扩展性。StateProcessor的实现简单高效,仅包含两个核心方法,避免了复杂的依赖关系。 ```mermaid flowchart TD A["设备状态更新 (PZ_STATE_ONLINE)"] --> B["StateProcessor::ChangeToImageState()"] B --> C["生成图像状态掩码"] C --> D["TreeView控件显示在线图标"] D --> E["用户看到设备在线"] F["用户选择设备项"] --> G["TreeView获取图像状态"] G --> H["StateProcessor::ChangeToItemState()"] H --> I["转换为内部状态值"] I --> J["程序逻辑处理"] ``` **Diagram sources** - [StateProcessor.cpp](file://cpp/Tools/StateProcessor.cpp#L19-L40) - [StateProcessor.h](file://h/StateProcessor.h#L12-L22) **Section sources** - [StateProcessor.cpp](file://cpp/Tools/StateProcessor.cpp#L19-L40) - [StateProcessor.h](file://h/StateProcessor.h#L14-L19) ## DialDevStatusTimerShow状态可视化 DialDevStatusTimerShow对话框实现了设备状态的可视化展示,特别是PLC设备的状态信息。该对话框继承自CDialog,包含一个CListCtrl控件(m_listData)用于显示状态数据。在OnInitDialog方法中,初始化列表控件的列标题,包括时间、电压、温度和开关状态等。ShowPlcStatusData方法从TaskDataOper组件查询PLC状态数据,并将数据填充到列表控件中。数据显示包括模拟量电压(Voltage1-4)、电池电压、温度和四个开关的开关状态(ON/OFF)。通过设置列表控件的扩展样式(如LVS_EX_FULLROWSELECT、LVS_EX_GRIDLINES),提升了用户体验。该对话框为用户提供了直观的设备状态历史视图,便于监控设备运行状况。 ```mermaid sequenceDiagram participant Dialog as "DialDevStatusTimerShow" participant DataOper as "TaskDataOper" participant DB as "数据库" Dialog->>Dialog : OnInitDialog() Dialog->>Dialog : 初始化列表控件列 Dialog->>Dialog : 设置扩展样式 Dialog->>DataOper : QueryPlcStatusData() DataOper->>DB : 查询PLC状态数据 DB-->>DataOper : 返回状态数据 DataOper-->>Dialog : 返回状态数据向量 loop 遍历每个状态数据 Dialog->>Dialog : 格式化时间字符串 Dialog->>Dialog : 插入列表项 loop 显示6个模拟量 Dialog->>Dialog : 格式化电压值 Dialog->>Dialog : 设置单元格文本 end loop 显示4个开关状态 Dialog->>Dialog : 转换开关值为ON/OFF Dialog->>Dialog : 设置单元格文本 end end ``` **Diagram sources** - [DialDevStatusTimerShow.cpp](file://cpp/Views/DialDevStatusTimerShow.cpp#L45-L144) - [DialDevStatusTimerShow.h](file://h/DialDevStatusTimerShow.h#L13-L44) **Section sources** - [DialDevStatusTimerShow.cpp](file://cpp/Views/DialDevStatusTimerShow.cpp#L45-L144) - [DialDevStatusTimerShow.h](file://h/DialDevStatusTimerShow.h#L13-L44) ## 状态同步异常诊断与恢复 系统针对状态同步异常、心跳丢失和状态不一致等问题提供了完善的诊断与恢复策略。当设备长时间未收到心跳包(EN_REQ_HEART_BEAT_PACKET)时,系统判定为心跳丢失,将设备状态从PZ_STATE_ONLINE更新为PZ_STATE_OFFLINE,并记录日志。对于状态不一致问题,系统通过定时轮询和事件驱动双重机制确保状态同步:定时轮询定期检查设备连接状态,而事件驱动机制在收到设备上线/下线通知(EN_RECV_NOTIFY_DEVICE_ONLINE/OFFLINE)时立即更新状态。诊断策略包括:检查网络连接、验证设备响应、比对数据库记录与内存状态。恢复策略包括:重新建立连接、强制状态同步、重启设备通信模块。系统还通过UpdateDevInfo方法确保设备参数的及时更新,避免因参数不一致导致的状态错误。 **Section sources** - [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h#L546-L547) - [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L592-L642) - [DevManager.h](file://h/DevManager.h#L43-L60)