424 lines
15 KiB
C
424 lines
15 KiB
C
#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, ///< 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;
|
||
|
||
// 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;
|
||
// 控制输出模式 1:DAC 2:PWM 3:PWMP
|
||
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__
|