347 lines
12 KiB
C
347 lines
12 KiB
C
/**
|
||
* @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));
|
||
}
|