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/src/params.c

347 lines
12 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.

/**
* @file params.c
* @author xxx
* @date 2023-08-30 08:58:43
* @brief 此文件定义了板卡全部重要参数(设备参数+校准参数),以及参数管理配置功能
* @copyright Copyright (c) 2023 by xxx, All Rights Reserved.
*/
#include "../inc/params.h"
#include "board.h"
#include "delay.h"
#include "diagnosis.h"
#include "fal_execution.h"
#include "test_bsp.h"
#include <stdio.h>
#define CURRENT_VERSION (HW_VER << 16 | SW_VER << 8 | FW_VER)
/// 磁条规格 [0]:最小值 [1]:最大值
const uint16_t magnet_param_table[MAGNET_PARAM_MAX][2] =
{
// 0位成员用于测试
{0, 10},
{0, 100},
};
/// 气压传感规格 [0]:最小值 [1]:最大值
const uint16_t pressure_param_table[PRESSURE_PARAM_MAX][2] =
{
{100, 4000}, // 气源
{100, 4000}, // A
{100, 4000}, // B
};
/// 阀门流量特性表
const uint16_t valve_characteristics_table[][17] =
{
// 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
// 线性
{0, 625, 1250, 1875, 2500, 3125, 3750, 4375, 5000, 5625, 6250, 6875, 7500, 8125, 8750, 9375, 10000},
// 等百分比1(1:50)
{0, 255, 326, 416, 532, 679, 867, 1107, 1414, 1806, 2306, 2945, 3761, 4802, 6132, 7831, 10000},
// 快开(50:1)
{0, 255, 326, 416, 532, 679, 867, 1107, 1414, 1806, 2306, 2945, 3761, 4802, 6132, 7831, 10000},
// 等百分比1(1:25)
{0, 255, 326, 416, 532, 679, 867, 1107, 1414, 1806, 2306, 2945, 3761, 4802, 6132, 7831, 10000},
// 快开(25:1)
{0, 255, 326, 416, 532, 679, 867, 1107, 1414, 1806, 2306, 2945, 3761, 4802, 6132, 7831, 10000},
// 等百分比2(1:33)
{0, 131, 281, 454, 655, 892, 1173, 1476, 1826, 2258, 2793, 3455, 4273, 5285, 6537, 8085, 10000},
// 快开(33:1)
{0, 2913, 4684, 5721, 6456, 7027, 7493, 7887, 8228, 8529, 8799, 9042, 9265, 9469, 9659, 9835, 10000},
};
/**
* @brief 参数初始化
* @return {*}
* @note
*/
void params_init(void)
{
BOOL res = FALSE;
driver_icon_enable.dev = 0; // 图标变量
// 清除数据内存
osel_memset((uint8_t *)&udevice, 0, sizeof(device_typedef));
osel_memset((uint8_t *)&rt_data, 0, sizeof(real_time_data_t));
osel_memset((uint8_t *)&calib_param, 0, (CALIBPARA_NUM * sizeof(calib_param_t)));
osel_memset((uint8_t *)&mode_params, 0, sizeof(mode_params_t));
// 读EEPROM内的设备参数
res = fal_execution_kv_read(KEY_DEVICE, (uint8_t *)&udevice, sizeof(device_typedef));
if (udevice.dev_version != CURRENT_VERSION)
{
params_restart();
hart_attribute_params_restart();
}
set_app_preload_language_flag(udevice.display_language);
// 读EEPROM内的校准参数
res = fal_execution_kv_read(KEY_CALIBPARA_PARAM, (uint8_t *)&calib_param, (CALIBPARA_NUM * sizeof(calib_param_t)));
if (res == FALSE)
{
__NOP(); // 异常已经在fal_execution_kv_read函数内处理此处不做处理
}
// 读取FM24内的实时参数
res = fal_execution_kv_read(KEY_REAL_TIME_DATA, (uint8_t *)&rt_data.save, sizeof(rt_save_param_t));
if (res == FALSE)
{
if (TRUE == fal_execution_kv_write(KEY_REAL_TIME_DATA, (uint8_t *)&rt_data.save, sizeof(rt_save_param_t)))
{
fal_execution_status_set(FAL_EXECUTION_EEPROM_FM24, TRUE);
}
else
{
fal_execution_status_set(FAL_EXECUTION_EEPROM_FM24, FALSE);
}
}
// 读取模式参数
res = fal_execution_kv_read(KEY_MODE_PARAM, (uint8_t *)&mode_params, sizeof(mode_params_t));
if (res == FALSE)
{
osel_memset((uint8_t *)&mode_params, 0, sizeof(mode_params_t));
}
// 上电增加累计次数
rt_data.save.power_on_cnt++;
// HART参数映射
hart_attribute_params_map();
}
/**
* @brief 参数恢复出厂设置
* @return {*}
* @note
*/
void params_restart(void)
{
uint8_t i = 0;
// 清除数据内存
osel_memset((uint8_t *)&udevice, 0, sizeof(device_typedef));
osel_memset((uint8_t *)&rt_data, 0, sizeof(real_time_data_t));
osel_memset((uint8_t *)&calib_param, 0, (CALIBPARA_NUM * sizeof(calib_param_t)));
/*************************************** 设备参数 ***************************************/
// 定位器版本号
udevice.dev_version = CURRENT_VERSION;
// 定位器硬件版本号
udevice.dev_hw_version = HW_VER;
// 定位器软件版本号
udevice.dev_fw_version = SW_VER;
// 定位器输出模式
udevice.dev_algorithm_mode = MODE_FREQUENCY_DOMAIN_CONTROL_ALGORITHM;
// 定位器型号
udevice.dev_model = POSITIONER_MODEL_GPS3001;
// 执行机构行程类型:直行程/角行程 TRAVEL_TYPE_STRAIGHT/TRAVEL_TYPE_ANGULAR
udevice.value_travel_type = TRAVEL_TYPE_STRAIGHT;
// 执行机构气动类型:气开/气关 ATO/ATC
udevice.value_action_type = ATO;
// 执行机构作用类型:单作用/双作用
udevice.value_relay_type = VALVE_ACTING_SINGLE;
osel_memset((uint8_t *)&udevice.dev_serial_num, 0, INST_SERIAL_NUM_LEN);
// 定位器作用方向:正作用/反作用
udevice.dev_driver_dir = CONTROLLER_ACTING_NORMAL;
// 定位器安装方向
udevice.dev_install_dir = CONTROLLER_INSTALL_NORMAL;
// 定位器工作模式
udevice.dev_work_mode = ON_LINE_MODE;
// 定位器控制模式:位置控制/压力控制
udevice.dev_ctrl_mode = POS_CTRL_MODE;
// 执行机构类型
udevice.value_type = VALUE_TYPE_OTHER;
// 执行机构尺寸
udevice.valve_size = VALUE_SIZE_OTHER;
// 执行机构行程
// 直行程16mm、25mm、40mm、60mm、100mm、130mm、160mm、200mm
// 角行程0~60°、0~90°
udevice.value_travel = VALUE_TRAVEL_OTHER;
// 自定义执行机构行程
udevice.self_value_travel = 0;
// 阀门特性
udevice.valve_chart = VALVE_CHARACT_LINEAR;
// 自定义阀门特性
for (i = 0; i < 17; i++)
udevice.self_value_chart[i] = 0;
// 磁条规格
udevice.magnet_spec = MAGNET_SPAC_TEST;
// 写入保护禁用/使能
udevice.write_protect_enable = FALSE;
// 压力传感器禁用/使能
udevice.press_sensor_enable = TRUE;
// 增速器禁用/使能
udevice.speed_increaser_enable = FALSE;
// 快排阀禁用/使能
udevice.quick_exhaust_enable = FALSE;
// 无线通讯禁用/使能
udevice.wireless_enable = TRUE;
// PWM输出电流禁用/使能
udevice.output_current_enable = FALSE;
// 输出开关触发逻辑
udevice.swo_logic[0] = TRIGGER_LOGIC_DISABLE;
udevice.swo_logic[1] = TRIGGER_LOGIC_DISABLE;
// 输出开关触发位置
udevice.swo_value[0] = 0;
udevice.swo_value[1] = 0;
// 显示方向 0/180
udevice.display_direction = DISP_DIR_0;
// 显示语言
udevice.display_language = CHINESE; // CHINESE;
// 行程百分比显示方式
udevice.display_travel_mode = TRAVEL_DISPLAY_NORMAL;
// 报警处理模式
udevice.alarm_handle_mode = ALARM_HANDLING_CONTINUE;
// 复位处理模式
udevice.reset_handle_mode = RESET_HANDLING_CONTINUE;
// 温度单位
udevice.temperature_unit = TEMPERATURE_UNIT_C;
// 电流单位
udevice.current_unit = CURRENT_UNIT_MA;
// 行程单位
udevice.travel_unit = TRAVEL_UNIT_PRE;
// 压力单位
udevice.press_unit = PRESSURE_UNIT_Kpa;
// 力学单位(摩擦力/弹簧力)
udevice.force_unit = FORCE_UNIT_N;
// 阀门打开(上行)变化速率 (%/秒),如需在5秒钟左右移动100%行程,请将其设置为 20 [%/sec]
udevice.travel_rate_open = 0;
// 阀门关闭(下行)变化速率 (%/秒),如需在5秒钟左右移动100%行程,请将其设置为 20 [%/sec]
udevice.travel_rate_close = 0;
// 阀门全开时间
udevice.all_open_time = 0;
// 阀门全关时间
udevice.all_close_time = 0;
// 阀门0位置行程反馈ADC值
udevice.pos0_travel_vol = 0;
// 阀门100位置行程反馈ADC值
udevice.pos100_travel_vol = 0;
// 阀门0位置小回路反馈ADC值
udevice.pos0_minor_vol = 0;
// 阀门100位置小回路反馈ADC值
udevice.pos100_minor_vol = 0;
// 阀门0位置A路气压反馈ADC值
udevice.pos0_press_a_vol = 0;
// 阀门100位置A路气压反馈ADC值
udevice.pos100_press_a_vol = 0;
// 阀门0位置B路气压反馈ADC值
udevice.pos0_press_b_vol = 0;
// 阀门100位置B路气压反馈ADC值
udevice.pos100_press_b_vol = 0;
// 记录存储间隔时间
udevice.save_cycle = 5;
// 配置时间
udevice.operating_time = 0;
// 死区(%),表示在目标位置附近设置的可允许偏差。若阀门填料的摩擦力较大,可相应调整并设置此数值,
// 以防止因摩擦导致循环受限。若死区设置为0.5%则其对应范围为目标的±0.5%。
udevice.travel_dead = 0.3; // 0.2%
// 输入范围低4-19mA (2位小数如 4mA = 4.00,20mA = 20.00)
udevice.input_lower = 4.00;
// 输入范围高5-20mA (2位小数如 4mA = 4.00,20mA = 20.00)
udevice.input_upper = 20.00;
// 温度报警上限
udevice.temp_upper = 80;
// 温度报警下限
udevice.temp_lower = -50;
// 供应压力报警上限
udevice.supply_upper = 0;
// 供应压力报警下限
udevice.supply_lower = 0;
// 摩擦力报警上限
udevice.friction_upper = 0;
// 摩擦力报警下限
udevice.friction_lower = 0;
// 弹簧力报警上限
udevice.elasticity_upper = 0;
// 弹簧力报警下限
udevice.elasticity_lower = 0;
// 行程范围上限
udevice.travel_upper = 95;
// 行程范围下限
udevice.travel_lower = 5;
// 行程报警死区
udevice.travel_alert_dead = 0.5;
// 小信号切除禁用/使能
udevice.travel_cut_enable = TRUE;
// 小信号切除上限
udevice.travel_cut_upper = 99.5;
// 小信号切除下限
udevice.travel_cut_lower = 0.5;
// 分程控制禁用/使能
udevice.part_travel_enable = FALSE;
// 分程控制上限
udevice.part_travel_upper = 0;
// 分程控制下限
udevice.part_travel_lower = 0;
// 累计行程上限
udevice.travel_sum_upper = 0xFFFFFFFF;
// 累计行程死区:行程超过累计行程死区时,计算累计行程
udevice.travel_sum_dead = 5;
// 动作次数上限
udevice.act_sum_upper = 0xFFFFFFFF;
// 动作次数死区:行程超过动作次数死区时,计算动作次数
udevice.act_sum_dead = 5;
// 输入的额定气源压力单位kpa
udevice.supply_press = 360.0;
// 气源偏差范围±%
udevice.supply_error = 10;
// 报警等待时间(秒)(偏差超出范围的持续时间上限)
udevice.supply_error_time = 10;
// 参考电压
udevice.vref = 3.0;
// 参考电压偏差
udevice.vref_error = 0.3;
// 参考电压报警等待时间
udevice.vref_error_time = 1;
// 行程偏差报警点±%
udevice.travel_error = 10;
// 行程偏差报警等待时间(秒)(偏差超出范围的持续时间上限)
udevice.travel_error_time = 10;
// 驱动阀门动作所需上限值
udevice.output_max = 4095;
// 驱动阀门动作所需下限值
udevice.output_min = 0;
// 整定标志
udevice.tuned_flag = TUNED_NONE;
// PID参数选择
udevice.pid_index = Adaptive_PID;
// 自适应PID参数
udevice.apid_kp = 1;
udevice.apid_ki = 0.05f;
udevice.apid_kd = 0;
udevice.apid_dead = 0.3;
// 自定义PID参数
udevice.spid_kp = 1;
udevice.spid_ki = 0;
udevice.spid_kd = 0;
udevice.spid_dead = 0.3;
// PWM输出电流原始值
udevice.output_4ma_duty = 546;
udevice.output_20ma_duty = 2730;
osel_memset((uint8_t *)&udevice.menus_main_password, 0, PASSWORD_LEN);
/*************************************** 校准参数 ***************************************/
// 回路电流
calib_param[CALIBPARA_LOOP].value[0] = 0.611153543;
calib_param[CALIBPARA_LOOP].value[1] = 2.1390624;
// 4~20ma PWM输出校准
set_pwm_calib_current();
// 立即保存
fal_execution_kv_write(KEY_CALIBPARA_PARAM, (uint8_t *)&calib_param, (CALIBPARA_NUM * sizeof(calib_param_t)));
fal_execution_kv_write(KEY_DEVICE, (uint8_t *)&udevice, sizeof(device_typedef));
fal_execution_kv_write(KEY_REAL_TIME_DATA, (uint8_t *)&rt_data.save, sizeof(rt_save_param_t));
}