443 lines
13 KiB
C
443 lines
13 KiB
C
#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
|