#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