439 lines
16 KiB
C
439 lines
16 KiB
C
#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__
|