291 lines
8.5 KiB
C
291 lines
8.5 KiB
C
#ifndef __MODE_DAC_H__
|
||
#define __MODE_DAC_H__
|
||
#include "lib.h"
|
||
#include "filter.h"
|
||
#include "mode_def.h"
|
||
#define G_PID_FUZZY 0 // 模糊PID
|
||
|
||
#define FSM_SET(st) BIT_SET(st, BIT7)
|
||
#define FSM_CLR(st) BIT_CLR(st, BIT7)
|
||
#define FSM_IS_WAIT(st) (st & BIT7)
|
||
|
||
// DAC工作任务枚举
|
||
typedef enum
|
||
{
|
||
DAC_PROCESS_IDLE, ///< 空闲
|
||
DAC_PROCESS_CONTROL, ///< 开始控制
|
||
DAC_PROCESS_CONTROL_STOP, ///< 控制结束
|
||
DAC_PROCESS_ADJUST, ///< 开始整定
|
||
DAC_PROCESS_ADJUST_STOP, ///< 整定结束
|
||
DAC_PROCESS_TEST, ///< 测试
|
||
|
||
} mode_dac_process_state_e;
|
||
|
||
// 整定步骤枚举
|
||
typedef enum
|
||
{
|
||
ADJUST_POS_100, ///< 获取最大反馈位置
|
||
ADJUST_POS_0, ///< 获取最小反馈位置
|
||
ADJUST_SAVE_POS, ///< 记录阀门安装方向
|
||
ADJUST_ALL_OPEN_TIME, ///< 记录全开时间
|
||
ADJUST_ALL_CLOSE_TIME, ///< 记录全关时间
|
||
ADJUST_PARAM_PREPARE, ///< 参数保存
|
||
|
||
ADJUST_DAC_BOTTOM_START, ///< 获取起点启动电流
|
||
ADJUST_DAC_TOP, ///< 获取阀门顶点电流大小
|
||
ADJUST_DAC_TOP_START, ///< 防止顶点电流过大,向下调整
|
||
ADJUST_DAC_ORIGN, ///< 防止起点启动电流过大,向下微调
|
||
ADJUST_DAC_END, ///< 整定顶点电流,等待顶点电流稳定
|
||
ADJUST_DAC_END_AMEND, ///< 微调顶点电流
|
||
ADJUST_DAC_BOTTOM, ///< 测量排底电流
|
||
ADJUST_CTRL_CURRUNT, ///< 保存测试电流
|
||
ADJUST_PID, ///< 计算PID参数
|
||
ADJUST_STEP, ///< 以10%步进,记录各点位稳定值
|
||
ADJUST_SAVE_ALL, ///< 保存所有参数
|
||
ADJUST_STOP, ///< 整定结束
|
||
|
||
} mode_dac_adjust_e;
|
||
|
||
// PID参数整定步骤枚举
|
||
typedef enum
|
||
{
|
||
G_PID_WAIT_ORIGN,
|
||
G_PID_JUMP,
|
||
G_PID_OVER,
|
||
|
||
} g_pid_adjust_e;
|
||
|
||
// 阶跃步骤枚举
|
||
typedef enum
|
||
{
|
||
G_STEP_TAO,
|
||
G_STEP_K,
|
||
G_STEP_GOBACK,
|
||
G_STEP_T1,
|
||
G_STEP_T2,
|
||
G_STEP_SAVE,
|
||
|
||
} g_step_e;
|
||
|
||
// 显示整定步骤枚举
|
||
typedef enum
|
||
{
|
||
LCD_ADJUST_POS = 1,
|
||
LCD_ADJUST_CTRL_PARAM,
|
||
LCD_ADJUST_MEASURE,
|
||
LCD_ADJUST_PID,
|
||
LCD_ADJUST_SAVE_ALL,
|
||
|
||
} mode_dac_lcd_e;
|
||
|
||
#define DAC_ADJUST_STEP LCD_ADJUST_SAVE_ALL // 整定步骤
|
||
|
||
// 整定状态枚举
|
||
typedef enum
|
||
{
|
||
ADJUST_WAIT,
|
||
ADJUST_ONGING,
|
||
ADJUST_OK,
|
||
ADJUST_TAO_ERR,
|
||
ADJUST_JUMP_ERR_1,
|
||
ADJUST_JUMP_ERR_2,
|
||
ADJUST_JUMP_ERR,
|
||
ADJUST_DAC_MAX_ERR,
|
||
ADJUST_DAC_MIN_ERR,
|
||
ADJUST_DAC_START0_ERR,
|
||
ADJUST_DAC_START100_ERR,
|
||
ADJUST_DAC_ORIGN_ERR,
|
||
ADJUST_DAC_START_ERR,
|
||
ADJUST_DAC_END_ERR,
|
||
ADJUST_DAC_AMEND_ERR,
|
||
ADJUST_POS100_ERR,
|
||
ADJUST_POS0_ERR,
|
||
|
||
} dac_adjust_state_e;
|
||
|
||
// 执行/不执行
|
||
typedef enum
|
||
{
|
||
EXECUTE_NONE = 0, // 不执行操作
|
||
EXECUTE_DAC = 1, // 执行DAC输出
|
||
} execute_e;
|
||
|
||
// 充气/放气
|
||
typedef enum
|
||
{
|
||
AIR_INFLATE, // 充气
|
||
AIR_ESCAPE, // 放气
|
||
} air_opt_e;
|
||
|
||
// 减/加
|
||
typedef enum
|
||
{
|
||
SUB = 0, // 减
|
||
ADD = 1, // 加
|
||
} cal_opt_e;
|
||
|
||
// 操作状态
|
||
typedef enum
|
||
{
|
||
ONGOING = 2, // 过程
|
||
WAIT = 3, // 等待
|
||
NEAR = 4, // 接近
|
||
FAR = 5, // 背离
|
||
} state_opt_e;
|
||
|
||
/*********************************** 执行器 ***********************************/
|
||
typedef struct
|
||
{
|
||
execute_e code; ///< 操作标志
|
||
uint16_t dac; ///< DAC值
|
||
|
||
} execute_rsp_t;
|
||
|
||
/*********************************** 滤波器 ***********************************/
|
||
typedef struct
|
||
{
|
||
lpf_window_t handle;
|
||
uint16_t value;
|
||
|
||
} win_filter_t;
|
||
|
||
/*********************************** 控制任务 ***********************************/
|
||
typedef struct
|
||
{
|
||
float32 ctrl_target; // 目标位置
|
||
float32 last_target; // 上次目标
|
||
float32 ctrl_feedback; // 实际位置
|
||
float32 last_feedback; // 上次实际,只有目标位置改变大于0.2才会更新
|
||
float32 real_error; // 误差
|
||
float32 update_error; // 更新误差,目标位置与上次实际位置的差值
|
||
BOOL dir; // 方向
|
||
uint16_t dac_max; // 输出最大值
|
||
uint16_t dac_min; // 输出最小值
|
||
float32 output; // 输出值
|
||
float32 ratio; // 输出值百分比
|
||
float32 kf; // 增益
|
||
BOOL switch_flag; // 开关阀标志
|
||
BOOL callback_flag; // 超调标志
|
||
BOOL unreach_flag; // 欠调标志
|
||
BOOL update_flag; // 目标更新标志
|
||
BOOL dead_flag; // 死区稳定标志
|
||
float32 current; // 电流
|
||
|
||
__IO int16_t ctrl_cycle; // 控制周期
|
||
__IO uint32_t enter_count; // 执行时间计数
|
||
__IO uint32_t dead_count; // 死区时间计数
|
||
|
||
} mode_dac_master_t;
|
||
|
||
/*********************************** 整定任务 ***********************************/
|
||
// PID参数整定
|
||
typedef struct
|
||
{
|
||
g_pid_adjust_e pid_adjust_state; // 当前PID参数整定步骤
|
||
g_pid_adjust_e pid_adjust_next_state; // 下个PID参数整定步骤
|
||
g_step_e step_state; // 阶跃步骤
|
||
float32 tao; // 滞后时间
|
||
float32 k; // k值
|
||
float32 t, t1, t2; // t值
|
||
// 临时变量
|
||
BOOL jump_flag, t1_flag, t2_flag;
|
||
float32 t1_pos, t2_pos, cur_pos, last_pos;
|
||
uint32_t opt_cnt, wait_cnt;
|
||
|
||
} adjust_pid_t;
|
||
|
||
// 整定时序
|
||
typedef struct
|
||
{
|
||
uint8_t visit_tag;
|
||
int32_t visit_cnt;
|
||
int32_t visit_cycle;
|
||
|
||
} adjust_timer_t;
|
||
|
||
typedef struct
|
||
{
|
||
BOOL adjust_enable; // 整定使能
|
||
mode_dac_adjust_e adjust_state; // 当前整定状态
|
||
mode_dac_adjust_e adjust_next_state; // 下次整定状态
|
||
uint8_t adjust_execute_state; // 执行整定状态
|
||
uint8_t adjust_lcd_state; // 显示整定状态
|
||
adjust_pid_t gpid; // PID参数整定
|
||
adjust_timer_t timer; // 整定时序
|
||
// 临时变量
|
||
float32 cur_pos, psb_pos; ///< 当前位置/初始位置
|
||
float32 speed; ///< 每500ms动作百分比(速度)
|
||
uint16_t up_offset; ///< 上行阶跃值偏移量
|
||
uint16_t lo_offset; ///< 下行阶跃值偏移量(量程的百分之一)
|
||
uint16_t psb_adc, cur_adc, last_adc, dif_adc, err_adc;
|
||
uint16_t cur_dac, start_dac;
|
||
uint8_t index;
|
||
uint32_t cnt;
|
||
|
||
} mode_dac_adjust_t;
|
||
|
||
/*********************************** 测试任务 ***********************************/
|
||
typedef struct
|
||
{
|
||
uint16_t output;
|
||
uint16_t megnet_adc;
|
||
uint16_t minor_adc;
|
||
float32 current;
|
||
} mode_dac_test_t;
|
||
|
||
/*********************************** 保存参数 ***********************************/
|
||
typedef struct
|
||
{
|
||
uint8_t dev_tuned_flag;
|
||
|
||
uint16_t dev_magnet_0; // 大回路0位置
|
||
uint16_t dev_magnet_100; // 大回路100位置
|
||
uint16_t dev_minor_0; // 小回路0位置
|
||
uint16_t dev_minor_100; // 小回路100位置
|
||
uint16_t invert_feedback; // 定位器安装方向
|
||
uint16_t dev_orign; // 起点值,阀门从起点启动的电流值,数字量
|
||
uint16_t dev_end; // 终点值,阀门稳定在99%的电流值,数字量
|
||
uint16_t dev_top; // 冲顶值,阀门最高点所需要输出的电流值
|
||
uint16_t dev_bottom; // 排底值,阀门维持在0%的电流值
|
||
float32 dev_lo_step[11]; // 排底值
|
||
float32 dev_up_step[11]; // 阶跃值
|
||
uint32_t dev_open_time; // 全开时间
|
||
uint32_t dev_close_time; // 全关时间
|
||
float32 dev_cur_lower; // 电流下限,模拟量
|
||
float32 dev_cur_upper; // 电流上限,模拟量
|
||
float32 dev_kp;
|
||
float32 dev_ki;
|
||
float32 dev_kd;
|
||
float32 dev_kv;
|
||
float32 dev_kf;
|
||
|
||
} mode_dac_storage_data_t;
|
||
|
||
|
||
/*********************************** 模式管理 ***********************************/
|
||
typedef struct
|
||
{
|
||
mode_dac_process_state_e process_state; // 任务
|
||
execute_rsp_t dac_rsp; // 执行器
|
||
win_filter_t magnet_filter; // 磁条滤波器
|
||
win_filter_t minor_filter; // 小回路滤波器
|
||
mode_dac_master_t master; // 控制任务
|
||
mode_dac_adjust_t adjust; // 整定任务
|
||
mode_dac_test_t test; // 测试任务
|
||
mode_dac_storage_data_t *save; // 保存参数
|
||
void (*params_save_cb)(void); // 保存函数
|
||
|
||
} mode_dac_t;
|
||
|
||
/*********************************** 接口声明 ***********************************/
|
||
// DAC模式句柄
|
||
extern mode_dac_t *mode_dac;
|
||
// DAC模式初始化
|
||
void mode_dac_init(mode_interface_req_t *req, uint16_t positioner_model, mode_dac_storage_data_t *params, void (*params_save_cb)(void));
|
||
// DAC模式反初始化
|
||
void mode_dac_dinit(void);
|
||
// DAC模式进程
|
||
void mode_dac_process(void);
|
||
|
||
#endif
|