/** * @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 #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)); }