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

439 lines
16 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 "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, ///< 420mA采集校准参数
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__