12 KiB
设备交互工具
**本文档引用的文件** - [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp) - [GD10OperCmd.h](file://h/GD10OperCmd.h) - [NetWorkOper.cpp](file://cpp/Tools/NetWorkOper.cpp) - [NetWorkOper.h](file://h/NetWorkOper.h) - [OperPLC.cpp](file://cpp/Tools/OperPLC.cpp) - [OperPLC.h](file://h/OperPLC.h) - [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) - [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h) - [Constant.h](file://h/Constant.h) - [TcpClient.h](file://h/TcpClient.h) - [DetcGD10Dev.h](file://h/DetcGD10Dev.h)目录
引言
GeomativeStudio系统通过一系列工具组件实现与外部设备的交互,包括GD10主机、PLC控制器和网络设备。本文档系统化记录了这些工具组件的设计与实现,重点分析GD10设备通信指令集、网络设备发现与控制、PLC设备读写操作,以及设备状态管理、消息分发和数据传输控制机制。这些组件共同构成了系统与外部设备通信的核心基础设施。
GD10设备通信指令集
GD10OperCmd组件定义了与GD10设备交互的完整指令集,通过模拟微机操作来管理设备上的文件和配置。该组件采用单例模式,确保全局唯一实例。
指令集主要包括:
- 工程管理:
project_add和project_delete方法用于在GD10设备上创建和删除工程,通过操作localhost.xml和MAC地址对应的XML文件来维护工程目录映射。 - 测区管理:
testzone_add和testzone_delete方法用于管理测区,创建相应的目录并在project.xml中添加或删除测区记录。 - 脚本管理:
script_add和script_delete方法用于管理测量脚本,支持VES、ERI、ERT等不同类型,操作scripts.xml文件和脚本文件。 - 任务管理:
meas_delete方法用于删除测量任务,同时清理XML配置和相关数据文件。 - 参数配置:
set_param方法用于设置设备参数,解析以分号分隔的参数字符串,并更新equipment.xml文件中的相应节点。 - 设备注册管理:
unregister_user方法用于注销用户,删除对应的用户配置文件。
所有操作都包含详细的错误处理和日志记录,确保操作的可靠性和可追溯性。
Section sources
网络设备发现与远程控制
NetWorkOper组件实现了网络设备的发现、状态查询和远程控制功能。该组件基于TCP通信,通过CTransferCtrl进行底层数据传输。
主要功能包括:
- 连接管理:
StartConnect方法建立与服务器的TCP连接,StartWork方法启动数据处理线程。 - 设备发现:通过监听特定控制命令(如
EN_RECV_NOTIFY_DEVICE_ONLINE)来发现网络上的设备,并通过CDetcGD10Dev管理器注册设备。 - 状态查询:
TransferOper方法用于发送状态查询命令,支持同步和异步模式,通过回调函数通知结果。 - 远程控制:
SendCtrlMsgDirect方法用于发送控制命令,RecvMsgDirect方法用于接收响应。 - 实时数据处理:通过
RegeditRealMsgCall注册实时数据接收窗口,当接收到实时测量数据时,通过Windows消息机制通知注册的窗口。
该组件采用生产者-消费者模式,通过临界区保护共享数据,确保多线程环境下的数据一致性。
sequenceDiagram
participant Client as "客户端"
participant NetWorkOper as "NetWorkOper"
participant TransferCtrl as "TransferCtrl"
participant Server as "服务器"
Client->>NetWorkOper : StartConnect(IP, Port)
NetWorkOper->>TransferCtrl : ConnectToServer()
TransferCtrl->>Server : TCP连接
Server-->>TransferCtrl : 连接成功
TransferCtrl-->>NetWorkOper : 连接状态
NetWorkOper->>NetWorkOper : StartWork()
NetWorkOper->>NetWorkOper : ThreadFunction()
loop 消息循环
NetWorkOper->>TransferCtrl : RecvCtrlMsg()
alt 设备上线通知
TransferCtrl-->>NetWorkOper : EN_RECV_NOTIFY_DEVICE_ONLINE
NetWorkOper->>DevManager : AddRemoteDevice()
NetWorkOper->>MainFrm : WM_MSG_NOTIFY_DEVICE_ON_OR_OFF
else PLC状态
TransferCtrl-->>NetWorkOper : EN_RECV_PLC_STATUS
NetWorkOper->>TaskDataOper : InsertPlcStatusData()
else 实时测量数据
TransferCtrl-->>NetWorkOper : EN_REAL_TIME_TESTING_DATA
NetWorkOper->>RealWnd : WM_NET_RECV_REAL_TIME_DATA
else 控制命令
TransferCtrl-->>NetWorkOper : EN_RECV_CTRL_CMD
NetWorkOper->>DevNotify : 回调通知
end
alt 需要发送命令
NetWorkOper->>TransferCtrl : SendCtrlInfo()
TransferCtrl->>Server : 发送控制命令
TransferCtrl->>TransferCtrl : RecvRspMsg()
TransferCtrl-->>NetWorkOper : 响应数据
NetWorkOper->>NotifyFunc : 回调通知
end
end
Diagram sources
Section sources
PLC设备读写操作
OperPLC组件封装了对PLC设备的读写操作,提供了一个简洁的接口来控制PLC的电源状态。
主要功能包括:
- 命令生成:
GetPlcCmdInfo方法根据命令类型生成相应的PLC控制数据包,支持EN_PLC_POWER_ON和EN_PLC_POWER_OFF命令。 - 响应解析:
ParsePlcOperResInfo方法解析PLC返回的状态信息,验证数据长度并提取操作结果。 - 具体命令实现:
GetPowerOnCmd和GetPowerOffCmd方法构建具体的控制数据包,设置相应的控制位。
该组件通过STRemPlcDataInfo结构体定义PLC数据格式,确保与设备的通信协议一致。
classDiagram
class COperPLC {
+GetInstance() COperPLC*
+GetPlcCmdInfo(BYTE, char*, int&, int) void
+ParsePlcOperResInfo(char*, int) int
-GetPowerOnCmd(char*, int&) void
-GetPowerOffCmd(char*, int&) void
-m_pOperPlc COperPLC*
}
class STRemPlcDataInfo {
+ucPacketIndex BYTE
+ucCtrlK1 BYTE
+ucCtrlK2 BYTE
+ucCtrlK3 BYTE
+ucCtrlK4 BYTE
+ucCtrlK5 BYTE
+ucCtrlK6 BYTE
+ucResult BYTE
}
COperPLC --> STRemPlcDataInfo : "使用"
Diagram sources
Section sources
设备状态机与消息处理
HandleProcessor和StateProcessor组件在设备状态机管理、消息分发和事件处理中扮演关键角色。
HandleProcessor负责句柄的生成和解析,将ID和类型信息编码到32位DWORD中:
- 句柄生成:
GenerateHandle方法将27位ID和5位类型组合成一个唯一的句柄。 - 句柄解析:
AnalyseHandle、GetIDFromHandle和GetStyleFromHandle方法从句柄中提取ID和类型信息。
StateProcessor负责状态与图像索引之间的转换:
- 状态转换:
ChangeToImageState和ChangeToItemState方法在树控件的状态图像索引和内部状态值之间进行转换。
这些组件为系统提供了统一的标识和状态管理机制,简化了设备和对象的管理和显示。
classDiagram
class CHandleProcessor {
+GenerateHandle(DWORD, UINT) DWORD
+GenerateNewHandle(DWORD, UINT) DWORD
+AnalyseHandle(DWORD, DWORD&, UINT&) void
+GetIDFromHandle(DWORD) DWORD
+GetStyleFromHandle(DWORD) UINT
}
class CStateProcessor {
+ChangeToImageState(UINT) UINT
+ChangeToItemState(UINT) UINT
}
CHandleProcessor : HANDLE_OFFSET = 27
CStateProcessor : STATE_OFFSET = 12
Diagram sources
Section sources
数据传输控制
TransferCtrl组件负责数据传输过程的流量控制与状态监控,继承自CTcpClient,实现了协议特定的通信逻辑。
主要功能包括:
- 协议封装:
SendCtrlInfoToDev方法构建符合STCtrlProtoHeader格式的数据包,包含ID码、源/目的地址、命令码、序列号和CRC校验。 - 数据接收:
RecvCommRspMsg方法处理接收的数据,包括查找协议头、长度校验、CRC校验和命令类型识别。 - 状态管理:维护当前命令、设备类型、序列号等状态信息,用于响应匹配和错误检测。
- 错误处理:实现超时、数据错序、CRC错误等多种错误处理机制。
该组件通过RecvEnoughMsg确保完整接收数据包,并通过IsCtrlMsg和IsPlcStatusMsg识别特殊类型的控制消息。
flowchart TD
A[开始发送] --> B[构建STCtrlProtoHeader]
B --> C[计算总长度]
C --> D[复制数据内容]
D --> E[计算CRC校验]
E --> F[发送数据]
F --> G{发送成功?}
G --> |是| H[更新状态信息]
G --> |否| I[记录错误日志]
H --> J[结束]
I --> J
K[开始接收] --> L[接收协议头]
L --> M{找到ID码?}
M --> |否| N[跳过字节]
N --> O{超过最大跳过字节?}
O --> |是| P[返回错误]
O --> |否| L
M --> |是| Q[校验长度]
Q --> R{长度有效?}
R --> |否| P
R --> |是| S[接收剩余数据]
S --> T[校验CRC]
T --> U{CRC正确?}
U --> |否| P
U --> |是| V[解析命令类型]
V --> W[返回结果]
Diagram sources
Section sources
典型交互流程
设备连接初始化
- 调用
NetWorkOper::StartConnect建立TCP连接 - 调用
NetWorkOper::StartWork启动消息处理线程 - 系统自动发现在线设备并更新设备列表
参数配置
- 调用
GD10OperCmd::set_param设置参数 - 构造参数字符串(如
"gain,2;range,1") - 方法解析参数并更新
equipment.xml
实时监控
- 调用
NetWorkOper::RegeditRealMsgCall注册实时数据窗口 - 当接收到实时测量数据时,系统发送
WM_NET_RECV_REAL_TIME_DATA消息 - 注册窗口处理消息并更新显示
最佳实践
超时处理
- 所有网络操作都应设置合理的超时时间
- 使用
STRespDataInfo中的iTimeout字段配置超时 - 超时后应进行重试或错误处理
指令重发
- 对于关键操作,实现自动重试机制
- 使用序列号跟踪命令,避免重复执行
- 在
TransferCtrl中维护命令状态,确保可靠性
状态同步
- 通过
NetWorkOper的设备上线/下线通知保持状态同步 - 使用
HandleProcessor确保对象标识的一致性 - 定期查询设备状态,验证同步状态
结论
GeomativeStudio的设备交互工具组件提供了一个完整、可靠的外部设备通信框架。通过GD10OperCmd、NetWorkOper、OperPLC等组件的协同工作,系统能够有效地管理GD10设备、网络设备和PLC控制器。HandleProcessor和StateProcessor提供了统一的状态和标识管理,而TransferCtrl确保了数据传输的可靠性和效率。这些组件的设计体现了良好的分层架构和关注点分离原则,为系统的稳定运行提供了坚实的基础。