#ifndef __ENTITY_H__ #define __ENTITY_H__ #include "lib.h" #include "adcs.h" #include "pid.h" #include "params.h" #include "pdctrl.h" #include "mode.h" #define CPU_ENCRYPT_ENABLE FALSE // 是否启用加密 #define H24_BLE_OUTPUT_DBG TRUE // 是否运行蓝牙输出数据到VOFA上位机 #define LCD_DESIGN FALSE // 是否运行LCD设计,TRUE模式下程序会跳过一些初始化操作,直接进入LCD设计模式 // 硬件版本号 1个字节 #ifdef V4 #define HW_VER 0x04 #elif V5 #define HW_VER 0x05 #else #define HW_VER 0x00 #endif // 软件版本号 1个字节 #define SW_VER 0x01 // 固件版本号 1个字节 #define FW_VER 0x03 #define HART_VERSION HART_PROTOCOL_VERSION_7 ///< HART协议版本号 #define CPU_VREF 2.5f ///< CPU基准电压 #define CPU_UGAGE_MAX 90.0f ///< CPU使用率最大值 #define MEM_UGAGE_MAX 90.0f ///< 内存使用率最大值 #define INPUT_CURRENT_MIN 3.8f ///< 输入电流下限3.8mA #define BLE_CURRENT_WORK 7.9f ///< 蓝牙工作电流 #define LOOP_CURRENT_MIN 4.0f ///< 输入电流最小值 #define LOOP_CURRENT_MAX 20.0f ///< 输入电流最大值 #define LOOP_CURRENT_WORK_MAX 12.0f ///< 工作输出最大电流下限 #define LCD_WORK_TEMP_MIN -20 ///< LCD最低工作稳定-20℃ #define BAROMETER_MAX 10 ///< 气压表最大值 #define SELF_VCHART_LEN 17 ///< 自定义阀门特性长度 #define VALVE_SERIAL_NUM_LEN 16 ///< 阀门序列号长度 #define INST_SERIAL_NUM_LEN 16 ///< 定位器序列号长度 #define OPERATOR_NAME_LEN 26 ///< 操作员姓名长度 #define PASSWORD_LEN 4 ///< LCD主菜单页面进入密码长度 /** * ADC通道定义: 主频4、分频系数16,根据公式 TCONV(转换时间) = (采样时间 + 12.5 个周期)/(主频/ADC分频系数) 计算每个通道单个采集时间 * ADC_LOOP_CHANNEL: 640.5+12.5=653个周期,653/(4/16)=2612us * ADC_PSB_CHANNEL: 47.5+12.5=60个周期,60/(4/16)=240us * ADC_BP_CHANNEL: 47.5+12.5=653个周期,60/(4/16)=240us * ADC_IPSB_CHANNEL: 47.5+12.5=653个周期,60/(4/16)=240us * ADC_NTC_CHANNEL: 640.5+12.5=653个周期,653/(4/16)=2612us * ADC_VIP_CHANNEL: 640.5+12.5=653个周期,653/(4/16)=2612us * ADC_DCDC_CHANNEL: 640.5+12.5=653个周期,653/(4/16)=2612us * ADC_BPA_CHANNEL: 47.5+12.5=653个周期,60/(4/16)=240us * ADC_BPB_CHANNEL: 47.5+12.5=653个周期,60/(4/16)=240us * * 通道采集数量为30个,单个采集时间为240us,总共采集时间为30*240=7200us = 7.2ms */ 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_INVREF_CHANNEL, ///< 内部参考电压 ADC_TEMP_CHANNEL, ///< 内部参考温度 // 下面的定义和ADC中的存储没有关系 ADC_FLOW, ///< 流量传感器 ADC1_MAX, ///< ADC1通道最大数量 } adc1_channel_e; /** * ADC2 :慢速通道单采集 * ADC_LOOP_CHANNEL: 640.5+12.5=653个周期,653/(4/64)= 10448us * ADC_PSB_CHANNEL: 640.5+12.5=653个周期,653/(4/64) = 10448us */ typedef enum { ADC2_LOOP_CHANNEL = 0, ///< IN5 输入电流ADC通道 ADC2_PSB_CHANNEL, ///< IN6 阀位反馈ADC通道 ADC2_MAX, ///< ADC2通道最大数量 } 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_NUM = 7, ///< 校准参数数量 } calibration_e; // 任务流程状态机 typedef enum { FLOW_EVENT_NORMAL, ///< 正常任务流程 FLOW_EVENT_DIAGNOSIS, ///< 诊断任务流程 } flow_event_e; #pragma pack(1) // 编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式 /// 时间结构 typedef union { uint8_t Byte[6]; struct { uint8_t Year; uint8_t Month; uint8_t Day; uint8_t Hour; uint8_t Minute; uint8_t Second; } Date; } uDateTime_TypeDef; /// 参数校准 typedef struct { BOOL is_calibration; ///< 是否校准 float32 value[2]; ///< 校准参数 } calib_param_t; /// 设备基础参数 typedef struct { // 定位器序列号 uint8_t dev_serial_num[INST_SERIAL_NUM_LEN]; // 定位器版本号 uint32_t dev_version; // 定位器硬件版本号 uint8_t dev_hw_version; // 定位器软件版本号 uint8_t dev_fw_version; // 定位器型号 uint16_t dev_model; // 定位器HART短地址(轮询地址)(作废,从HART模块获取) // uint8_t dev_hart_addr; // 定位器作用方向:正作用/反作用 uint8_t dev_driver_dir; // 定位器安装方向 // 0 = 反向安装,磁条反馈ADC值上小下大 // 1 = 正向安装,磁条反馈ADC值上大下小 uint8_t dev_install_dir; // 定位器工作模式 // 0 = 自动模式,根据4~20mA控制阀位 // 1 = 手动模式,根据设定目标值控制阀位 // 2 = 测试模式,在测试定位器部分功能时,必须在测试模式下进行 // 3 = 非投用模式,阀门复位,定位器禁用信号控制功能 // 4 = 待机模式,阀门保持,定位器禁用信号控制功能 uint8_t dev_work_mode; // 定位器算法模式 详见:mode_algorithm_e uint8_t dev_algorithm_mode; // 定位器控制模式 1 = 位置控制模式,2 = 压力控制模式 uint8_t dev_ctrl_mode; // 执行机构类型 uint8_t value_type; // 执行机构尺寸 uint8_t valve_size; // 执行机构行程 uint8_t value_travel; // 自定义执行机构行程 uint8_t self_value_travel; // 执行机构行程类型:直行程/角行程 uint8_t value_travel_type; // 执行机构气动类型:气开/气关 uint8_t value_action_type; // 执行机构作用类型:单作用/双作用 uint8_t value_relay_type; // 阀门特性 uint8_t valve_chart; // 自定义阀门特性 uint16_t self_value_chart[SELF_VCHART_LEN]; // 磁条规格 uint8_t magnet_spec; // 写入保护禁用/使能 uint8_t write_protect_enable; // 压力传感器使能 uint8_t press_sensor_enable; // 增速器禁用/使能 uint8_t speed_increaser_enable; // 快排阀禁用/使能 uint8_t quick_exhaust_enable; // 无线通讯禁用/使能 uint8_t wireless_enable; // PWM输出电流禁用/使能 uint8_t output_current_enable; // 输出开关触发逻辑 uint8_t swo_logic[2]; // 输出开关触发位置 float32 swo_value[2]; // 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 temperature_unit; // 电流单位 uint8_t current_unit; // 行程单位 uint8_t travel_unit; // 压力单位 uint8_t press_unit; // 力学单位(摩擦力/弹簧力) uint8_t force_unit; // 死区(%),表示在目标位置附近设置的可允许偏差。若阀门填料的摩擦力较大,可相应调整并设置此数值, // 以防止因摩擦导致循环受限。若死区设置为0.5%,则其对应范围为目标的±0.5%。 float32 travel_dead; // 0.1~10.0% // 模拟输入范围上限,单位:mA float32 input_upper; // 模拟输入范围下限,单位:mA float32 input_lower; // 温度范围上限,单位:摄氏度 float32 temp_upper; // 温度范围下限,单位:摄氏度 float32 temp_lower; // 供应压力范围上限,单位:kpa float32 supply_upper; // 供应压力范围下限,单位:kpa float32 supply_lower; // 摩擦力范围上限 float32 friction_upper; // 摩擦力范围下限 float32 friction_lower; // 弹簧力范围上限 float32 elasticity_upper; // 弹簧力范围下限 float32 elasticity_lower; // 行程范围上限,单位:百分比 float32 travel_upper; // 行程范围下限,单位:百分比 float32 travel_lower; // 行程报警死区:行程回归超过死区,认为回归正常范围 float32 travel_alert_dead; // 小信号切除禁用/使能 uint8_t travel_cut_enable; // 小信号上限 float32 travel_cut_upper; // 小信号下限 float32 travel_cut_lower; // 分程控制禁用/使能 uint8_t part_travel_enable; // 分程控制上限 float32 part_travel_upper; // 分程控制下限 float32 part_travel_lower; // 累计行程上限 float32 travel_sum_upper; // 累计行程死区:行程超过累计行程死区时,计算累计行程 float32 travel_sum_dead; // 动作次数上限 uint32_t act_sum_upper; // 动作次数死区:行程超过动作次数死区时,计算动作次数 float32 act_sum_dead; // 供应压力 float32 supply_press; // 供应压力偏差(百分比) float32 supply_error; // 供应压力偏差报警等待时间 uint16_t supply_error_time; // 参考电压 float32 vref; // 参考电压偏差 float32 vref_error; // 参考电压偏差报警等待时间 uint16_t vref_error_time; // 行程偏差 float32 travel_error; // 行程偏差报警等待时间(秒)(偏差超出范围的持续时间上限) uint16_t travel_error_time; // 阀门打开(上行)变化速率 (%/秒),如需在5秒钟左右移动100%行程,请将其设置为 20 [%/sec] float32 travel_rate_open; // 阀门关闭(下行)变化速率 (%/秒),如需在5秒钟左右移动100%行程,请将其设置为 20 [%/sec] float32 travel_rate_close; // 阀门全开时间 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; // 整定标志 0:未整定,1:整定中,2:整定成功,3:整定失败 uint8_t tuned_flag; // PID参数选择,0 = 自适应,1 = 自定义 uint8_t pid_index; // 自适应PID参数 float32 apid_kp; float32 apid_ki; float32 apid_kd; float32 apid_dead; // 自定义PID参数 float32 spid_kp; float32 spid_ki; float32 spid_kd; float32 spid_dead; // PWM输出电流校验4ma采样值 uint16_t output_4ma_duty; // PWM输出电流标定20ma采样值 uint16_t output_20ma_duty; // 输入电流ADC原始值 uint16_t input_raw; // 输入电流偏移 uint16_t input_offset; // 输入电流跨度 uint16_t input_span; // 气源压力ADC原始值 uint16_t press_s_raw; // 气源压力偏移 uint16_t press_s_offset; // 气源压力跨度 uint16_t press_s_span; // A路压力ADC原始值 uint16_t press_a_raw; // A路压力偏移 uint16_t press_a_offset; // A路压力跨度 uint16_t press_a_span; // B路压力ADC原始值 uint16_t press_b_raw; // B路压力偏移 uint16_t press_b_offset; // B路压力跨度 uint16_t press_b_span; // 记录存储间隔时间(秒) uint16_t save_cycle; // 配置时间(时间戳) uint32_t operating_time; // 配置人员 uint8_t operator[OPERATOR_NAME_LEN]; // 行程设定点 float32 travel_setpoint; // LCD主菜单页面进入密码长度 uint8_t menus_main_password[PASSWORD_LEN]; } device_typedef; /// 设备实时参数 typedef struct { __IO uint32_t travel_cnt; // 累计行程 __IO uint32_t act_cnt; // 动作次数 __IO uint32_t dev_work_time; // 设备工作时长 __IO uint32_t power_on_cnt; // 设备上电次数 uint8_t last_dev_variable; // 上一个设备变量 uint16_t cfg_update_cnt; // 配置更新次数 __IO uDateTime_TypeDef real_time; // 实时时间 } rt_save_param_t; typedef struct { __IO uint8_t tuned_id; // 整定步骤 __IO uint16_t ip_output; // IP输出值 __IO float32 temperature; // 设备温度 __IO float32 loop_current; // 回路电流 __IO float32 target_travel; // 目标行程 __IO float32 actual_travel; // 实际行程 __IO float32 pressure_s; // 气源压力 __IO float32 pressure_a; // A路压力 __IO float32 pressure_b; // B路压力 __IO float32 friction; // 摩擦力 __IO float32 elasticity; // 弹簧力 __IO float32 cpu_percent; // CPU使用率 __IO float32 cpu_temperature; // CPU温度 __IO float32 mem_percent; // 内存使用率 rt_save_param_t save; // 需要保存到FM24的实时参数 } real_time_data_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; #pragma pack() // 编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式 extern device_typedef udevice; ///< 设备参数 extern __IO calib_param_t calib_param[CALIBPARA_NUM]; ///< 校准参数 extern real_time_data_t rt_data; ///< 实时参数 extern mode_params_t 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 uint32_t mode_default_autoload; ///< 默认自动加载 // 数字量 extern __IO float32 pid_target; ///< pid控制目标 extern __IO float32 pid_actual; ///< pid控制实际 extern __IO float32 show_loop; ///< 显示电流 extern __IO float32 show_target; ///< 显示目标 extern __IO float32 show_actual; ///< 显示实际 extern __IO float32 range_percentage; ///< 量程百分比 extern __IO flow_event_e flow_event; ///< 任务流程状态机 // 函数 extern void h24_bluetooth_output_dbg(uint8_t *data, uint16_t len); ///< 蓝牙输出调试 extern void h24_bluetooth_output(uint8_t *data, uint16_t len); ///< 蓝牙输出 #endif // __ENTITY_H__