a
This commit is contained in:
@@ -0,0 +1,165 @@
|
||||
# 设备状态管理
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [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)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
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<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**
|
||||
- [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)
|
||||
Reference in New Issue
Block a user