MS-DTU/MS-DTU-V1/User/TankPrediction.h

443 lines
13 KiB
C
Raw Permalink Normal View History

2025-04-03 14:18:58 +08:00
#ifndef __ALGORITHM_H__
#define __ALGORITHM_H__
#pragma pack(push, 1)
#define DatasNumber 1 //数据最大数量
//cqr 20230224修改
//罐箱参数
struct TankPara
{
/////第2类一次性下发的算法固定常数按后面的注释值赋值所有常数变量在苏醒后需要读入
float DL0; // 0.05 =====液位差判断基准==4G输入给出
float Dis_0; // 1000
float DT_0; //采样时间周期ΔT 整型常数变量 1 小时
float T_0; // 150 =====温度判断基准==4G输入给出
float Stable_Day;// 1 ====静置天数==4G输入给出
float Lamda_0; // 0.1
float L_0; // 充装状态判断条件Φ0 0.75 =====液位判断基准==4G输入给出
float Eta_V; // 0.95 =====容积安全系数==4G输入给出
float Pa_0; // 0.1013
float Tc_0; // =273.15+30 = 303.15
float R_0; // 8.314
float MTime_0; // 300
float Fai_bz0; // 0.95
short int Nday_0;// 整型常数 20 平均日漏热量计算周期CT
short int Tz_0; // 内能计算间隔周期tz 整型常数 24小时
float Fai_0; // 0.75 =====充装率判断基准==4G输入给出
float Mavg_0; // 16
float Pcr_0;// 常数 4.59
float QHQR_0 ; // 511.12 =====标态LNG气化潜热==4G输入给出
float RhoLng_0; // 434.15
float K_1; // 0.6583 =====标态LNG和液氮气化潜热转换系数=4G输入给出
float Default_CH4;// 0.95 ====默认甲烷成分==4G输入给出
float VN_0; //常数 0.01191
float Nx_0; // 0.35
float Ny_0; // 0.5
float Nz_0; // 0.15
float Kymax; //常数 1.1
float Kymin; //常数 0.8
float Da_0; // 0.00202
float Db_0; // -0.023
float Dc_0; // 0.0125
float Dd_0; // -0.0309
//预留
float Default_C2; // 默认C2成分比
float Default_C3; // 默认C3成分比
float Default_C4; // 默认C4成分比
float Default_N2; // 默认N2成分比
float TimeYJ; // 安全阀起跳预警值
float RJJ; // 结果相关性修正系数—截距
float RXL; // 结果相关性修正系数—斜率
float RQP; // 结果相关性修正区间起始压力
float QZP; // 结果相关性修正区间终止压力
float ZQQ; // 重罐轻罐权重系数-气相导热系数
float ZQY; // 重罐轻罐权重系数-液相导热系数
float ZQFai0; // 重罐轻罐权重修正起始充装率
float ZQFaiN; // 重罐轻罐权重修正终止充装率
short int SFKZ1; // 算法控制参数1(是否启用区间结果相关性修正)
short int SFKZ2; // 算法控制参数2重罐-轻罐权重系数)
short int SFKZ3; // 算法控制参数3临界参数你和修正
short int SFKZ4; // 算法控制参数4温度系数K2修正
short int SFKZ5; // 算法控制参数5日漏热量修正
short int SFKZ6; // 算法控制参数6罐箱用途
float Tcr; //临界温度
float dTmax; //罐内最大温差
float dTP; //安全阀起跳状态判断参数
float csY3;// 常数预留变量
float csY4;
float csY5;
float csY6;
float csY7;
float csY8;
float csY9;
float csY10;
/////
//////////////////////////////////////////////////////////////////////////
////第3类 罐箱固定参数
float P75;//满罐安全阀起跳压力,文件输入
float a20; //液氮静态蒸发率,文件输入
float TankVolYX; // 有效容积,文件输入
float TankVol; // 总容积,文件输入
float D; // 罐子直径
float fai; // 额定充装率,文件输入
short int GT;//罐箱用途 运输罐箱为01燃料罐箱为02
short int TankType; // 罐箱绝热型式,文件输入
short int ZC;//罐箱支撑型式 01代表两点支撑02代表8点支撑02为默认值
float ZKD; //真空度
float Phz; // 安全阀回座压力
float minFai;//最小可识别充装率
float RL; // 罐箱圆柱段长度
float gxY3;// 预留参数
float gxY4;
float gxY5;
float gxY6;
float gxY7;
float gxY8;
float gxY9;
float gxY10;
////////// 第5类 组分航次参数,营运输入,每航次变更
float ch4; // 甲烷成分比
float C2; // C2摩尔百分比体积比
float C3; // C3摩尔百分比体积比
float C4; // C4摩尔百分比体积比
float N2; // N2摩尔百分比体积比
float hcY1;//航次预留系数
float hcY2;
float hcY3;
float hcY4;
float hcY5;
float hcY6;
float hcY7;
float hcY8;
float hcY9;
float hcY10;
//////////////////////////////////////////////////////////////////////////
////第1类 运行时的实时数据,苏醒后需要读入
int isStart; // 是否开始预报
float QDay_0; //日漏热量
float mMin; // 最小安全质量,空罐最大允许剩余量 ,用于是否空罐的判断
float aLNG20; //LNG静态蒸发率a20*k1,k1=0.6583
float QdLNG20; // 根据静态蒸发率计算的标态每日漏热量
float faiMax; //极限充装率
float m0; //总质量
float RhoLNG0; // 标态LNG饱和液体密度根据甲烷成分比按P=0插值计算
float QHQR0; // 标态LNG饱和液体气化潜热,取为定值511.12
float Pn;// 终了起跳压力,文件输入;在涨罐压力和满罐起跳压力之间取小者
float Qn;//终了内能
float TAvg;//平均温度,(T0+Tn)/2
float Qn_kg;//空罐终了内能 20230224
float WE0;
float SN0; //初始
float ZeroL; // 初始充装率
double ZeroDate; // 初始时间
float ForeCast_Sec; // 离满足条件的标记0时刻的时间长度单位秒-1代表未标记满足条件0时刻非-1代表当前离标记0时刻的时间长度单位秒,这个未扣除稳定期时间长度
float ForeCast_Date; //开始预报日期天数,-1不预报非-1代表第多少天的预报ForeCast_Date = (ForeCast_Sec - StablePeriod)/ 3600 / 24 //这个扣除了稳定期时间长度其0值即代表预报开始的0时刻单位天
unsigned char ZeroDate_Str[12]; /// 苏醒后需要读入
//unsigned char PreDate_Str[12]; /// 苏醒后需要读入 //cqr-20230117
double preDate; //cqr-20230117
float Pre_fai; //前一时刻的充装率 cqr-2023 新增
//每日24小时漏热量记录数据
short int nhour; //记录小时数
// int nData; // 每天读取数据条数
short int ihour;// 记录数据个数
short int iQday;
float Qhour[24];
float hour[24];
float dQi[24];
//每日漏热量记录数据
short int nday; //记录天数
short int nData; // 每天读取数据条数
float DayNow;
short int iday;// 记录数据个数
float Qi_0; // 起始时间的内能
float Qi; // 当天内能
float QdAvg;
float Qday[20];
short int day[20]; //记录Qday对应的天数
float Qi_kg;//空罐当前内能 20230224
//jzw 20230228 记录质量数据
short int isChange;//判断质量是否进行初始化赋值(实时计算) 0初始化 1不初始化
short int isCal; //判断是否进行质量计算 0不计算 1计算
float Mhour[12]; //质量数组
short int iMhour; //质量个数
//jzw 20230301 判断安全阀起跳相关数据
short int isBreak; //是否起跳 0未起跳 1起跳
float Pre_P;//上一实测压力
double breakDate; // 安全阀起跳时刻
float Mbreak[12];
short int iMbreak; //质量个数
////////////////////// 中间结果
float P0;// 初始压力
float T0;//初始温度
float Q0; // 初始内能
float Tn;//终了温度根据Pn计算得到
float RhoLimit;// 最小液体密度
float RhoLn;// 起跳压力对应的液体密度, 用于是否涨罐的判断
float Dis; // 根据经纬度计算的移动距离
float Record_Tg;//存储每次从传感器读的数据,气体温度
float Record_Tl;//存储每次从传感器读的数据,气体温度
float LQdLng1;// 理论日漏热量
float SQdLng2;//需要输入
float lamda; //时间安全系数
float VLp;//压力计算得到液相体积
float VLf;//充装率计算得到液相体积
float VGp;//压力计算得到气相体积
float VGf;//充装率计算得到气相体积
float TLp;//压力计算得到液相温度
float TavgL;//液相平均温度
float K2; //k2修正系数
float Ky; //运动修正
float Kr; //Russa修正
float Kf; //热不均匀修正
///////////
float P;
float Pm;
float VL;
float RhoL;
float HL;
float QL;
float VG;
float RhoG;
float HG;
float QG;
float PQ;
float Pfai;
float PRhoLimit;
float PQdLNG;
float VLavg;//平均液相体积
float fai_p; //实时压力插值计算充装率
float VGavg;//平均液相体积
float mG;//液相质量 cqr-201301
float mL;//气相质量 cqr-201301
float rhoG;//液相密度 cqr-201301
float rhoL;//气相密度 cqr-201301
float rhoL_n;//终了气相密度 cqr-201301
float rhoG_n;//终了液相密度 cqr-201301
///////////////////////////////////////////////////////////////
///////////////////////////////////////
////第6类计算结果
float MaintainTime; // 预报维持时间
int sfbm;//算法编码
double ztbm; //状态编码 jzw 20230303
int sfrz1; //15位 日志编码
int sfrz2; //预留日志
int sfrz3; //预留日志
float BOG;//BOG释放量
float XHL;//燃料平均日消耗量
float jgY1; //结果预留变量
float jgY2;
float jgY3;
float jgY4;
float jgY5;
float jgY6;
float jgY7;
float jgY8;
float jgY9;
float jgY10;
//////// 拟合并进日志编码 //////////////////////////
// int RZ[50];
///// 拟合并进状态编码
//20220506增加变量
short int CY;//储运状态 01静置02运输03充装04利用05异常
short int CZ;//充装状态 11满罐12涨罐21空罐起跳22空罐不起跳
short int LR;//满罐计算方法01 理论 ,02 实测 , 03 综合
short int GJ; //告警信号 02 温度高于150K
short int YJ;//预警信号
//int DisplayInfo; // 预报状态
///// 重复变量,拟去除 //////////////////////////
//cqr 增加2个变量
//int TankState;
//int CalModel;
};
////中间计算数据
//实时物化参数
struct PhysicochemicalPara
{
float ch4;//甲烷成分比
float P; // 压力
float m; // 总质量
float VL; //液体体积
float RhoL; //液体密度
float HL; // 液体焓值
float QL; // 液体内能
float VG; //气体体积
float RhoG; //气体密度
float HG; // 气体焓值
float QG; // 气体内能
float Q; //内能
float fai;//充装率
float RhoLimit;// 最小液体密度
float QdLNG; // 实测每日漏热量
float Amp; // 运动幅度
float fr; //运动频率
};
////中间计算数据
//每日漏热量记录
struct DailyHeatLoss
{
short int nday; //记录天数
short int nData; // 每天读取数据条数
float DayNow;
int iday;// 记录数据个数
float Qi_0; // 起始时间的内能
float Qi; // 当天内能
float QdAvg;
float Qday[20];
short int day[20]; //记录Qday对应的天数
};
////实时采集数据
struct MonitoringData
{
double Record_ID;//存储每次从传感器读的数据ID
//unsigned char Record_Date[12]; //存储每次从传感器读的数据,日期时间
double Record_Date;
float Record_T;//存储每次从传感器读的数据,温度
float Record_P;//存储每次从传感器读的数据,压力,
float Record_L;//存储每次从传感器读的数据,充装率
float Record_Amp_x;//运动幅度
float Record_Amp_y;//运动幅度
float Record_Amp_z;//运动幅度
float Record_fr_x;//运动频率
float Record_fr_y;//运动频率
float Record_fr_z;//运动频率
float Record_OutT;//环境温度
//20220506增加变量
float WE;//经度
float SN;//纬度
float Record_Tg;//存储每次从传感器读的数据,气体温度
float Record_Tl;//存储每次从传感器读的数据,气体温度
float Yewei;//液位
float zkd;// 真空度
float dP; //压差
float mdY2;// 预留变量
float mdY3;
float mdY4;
float mdY5;
float mdY6;
float mdY7;
float mdY8;
float mdY9;
float mdY10;
};
#pragma pack(pop)
//计算函数正式定义在main函数后面
void SetTankPara(struct TankPara *tank);
void InitConstantPara(struct TankPara *tank);
void InitTankPara(struct TankPara *tank);//cqr-20230213
void InitLoadPara(struct TankPara *tank);//cqr-20230219
void PredictTime( struct MonitoringData * MData, struct TankPara * tank );
void TankInit(int InitTime, struct TankPara *tank, struct MonitoringData *data);
void ConvertDateFormat(double Record_Date, struct tm *Date_Str ); //转换日期格式
void SaveDailyHeatLoss( struct TankPara * Qds );
float Calculate_m(struct TankPara *tank ,struct MonitoringData *data);
void CalculatePhyChemPara(struct TankPara *tank, float p, struct PhysicochemicalPara *PCi );
float CalculateLiquidTemperature(float ch4,float x);
float CalculateLiquidRhoAtP0(float ch4);
float CalculateLiquidRho(float ch4,float x);
float CalculateLiquidPressure(float ch4,float x);
float CalculateLiquid_H(float ch4,float x);
float CalculateGasRho(float ch4,float x);
float CalculateGasH(float ch4,float x);
float CalculateLiquidC(float ch4,float x);
float FullTankAlgorithm(struct TankPara *tank,struct MonitoringData *data);
float EmptyTankAlgorithm(struct TankPara *tank,struct MonitoringData *data);
int ReadMontoringDataFile(struct MonitoringData *data);
float t1ByTheoretical(struct TankPara *tank,struct MonitoringData *data);
float t2ByMeasuredData(struct TankPara *tank,struct MonitoringData *data) ;
double getDistanceFromGPS(double lat_a, double lng_a, double lat_b, double lng_b);
#endif