GrabBag/App/BeltTearing/BeltTearingServer/RobotProtocolSimplified.h

145 lines
4.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef ROBOTPROTOCOLSIMPLIFIED_H
#define ROBOTPROTOCOLSIMPLIFIED_H
#include <functional>
#include "IYModbusTCPServer.h"
#include "ProtocolCommon.h"
/**
* @brief ModbusTCP简化协议封装类
* 提供简化的撕裂报警信息和复位功能
*
* 寄存器地址分配:
* - 40001 (地址0): 复位命令 (写入1执行复位)
* - 40002 (地址1): 撕裂报警标志 (0=无报警1=撕裂报警)
* - 40003 (地址2): 最大长度 (mm)
* - 40004 (地址3): 最大宽度 (mm)
* - 40005-40006 (地址4-5): 最大撕裂ID (UInt32)
*/
class RobotProtocolSimplified
{
public:
/**
* @brief 撕裂报警数据结构
*/
struct TearingAlarmData
{
uint16_t alarmFlag; // 报警标志 (0=无报警1=撕裂报警)
uint16_t maxLength; // 最大撕裂长度 (mm)
uint16_t maxWidth; // 最大撕裂宽度 (mm)
uint32_t maxId; // 最大撕裂对应的ID
TearingAlarmData()
: alarmFlag(0)
, maxLength(0)
, maxWidth(0)
, maxId(0)
{}
};
/**
* @brief 复位回调函数类型
* 当收到复位命令时触发
*/
using ResetCallback = std::function<void()>;
/**
* @brief 连接状态枚举(使用公共状态定义)
*/
using ConnectionStatus = ::ConnectionStatus;
public:
RobotProtocolSimplified();
~RobotProtocolSimplified();
/**
* @brief 初始化ModbusTCP服务
* @param port TCP端口号默认502
* @return 0-成功,其他-错误码
*/
int Initialize(uint16_t port = 502);
/**
* @brief 反初始化,停止服务
*/
void Deinitialize();
/**
* @brief 设置撕裂报警数据
* @param alarmData 报警数据结构
* @return 0-成功,其他-错误码
*/
int SetAlarmData(const TearingAlarmData& alarmData);
/**
* @brief 清空报警数据(执行复位)
* @return 0-成功,其他-错误码
*/
int ClearAlarmData();
/**
* @brief 设置复位回调函数
* @param callback 复位回调函数
*/
void SetResetCallback(const ResetCallback& callback);
/**
* @brief 设置连接状态回调
* @param callback 回调函数
*/
void SetConnectionCallback(const ConnectionCallback& 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 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端口
// 连接状态
ConnectionStatus m_connectionStatus; // 连接状态
// 回调函数
ConnectionCallback m_connectionCallback; // 连接状态回调
ResetCallback m_resetCallback; // 复位回调
// Modbus寄存器地址映射实际寄存器地址从0开始
static const uint16_t RESET_CMD_ADDR = 0; // 复位命令地址40001
static const uint16_t ALARM_FLAG_ADDR = 1; // 报警标志地址40002
static const uint16_t MAX_LENGTH_ADDR = 2; // 最大长度地址40003
static const uint16_t MAX_WIDTH_ADDR = 3; // 最大宽度地址40004
static const uint16_t MAX_ID_ADDR = 4; // 最大撕裂ID地址40005-40006占2个寄存器
static const uint16_t TOTAL_REGISTERS = 6; // 总寄存器数量
};
#endif // ROBOTPROTOCOLSIMPLIFIED_H