#ifndef __ENTITY_H__ #define __ENTITY_H__ #include "lib.h" #include "adcs.h" #include "pid.h" #include "params.h" #include "hart.h" #include "pdctrl.h" #include "mode.h" #include "app_hart.h" #include "params.h" // 注:1. 板子正常电流在2.5ma左右,在超频时会有所增加,但不会超过4ma,如果超过4ma,说明板子有问题,需要检查是否短路 #define DEBUG_ENABLE TRUE ///< 是否启用调试,正式发布时请关闭。使能下:蓝牙发送调试数据 #define CPU_ENCRYPT_ENABLE FALSE ///< 是否启用加密 !没有验证,暂时不开启 #define LCD_DESIGN FALSE ///< 是否运行LCD设计,TRUE模式下程序会跳过一些初始化操作,直接进入LCD设计模式 #define HART_SOFTWARE_TEST_ENABLE FALSE ///< HART软件测试模式,用于中科博微测试 #define HART_HARDWARE_TEST_ENABLE FALSE ///< HART硬件测试模式,用于中科博微测试 ///< 设备版本 1个字节 当前设备基于SMT32L476基础上开发 #define DW_VER 2 ///< 硬件版本号 1个字节 硬件修订 #define HW_VER 5 ///< 软件版本号 1个字节 软件修订 #define SW_VER 22 #define HART_VERSION HART_PROTOCOL_VERSION_7 ///< HART协议版本号 #define HART_WRITE_MAX_COUNT 3 ///< HART写入最大次数 #define CPU_VREF 2.5f ///< CPU基准电压 #define CPU_VREF_OFFSET 0.3f ///< CPU基准电压偏差 #define CPU_VREF_RUN_MIN (CPU_VREF - 0.1f) ///< CPU运行最小电压 #define CPU_VREF_RUN_MAX (CPU_VREF + 0.1f) ///< CPU运行最大电压 #define CPU_UGAGE_MAX 90.0f ///< CPU使用率最大值 #define MEM_UGAGE_MAX 90.0f ///< 内存使用率最大值 #define POSITION_FEEDBACK_MAX 3500 ///< 位置反馈最大值 #define POSITION_FEEDBACK_MIN 600 ///< 位置反馈最小值 #define POSITION_FEEDBACK_CENTER 2048 ///< 位置反馈中心偏移量 #define POSITION_FEEDBACK_CENTER_OFFSER 100 ///< 位置反馈中心偏移量 #define IP_CURRENT_MAX 2.0f ///< IP电流最大值 #define IP_VOL_OFFSET 0.5f ///< IP电压偏差(理论输出与实际输出差值) #define BOARD_START_CURRENT_MAX 2.0f ///< 板子启动最大电流,可以运行加速 #define LOOP_CURRENT_MIN 4.0f ///< 输入模拟电流最小值 #define LOOP_CURRENT_MAX 20.0f ///< 输入模拟电流最大值 #define LOOP_CURRENT_OFFSET 0.05f ///< 输入模拟电流偏差 #define INPUT_CURRENT_RUN 3.5f ///< 输入电流运行,达到这个电流程序才启动 #define SYSTEM_CLOCK_HIGHT_CURRENT_MIN 3.8f ///< 系统高频运行的最低启动电流,瞬间被降低到以下需要能够恢复,外置存储才能加速写入; #define INPUT_CURRENT_MIN_UART 3.8f ///< HART UART 输入电流下限3.8mA #define FAL_WRITE_CURRENT 3.8f ///< fal写入最小输入电流 #define GUI_RUN_CURRENT 3.8f ///< gui运行最小输入电流 #define GUI_HIGHT_CURRENT_MIN 4.0f ///< GUI高频运行的最低电流 #define BLE_CURRENT_WORK 7.5f ///< 蓝牙启动工作电流 #define LOOP_TUNE_CURRENT 8.0f ///< 自整定最小输入电流 #define SYSTEM_CLOCK_HIGHT 16000000U ///< 系统高频运行的时钟 #define SYSTEM_HART_CLOCK 460.8f #define TEMP_MIN -40.0f ///< 温度最低-40℃ #define TEMP_MAX 85.0f ///< 温度最高85℃ #define WORK_HOURS_MAX (24 * 365 * 10) ///< 最大工作时间24小时*365天*10年 = 87600小时 #define PRESS_MAX 400.0f ///< 气源压力上限 #define PRESS_MIN 200.0f ///< 气源压力下限 #define LCD_WORK_TEMP_MIN -20.0f ///< LCD最低工作稳定 #define LCD_WORK_TEMP_MAX 70.0f ///< LCD最高工作稳定 #define BLE_WORK_TEMP_MIN -40.0f ///< 蓝牙最低工作稳定 #define BLE_WORK_TEMP_MAX 80.0f ///< 蓝牙最高工作稳定 #define BAROMETER_MAX 10 ///< 气压表最大值 #define DESCRIPTOR "GSDT" #define SELF_VCHART_LEN 21 ///< 自定义阀门特性长度 #define VALVE_SERIAL_NUM_LEN 16 ///< 阀门序列号长度 #define INST_SERIAL_NUM_LEN 16 ///< 定位器序列号长度(仪表序列号长度) #define MAN_SERIAL_NUM_LEN 16 ///< 制造信息序列号 #define OPERATOR_NAME_LEN HART_PACKED25_LEN ///< 操作员姓名长度 #define PASSWORD_LEN 4 ///< LCD主菜单页面进入密码长度 #define PST_PROHIBIT_DETAIL_LEN 6 ///< 部分行程测试故障信息长度 #define MA_TO_PERCENT (100.0 / (LOOP_CURRENT_MAX - LOOP_CURRENT_MIN)) ///< 1毫安占百分百的比例 6.25% #define MA_TO_PERCENT_01 (MA_TO_PERCENT / 10) ///< 0.1毫安占百分百的比例 0.625% #define MA_TO_PERCENT_005 (MA_TO_PERCENT / 20) ///< 0.05毫安占百分百的比例 0.3125% #define MIN_TARGET_PERCENT -25.0f // 最小目标百分比 #define MAX_TARGET_PERCENT 125.0f // 最大目标百分比 #define NOINIT_NORESET_FLAG (0x0520) ///< 无初始化标志 /** * STM32L476xx devices feature up to 1 Mbyte of embedded Flash memory available for storing programs and data. The Flash memory is divided into two banks allowing read while-write operations. This feature allows to perform a read operation from one bank while an erase or program operation is performed to the other bank. The dual bank boot is also supported. Each bank contains 256 pages of 2 Kbyte */ /** * 板卡信息数据管理 */ #define BOARD_DATA_START_ADDRESS (257 * LL_FLASH_PAGE_SIZE) #define BOARD_DATA_PAGE_NUM 1 #define BOARD_DATA_END_ADDRESS (BOARD_DATA_START_ADDRESS + BOARD_DATA_PAGE_NUM * LL_FLASH_PAGE_SIZE) ///< 默认的board存储结束地址 /** * ADC通道定义: 主频4、分频系数8,根据公式 TCONV(转换时间) = (采样时间 + 12.5 个周期)/(主频/ADC分频系数) 计算每个通道单个采集时间 * ADC_LOOP_CHANNEL: 12.5+12.5=25个周期,25/(4/8)=50us * ADC_PSB_CHANNEL: 12.5+12.5=105个周期,25/(4/8)=50us * ADC_BP_CHANNEL: 12.5+12.5=25个周期,25/(4/8)=50us * ADC_IPSB_CHANNEL: 12.5+12.5=25个周期,25/(4/8)=50us * ADC_NTC_CHANNEL: 12.5+12.5=25个周期,25/(4/8)=50us * ADC_VIP_CHANNEL: 12.5+12.5=25个周期,25/(4/8)=50us * ADC_DCDC_CHANNEL: 12.5+12.5=25个周期,25/(4/8)=50us * ADC_BPA_CHANNEL: 12.5+12.5=25个周期,25/(4/8)=50us * ADC_BPB_CHANNEL: 12.5+12.5=25个周期,25/(4/8)=50us * * 通道采集数量为30个,单个采集时间为50us,总共采集时间为400*50us = 20000us */ typedef enum { ADC_LOOP_CHANNEL = 0, ///< IN5 输入电流ADC通道 ADC_PSB_CHANNEL, ///< IN6 阀位反馈ADC通道 ADC_BP_CHANNEL, ///< IN7 压力传感器ADC通道 ADC_IPSB_CHANNEL, ///< IN8 内部I/P位置电压(小回路) ADC_NTC_CHANNEL, ///< IN9 温度ADC电压 ADC_VIP_CHANNEL, ///< IN11 I/P输出电流 ADC_DCDC_CHANNEL, ///< IN12 DCDC检测通道 ADC_BPA_CHANNEL, ///< IN13 A路压力 ADC_BPB_CHANNEL, ///< IN14 B路压力 ADC_VDD_CHANNEL, ///< IN16 VDD电压 ADC_TEMP_CHANNEL, ///< 内部参考温度 ADC_INVREF_CHANNEL, ///< 内部参考电压 ///< 下面的定义和ADC中的存储没有关系 ADC_FLOW, ///< 流量传感器 ADC1_MAX, ///< ADC1通道最大数量 } adc1_channel_e; /** * ADC通道定义: 主频4、分频系数8,根据公式 TCONV(转换时间) = (采样时间 + 12.5 个周期)/(主频/ADC分频系数) 计算每个通道单个采集时间 * ADC2_LOOP_CHANNEL: 12.5+12.5=25个周期,25/(4/8)= 50us * ADC2_PSB_CHANNEL: 12.5+12.5=25个周期,25/(4/8)= 50us * 通道采集数量为999个,单个采集时间为50us,总共采集时间为999*50 = 49950us */ typedef enum { ADC2_MAX, } adc2_channel_e; ///< 校准参数信息 typedef enum { CALIBPARA_LOOP = 0, ///< 4~20mA采集校准参数 CALIBPARA_PSB = 1, ///< 位置反馈校准参数 CALIBPARA_PS = 2, ///< 气源压力校准参数 CALIBPARA_PA = 3, ///< A输出压力校准参数 CALIBPARA_PB = 4, ///< B输出压力校准参数 CALIBPARA_IPSB = 5, ///< 小回路校准参数 CALIBPARA_VIP = 6, ///< 4~20mA输出校准参数 CALIBPARA_MAX, } calibration_e; ///< 任务流程状态机 typedef enum { FLOW_EVENT_NORMAL, ///< 正常任务流程 FLOW_EVENT_DIAGNOSIS, ///< 诊断任务流程 } flow_event_e; // 自定义特性表:每个点代表一个行程目标位置,以行程范围的百分比表示;响应的设定点以相对设定值的百分比来表示 typedef struct { uint8_t points; uint16_t setpoint[SELF_VCHART_LEN]; ///< 设定点 计算公式100*(值-2048)/8192 uint16_t value[SELF_VCHART_LEN]; // 行程目标位置 计算公式100*(值-2048)/8192 } custom_property_table_t; ////< 参数校准 typedef struct { BOOL is_calibration; ///< 是否校准 int16_t offset; ///< 偏移 int16_t span; ///< 跨度 uint16_t original_adc_value[2]; ///< ADC值 float32 min; ///< 最小值,用作分子 float32 max; ///< 最大值,用作分子 float32 slope; ///< 斜率 uint32_t crc; ///< CRC校验 } calib_param_t; ////< 校准记录 typedef struct { uint32_t operation_time; ///< 时间 4字节 uint8_t control_byte; ///< 控制字节 uint8_t operator[OPERATOR_NAME_LEN]; ///< 人员 25字节 } calib_record_t; ////< 设备基础参数 typedef struct { ///< 定位器硬件版本号 uint8_t dev_hw_version; ///< 定位器软件版本号 uint8_t dev_sw_version; ///< 定位器算法模式 详见:mode_algorithm_e uint8_t dev_algorithm_mode; ///< 执行机构尺寸 uint8_t valve_size; ///< 执行机构行程 uint8_t value_travel; ///< 自定义执行机构行程 uint8_t self_value_travel; ///< 写入保护禁用/使能 uint8_t write_protect_enable; ///< 增速器禁用/使能 uint8_t speed_increaser_enable; ///< 快排阀禁用/使能 uint8_t quick_exhaust_enable; ///< 无线通讯禁用/使能 uint8_t wireless_enable; ///< PWM输出电流禁用/使能,外部输出4-20mA电流 uint8_t output_current_enable; ///< LCD显示方向:0/180 uint8_t display_direction; ///< LCD显示语言 uint8_t display_language; ///< 行程百分比显示方式 ///< 0 = 正向显示,与阀门开度一致 ///< 1 = 反向显示,与阀门开度相反 uint8_t display_travel_mode; ///< 报警处理方式 uint8_t alarm_handle_mode; ///< 复位处理方式 uint8_t reset_handle_mode; ///< 力学单位(摩擦力/弹簧力) uint8_t force_unit; ///< 信号切除禁用/使能 uint8_t travel_cut_enable; ///< 分程控制禁用/使能 uint8_t part_travel_enable; ///< 整定标志 0:未整定,1:整定中,2:整定成功,3:整定失败。这个作为中间变量和FISHER的上一次整定结果做映射关系 uint8_t tuned_flag; ///< 整定错误码 mode_adjust_error_e,tuned_flag未3时有效 uint8_t tuned_err_code; ///< PID参数选择,0 = 自适应,1 = 自定义 uint8_t pid_index; ///< 定位器型号(仪表型号) uint16_t dev_model; ///< 设备授权等级 uint16_t dev_usfeatures; ///< 行程偏差报警等待时间(秒)(偏差超出范围的持续时间上限) uint16_t travel_error_time; ///< 阀门全开时间 uint16_t all_open_time; ///< 阀门全关时间 uint16_t all_close_time; ///< 阀门0位置行程反馈ADC值 uint16_t pos0_travel_vol; ///< 阀门100位置行程反馈ADC值 uint16_t pos100_travel_vol; ///< 阀门0位置小回路反馈ADC值 uint16_t pos0_minor_vol; ///< 阀门100位置小回路反馈ADC值 uint16_t pos100_minor_vol; ///< 阀门0位置A路气压反馈ADC值 uint16_t pos0_press_a_vol; ///< 阀门100位置A路气压反馈ADC值 uint16_t pos100_press_a_vol; ///< 阀门0位置B路气压反馈ADC值 uint16_t pos0_press_b_vol; ///< 阀门100位置B路气压反馈ADC值 uint16_t pos100_press_b_vol; ///< 驱动阀门动作所需上限值 uint16_t output_max; ///< 驱动阀门动作所需下限值 uint16_t output_min; // ///< PWM输出电流校验4ma采样值 // uint16_t output_4ma_duty; // ///< PWM输出电流标定20ma采样值 // uint16_t output_20ma_duty; ///< 输入电流ADC原始值 uint16_t input_raw; ///< 气源压力ADC原始值 uint16_t press_s_raw; ///< A路压力ADC原始值 uint16_t press_a_raw; ///< B路压力ADC原始值 uint16_t press_b_raw; ///< 记录存储间隔时间(秒) 实时数据是I2C存储,间隔时间不宜太短,建议大于30秒 uint16_t save_cycle; ///< 定位器版本号 uint32_t dev_version; ///< 摩擦力范围上限 float32 friction_upper; ///< 摩擦力范围下限 float32 friction_lower; ///< 弹簧力范围上限 float32 elasticity_upper; ///< 弹簧力范围下限 float32 elasticity_lower; ///< 行程报警死区:行程回归超过死区,认为回归正常范围 float32 travel_alert_dead; ///< 分程控制下限 float32 part_travel_lower; ///< 分程控制上限 float32 part_travel_upper; ///< 累计行程死区:行程超过累计行程死区时,计算累计行程 float32 travel_sum_dead; ///< 动作次数死区:行程超过动作次数死区时,计算动作次数 float32 act_sum_dead; ///< 参考电压 float32 vref; ///< 阀门打开(上行)变化速率 (%/秒),如需在5秒钟左右移动100%行程,请将其设置为 20 [%/sec] float32 travel_rate_open; ///< 阀门关闭(下行)变化速率 (%/秒),如需在5秒钟左右移动100%行程,请将其设置为 20 [%/sec] float32 travel_rate_close; ///< 自定义PID参数 float32 spid_kp; float32 spid_ki; float32 spid_kd; float32 spid_dead; ///< 纠正系统误差造成的影响,作用于死区,比如检测出系统偏差为0.2%,则将其设置为0.2%,算法系统内部自动处理 float32 deviation; ///< 输出开关触发逻辑 uint8_t swo_logic[2]; ///< 阀门序列号 uint8_t valve_serial_num[VALVE_SERIAL_NUM_LEN]; ///< 定位器序列号(仪表序列号) uint8_t dev_serial_num[INST_SERIAL_NUM_LEN]; ///< 制造信息序列号 uint8_t man_info_serial_num[MAN_SERIAL_NUM_LEN]; ///< 制造方案序列号 uint8_t man_scheme_serial_num[MAN_SERIAL_NUM_LEN]; ///< LCD主菜单页面进入密码长度 uint8_t menus_main_password[PASSWORD_LEN]; ///< 输出开关触发位置 float32 swo_value[2]; ///< 自定义阀门特性 custom_property_table_t custom_property_table; /********************************************** 参照Fisher陆续更新 **********************************************/ ///< 反馈特性(磁条规格) uint8_t feedback_char; ///< 取值范围 feedback_char_e ///< 电流单位 uint8_t input_unit; ///< 取值范围 input_unit_e ///< 行程特性 uint8_t travel_char; ///< 取值范围 valve_chart_e ///< 执行机构类型 act_style_u act_style; ///< 取值范围 act_style_u ///< 压力单位 uint8_t press_unit; ///< 温度单位 uint8_t temp_unit; ///< 仪器模式 uint8_t inst_mode; ///< 取值范围 inst_mode_e ///< 行程压力选择 uint8_t travel_press_select; ///< 取值范围 travel_press_e ///< 上次整定结果 uint8_t auto_cal_status; ///< 取值范围 auto_cal_status_e ///< 控制模式 uint8_t control_mode; ///< 取值范围 control_mode_e ///< 零功率条件(阀门气开气关类型) uint8_t zero_power_condition; ///< 取值范围 zero_power_e ///< 切除/限位选择 uint8_t cutoff_limit_select; ///< 取值范围 cutoff_limit_e ///< 手动/伺服控制 uint8_t manual_loader; ///< 取值范围 manual_loader_e ///< 通讯超时时间 uint8_t comm_timeout; ///< 反向反馈(定位器安装方向) uint8_t invert_feedback; ///< 积分控制使能 uint8_t comp_mode; ///< 取值范围 ui_enable_e ///< 压力传感器使能 uint8_t press_sensor_enable; ///< 自动校准按钮 uint8_t autocal_btn; ///< 重启仪器模式 uint8_t restart_inst_mode; ///< 取值范围 restart_inst_mode_e ///< 重新启动控制模式 uint8_t restart_ctrl_mode; ///< 取值范围 restart_ctrl_mode_e ///< 轮询地址 uint8_t polling_addr; ///< 警报记录使能 uint8_t aer_config; ///< 输出压力限制使能 uint8_t output_press_limit_enable; ///< 行程单位 uint8_t travel_units; ///< 位置变送器状态 uint8_t xmtr_installed_posxmtrstate; ///< 保留位 uint16_t reserve_78; ///< 超前滞后上限 uint16_t lead_lag_open; ///< 超前滞后下限 uint16_t lead_lag_close; ///< 滞后时间 uint16_t lvp_filter_selector; ///< 触发灵敏度 uint16_t trigger_sensitivity; ///< 位置跨度 uint16_t pos_span; ///< 位置偏移 uint16_t pos_offset; ///< 变化点(与行程有关) uint16_t crossover_out; ///< 原始驱动 uint16_t driver_raw; ///< 伺服输出偏差 uint16_t servo_output_bias; ///< 输入电流4ma偏移 int16_t input_offset; ///< 输入电流20ma范围 int16_t input_span; ///< 输出电流4ma采样值 int16_t output_offset; ///< 输出电流20ma范围 int16_t output_span; ///< 气源压力偏移 uint16_t press_s_offset; ///< 气源压力跨度 uint16_t press_s_span; ///< A路压力偏移 uint16_t press_a_offset; ///< A路压力跨度 uint16_t press_a_span; ///< B路压力偏移 uint16_t press_b_offset; ///< B路压力跨度 uint16_t press_b_span; ///< 小回路跨度 uint16_t minor_loop_span; ///< 动作次数报警设定值 uint32_t cycle_count_limit; ///< 累计行程报警设定值 uint32_t travel_accum_alert_pt; ///< 压力控制100位置压力值(只用于显示) float32 press_100_percent; ///< 压力控制0位置压力值(只用于显示) float32 press_0_percent; ///< 行程控制100位置行程(只用于显示) float32 travel_100_percent; ///< 行程控制0位置行程(只用于显示) float32 travel_0_percent; ///< 供应压力上限报警设定值 float32 high_supply_alert_pt; ///< 供应压力下限报警设定值 float32 low_supply_alert_pt; ///< 压力控制偏差报警设定值 float32 press_dev_alert_pt; ///< 行程控制偏差报警设定值 float32 travel_dev_alert_pt; ///< 行程上限报警设定值 float32 travel_hi_alert_pt; ///< 行程下限报警设定值 float32 travel_lo_alert_pt; ///< 行程上限过高报警设定值 float32 travel_hihi_alert_pt; ///< 行程下限过低报警设定值 float32 travel_lolo_alert_pt; ///< 压力范围上限(顶点压力) float32 press_range_hi; ///< 压力范围下限(起点压力) float32 press_range_lo; ///< 温度范围下限 float32 min_temp; ///< 温度范围上限 float32 max_temp; ///< 切除/限位上限 float32 cutoff_limit_hi; ///< 切除/限位下限 float32 cutoff_limit_lo; ///< 自定义PID参数 float32 travel_kp; ///< 行程比例增益 float32 travel_ki; ///< 行程积分增益 float32 travel_kv; ///< 行程速度增益 float32 travel_kd; ///< 行程微分增益 float32 press_kp; ///< 压力比例增益 float32 press_ki; ///< 压力积分增益 float32 press_rate; ///< 压力速率 float32 press_kd; ///< 压力微分增益 ///< 积分死区 float32 integral_db; ///< 行程/压力偏差跳变点 float32 tvl_dev_trip; ///< 行程/压力偏差时间 float32 tvl_dev_time; ///< 行程/压力设定点速率上限 float32 rate_limit_open; ///< 行程/压力设定点速率下限 float32 rate_limit_close; ///< 超前滞后启动 float32 lead_lag_boost; ///< A口压力跳变点 float32 ps1_trigger_db; ///< B口压力跳变点 float32 ps2_trigger_db; ///< 行程偏差报警时间 float32 travel_dev_alert_time; ///< 输入电流跳变点 float32 current_trigger_db; ///< 压力偏差报警时间 float32 press_dev_alert_time; ///< 上限软切割速率 float32 soft_cutoff_rate_open_unscaled; ///< 下限软切割速率 float32 soft_cutoff_rate_close_unscaled; ///< 积分限位 float32 intergal_limit_unscaled; ///< 压力A限制 float32 press_a_limit; ///< 所有行程警报死区 float32 travel_alert_deadband_unscaled; ///< 周期计数累计死区 float32 cycle_count_deadband_unscaled; ///< 输入电流上限 float32 input_range_hi; ///< 输入电流下限 float32 input_range_lo; ///< 停机自检 uint8_t selftest_shutdown[HART_PACKED6_LEN]; ///< 校准记录 calib_record_t calib_record; ///< 更多状态标志使能/禁用 hart_device_specific_status_u more_status_mask_6x; /************** 下面定义的参数只供FISHER指令查询暂时不使用 **********************/ ///< 仪表覆盖状态 uint8_t sis_override_status; ///< 暂时固定数据 A0 ///< 行程报警使能/禁止 uint8_t demand_stroke_alert_enable; ///< TRUE = 使能,FALSE = 禁止 ///< 位置整定参数 uint8_t pos_tuning_set; ///< 压力整定参数 uint8_t press_tuning_set; ///< 停机触发 uint8_t sis_opt; ///< 取值范围 sis_opt_e ///< 突发模式 uint8_t burst_mode; ///< TRUE = 是,FALSE = 否 ///< XMTR状态 uint8_t xmtr_status; ///< 暂时固定数据 00 ///< 部分行程测试延期原因 uint8_t pst_deferral_reason; ///< 暂时固定数据 00 ///< SVT报警使能/禁用 uint8_t svt_alert_enable; ///< TRUE = 使能,FALSE = 禁用 ///< 部分行程测试故障信息 uint8_t pst_prohibit_detail[PST_PROHIBIT_DETAIL_LEN]; ///< 暂时没有部分行程测试功能 ///< 附属标志 uint8_t accessory_flags; ///< 自动校准稳定时间 uint8_t autocal_settling_time; ///< XMTR模式标志 uint8_t xmtr_mode_flag; ///< XMTR使能 uint8_t xntr_enable; ///< SVT使能标志 uint8_t svt_enable_flag; ///< 辅助输入类型 uint8_t aux_input_type; ///< 复位时间报警设定值 float32 reset_stroke_time_alert_pt; ///< 暂时固定数据 00 00 00 00 ///< 行程时间报警设定值 float32 demand_stroke_time_alert_pt; ///< 暂时固定数据 00 00 00 00 ///< 启动时间报警设定值 float32 breakout_time_alert_pt; ///< 暂时固定数据 00 00 00 00 ///< 行程控制小回路增益 float32 travel_mlfb_gain; ///< 压力控制小回路增益 float32 press_mlfb_gain; ///< SVT跳闸压力报警设定值 float32 svt_trip_press_alert_pt; ///< SVT恢复压力报警设定值 float32 svt_recovery_press_alert_pt; ///< 默认设置点 float32 default_setpoint; ///< 暂时固定数据 1 ///< 部分行程测试解电至跳闸 float32 loop_pst_ett; ///< 部分行程测试充电至跳闸 float32 loop_pst_dett; ///< LCP通讯跳闸警报时间 uint16_t lcp_trip_alert_sec; ///< 部分行程测试最小压力 float32 min_pst_press; ///< 部分行程测试最小压力时间 float32 min_pst_press_time; uint32_t crc; // 用于校验 } udevice_t; typedef struct { uint8_t last_dev_variable; ///< 上一个设备变量 uint8_t work_menu_index; ///< 工作菜单索引 int8_t mode_control_stable_temperature; ///< 整定稳定温度值 int16_t mode_control_offset; ///< 模式控制偏移量 uint16_t hart_run_time_h; ///< 需要将dev_run_time_h/18得到hart_run_time_h 按照1=18小时计算 uint16_t dev_run_time_s; ///< 设备工作时长(秒) uint16_t power_on_cnt; ///< 设备上电次数 uint16_t reset_cnt; ///< 设备复位次数 uint32_t dev_run_time_h; ///< 设备工作时长(小时) uint32_t travel_accum; ///< 累计行程 uint32_t cycle_count; ///< 动作次数 float32 travel_set_pt; ///< 目标行程设定值 float32 press_set_pt; ///< 目标压力设定值 date_time_t real_time; ///< 实时时间 uint32_t crc; ///< CRC校验 } rt_save_param_t; typedef struct { uint8_t unit; ///< 单位 uint16_t min_ad_value; ///< 最小AD值 uint16_t max_ad_value; ///< 最大AD值 float32 min_set; ///< 最小值 float32 max_set; ///< 最大值 uint32_t crc; ///< CRC校验 } pressure_calib_param_t; ///< 压力校准参数 typedef union { uint64_t data; struct { uint8_t app_init_over : 1; ///< app初始化完成标志:中断中有部分方法需要应用层全部初始化完成后再执行 uint8_t current_low : 1; ///< 低电流标识位,参考SYSTEM_CLOCK_HIGHT_CURRENT_MIN uint8_t lcd_detect : 1; ///< LCD检测,用于标记LCD扩展板是否存在,将反初始化LED和LCD uint8_t small_signal_deal : 1; ///< 小信号处理标志位 uint8_t tuning_enter : 1; ///< 校准进入 uint8_t auto_tuning_enter : 1; ///< 自动校准进入 uint8_t hart_rts_on : 1; ///< 用于测试HART通讯,数据发送完成标志位 uint8_t hart_send_test : 2; ///< HART发送测试 0:不发送 1:发送测试0 2:发送测试1 uint8_t calib_param_storage : 1; ///< 校准参数存储标志位,用于校验一致性 uint8_t specification_table_data_storage : 1; ///< 规格表数据存储标志位,用于校验一致性 uint8_t mode_params_storage : 1; ///< 算法存储标志位,用于校验一致性 uint8_t hart_attribute_storage : 1; ///< HART属性存储标志位,用于校验一致性 uint8_t hart_variable_storage : 1; ///< HART变量存储标志位,用于校验一致性 uint8_t hart_constant_storage : 1; ///< HART常量存储标志位,用于校验一致性 uint8_t hart_standard_variable_storage : 1; ///< HART标准变量存储标志位,用于校验一致性 } bits; } rt_data_flag_u; typedef struct { rt_data_flag_u flag; ///< 实时数据标志位 uint8_t record_algorithm_mode; ///< 设备算法模式,用于切到正常模式时恢复 uint8_t tuned_id; ///< 整定步骤 uint16_t mode_auto_load; ///< 模式自动加载,算法运行周期 ms uint16_t ip_output; ///< IP输出值 uint16_t minor_loop_normal; ///< TODO 暂不明确 uint16_t crossover_out_u; ///< 磁条反馈原始值 uint16_t humidity; ///< 设备湿度 uint32_t seconds; ///< 总共秒数 从2000年开始 float32 temperature; ///< 设备温度 float32 loop_current; ///< 回路电流 float32 target_travel; ///< 目标行程/目标位置 float32 actual_travel; ///< 实际行程(阀门行程/实际位置) float32 test_target; ///< 测试模式目标 float32 servo_feedback; ///< 伺服反馈(和实际行程的值一样) float32 pressure_s; ///< 气源压力 float32 pressure_a; ///< A路压力 float32 pressure_b; ///< B路压力 float32 pressure_s_kpa; ///< 气源压力 float32 pressure_a_kpa; ///< A路压力 float32 pressure_b_kpa; ///< B路压力 float32 pressure_cross_point; ///< 交叉点 float32 friction; ///< 摩擦力 float32 elasticity; ///< 弹簧力 float32 cpu_percent; ///< CPU使用率 float32 cpu_temperature; ///< CPU温度 float32 cpu_volt; ///< CPU内部电压 float32 board_current; ///< 板卡电流 float32 dc; ///< DCDC电压 float32 vdd; ///< VDD电压 float32 mem_percent; ///< 内存使用率 float32 driver_signal; ///< 驱动信号(百分比) ///< 系统内部参数 uint32_t storage_change; ///< 存储变化次数 float32 pid_target; // pid控制目标 float32 pid_actual; // pid控制实际 float32 show_loop; float32 show_target; float32 show_actual; uint32_t cpuid[3]; ///< CPUID } real_time_data_t; typedef struct { uint16_t pow_on_cnt_flag; ///< 上电复位标志 } flash_storage_t; ////< 驱动使能图标 typedef union { uint64_t dev; struct { uint64_t hart : 1; ///< hart模块 uint64_t bluetooth : 1; ///< 蓝牙模块 uint64_t work_mode : 3; ///< 工作模式 uint64_t write_protect : 1; ///< 写保护 uint64_t lock : 1; ///< 锁模块 } bits; } driver_icon_enable_u; typedef union { uint8_t data; struct { uint8_t reset_or_power_on : 1; ///< 复位或上电标志 FALSE: 复位 TRUE: 上电 } bits; } noinit_dat_flag_u; // 复位不清除的参数 typedef struct { uint16_t rest_flag; ///< 复位标志 noinit_dat_flag_u flag; ///< 复位或上电标志 uint8_t language; ///< 语言 uint8_t inst_mode; ///< 仪表模式 uint8_t control_mode; ///< 控制模式 uint8_t dev_algorithm_mode; ///< 定位器算法模式 uint16_t dev_model; ///< 定位器型号 float32 dead_zone; ///< 死区 int16_t travel_set_pt; ///< 目标行程设定值 uint8_t mode_params[300]; ///< 模式参数 calib_param_t loop; ///< 4-20mA校准参数 calib_param_t loop_output; ///< 4-20mA输出校准参数 calib_param_t pressure_s; uint32_t crc; ///< 校验 } noinit_data_t; // 重启不会初始化的数据 extern noinit_data_t noinit_data; ///< 复位不初始化数据 extern __IO udevice_t udevice; ///< 设备参数 extern __IO rt_save_param_t rt_save; ///< 实时保存参数 extern __IO calib_param_t calib_param[CALIBPARA_MAX]; ///< 校准参数 extern __IO real_time_data_t rt_data; ///< 实时参数 extern pressure_calib_param_t pressure_calib_param[PRESSURE_PARAM_MAX]; ///< 压力校准参数 extern mode_params_u mode_params; ///< 模式参数 extern pid_t _pid; ///< PID参数 extern driver_icon_enable_u driver_icon_enable; ///< 驱动使能图标 ///< 模拟量 extern __IO uint16_t adc_raw[ADC1_MAX]; ///< ADC原始值 extern __IO flow_event_e flow_event; ///< 任务流程状态机 ///< 函数 extern void h24_bluetooth_output_dbg(uint8_t *data, uint16_t len); ///< 蓝牙输出调试 extern void bluetooth_output(uint8_t *data, uint16_t len); ///< 蓝牙输出 extern void board_data_save(void); ///< 保存板卡参数 extern void noinit_data_set(void); ///< 复位不清除数据设置 #endif ///< __ENTITY_H__