#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__