injectorCTL/protocol.h
2024-12-10 23:52:29 +08:00

268 lines
8.8 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 // 写多个寄存器
/*寄存器4001告警代码
报警代码用来表示驱动器当前的报警信息,用户可以通过查询报警代码寄存器了解具体的报警信息。报
警代码寄存器的每一位代表不同的报警信息当某一位被置1时表示驱动器正处于该位定义的报警状态
具体每一位的定义可参考下表:
0 位置误差超限
1 CCW方向禁止限位
2 CW方向禁止限位
3 驱动器过温
4 驱动器内部电压错误
5 驱动器过压
6 驱动器欠压
7 驱动器过流
8 电机绕组开关
9 电机编码器信号错误
10 通讯异常
11 参数保存失败
12 在电机未使能时命令其运转
13 电机重载状态
14 调用的Q程序段为空
15 存储器错误
*/
typedef enum {
ALARM_POSITION_ERROR = 0,
ALARM_CCW_LIMIT = 1,
ALARM_CW_LIMIT = 2,
ALARM_OVER_TEMP = 3,
ALARM_INTERNAL_VOLTAGE_ERROR = 4,
ALARM_OVER_VOLTAGE = 5,
ALARM_UNDER_VOLTAGE = 6,
ALARM_OVER_CURRENT = 7,
ALARM_MOTOR_WINDING_SWITCH = 8,
ALARM_MOTOR_ENCODER_ERROR = 9,
ALARM_COMMUNICATION_ERROR = 10,
ALARM_PARAMETER_SAVE_FAILED = 11,
ALARM_MOTOR_UNDER_LOAD = 13,
ALARM_EMPTY_Q_PROGRAM = 14,
ALARM_MEMORY_ERROR = 15,
} AlarmCode_t;
const uint8_t armInfo[16][32]={
"位置误差超限",
"CCW方向禁止限位",
"CW方向禁止限位",
"驱动器过温",
"驱动器内部电压错误",
"驱动器过压",
"驱动器欠压",
"驱动器过流",
"电机绕组开关",
"电机编码器信号错误",
"通讯异常",
"参数保存失败",
"在电机未使能时命令其运转",
"电机重载状态",
"调用的Q程序段为空",
"存储器错误",
};
/*
寄存器4002状态代码
状态代码用来表示驱动器当前的工作状态,用户可以通过查询状态寄存器了解具体的状态信息。状态代
码寄存器的每一位代表不同的状态信息当某一位被置1时表示驱动器正处于该位定义的状态具体每一
位的定义可参考下表。
位 说明
0 使能
1 采样中(软件示波器功能开启)
2 驱动器报故障
3 运动到位
4 运动中
5 点动运行中
6 减速中
7 等待输入信号例如执行WI指令
8 参数保存中
9 驱动器报警告
10 回原点中
11 等待时间例如执行WT、WD指令
12 内部使用
13 编码器检测中
14 Q程序运行中
15 初始化(步进系),伺服准备好(伺服系)
*/
typedef enum {
STATUS_ENABLE = 0,
STATUS_SAMPLE = 1,
STATUS_FAULT = 2,
STATUS_POSITION_REACHED = 3,
STATUS_MOVING = 4,
STATUS_POINT_MOVE = 5,
STATUS_DECELERATING = 6,
STATUS_WAIT_INPUT = 7,
STATUS_PARAMETER_SAVE = 8,
STATUS_ALARM = 9,
STATUS_RETURN_HOME = 10,
STATUS_WAIT_TIME = 11,
STATUS_ENCODER_CHECK = 13,
STATUS_Q_PROGRAM_RUN = 14,
STATUS_INIT = 15,
} StatusCode_t;
const uint8_t statusInfo[16][32]={
"使能",
"采样中(软件示波器功能开启)",
"驱动器报故障",
"运动到位",
"运动中",
"点动运行中",
"减速中",
"等待输入信号例如执行WI指令",
"参数保存中",
"驱动器报警告",
"回原点中",
"等待时间例如执行WT、WD指令",
"内部使用",
"编码器检测中",
"Q程序运行中",
"初始化(步进系),伺服准备好(伺服系)",
};
/* 设置加速度、减速度、速度和目标位置对应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