This repository has been archived on 2025-02-28. You can view files and clone it, but cannot push or open issues or pull requests.
controller-hd/User/application/mode/mode_dac.h

291 lines
8.5 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 __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