#ifndef ROBOTPROTOCOL_H #define ROBOTPROTOCOL_H #include #include #include "IYModbusTCPServer.h" /** * @brief 机械臂ModbusTCP协议封装类 * 提供机械臂坐标配置、状态检测、工作信号处理等功能 */ class RobotProtocol { public: /** * @brief 机械臂坐标结构体 */ struct RobotCoordinate { float x; // X坐标 float y; // Y坐标 float z; // Z坐标 float rx; // X轴旋转 float ry; // Y轴旋转 float rz; // Z轴旋转 }; /** * @brief 单个目标位置数据(简化版,只包含必要的x,y,z,rz) */ struct TargetPosition { float x; // X坐标 float y; // Y坐标 float z; // Z坐标 float rz; // Z轴旋转(yaw角) uint16_t cameraId; // 相机ID(从1开始编号) }; /** * @brief 多目标检测结果数据结构 */ struct MultiTargetData { uint16_t count; // 目标数量 uint16_t cameraId; // 当前检测的相机ID(从1开始编号) std::vector targets; // 目标位置列表 MultiTargetData() : count(0), cameraId(1) {} // 默认相机ID为1 }; /** * @brief 机械臂状态枚举 */ enum RobotStatus { STATUS_DISCONNECTED = 0, // 断开连接 STATUS_CONNECTED = 1, // 已连接 STATUS_IDLE = 2, // 空闲状态 STATUS_WORKING = 3, // 工作中 STATUS_ERROR = 4 // 错误状态 }; /** * @brief 连接状态回调函数类型 * @param connected true-连接,false-断开 */ using ConnectionCallback = std::function; /** * @brief 开始工作信号回调函数类型 * @param startWork true-开始工作,false-停止工作 * @param cameraId 相机ID,从1开始编号(1,2,...) */ using WorkSignalCallback = std::function; public: RobotProtocol(); ~RobotProtocol(); /** * @brief 初始化ModbusTCP服务 * @param port TCP端口号,默认502 * @return 0-成功,其他-错误码 */ int Initialize(uint16_t port = 502); /** * @brief 反初始化,停止服务 */ void Deinitialize(); /** * @brief 设置多目标检测结果数据 * @param multiTargetData 多目标数据结构 * @param cameraId 相机ID(从1开始编号) * @return 0-成功,其他-错误码 */ int SetMultiTargetData(const MultiTargetData& multiTargetData, uint16_t cameraId); /** * @brief 获取当前检测状态 * @return 当前状态 */ RobotStatus GetDetectionStatus() const; /** * @brief 设置连接状态回调 * @param callback 回调函数 */ void SetConnectionCallback(const ConnectionCallback& callback); /** * @brief 设置工作信号回调 * @param callback 回调函数 */ void SetWorkSignalCallback(const WorkSignalCallback& callback); /** * @brief 获取服务运行状态 * @return true-运行中,false-已停止 */ bool IsRunning() const; /** * @brief 设置工作状态 * @param status 工作状态:0-空闲,1-相机1工作完成,2-相机2工作完成,3-忙碌 * @return 0-成功,其他-错误码 */ int SetWorkStatus(uint16_t status); // 工作状态定义(公共常量) static const uint16_t WORK_STATUS_IDLE = 0; // 空闲 static const uint16_t WORK_STATUS_CAMERA1_DONE = 1; // 相机1工作完成 static const uint16_t WORK_STATUS_CAMERA2_DONE = 2; // 相机2工作完成 static const uint16_t WORK_STATUS_BUSY = 3; // 忙碌 private: /** * @brief 停止ModbusTCP服务器 */ void StopModbusTCPServer(); /** * @brief 处理ModbusTCP连接状态变化 * @param connected true-连接,false-断开 */ void OnModbusTCPConnectionChanged(bool connected); /** * @brief 处理线圈写入请求(工作信号) * @param unitId 单元ID * @param startAddress 起始地址 * @param quantity 数量 * @param values 值数组 * @return 错误码 */ IYModbusTCPServer::ErrorCode OnWriteCoils(uint8_t unitId, uint16_t startAddress, uint16_t quantity, const uint8_t* values); /** * @brief 处理保持寄存器写入请求 * @param unitId 单元ID * @param startAddress 起始地址 * @param quantity 数量 * @param values 值数组 * @return 错误码 */ IYModbusTCPServer::ErrorCode OnWriteRegisters(uint8_t unitId, uint16_t startAddress, uint16_t quantity, const uint16_t* values); private: // ModbusTCP相关 IYModbusTCPServer* m_pModbusServer; // ModbusTCP服务器实例 bool m_bServerRunning; // 服务器运行状态 uint16_t m_nPort; // TCP端口 // 机械臂数据 RobotStatus m_robotStatus; // 机械臂状态 // 回调函数 ConnectionCallback m_connectionCallback; // 连接状态回调 WorkSignalCallback m_workSignalCallback; // 工作信号回调 // Modbus地址映射 static const uint16_t WORK_SIGNAL_ADDR = 0; // 工作信号线圈地址 (所有相机) static const uint16_t STATUS_ADDR = 1; // 状态地址 static const uint16_t COORD_ONE_START_ADDR = 4; // 相机一的检测开始地址 static const uint16_t COORD_TWO_START_ADDR = 46; // 相机二的检测开始地址 }; #endif // ROBOTPROTOCOL_H