12 KiB
状态与流程控制
**本文档引用文件** - [HandleProcessor.cpp](file://cpp/Tools/HandleProcessor.cpp) - [HandleProcessor.h](file://h/HandleProcessor.h) - [StateProcessor.cpp](file://cpp/Tools/StateProcessor.cpp) - [StateProcessor.h](file://h/StateProcessor.h) - [TransferCtrl.cpp](file://cpp/Tools/TransferCtrl.cpp) - [TransferCtrl.h](file://h/TransferCtrl.h) - [Constant.h](file://h/Constant.h) - [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h) - [DevManager.h](file://h/DevManager.h)目录
引言
本文档系统化阐述GeomativeStudio项目中HandleProcessor、StateProcessor和TransferCtrl三个核心组件在设备交互中的协同工作机制。这些组件共同构成了系统状态管理、流程控制和数据传输的核心架构,确保了设备连接、就绪、测量、离线等状态的可靠转换,以及底层通信事件向UI层和业务逻辑层的高效分发。
核心组件协同工作机制
HandleProcessor、StateProcessor和TransferCtrl三个组件在系统中扮演着不同的角色,通过紧密协作实现设备交互的完整控制流程。HandleProcessor负责句柄的生成与解析,将设备ID和类型信息编码到32位DWORD中,实现了高效的对象标识管理。StateProcessor则专注于状态表示的转换,将内部状态值与UI显示状态进行映射。TransferCtrl作为通信控制核心,继承自CTcpClient,负责与设备建立TCP连接,发送控制指令并接收响应数据。
这三个组件的协同工作始于设备连接:当设备上线时,TransferCtrl接收设备上线通知,通过DevManager获取设备信息,使用HandleProcessor生成设备句柄,然后通过StateProcessor将设备状态转换为UI可识别的形式进行显示。在测量过程中,TransferCtrl发送测量指令,HandleProcessor处理任务相关的句柄信息,StateProcessor管理测量状态的转换。这种分工明确的架构设计确保了系统各层之间的松耦合和高内聚。
Section sources
状态机设计模式
系统采用基于枚举和条件判断的状态机设计模式,管理设备从连接、就绪、测量到离线的完整生命周期。状态转换主要通过TransferCtrl组件中的RecvCommRspMsg方法实现,该方法持续监听通信通道,根据接收到的不同命令字触发相应的状态转换。
设备状态主要包括:离线(PZ_STATE_OFFLINE)、在线(PZ_STATE_ONLINE)、就绪、测量中等。当设备首次连接时,系统接收到EN_RECV_DEVICE_ONLINE(0x71)命令,设备状态从离线转换为在线。随后通过EN_CTRL_SYN_DEV_PARAM(0x02)命令同步设备参数,完成初始化后进入就绪状态。当用户启动测量任务时,系统发送EN_CTRL_MEASURE_DATA(0x06)命令,设备状态转换为测量中。在测量过程中,系统持续接收实时测量数据,直到任务完成或用户手动停止。
状态转换的条件主要基于通信协议中的命令字和响应码。例如,当接收到EN_RECV_DEVICE_OFFLINE命令时,无论当前处于何种状态,都会转换为离线状态。这种基于事件驱动的状态机设计确保了状态转换的确定性和可靠性,避免了非法状态的出现。
stateDiagram-v2
[*] --> 离线
离线 --> 在线 : 接收到EN_RECV_DEVICE_ONLINE
在线 --> 就绪 : 完成设备参数同步
就绪 --> 测量中 : 发送EN_CTRL_MEASURE_DATA命令
测量中 --> 就绪 : 测量完成或用户停止
测量中 --> 离线 : 接收到EN_RECV_DEVICE_OFFLINE
就绪 --> 离线 : 接收到EN_RECV_DEVICE_OFFLINE
在线 --> 离线 : 接收到EN_RECV_DEVICE_OFFLINE
**Diagram sources **
消息分发机制
系统采用Windows消息机制和回调函数相结合的方式实现底层通信事件向UI层和业务逻辑层的分发。TransferCtrl组件作为消息的接收端,通过RecvCommRspMsg方法从通信通道接收原始数据包,解析协议头后根据命令字类型决定消息的分发路径。
对于控制类消息(EN_RECV_CTRL_CMD),系统通过Windows消息机制将其分发到注册的UI窗口。例如,设备上线/下线通知通过WM_MSG_NOTIFY_DEVICE_ON_OR_OFF消息发送到主窗口,触发设备列表的更新。对于实时测量数据(EN_REAL_TIME_TESTING_DATA),系统直接调用注册的回调函数,将数据传递给数据处理模块进行实时显示。
消息分发的关键在于NetWorkOper组件中的RegeditRealMsgCall和UnRegeditRealMsgCall方法,它们管理着实时消息接收者的注册表。当UI组件需要接收实时数据时,先注册自己的窗口句柄,当不再需要接收时则注销。这种发布-订阅模式确保了消息只发送给当前活跃的接收者,避免了资源浪费和潜在的内存泄漏。
flowchart TD
A[通信通道] --> B{RecvCommRspMsg}
B --> C[解析协议头]
C --> D{命令字类型}
D --> |EN_RECV_DEVICE_ONLINE| E[发送WM_MSG_NOTIFY_DEVICE_ON_OR_OFF]
D --> |EN_CTRL_MEASURE_DATA| F[调用实时数据回调函数]
D --> |EN_RECV_PLC_STATUS| G[更新PLC状态显示]
D --> |EN_REAL_TIME_TESTING_DATA| H[传递给数据处理模块]
E --> I[UI层更新设备列表]
F --> J[实时数据显示]
G --> K[状态面板更新]
H --> L[数据存储与分析]
**Diagram sources **
数据传输控制机制
TransferCtrl组件实现了完整的数据传输控制机制,包括流量控制、进度监控和错误恢复。流量控制通过序列号(m_iSeriNo)和确认机制实现,每个发送的数据包都有唯一的序列号,接收方必须返回相应的确认响应,确保数据的有序传输。
进度监控主要通过测量任务的状态跟踪实现。系统维护着当前测量点的序号,通过比较已接收数据点和总测量点数来计算进度百分比。在实时测量过程中,系统每接收一个数据包就更新进度显示,让用户了解任务的执行情况。
错误恢复机制是系统可靠性的关键。当通信超时或数据校验失败时,系统会根据错误类型采取不同的恢复策略。对于临时性错误如通信超时,系统会自动重试发送;对于数据校验失败,则会请求重传;对于严重的连接中断,则会尝试重新连接设备。这种分层的错误处理策略确保了系统在各种异常情况下的稳定运行。
sequenceDiagram
participant UI as UI层
participant Business as 业务逻辑层
participant TransferCtrl as TransferCtrl
participant Device as 设备
UI->>Business : 启动测量任务
Business->>TransferCtrl : 发送EN_CTRL_MEASURE_DATA
TransferCtrl->>Device : 发送测量指令
Device-->>TransferCtrl : 返回确认响应
TransferCtrl-->>Business : 通知测量开始
loop 数据接收
Device->>TransferCtrl : 发送测量数据
TransferCtrl->>TransferCtrl : CRC校验
alt 校验成功
TransferCtrl-->>Business : 分发测量数据
Business-->>UI : 更新进度显示
else 校验失败
TransferCtrl->>Device : 请求重传
end
end
Device->>TransferCtrl : 发送任务完成通知
TransferCtrl-->>Business : 通知测量完成
Business-->>UI : 显示完成状态
**Diagram sources **
测量任务全链路流程
从任务启动到数据接收完成的全链路流程展示了系统各组件的协同工作。流程始于用户在UI层选择测量任务并点击开始按钮,触发业务逻辑层的测量控制模块。
首先,系统检查设备连接状态,通过TransferCtrl的GetConnectStatus方法确认通信链路正常。然后,使用HandleProcessor生成任务相关的句柄信息,准备测量参数。接着,通过TransferCtrl发送EN_CTRL_SET_TASK_PARAM命令设置任务参数,等待设备确认。
设备确认后,系统发送EN_CTRL_MEASURE_DATA命令启动测量。在测量过程中,TransferCtrl持续接收实时数据包,通过RecvCommRspMsg方法解析数据,并使用StateProcessor将测量状态转换为UI可显示的形式。每接收一个有效数据包,系统就更新进度条并存储数据到数据库。
当设备发送任务完成通知或用户手动停止时,测量流程进入结束阶段。系统发送停止命令,等待设备确认,然后清理资源,更新任务状态为完成。在整个流程中,异常处理机制始终监控着各个环节,确保任何异常都能被及时捕获和处理。
flowchart TD
A[用户启动测量任务] --> B[检查设备连接状态]
B --> C{连接正常?}
C --> |是| D[生成任务句柄]
C --> |否| Z[显示连接错误]
D --> E[设置测量参数]
E --> F[发送EN_CTRL_SET_TASK_PARAM]
F --> G{设备确认?}
G --> |是| H[发送EN_CTRL_MEASURE_DATA]
G --> |否| Y[重试或报错]
H --> I[开始接收测量数据]
I --> J{数据有效?}
J --> |是| K[更新进度, 存储数据]
J --> |否| L[请求重传]
K --> M{任务完成?}
L --> M
M --> |是| N[发送停止命令]
M --> |否| I
N --> O[等待设备确认]
O --> P[清理资源]
P --> Q[更新任务状态]
Q --> R[显示完成结果]
**Diagram sources **
状态同步与异常恢复
状态同步和异常恢复是确保系统稳定运行的关键。状态同步主要通过定期的心跳包(EN_REQ_HEART_BEAT_PACKET)和状态查询实现。系统每隔一段时间发送心跳包,确认设备在线状态,同时通过EN_REQ_DOWNLOAD_DEV_INFO命令获取设备最新状态,确保本地状态与设备实际状态一致。
异常恢复策略分为多个层次:通信层异常通过TCP重连机制处理;数据层异常通过CRC校验和重传机制处理;应用层异常通过状态回滚和任务重启处理。例如,当检测到通信中断时,系统会自动尝试重新连接设备,连接成功后重新同步状态,必要时重启测量任务。
最佳实践指南建议:在关键操作前始终验证设备状态;对重要数据进行双重校验;设置合理的超时时间避免无限等待;记录详细的日志便于问题排查;提供用户友好的错误提示和恢复选项。这些实践确保了系统在各种异常情况下的可用性和可靠性。
Section sources
结论
HandleProcessor、StateProcessor和TransferCtrl三个组件通过精巧的设计和紧密的协作,构建了GeomativeStudio系统稳定可靠的设备交互基础。HandleProcessor的句柄管理机制实现了高效的对象标识,StateProcessor的状态转换功能确保了UI显示的准确性,而TransferCtrl的通信控制能力则保障了数据传输的可靠性。这三者共同构成了一个完整、健壮的状态与流程控制系统,为地质测量任务的顺利执行提供了坚实的技术支撑。