155 lines
4.6 KiB
C
Raw Normal View History

2026-03-28 10:49:55 +08:00
#ifndef ROBOTPROTOCOL_H
#define ROBOTPROTOCOL_H
#include <functional>
#include <vector>
#include "IYModbusTCPServer.h"
#include "ProtocolCommon.h"
/**
* @brief 机械臂ModbusTCP协议封装类
* 提供机械臂坐标配置、状态检测、工作信号处理等功能
*/
class RobotProtocol
{
public:
/**
* @brief 机械臂状态枚举(使用公共状态定义)
*/
using RobotStatus = ConnectionStatus;
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);
/**
* @brief 获取当前检测状态
* @return 当前状态
*/
RobotStatus GetDetectionStatus() const;
/**
* @brief 设置连接状态回调
* @param callback 回调函数
*/
void SetConnectionCallback(const ConnectionCallback& callback);
/**
* @brief 设置工作信号回调
* @param callback 回调函数
*/
void SetWorkSignalCallback(const WorkSignalCallback& callback);
/**
* @brief 设置系统控制回调
* @param callback 回调函数,参数为控制命令(0-停止,1-开始,2-复位)
*/
void SetSystemControlCallback(const std::function<void(uint16_t)>& callback);
2026-08-12 18:03:28 +08:00
void SetReconnectCameraCallback(const std::function<void()>& callback);
2026-03-28 10:49:55 +08:00
/**
* @brief 获取服务运行状态
* @return true-运行中,false-已停止
*/
bool IsRunning() const;
/**
* @brief 设置工作状态
* @param status 工作状态:0-空闲,1-相机1工作完成,2-相机2工作完成,3-忙碌
* @return 0-成功,其他-错误码
*/
int SetWorkStatus(uint16_t status);
/**
* @brief 清空检测结果数据
* @return 0-成功,其他-错误码
*/
int ClearDetectionData();
// 使用公共工作状态定义
static const uint16_t WORK_STATUS_IDLE = ::WORK_STATUS_IDLE;
static const uint16_t WORK_STATUS_WORKING = ::WORK_STATUS_WORKING;
static const uint16_t WORK_STATUS_BUSY = ::WORK_STATUS_BUSY;
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; // 工作信号回调
std::function<void(uint16_t)> m_systemControlCallback; // 系统控制回调
2026-08-12 18:03:28 +08:00
std::function<void()> m_reconnectCameraCallback; // 相机重连回调
2026-03-28 10:49:55 +08:00
// Modbus地址映射
static const uint16_t STATUS_ADDR = 0; // 工作信号线圈地址 (所有相机)
static const uint16_t DETECT_RESULT_ADDR = 1; // 状态地址
static const uint16_t RESULT_OFFSET_ADDR = 16; // 状态地址
2026-08-12 18:03:28 +08:00
static const uint16_t RECONNECT_CMD_ADDR = 81; // 相机重连命令地址(40082)
2026-03-28 10:49:55 +08:00
};
#endif // ROBOTPROTOCOL_H