injectorCTL/protocol.h
CSSC-WORK\murmur a71606de2e update function
2024-12-11 10:32:35 +08:00

297 lines
11 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 // 系统初始化
// 命令帧错误码定义
typedef enum {
CMD_FRAME_OK = 0,
CMD_FRAME_HEADER_ERROR = -1,
CMD_FRAME_TAIL_ERROR = -2,
CMD_FRAME_CHECK_ERROR = -3,
CMD_FRAME_CMD_ERROR = -4,
} CmdFrameError_t;
// 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 union {
struct {
uint16_t position_error:1; // 位0: 位置误差超限
uint16_t ccw_limit:1; // 位1: CCW方向禁止限位
uint16_t cw_limit:1; // 位2: CW方向禁止限位
uint16_t over_temp:1; // 位3: 驱动器过温
uint16_t voltage_error:1; // 位4: 驱动器内部电压错误
uint16_t over_voltage:1; // 位5: 驱动器过压
uint16_t under_voltage:1; // 位6: 驱动器欠压
uint16_t over_current:1; // 位7: 驱动器过流
uint16_t winding_switch:1; // 位8: 电机绕组开关
uint16_t encoder_error:1; // 位9: 电机编码器信号错误
uint16_t comm_error:1; // 位10: 通讯异常
uint16_t param_save_failed:1; // 位11: 参数保存失败
uint16_t motor_disabled:1; // 位12: 在电机未使能时命令其运转
uint16_t motor_overload:1; // 位13: 电机重载状态
uint16_t empty_q_program:1; // 位14: 调用的Q程序段为空
uint16_t memory_error:1; // 位15: 存储器错误
} bits;
uint16_t all; // 访问完整的16位寄存器
}AlarmCode_t;
// 用于输出具体的告警信息字符串
const uint8_t alarmInfo[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 union {
struct {
uint16_t enable:1; // 位0: 使能
uint16_t sample:1; // 位1: 采样中(软件示波器功能开启)
uint16_t fault:1; // 位2: 驱动器报故障
uint16_t position_reached:1; // 位3: 运动到位
uint16_t moving:1; // 位4: 运动中
uint16_t point_move:1; // 位5: 点动运行中
uint16_t decelerating:1; // 位6: 减速中
uint16_t wait_input:1; // 位7: 等待输入信号例如执行WI指令
uint16_t parameter_save:1; // 位8: 参数保存中
uint16_t alarm:1; // 位9: 驱动器报警告
uint16_t return_home:1; // 位10: 回原点中
uint16_t wait_time:1; // 位11: 等待时间例如执行WT、WD指令
uint16_t encoder_check:1; // 位12: 编码器检测中
uint16_t q_program_run:1; // 位13: Q程序运行中
uint16_t init:1; // 位14: 初始化(步进系),伺服准备好(伺服系)
} bits;
uint16_t all;
} 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 // 目标位置
#define RTU_PUMP_CMD_SC 0x4002 // 状态寄存器
#define RTU_PUMP_CMD_AL 0x4001 // 告警寄存器
// 错误码定义
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;
static uint8_t pumpName[2][10] = {
"Pump1",
"Pump2"
};
// 定义协议消息结构
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[];//柔性数组大小由data_cnt决定
// uint8_t crc[2];
} RTU_Frame;
// 函数声明
CmdFrameError_t ProcessHostCommand(uint8_t *rxBuf, uint16_t rxLen);
// uint16_t CalculateCRC16(uint8_t *data, uint16_t length);
void InitDeviceStatus();
void DecodePumpAlarmMsg(uint16_t reg4001);
void DecodePumpStatusMsg(uint16_t reg4002);
void UpdatePumpStatus();
#endif // PROTOCOL_H