361 lines
12 KiB
C
361 lines
12 KiB
C
/***
|
||
* @Author: shenghao.xu
|
||
* @Date: 2023-04-06 18:11:36
|
||
* @LastEditors: shenghao.xu
|
||
* @LastEditTime: 2023-04-06 18:12:03
|
||
* @Description:
|
||
* @email:545403892@qq.com
|
||
* @Copyright (c) 2023 by shenghao.xu, All Rights Reserved.
|
||
*/
|
||
|
||
#ifndef __AGREEEMENT_FRAME_H__
|
||
#define __AGREEEMENT_FRAME_H__
|
||
#include "../lib/inc/lib.h"
|
||
/**
|
||
* 帧头 帧长度 源地址 目标地址 报文类型 报文体 校验 帧尾
|
||
1 2 2 2 1 n 2 1
|
||
*/
|
||
|
||
#define FRAME_HEAD 0x05 // 帧头
|
||
#define FRAME_TAIL 0x1b // 帧尾
|
||
#define FRAME_LENGTH_WITHOUT_BODY (1 + 2 + 2 + 2 + 1 + 2 + 1) // 帧长度不包括报文体
|
||
// 以下协议相关参数定义
|
||
typedef enum
|
||
{
|
||
RUN_STATE_UNEXECUTED = 0x00, // 未执行
|
||
RUN_STATE_EXECUTING = 0x01, // 执行中
|
||
RUN_STATE_PREPARED = 0x02, // 准备完毕
|
||
RUN_STATE_FAILED = 0x03, // 执行失败
|
||
|
||
RUN_STATE_READY_RUN = 0x04, // 准备运行
|
||
} run_state_e;
|
||
|
||
typedef enum
|
||
{
|
||
SENSOR_PRESSURE = 0x01, // 压力传感器
|
||
SENSOR_FLOW = 0x02, // 流量传感器
|
||
SENSOR_TEMPERATURE = 0x03, // 温度传感器
|
||
SENSOR_LASER = 0x04, // 激光传感器
|
||
SENSOR_MINOR_LOOP = 0x05, // 小回路传感器
|
||
SENSOR_PROPORTIONAL_VALVE = 0x06, // 比例阀传感器
|
||
SENSOR_STEP_MOTOR = 0x07, // 步进电机传感器
|
||
SENSOR_MAX,
|
||
} sensor_e; // 传感器枚举
|
||
typedef enum
|
||
{
|
||
UNIT_TWO_WAY_VALVE = 0x10, // 两通阀
|
||
UNIT_THREE_WAY_VALVE = 0x11, // 三通阀
|
||
UNIT_PROPORTIONAL_VALVE = 0x12, // 比例阀
|
||
UNIT_IP_CONVERTER = 0x13, // IP转换器
|
||
} unit_e; // 组件枚举
|
||
|
||
typedef enum
|
||
{
|
||
ACTION_WAIT = 0x00, // 等待
|
||
ACTION_WORK = 0x01, // 工作
|
||
ACTION_VALVE = 0x10, // 操作阀门
|
||
ACTION_IP_CONVERTER = 0x20, // 操作IP转换器
|
||
} action_e; // 动作枚举
|
||
|
||
#pragma pack(1)
|
||
|
||
typedef struct
|
||
{
|
||
uint8_t valve_type; // 阀门类型
|
||
uint8_t no; // 阀门编号
|
||
union
|
||
{
|
||
bool open; // 两通阀:开关
|
||
uint8_t position; // 三通阀:位置 1:左 2:右
|
||
float32_t value; // 比例阀:压力值
|
||
} data; // 阀门数据
|
||
} valve_t; // 阀门数据结构
|
||
|
||
typedef struct
|
||
{
|
||
float32_t value; // 电流值
|
||
} ip_converter_t; // IP转换器数据结构
|
||
|
||
typedef struct
|
||
{
|
||
uint8_t type; // 动作类型
|
||
union
|
||
{
|
||
valve_t valve; // 阀门数据
|
||
ip_converter_t ip_converter; // IP转换器数据
|
||
uint16_t sleep; // 等待时间ms
|
||
} data; // 动作数据
|
||
} action_t; // 动作数据结构
|
||
|
||
typedef struct
|
||
{
|
||
uint8_t action_count; // 动作数量
|
||
action_t *actions; // 动作数组, 每个方案包含多个动作,在执行时,按照动作的顺序执行
|
||
} plan_t; // 流程方案数据结构
|
||
|
||
typedef struct
|
||
{
|
||
uint8_t plan_count; // 流程方案数量
|
||
plan_t *plans; // 流程方案数组, 每个流程包含多个方案,在执行时,按照方案的顺序执行
|
||
} process_t; // 流程数据结构
|
||
|
||
typedef struct
|
||
{
|
||
uint8_t process_count; // 流程数量
|
||
process_t *processes; // 流程数组, 每个配置包含多个流程,在执行时,按照流程的顺序执行
|
||
} config_t; // 配置数据结构
|
||
|
||
typedef struct
|
||
{
|
||
float32_t value; // 电流值
|
||
} adjust_ip_input_current_t; // 调整IP输入电流请求数据域
|
||
|
||
typedef struct
|
||
{
|
||
uint16_t address;
|
||
} config_address_t; // 配置地址数据域
|
||
|
||
typedef struct
|
||
{
|
||
uint16_t address;
|
||
} query_address_t; // 查询地址数据域
|
||
typedef struct
|
||
{
|
||
uint8_t process_index; // 配置参数中流程数组的索引
|
||
uint8_t plan_index; // 配置参数中流程方案数组的索引
|
||
} execute_process_t; // 执行流程数据域
|
||
|
||
typedef union
|
||
{
|
||
uint8_t data;
|
||
struct
|
||
{
|
||
uint8_t sensor_1 : 1; // 传感器1
|
||
uint8_t sensor_2 : 1; // 传感器2
|
||
uint8_t sensor_3 : 1; // 传感器3
|
||
uint8_t sensor_4 : 1; // 传感器4
|
||
uint8_t sensor_5 : 1; // 传感器5
|
||
uint8_t sensor_6 : 1; // 传感器6
|
||
uint8_t sensor_7 : 1; // 传感器7
|
||
uint8_t sensor_8 : 1; // 传感器8
|
||
} bits;
|
||
} sensor_bits_e;
|
||
typedef struct
|
||
{
|
||
uint8_t sensor_class; // 传感器类型
|
||
sensor_bits_e sensor; // 传感器
|
||
} query_data_sensor_t;
|
||
typedef struct
|
||
{
|
||
uint8_t count; // 传感器分类数量
|
||
query_data_sensor_t *sensors;
|
||
} query_data_t; // 查询数据数据域
|
||
|
||
typedef struct
|
||
{
|
||
query_data_sensor_t;
|
||
uint8_t count;
|
||
float32_t data[8]; // 传感器最大数量为8
|
||
} query_data_rsp_t;
|
||
|
||
typedef struct
|
||
{
|
||
uint8_t state; // 0:零位 1:满值
|
||
query_data_t sensor_data;
|
||
} calibration_sensor_t; // 标定传感器数据域
|
||
|
||
typedef struct
|
||
{
|
||
uint8_t unit; // 组件类型
|
||
uint8_t status; // 两通阀1:开启 0:关闭 三通阀位置 1:左 2:右
|
||
uint8_t index; // 阀门编号
|
||
} set_valve_t; // 设置阀门数据域
|
||
|
||
typedef struct
|
||
{
|
||
float32_t value; // 比例阀值
|
||
uint8_t pid_sensor_class; // PID传感器类型 0x01 压力传感器 0x00 使用默认的比例阀
|
||
uint8_t pid_sensor_no; // PID传感器编号
|
||
} set_valve_ratio_t; // 设置比例阀数据域
|
||
|
||
typedef struct
|
||
{
|
||
uint8_t dir; // 步进电机运行方向 0:逆时针旋转 1:顺时针旋转
|
||
float32 angle; // 角度
|
||
} stepper_motor_t;
|
||
|
||
typedef struct
|
||
{
|
||
uint8_t frequency; // 频率
|
||
float32 percent; // 占空比
|
||
} query_ip_pwm_duty_t;
|
||
|
||
typedef struct
|
||
{
|
||
float32 percent; // 占空比
|
||
} adjust_ip_pwm_duty_t;
|
||
|
||
typedef struct
|
||
{
|
||
uint8_t mode; // 1: 电流模式 2: PWM模式
|
||
uint8_t data_length;
|
||
union
|
||
{
|
||
uint8_t frequency;
|
||
} data;
|
||
} set_ip_mode_t;
|
||
|
||
typedef struct
|
||
{
|
||
uint8_t mode; // 1: 电流模式 2: PWM模式
|
||
uint8_t data_length;
|
||
union
|
||
{
|
||
uint8_t frequency;
|
||
} data;
|
||
} query_ip_mode_t;
|
||
#pragma pack()
|
||
|
||
// 结束:协议数据结构定义
|
||
|
||
typedef enum
|
||
{
|
||
COMMAND_RESET_DEVICE = 0x00, // 复位设备
|
||
COMMAND_QUERY_IP_INPUT_CURRENT = 0x01, // 查询IP输入电流
|
||
COMMAND_ADJUST_IP_INPUT_CURRENT = 0x02, // 调节IP输入电流
|
||
COMMAND_QUERY_STATE = 0x03, // 查询状态
|
||
COMMAND_QUERY_PROCESS = 0x04, // 查询流程
|
||
COMMAND_CONFIG_PROCESS = 0x05, // 配置流程
|
||
COMMAND_EXECUTE_PROCESS = 0x06, // 执行流程
|
||
COMMAND_STOP_PROCESS = 0x07, // 停止流程
|
||
COMMAND_QUERY_DATA = 0x08, // 查询数据
|
||
COMMAND_CONFIG_ADDRESS = 0x09, // 配置地址
|
||
COMMAND_QUERY_ADDRESS = 0x0A, // 查询地址
|
||
COMMAND_CALIBRATE_SENSOR = 0x0B, // 标定传感器
|
||
COMMAND_SET_VALVE = 0x0C, // 设置阀门
|
||
COMMAND_QUERY_VALVE = 0x0D, // 查询比例阀
|
||
COMMAND_SET_VALVE_RATIO = 0x0E, // 设置比例阀
|
||
COMMAND_SET_STEPPER_MOTOR = 0x0F, // 设置步进电机
|
||
COMMAND_QUERY_IP_INPUT_PWM_DUTY = 0x10, // 查询I/P 输入PWM占空比
|
||
COMMAND_ADJUST_IP_INPUT_PWM_DUTY = 0x11, // 调节I/P 输入PWM占空比
|
||
COMMAND_SET_IP_MODE = 0x12, // 设置I/P 模式
|
||
COMMAND_QUERY_IP_MODE = 0x13, // 查询I/P 模式
|
||
COMMAND_MAX,
|
||
} command_e;
|
||
|
||
#pragma pack(1)
|
||
typedef struct
|
||
{
|
||
uint8_t code[11]; // 标识码 'epm'
|
||
union
|
||
{
|
||
uint8_t data;
|
||
struct
|
||
{
|
||
uint8_t lo : 4; // 低位
|
||
uint8_t hi : 4; // 高位
|
||
} bits;
|
||
} version;
|
||
uint8_t status; // 运行状态 0:未执行 1:执行中 2:准备完毕 3:执行失败
|
||
uint8_t process_index; // 当前执行的流程编号
|
||
uint8_t plan_index; // 当前执行的方案编号
|
||
uint8_t action_index; // 当前执行的动作编号
|
||
uint8_t two_way_valve; // 两通阀状态 bits
|
||
uint8_t three_way_valve; // 三通阀状态 bits
|
||
} slave_req_query_state_t;
|
||
|
||
typedef struct
|
||
{
|
||
union
|
||
{
|
||
float32_t current; // 电流值
|
||
slave_req_query_state_t query_state; // 查询状态数据域
|
||
config_t config; // 配置数据域
|
||
execute_process_t execute_process; // 执行流程数据域
|
||
config_address_t config_address; // 配置地址数据域
|
||
query_address_t query_address; // 查询地址数据域
|
||
query_data_t query_data; // 查询数据数据域
|
||
query_data_rsp_t *query_data_rsp; // 查询数据响应数据域,需要手动释放
|
||
calibration_sensor_t calibration_sensor; // 标定传感器数据域
|
||
set_valve_t set_valve; // 设置阀门数据域
|
||
set_valve_ratio_t valve_ratio; // 比例阀值
|
||
stepper_motor_t stepper_motor; // 步进电机数据域
|
||
query_ip_pwm_duty_t query_ip_pwm_duty; // 查询I/P 输入PWM占空比
|
||
adjust_ip_pwm_duty_t adjust_ip_pwm_duty; // 调节I/P 输入PWM占空比
|
||
set_ip_mode_t set_ip_mode; // 设置I/P 模式
|
||
query_ip_mode_t query_ip_mode; // 查询I/P 模式
|
||
} data;
|
||
float32_t default_value; // 默认值
|
||
} slave_request_done_t;
|
||
|
||
#pragma pack()
|
||
|
||
typedef void (*response_cb)(uint8_t *data, uint16_t len); // 回复消息注册接口
|
||
typedef slave_request_done_t (*slave_request_done_cb)(command_e command, void *data); // 从机请求处理完成回调
|
||
|
||
#pragma pack(1)
|
||
typedef struct
|
||
{
|
||
uint16_t src; // 源地址
|
||
uint16_t dst; // 目的地址
|
||
uint8_t command;
|
||
union
|
||
{
|
||
adjust_ip_input_current_t adjust_ip_input_current; // 调节IP输入电流数据域
|
||
config_address_t config_address; // 配置地址数据域
|
||
execute_process_t execute_process; // 执行流程数据域
|
||
query_data_t query_data; // 查询数据数据域
|
||
config_t *config; // 配置流程数据域
|
||
calibration_sensor_t calibration_sensor; // 标定传感器数据域
|
||
set_valve_t set_valve; // 设置阀门数据域
|
||
set_valve_ratio_t valve_ratio; // 设置比例阀数据域
|
||
stepper_motor_t stepper_motor; // 设置步进电机数据域
|
||
adjust_ip_pwm_duty_t adjust_ip_pwm_duty; // 调节I/P 输入PWM占空比
|
||
set_ip_mode_t set_ip_mode; // 设置I/P 模式
|
||
} data;
|
||
} command_req_t;
|
||
|
||
typedef struct
|
||
{
|
||
pbuf_t *pbuf;
|
||
} command_resp_t;
|
||
|
||
typedef struct
|
||
{
|
||
uint16_t src; // 源地址
|
||
uint16_t dst; // 目的地址
|
||
uint8_t command; // 命令
|
||
uint8_t *data; // 数据
|
||
uint16_t data_len; // 数据长度
|
||
} agreement_response_fill_t; // 回复消息填充结构体
|
||
typedef struct
|
||
{
|
||
uint8_t slave; // 0: master 1: slave ; 主机或从机公用一个注册接口,只能注册一种类型
|
||
response_cb response_call; // 回复消息注册接口
|
||
slave_request_done_cb slave_request_done_call; // 从机请求处理完成回调
|
||
} agreement_init_t;
|
||
|
||
#pragma pack()
|
||
|
||
extern bool (*command_req_ptr_arr[COMMAND_MAX])(const command_req_t *const data, command_resp_t *resp);
|
||
extern agreement_init_t handle;
|
||
extern config_t *g_config;
|
||
extern execute_process_t g_execute_process; // 执行流程数据域
|
||
|
||
extern pbuf_t *agreement_response_fill(const agreement_response_fill_t *const rsp);
|
||
extern void config_convert_pbuf(config_t config, pbuf_t **pbuf);
|
||
extern config_t *data_convert_config(uint8_t *data, uint16_t len);
|
||
extern config_t *config_alloc(uint8_t process_count, uint8_t plan_count, uint8_t action_count);
|
||
extern void config_free(config_t *config);
|
||
extern void config_print(config_t *config);
|
||
|
||
extern calibration_sensor_t *data_convert_calibration_sensor(uint8_t *data, uint16_t len);
|
||
extern void calibration_sensor_convert_pbuf(calibration_sensor_t calibration_sensor, pbuf_t **const pbuf);
|
||
|
||
extern query_data_t *data_convert_query_data(uint8_t *data, uint16_t len);
|
||
extern void query_data_convert_pbuf(query_data_rsp_t *query_data, uint8_t count, pbuf_t **const pbuf);
|
||
|
||
extern config_t *mock_commond_req_config(void);
|
||
|
||
#endif // __AGREEEMENT_FRAME_H__
|