#ifndef ROBOTPROTOCOL_H #define ROBOTPROTOCOL_H #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 机械臂状态枚举 */ 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 cameraIndex 相机索引,-1表示所有相机,0/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 coordinate 坐标结构体 * @return 0-成功,其他-错误码 */ int SetRobotCoordinate(const RobotCoordinate& coordinate); /** * @brief 获取机械臂坐标配置 * @param coordinate 输出坐标结构体 * @return 0-成功,其他-错误码 */ int GetRobotCoordinate(RobotCoordinate& coordinate); /** * @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; 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); /** * @brief 处理读取保持寄存器请求 * @param unitId 单元ID * @param startAddress 起始地址 * @param quantity 数量 * @param values 输出值数组 * @return 错误码 */ IYModbusTCPServer::ErrorCode OnReadHoldingRegisters(uint8_t unitId, uint16_t startAddress, uint16_t quantity, uint16_t* values); private: // ModbusTCP相关 IYModbusTCPServer* m_pModbusServer; // ModbusTCP服务器实例 bool m_bServerRunning; // 服务器运行状态 uint16_t m_nPort; // TCP端口 // 机械臂数据 RobotCoordinate m_robotCoordinate; // 机械臂坐标 RobotStatus m_robotStatus; // 机械臂状态 // 回调函数 ConnectionCallback m_connectionCallback; // 连接状态回调 WorkSignalCallback m_workSignalCallback; // 工作信号回调 // Modbus地址映射 static const uint16_t COORD_X_ADDR = 0x0000; // X坐标地址 static const uint16_t COORD_Y_ADDR = 0x0002; // Y坐标地址 static const uint16_t COORD_Z_ADDR = 0x0004; // Z坐标地址 static const uint16_t COORD_RX_ADDR = 0x0006; // RX坐标地址 static const uint16_t COORD_RY_ADDR = 0x0008; // RY坐标地址 static const uint16_t COORD_RZ_ADDR = 0x000A; // RZ坐标地址 static const uint16_t STATUS_ADDR = 0x000C; // 状态地址 // 线圈地址定义 static const uint16_t WORK_SIGNAL_COIL = 0x0000; // 工作信号线圈地址 (所有相机) static const uint16_t CAMERA_1_COIL = 0x0001; // 相机1控制信号线圈地址 static const uint16_t CAMERA_2_COIL = 0x0002; // 相机2控制信号线圈地址 static const uint16_t CAMERA_SELECT_ADDR = 0x000D; // 相机选择寄存器地址 }; #endif // ROBOTPROTOCOL_H