9.4 KiB
设备状态管理
**本文档引用的文件** - [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)目录
- 系统概述
- CDevManager状态监控机制
- CDevice状态字段设计与更新逻辑
- 状态处理器(StateProcessor)作用
- DialDevStatusTimerShow状态可视化
- 状态同步异常诊断与恢复
系统概述
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
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显示和数据库记录。
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<CDevice*> m_devLinkList
+_ConnectionPtr m_pConnection
+std : : set<STSigRemoteDev> 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
Section sources
状态处理器(StateProcessor)作用
StateProcessor类在设备状态管理和UI显示之间起着桥梁作用。其主要功能是实现设备状态与UI图像状态之间的相互转换。通过ChangeToImageState方法,将设备的内部状态值(如PZ_STATE_ONLINE、PZ_STATE_OFFLINE)转换为TreeView控件使用的图像状态掩码,从而在UI上显示对应的状态图标。反之,通过ChangeToItemState方法,将UI的图像状态转换回内部状态值,便于程序逻辑处理。这种转换机制使得UI显示与业务逻辑分离,提高了代码的可维护性和可扩展性。StateProcessor的实现简单高效,仅包含两个核心方法,避免了复杂的依赖关系。
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
Section sources
DialDevStatusTimerShow状态可视化
DialDevStatusTimerShow对话框实现了设备状态的可视化展示,特别是PLC设备的状态信息。该对话框继承自CDialog,包含一个CListCtrl控件(m_listData)用于显示状态数据。在OnInitDialog方法中,初始化列表控件的列标题,包括时间、电压、温度和开关状态等。ShowPlcStatusData方法从TaskDataOper组件查询PLC状态数据,并将数据填充到列表控件中。数据显示包括模拟量电压(Voltage1-4)、电池电压、温度和四个开关的开关状态(ON/OFF)。通过设置列表控件的扩展样式(如LVS_EX_FULLROWSELECT、LVS_EX_GRIDLINES),提升了用户体验。该对话框为用户提供了直观的设备状态历史视图,便于监控设备运行状况。
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
Section sources
状态同步异常诊断与恢复
系统针对状态同步异常、心跳丢失和状态不一致等问题提供了完善的诊断与恢复策略。当设备长时间未收到心跳包(EN_REQ_HEART_BEAT_PACKET)时,系统判定为心跳丢失,将设备状态从PZ_STATE_ONLINE更新为PZ_STATE_OFFLINE,并记录日志。对于状态不一致问题,系统通过定时轮询和事件驱动双重机制确保状态同步:定时轮询定期检查设备连接状态,而事件驱动机制在收到设备上线/下线通知(EN_RECV_NOTIFY_DEVICE_ONLINE/OFFLINE)时立即更新状态。诊断策略包括:检查网络连接、验证设备响应、比对数据库记录与内存状态。恢复策略包括:重新建立连接、强制状态同步、重启设备通信模块。系统还通过UpdateDevInfo方法确保设备参数的及时更新,避免因参数不一致导致的状态错误。
Section sources