#ifndef PROTOCOL_H #define PROTOCOL_H #include // 帧头帧尾定义 #define FRAME_HEADER 0xA55A5AA5 #define FRAME_TAIL 0x5AA5A55A // 功能码定义 #define CMD_STATUS_QUERY 0x0001 // 状态查询 #define CMD_VALVE_CTRL 0x0002 // 三通阀控制 #define CMD_PUMP_RUN_TIME 0x0003 // 泵运行时长控制 #define CMD_PUMP_RUN_SPEED 0x0004 // 泵运行速度设置 #define CMD_SOFT_STOP 0x0005 // 软急停功能 #define CMD_PUMP_RUN_STEP 0x0006 // 泵步进设置 #define CMD_SYSTEM_INIT 0x0007 // 系统初始化 // MOONS’驱动器支持的Modbus功能码如下: // 0x03:读取保持寄存器 // 0x06:写单个寄存器 // 0x10:写多个寄存器 #define RTU_PUMP_FUNC_READ_REG 0x03 // 读取保持寄存器 #define RTU_PUMP_FUNC_WRITE_REG 0x06 // 写单个寄存器 #define RTU_PUMP_FUNC_WRITE_MULTI_REG 0x10 // 写多个寄存器 /* 设置加速度、减速度、速度和目标位置,对应MOONS’ SCL指令如下: +----------+----------+----------+--------------+--------------+--------------+--------------------------------------------------+ | SCL指令 | 设定数值 | 单位 | 寄存器地址 | 十六进制格式 | 写入寄存器值 | 说明 | | | | | | 寄存器地址 | | | +----------+----------+----------+--------------+--------------+--------------+--------------------------------------------------+ | AC | 100 | Rps/sec | 40028 | 001B | 600 | 预设置加速度为100,需要对寄存器40028 | | | | | | | | 写入600(0x0258) | +----------+----------+----------+--------------+--------------+--------------+--------------------------------------------------+ | DE | 100 | Rps/sec | 40029 | 001C | 600 | 预设置减速度为100,需要对寄存器40029 | | | | | | | | 写入600(0x0258) | +----------+----------+----------+--------------+--------------+--------------+--------------------------------------------------+ | VE | 1 | Rps | 40030 | 001D | 240 | 预设置速度为1,需要对寄存器40030写入 | | | | | | | | 240(0x00F0) | +----------+----------+----------+--------------+--------------+--------------+--------------------------------------------------+ | DI | 200000 | Counts | 40031,40032 | 001E,001F | 200000 | 预设定目标位置为200000,需要对40031和40032寄存器 | | | | | | | | 写入200000(0x00030D40) | +----------+----------+----------+--------------+--------------+--------------+--------------------------------------------------+ */ #define RTU_PUMP_CMD_AC 0x001B // 加速度 #define RTU_PUMP_CMD_DE 0x001C // 减速度 #define RTU_PUMP_CMD_VE 0x001D // 速度 #define RTU_PUMP_CMD_DI 0x001E // 目标位置 // 错误码定义 typedef enum { ERR_NONE = 0x00, ERR_COMM = 0x01, ERR_CTRL = 0x02, // 其他错误码待定 } ErrorCode_t; // 设备状态相关定义 // 1. 下挂设备状态 typedef enum { DEVICE_OFFLINE = 0, DEVICE_ONLINE = 1 } DeviceStatus_t; // 2. 三通阀角度 typedef enum { VALVE_ANGLE_120 = 120, VALVE_ANGLE_210 = 210 } ValveAngle_t; // 3. 泵状态 typedef enum { PUMP_STOP = 0, PUMP_CLOCKWISE = 1, PUMP_ANTICLOCKWISE = 2 } PumpStatus_t; // 4. 泵速度范围 #define PUMP_SPEED_MIN 0 #define PUMP_SPEED_MAX 100 // 5. 气泡状态 typedef enum { BUBBLE_NONE = 0, BUBBLE_DETECTED = 1 } BubbleStatus_t; // 6. 急停按键状态 typedef enum { ESTOP_NORMAL = 0, ESTOP_PRESSED = 1 } EstopStatus_t; // 7. 初始化状态 typedef enum { INIT_IN_PROGRESS = 0, INIT_SUCCESS = 1, INIT_FAILED = 2 } InitStatus_t; // 三通阀结构体 typedef struct { uint8_t angle1; // 阀门1角度 (120/210) uint8_t angle2; // 阀门2角度 (120/210) } ValveStatus; // 泵结构体 typedef struct { uint8_t status1; // 泵1运行状态 (停止/顺时针/逆时针) uint8_t status2; // 泵2运行状态 (停止/顺时针/逆时针) uint8_t speed1; // 泵1速度百分比 (0-100) uint8_t speed2; // 泵2速度百分比 (0-100) } PumpStatus; // 设备状态结构体 typedef struct { uint8_t deviceStatus; // 下挂设备状态 ValveStatus valves; // 两个三通阀状态 PumpStatus pumps; // 两个泵状态 uint8_t bubbleStatus; // 气泡状态 uint8_t stopStatus; // 急停状态 uint8_t errorCode; // 错误码 uint8_t initStatus; // 初始化状态 } DeviceStatus; // 定义协议消息结构 typedef struct { uint8_t device_id; uint8_t func; uint8_t reg_addr[2]; uint8_t reg_cnt[2]; uint8_t data_cnt; uint8_t data[0];//柔性数组,大小由data_cnt决定 uint8_t crc[2]; } RTU_Frame; // 函数声明 uint8_t ProcessCommand(uint8_t *rxBuf, uint16_t rxLen, uint8_t *txBuf, uint16_t *txLen); uint16_t CalculateCRC16(uint8_t *data, uint16_t length); #endif // PROTOCOL_H