injectorCTL/protocol.h
CSSC-WORK\murmur 37f4581ebb init version
2024-12-10 20:01:16 +08:00

147 lines
5.5 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 PROTOCOL_H
#define PROTOCOL_H
#include <stdint.h>
// 帧头帧尾定义
#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