This repository has been archived on 2025-04-02. You can view files and clone it, but cannot push or open issues or pull requests.
controller-hart/User/entity.h

782 lines
33 KiB
C
Raw Permalink 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 __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 "file_storage.h"
// 注1. 板子正常电流在2.5ma左右在超频时会有所增加但不会超过4ma如果超过4ma说明板子有问题需要检查是否短路
#define DEBUG_ENABLE TRUE ///< 是否启用调试,正式发布时请关闭。使能下:蓝牙发送调试数据
#define CPU_ENCRYPT_ENABLE TRUE ///< 是否启用加密
#define LCD_DESIGN FALSE ///< 是否运行LCD设计,TRUE模式下程序会跳过一些初始化操作直接进入LCD设计模式
#define HART_SOFTWARE_TEST_ENABLE TRUE ///< HART软件测试模式,用于中科博微测试
#define HART_HARDWARE_TEST_ENABLE FALSE ///< HART硬件测试模式,用于中科博微测试
///< 设备应用等级
#define DEV_USFEATURES DEV_USFEATURES_AC
///< 设备版本 1个字节 当前设备基于SMT32L476基础上开发
#define DW_VER 2
///< 硬件版本号 1个字节 硬件修订
#define HW_VER 12
///< 软件版本号 1个字节 软件修订
#define SW_VER 7
#define MAN_SCHEME_SERIAL_NUM "" ///< 制造方案
#define MAN_INFO_SERIAL_NUM "" ///< 印刷线路板序列号
#define PROJECT_START_YEAR 2023 ///< 项目开始年份
#define IS_CALIBRATION 0x0101 ///< 是否校准
#define BASE_YEAR 2000 ///< 基准年份
#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.1f ///< 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 INPUT_CURRENT_RUN 3.5f ///< 输入电流运行,达到这个电流程序才启动,程序會自動復位
#define SYSTEM_RUN_MIN_CURRENT 3.6f ///< 系统运行最小电流
#define SYSTEM_RUN_MAX_CURRENT 24.0f ///< 系统运行最大电流
#define LOOP_CURRENT_OFFSET 0.05f ///< 输入模拟电流偏差
#define ALGORITHM_RUN_CURRENT 6 ///< 数字模式或者测试模式下,算法运行的最小电流值,低于此值不运行算法
#define SYSTEM_CLOCK_HIGHT_CURRENT_MIN 3.8f ///< 系统高频运行的最低启动电流,瞬间被降低到以下需要能够恢复,外置存储才能加速写入;
#define INPUT_CURRENT_MIN_UART 3.6f ///< HART UART 输入电流下限3.8mA
#define GUI_RUN_CURRENT 3.8f ///< gui运行最小输入电流
#define GUI_HIGHT_CURRENT_MIN 5.0f ///< GUI高频运行的最低电流需要保证反向安装
#define BLE_CURRENT_WORK 8.0f ///< 蓝牙启动工作电流
#define LOOP_TUNE_CURRENT 10.0f ///< 自整定最小输入电流
#define SYSTEM_CLOCK_CHANGE 11059200U ///< 系统高频运行的时钟
#define SYSTEM_HART_CLOCK 460.8f
#define TEMP_MIN -25.0f ///< 温度最低-25℃
#define TEMP_MAX 70.0f ///< 温度最高70℃
#define TEMP_MIN_DEFAULT -127.0f ///< 默认温度最低-127℃
#define TEMP_MAX_DEFAULT 127.0f ///< 默认温度最高127℃
#define WORK_HOURS_MAX (24 * 365 * 50) ///< 最大工作时间24小时*365天*50年(通电时间)
#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 WIRELESS_ID_LEN 12 ///< 无线ID长度
#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 // 最大目标百分比
/**
*
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/(11/8)= 25us
* ADC_PSB_CHANNEL: 12.5+12.5=25个周期25/(11/8)=25us
* ADC_BP_CHANNEL: 12.5+12.5=25个周期25/(11/8)=25us
* ADC_IPSB_CHANNEL: 12.5+12.5=25个周期25/(11/8)=25us
* ADC_NTC_CHANNEL: 12.5+12.5=25个周期25/(11/8)=25us
* ADC_VIP_CHANNEL: 12.5+12.5=25个周期25/(11/8)=25us
* ADC_DCDC_CHANNEL: 12.5+12.5=25个周期25/(11/8)=25us
* ADC_BPA_CHANNEL: 12.5+12.5=25个周期25/(11/8)=25us
* ADC_BPB_CHANNEL: 12.5+12.5=25个周期25/(11/8)=25us
*
* 通道采集数量为400个单个采集时间为20us总共采集时间为400*20us = 8000us = 8ms
*/
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;
typedef enum
{
DEVICE_IS_RESET = 0, ///< 设备复位
DEVICE_IS_POWER_DOWN = 0x05ff, ///< 设备掉电
DEVICE_IS_ON = 0x0520,
} device_reset_flag_e;
///< 校准参数信息
typedef enum
{
CALIBPARA_LOOP = 0, ///< 420mA采集校准参数
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;
#pragma pack(1)
// 自定义特性表:每个点代表一个行程目标位置,以行程范围的百分比表示;响应的设定点以相对设定值的百分比来表示
typedef struct
{
uint8_t points;
uint16_t setpoint[SELF_VCHART_LEN]; ///< 设定点 计算公式100*(值-2048)/8192
uint16_t value[SELF_VCHART_LEN]; // 行程目标位置 计算公式100*(值-2048)/8192
uint8_t travel_char; ///< 行程特性 ,用于和当前行程特性对比
} custom_property_table_t;
#pragma pack()
#pragma pack(1)
////< 参数校准
typedef struct
{
uint16_t is_calibration; ///< 是否校准
int16_t offset; ///< 偏移
int16_t span; ///< 跨度
uint16_t original_adc_value[2]; ///< ADC值
float32 min; ///< 最小值,用作分子
float32 max; ///< 最大值,用作分子
float32 slope; ///< 斜率
uint32_t random; ///< 随机数
} calib_param_t;
#pragma pack()
////< 校准记录
typedef struct
{
uint32_t operation_time; ///< 时间 4字节
uint8_t control_byte; ///< 控制字节
uint8_t operator[OPERATOR_NAME_LEN]; ///< 人员 25字节
} calib_record_t;
#pragma pack(1)
////< 设备基础参数
typedef struct
{
///< 定位器硬件版本号
uint8_t dev_hw_version;
///< 定位器软件版本号
uint8_t dev_sw_version;
///< 定位器算法模式 详见mode_algorithm_e
uint8_t dev_algorithm_mode;
///< 执行机构行程
// uint8_t value_travel;
///< 自定义执行机构行程
// uint8_t self_value_travel;
///< 写入保护禁用/使能
uint8_t write_protect_enable;
///< 增速器禁用/使能
// uint8_t speed_increaser_enable;
///< 快排阀禁用/使能
// uint8_t quick_exhaust_enable;
///< 无线通讯禁用/使能模拟下需要大于20ma其他模式大于7.5ma
uint8_t wireless_enable;
///< 无线ID
uint8_t wireless_id[WIRELESS_ID_LEN];
///< 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;
/// @brief 诊断功能禁用/使能
BOOL diagnosis_enable;
///< 报警处理方式
uint8_t alarm_handle_mode;
///< 复位处理方式
uint8_t reset_handle_mode;
///< 力学单位(摩擦力/弹簧力)
// uint8_t force_unit;
///< 信号切除禁用/使能
uint8_t travel_cut_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;
///< 记录存储间隔时间(秒)
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 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 + 1];
///< 仪器序列号(仪表序列号)
uint8_t dev_serial_num[INST_SERIAL_NUM_LEN + 1];
///< 印刷线路板序列号
uint8_t man_info_serial_num[MAN_SERIAL_NUM_LEN + 1];
///< 制造方案序列号
uint8_t man_scheme_serial_num[MAN_SERIAL_NUM_LEN + 1];
///< 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_condition_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_enable;
///< 重启仪器模式
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 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 cutoff_limit_hi;
///< 切除/限位下限
float32 cutoff_limit_lo;
///< 最低记录温度
float32 min_temp;
///< 最高记录温度
float32 max_temp;
///< 自定义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[PACKED6_LEN];
///< 设备状态报警使能
uint8_t device_specific_status_enable[PACKED6_LEN];
///< 校准记录
calib_record_t calib_record;
/************** 下面定义的参数只供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;
} udevice_t;
#pragma pack()
#pragma pack(1)
typedef union
{
uint16_t data;
struct
{
uint8_t rtc_need_calibrate : 1; ///< RTC需要校准(设备通电后该标志位置1)
} bits;
} rt_save_flag_u;
typedef struct
{
rt_save_flag_u flag; ///< 标志位
uint8_t last_dev_variable; ///< 上一个设备变量?
uint8_t work_menu_index; ///< 工作菜单索引
int8_t mode_control_stable_temperature; ///< 整定稳定温度值
int16_t mode_control_offset; ///< 模式控制偏移量
uint16_t diagnosis_log_node_write_count; ///< 诊断日志写入数量
uint16_t diagnosis_log_node_start_offset_index; ///< 诊断日志起始偏移索引
uint16_t power_on_cnt; ///< 设备上电次数/通电次数
uint16_t reset_cnt; ///< 设备复位次数
uint32_t travel_count; ///< 行程次数
uint32_t travel_accum; ///< 累计行程
uint32_t cycle_count; ///< 动作次数
float32 travel_set_pt; ///< 目标行程设定值
float32 press_set_pt; ///< 目标压力设定值
// 重置不要清除的参数
uint16_t dev_run_time_s; ///< 设备工作时长(秒)
uint32_t dev_run_time_h; ///< 设备工作时长(小时)
date_time_t real_time; ///< 实时时间
} rt_save_param_t;
#pragma pack()
typedef struct
{
uint8_t unit; ///< 单位
uint16_t min_ad_value; ///< 最小AD值
uint16_t max_ad_value; ///< 最大AD值
float32 min_set; ///< 最小值
float32 max_set; ///< 最大值
} pressure_calib_param_t; ///< 压力校准参数
typedef union
{
uint64_t data;
struct
{
uint8_t dbg_assert_reset : 1; ///< 断言复位标志位(测试)
uint8_t app_init_over : 1; ///< app初始化完成标志:中断中有部分方法需要应用层全部初始化完成后再执行
uint8_t auto_tuning_enter : 1; ///< 自动校准进入
uint8_t ble_on : 1; ///< 蓝牙使能
uint8_t current_low : 1; ///< 低电流标识位参考SYSTEM_CLOCK_HIGHT_CURRENT_MIN
uint8_t lcd_detect : 1; ///< LCD检测,用于标记LCD扩展板是否存在将反初始化LED和LCD
uint8_t hart_on : 1; ///< HART使能
uint8_t hart_rts_on : 1; ///< 用于测试HART通讯,数据发送完成标志位
uint8_t hart_send_test : 2; ///< HART发送测试 0:不发送 1:发送测试0 2:发送测试1
uint8_t tuning_enter : 1; ///< 校准进入
uint8_t real_time_idel : 1; ///< 实时时间准备就绪
uint8_t input_loop_current_lo : 1; ///< 输入低电流标识位
uint8_t input_loop_current_hi : 1; ///< 输入高电流标识位
uint8_t low_power : 1; ///< 低功耗标志位
uint8_t valve_stuck : 1; ///< 阀门卡死标志位
uint8_t small_signal_deal : 1; ///< 小信号处理标志位
uint8_t loop_set_point_lo : 1; ///< 回路设定点低标识位
uint8_t loop_set_point_hi : 1; ///< 回路设定点高标识位
uint8_t loop_deviation : 1; ///< 回路偏差标识位
uint8_t loop_feedback_lo : 1; ///< 回路反馈低标识位
uint8_t loop_feedback_hi : 1; ///< 回路反馈高标识位
uint8_t loop_feedback_lo_lo : 1; ///< 回路反馈低低标识位
uint8_t loop_feedback_hi_hi : 1; ///< 回路反馈高高标识位
// 存储类
uint8_t calib_param_storage : 1; ///< 校准参数存储标志位,用于校验一致性
uint8_t mode_params_storage : 1; ///< 算法存储标志位,用于校验一致性
uint8_t specification_table_data_storage : 1; ///< 规格表数据存储标志位,用于校验一致性
uint8_t udevice_storage : 1; ///< 设备存储标志位,用于校验一致性
uint8_t rt_save_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 tuned_id; ///< 整定步骤
uint16_t ip_output; ///< IP输出值
float32 ip_current; ///< IP驱动电流
uint16_t minor_loop_normal; ///< TODO 暂不明确
uint16_t crossover_out_u; ///< 磁条反馈原始值磁条ADC采样值
uint16_t crossover_out; ///< 变化点(与行程有关,平衡点输出)
float32 temperature; ///< 设备温度
uint16_t humidity; ///< 设备湿度
float32 temperature2; ///< 设备温度
uint32_t timestamp; ///< 时间戳
float32 loop_current; ///< 回路电流
float32 travel_set_pt; ///< 行程设定点,实际设置,不做任何处理的数值
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; ///< 驱动信号(百分比)
uint16_t hart_run_time_h; ///< 需要将dev_run_time_h/18得到hart_run_time_h 按照1=18小时计算
///< 系统内部参数
uint8_t storage_used_page_count; ///< 存储页数使用次数使用的是FM24總共有128頁
uint32_t storage_change; ///< 存储变化次数
float32 pid_target; // pid控制目标
float32 pid_actual; // pid控制实际
float32 show_loop;
float32 show_target;
float32 show_actual;
float32 output_current; ///< 输出电流
uint8_t cpuid[16]; ///< CPUID
uint32_t cpuid_32[3]; ///< CPUID 32位
struct
{
uint16_t task; ///< 任务周期
uint16_t mode; ///< 模式周期
uint16_t mode_gathe; ///< 模式采集周期
uint16_t hart; ///< HART周期
} time_cycle; ///< 定时器周期 ms
// HART 变量
hart_device_variable_t *drive_signal; ///< 驱动信号
hart_device_variable_t *travel_setpoint; ///< 阀门设置点
hart_device_variable_t *implied_valve_position; ///< 行程设置点
} 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;
extern __IO device_reset_flag_e reset_flag; ///< 复位标志
extern __IO udevice_t udevice; ///< 设备参数
extern __IO rt_save_param_t rt_save; ///< 实时保存参数
extern __IO calib_param_t calib_param[CALIBPARA_MAX]; ///< 校准参数
extern 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 BOOL in_correct_model(void); ///< 是否在正确的模式
#endif ///< __ENTITY_H__