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

424 lines
15 KiB
C
Raw 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 "params.h"
#include "pdctrl.h"
#include "mode.h"
#include "pid.h"
// 硬件版本号 1个字节
#ifdef V4
#define HW_VER 0x04
#elif V5
#define HW_VER 0x05
#else
#error "Please define hardware version!"
#endif
// 固件版本号 1个字节
#define FW_VER 0x02
#define HART_VERSION HART_PROTOCOL_VERSION_7 ///< HART协议版本号
#define H24_BLE_OUTPUT_DBG TRUE // 是否运行蓝牙输出数据到VOFA上位机
// CPU基准电压
#define CPU_VREF 3.0f
// 输入电流小于3.8mA
#define INPUT_CURRENT_MIN 3.8f
// 蓝牙工作电流
#define BLE_CURRENT_WORK 7.9f
// 气压表最大值
#define BAROMETER_MAX 10
// LCD最低工作稳定-20℃
#define LCD_WORK_TEMP_MIN -20
#define LOOP_CURRENT_MIN 4.0f ///< 输入电流最小值
#define LOOP_CURRENT_MAX 20.0f ///< 输入电流最大值
#define LOOP_CURRENT_WORK_MAX 12.0f ///< 工作输出最大电流下限
#define SELF_VCHART_LEN 17 ///< 自定义阀门特性长度
#define VALVE_SERIAL_NUM_LEN 16 ///< 阀门序列号长度
#define INST_SERIAL_NUM_LEN 16 ///< 定位器序列号长度
#define OUT_MAX 4095 ///< 输出最大值
/**
* ADC通道定义: 主频4、分频系数16根据公式 TCONV(转换时间) = (采样时间 + 12.5 个周期)/(主频/ADC分频系数) 计算每个通道单个采集时间
* ADC_LOOP_CHANNEL: 247.5+12.5=260个周期260/(4/16)=1040us
* ADC_PSB_CHANNEL: 47.5+12.5=60个周期60/(4/16)=240us
* ADC_BP_CHANNEL: 47.5+12.5=60个周期60/(4/16)=240us
* ADC_IPSB_CHANNEL: 640.5+12.5=653个周期653/(4/16)=2612us
* 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: 640.5+12.5=653个周期653/(4/16)=2612us
* ADC_BPB_CHANNEL: 640.5+12.5=653个周期653/(4/16)=2612us
*/
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电压
ADC_DCDC_CHANNEL, ///< IN12 DCDC检测通道
ADC_BPA_CHANNEL, ///< IN13 A路压力
ADC_BPB_CHANNEL, ///< IN14 B路压力
ADC_INVREF_CHANNEL, ///< 内部参考电压
ADC1_MAX, ///< ADC1通道最大数量
} adc1_channel_e;
/**
* ADC2 :快速通道单采集
* ADC2_PSB_CHANNEL: 2.5+12.5=15个周期15/(4/16)=60us
*/
typedef enum
{
ADC2_PSB_CHANNEL = 0, ///< 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;
// CRC预留数量
#define CRC_NUM 8 // CRC预留数量
// CRC内存索引
#define CALIBPARA_CRC 0 // 校准参数CRC
#define DEVICE_CRC 1 // 设备参数CRC
#define HART_DEVICE_VARIABLE_CRC 2 // HART设备属性CRC
#define HART_DEVICE_VARIABLE_USER_CRC 3 // HART设备用户自定义属性CRC
// CRC内存地址
#define CALIBPARA_CRC_ADDR (EE_CRC_ADDRESS + CALIBPARA_CRC * 2) // 校准参数CRC地址
#define DEVICE_CRC_ADDR (EE_CRC_ADDRESS + DEVICE_CRC * 2) // 设备参数CRC地址
#define HART_DEVICE_VARIABLE_CRC_ADDR (EE_CRC_ADDRESS + HART_DEVICE_VARIABLE_CRC * 2) // HART设备属性CRC地址
#define HART_DEVICE_VARIABLE_USER_CRC_ADDR (EE_CRC_ADDRESS + HART_DEVICE_VARIABLE_USER_CRC * 2) // HART设备用户自定义属性CRC地址
#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
{
// 版本号
uint16_t eVersion;
// 显示方向 0/180
uint16_t eDispDir;
// 主屏显示方式
uint16_t MainDisp;
// 显示语言
uint16_t eLanguage;
// 定位器Hart短地址
uint16_t DeviceAddr;
// 定位器工作模式
uint16_t WorkMode;
// 行程类型, 直行程/角行程
uint16_t eTravelType;
// 磁条规格
uint16_t MagnetIndex;
// 行程范围选择
uint16_t TravelRangeIndex;
// 自定义行程范围
uint16_t TravelRangeSelf;
// 行程百分比显示方式
uint16_t eTravelDispMode;
// 行程起点和终点反馈电压
uint16_t TravelVol0;
uint16_t TravelVol100;
// 行程显示单位
uint16_t eTravelUnit;
// 阀门打开(上行)变化速率 (%/秒),如需在5秒钟左右移动100%行程,请将其设置为 20 [%/sec]
float32 TravelRateOpen;
// 阀门关闭(下行)变化速率 (%/秒),如需在5秒钟左右移动100%行程,请将其设置为 20 [%/sec]
float32 TravelRateClose;
// 行程偏差报警点 ±%
float32 TravelError;
// 行程偏差报警等待时间(秒)(偏差超出范围的持续时间上限)
uint16_t TravelErrorWaitTime;
// 死区(%),表示在目标位置附近设置的可允许偏差。若阀门填料的摩擦力较大,可相应调整并设置此数值,
// 以防止因摩擦导致循环受限。若死区设置为0.5%则其对应范围为目标的±0.5%。
float32 TravelDead; // 0.1~10.0%
// 死区报警上限
float32 TravelDeadUpper;
// 死区更新等待时间(输入信号幅度大于当前的死区值时,阀门保持不动的时间上限,超过时间上限后更新当前死区值)
uint16_t TravelDeadUpperWaitTime;
// 累计行程上限
uint32_t TravelSumUpper;
// 动作次数上限
uint32_t ActNumberUpper;
// 高低位置报警线
float32 TravelUpperAlarm;
float32 TravelLowerAlarm;
// 开关1/2闭合触发位置 ( % of 行程, -25% ~ 125%)
float32 SWTriggerValue[2];
// 开关1/2闭合触发条件高于低于禁用
// 阀门开关触发逻辑
uint16_t eSWTriggerLogic[2];
// 输入范围低4-19mA (2位小数如 4mA = 400,20mA = 2000)
float32 InputIL;
// 输入范围高5-20mA (2位小数如 4mA = 400,20mA = 2000)
float32 InputIH;
// 输入电流报警下限
float32 InputILowAlarm;
/***************************************************************************************/
/* 压力
bar(2位小数如, 1bar = 100, 7bar = 700)
KPa或者PSI(1位小数如, 1.0Kpa = 10, 101.9KPa = 1019; 116.9PSI = 1169)
1Kpa = 0.1450377psi, 1psi = 6.894757Kpa
Mpa--0.XXXX Mpa, 1Kpa = 0.001Mpa
*/
// 压力单位
uint16_t ePressUnit;
// 输入的额定气源压力
float32 SupplyPressure;
// 气源偏差范围±%
float32 SupplyPressureError;
// 报警等待时间(秒)(偏差超出范围的持续时间上限)
uint16_t SupplyPressureErrorWaitTime;
// 整定时阀门0%--100%位置的气压值
float32 TravelPressureA0;
float32 TravelPressureA100;
float32 TravelPressureB0;
float32 TravelPressureB100;
/***************************************************************************************/
// 阀门特性
uint16_t eValveCharacteristics;
// 自定义阀门特性
uint16_t SelfVChart[SELF_VCHART_LEN];
// 小信号切除
uint16_t SmallSignalCutEnable;
// 小信号上限
float32 SmallSignalUpper;
// 小信号下限
float32 SmallSignalLower;
// 执行机构单/双作用
uint16_t eActuator;
// 定位器(控制器)正/反作用
uint16_t eControllerAction;
// 气开/气关设置(零控信号阀门状态, 0-关闭,其它打开)
uint16_t eAirAction;
// 增速器
uint16_t SpeedIncreaserEnable;
// 快排阀
uint16_t QuickExhaustValveEnable;
// 整定时,阀门动作的所需要的上下限值
uint16_t DAC_Max;
uint16_t DAC_Min;
// 放大器报警设置驱动信号下限报警等待时间控制UP或IP的驱动信号大于下限时放大器输出压力保持不变的时间上限
uint16_t DAC_AlarmWaitTime;
// 阀门全开/全关时间
uint16_t AllOpenTime;
uint16_t AllCloseTime;
// PID参数选择1自适应/2自定义
uint16_t PIDIndex;
// 自适应PID参数
float32 APID_KP;
float32 APID_TI;
float32 APID_TD;
// 自定义PID参数
float32 SPID_KP;
float32 SPID_TI;
float32 SPID_TD;
// 积分使能
uint16_t IntegralEnable;
// 积分初始值
float32 IniIntegral;
// 积分工作区域(%)
float32 IntegralZone; // 0.1~20.0%
// 报警处理方式
uint16_t eAlarmHandleMode;
// 温度报警上限
float32 TemperatureUpperAlarm;
// 温度报警下限
float32 TemperatureLowerAlarm;
// 摩擦力
float32 Friction;
// 允许的摩擦力上限
float32 FrictionUpper;
// 允许的摩擦力下限
float32 FrictionLower;
// 弹簧故障报警
// 标准弹性系数范围、弹簧提供的压力上下限允许的变化范围(根据始终点的输出气压判断)
float32 Elasticity;
// 允许的弹力范围上限
float32 ElasticityUpper;
// 允许的弹力范围下限
float32 ElasticityLower;
// 是否整定过 1整定过 0未整定
uint16_t TunedFlag;
// 记录存储间隔时间(秒)
uint16_t SaveRecordInterval;
// 开机控制方式
uint16_t ControlMode;
// PWM电流标定4ma值
uint16_t CurrentCalibrationA;
// PWM电流标定20ma值
uint16_t CurrentCalibrationB;
// 磁条接收的反馈电压由大变小 0 由小变大 1
uint16_t ProcessChange_Flag;
// DAC中间值 用于刹车
uint16_t PosMidDac_Val;
// 小回路最小值
uint16_t MinorLoopVol0_Val;
// 小回路最大值
uint16_t MinorLoopVol100_Val;
// 部分行程使能
uint16_t PartTravelEnable;
float32 PartTravelMin;
float32 PartTravelMax;
// 无线通讯使能
uint16_t WirelessCommEnable;
// PWM 4-20mA使能
uint16_t mAOutputEnable;
// 压力偏移量
float32 PressureOffset;
// 间隙控制范围 (%),当阀门的当前位置在基于最终目标位置的 GAP 参数设置范围(目标位置 ± GAP内时使用GAP PID参数
uint16_t TravelGap; // 0.1~20.0%
// TravelDAC_KVal 相差值
float32 TravelDAC_KVal_Up;
float32 TravelDAC_KVal_Dn;
// 开机通电时间
uDateTime_TypeDef uAccumulatedTime;
// 阀门序列号
uint8_t ValveSerialNum[VALVE_SERIAL_NUM_LEN];
// 仪器序列号
uint8_t InstSerialNum[INST_SERIAL_NUM_LEN];
// 阀门类型
uint16_t ValveStyle;
// 阀门尺寸
uint16_t SpecValveSize;
// 阀门等级
uint16_t SpecValveClass;
// 阀杆直径
float32 SpecValveStemDiameter;
// 包装类型
uint16_t SpecValvePackingType;
// 控制输出模式 1DAC 2:PWM 3PWMP
uint16_t SpecControlOutputMode;
// 整定结果 1成功 0失败
uint16_t TunedFlagResult;
// 定位器型号
uint16_t positioner_model;
} uDeviceTypedef;
/// 实时参数
typedef struct
{
// 动态数据:
uDateTime_TypeDef timestamp; ///< 时间戳
// uint64_t write_cnt; ///< FM24写入次数
float32 travel_target; ///< 行程目标
uint32_t travel_cnt; ///< 行程累计
uint32_t action_cnt; ///< 动作次数
float32 max_recorded_temp; ///< 最高温度记录
float32 min_recorded_temp; ///< 最低温度记录
uint32_t number_of_power_ups; ///< 上电次数
// HART 动态数据
uint8_t last_device_variable; ///< 上一个设备变量,这表示应用程序应在现场设备中找到的最后一个设备变量代码
uint16_t configuration_update_count; ///< 配置更新次数
} uRealTimeDef;
// 阀门执行机构参数
typedef struct
{
// 充/排气调节时间-阀门10%到90%或90%到10%所需要的时间,单位ms
uint32_t AdjTime;
// 纯延时时间-从进气开始到阀门开始动作的时间差,单位ms
uint32_t DelayTime;
// 最大速度
uint16_t Vmax;
// 最大速度位置
uint16_t VmaxLoc;
// 最大过冲量
uint16_t OVSmax;
} ValveParaDef;
// 驱动使能图标
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 volatile float32 calib_param[CALIBPARA_NUM][2]; ///< 校准参数
extern uDeviceTypedef uDevice; ///< 设备参数
extern mode_params_t mode_params; ///< 模式参数
extern uRealTimeDef uRtData; ///< 实时参数
extern uint8_t cpu_percent; ///< CPU使用率
extern uint8_t mem_percent; ///< 内存使用率
// 模拟量
extern volatile uint16_t adc_raw[ADC1_MAX]; ///< ADC原始值
extern volatile uint16_t ip_out; ///< DAC输出值
// 数字量
extern volatile float32 loop_current; ///< 输入电流mA
extern volatile float32 actual_travel; ///< 实际阀门位置 % (1位小数如 0~100%, 100% = 1000)
extern volatile float32 target_travel; ///< 目标阀门位置 % (1位小数如 0~100%, 100% = 1000)
extern volatile float32 pid_target; ///< pid控制目标
extern volatile float32 show_target; ///< 显示目标
extern volatile float32 pid_actual; ///< pid控制实际
extern volatile float32 show_loop; ///< 显示电流
extern volatile float32 show_actual; ///< 显示实际
extern volatile float32 show_target; ///< lcd显示目标
extern volatile float32 show_actual; ///< lcd显示实际
extern volatile float32 target_actual_diff; ///< 目标位置与实际位置的差值
extern volatile uint8_t target_direction; ///< 目标方向,0:向下,1:向上
extern volatile float32 temperature; ///< 温度
extern volatile float32 pressure; ///< 气源压力
extern volatile float32 pressureA; ///< A路压力
extern volatile float32 pressureB; ///< B路压力
extern volatile float32 range_percentage; ///< 量程百分比
extern pid_t _pid; ///< PID参数
extern driver_icon_enable_u driver_icon_enable; ///< 驱动使能图标
extern uint32_t mode_default_autoload; ///< 默认自动加载
extern void h24_bluetooth_output_dbg(uint8_t *data, uint16_t len);
#endif // __ENTITY_H__