2375 lines
47 KiB
C
2375 lines
47 KiB
C
|
|
#include <stdio.h>
|
|||
|
|
#include <stdlib.h>
|
|||
|
|
#include<time.h>
|
|||
|
|
#include<math.h>
|
|||
|
|
|
|||
|
|
#include "TankPrediction.h"
|
|||
|
|
|
|||
|
|
#pragma diag_suppress 1035,177,550,940
|
|||
|
|
|
|||
|
|
//cqr 20230224修改
|
|||
|
|
|
|||
|
|
//算法系数罐箱参数组分参数不在云端下发,直接设置参数 jzw 20230324
|
|||
|
|
void SetTankPara(struct TankPara *tank)
|
|||
|
|
{
|
|||
|
|
/////第2类:一次性下发的算法固定常数,按后面的注释值赋值,所有常数变量在苏醒后需要读入
|
|||
|
|
tank->DL0 = 5; // 0.05 =====液位差判断基准==4G输入给出,
|
|||
|
|
tank->Dis_0 = 100; // 1000
|
|||
|
|
tank->DT_0 = 1; //采样时间周期ΔT 整型常数变量 1 小时
|
|||
|
|
tank->T_0 = 150; // 150 =====温度判断基准==4G输入给出,
|
|||
|
|
tank->Stable_Day = 1; // 1 ====静置天数==4G输入给出,
|
|||
|
|
tank->Lamda_0 = 0.1; // 0.1
|
|||
|
|
tank->L_0 = 0.1; //充装状态判断条件Φ0 0.1 =====液位判断基准==4G输入给出,
|
|||
|
|
tank->Eta_V = 0.95; // 0.95 =====容积安全系数==4G输入给出,
|
|||
|
|
tank->Pa_0 = 0.1013; // 0.1013
|
|||
|
|
tank->Tc_0 = 303.15; // =273.15+30 = 303.15
|
|||
|
|
tank->R_0 = 8.314; // 8.314
|
|||
|
|
tank->MTime_0 = 300; // 300
|
|||
|
|
tank->Fai_bz0 = 95; // 0.95
|
|||
|
|
tank->Nday_0 = 20; // 整型常数 20 平均日漏热量计算周期CT
|
|||
|
|
tank->Tz_0 = 24; // 内能计算间隔周期tz 整型常数 24小时
|
|||
|
|
tank->Fai_0 = 75; // 0.75 =====充装率判断基准==4G输入给出,
|
|||
|
|
tank->Mavg_0 = 16; // 16
|
|||
|
|
tank->Pcr_0 = 4.59; // 常数 4.59
|
|||
|
|
tank->QHQR_0 = 511.12; // 511.12 =====标态LNG气化潜热==4G输入给出,
|
|||
|
|
tank->RhoLng_0 = 434.15; // 434.15
|
|||
|
|
tank->K_1 = 0.9553; // 0.6583 =====标态LNG和液氮气化潜热转换系数=4G输入给出,
|
|||
|
|
|
|||
|
|
tank->Default_CH4 = 96.299; // 0.95 ====默认甲烷成分==4G输入给出,
|
|||
|
|
tank->VN_0 = 111.91; //常数 0.01191
|
|||
|
|
tank->Nx_0 = 0.35; // 0.35
|
|||
|
|
tank->Ny_0 = 0.5; // 0.5
|
|||
|
|
tank->Nz_0 = 0.15; // 0.15
|
|||
|
|
tank->Kymax = 1.1; //常数 1.1
|
|||
|
|
tank->Kymin = 0.8; //常数 0.8
|
|||
|
|
|
|||
|
|
tank->Da_0 = 20.2; // 0.00202
|
|||
|
|
tank->Db_0 = 230; // -0.023
|
|||
|
|
tank->Dc_0 = 125; // 0.0125
|
|||
|
|
tank->Dd_0 = 309; // -0.0309
|
|||
|
|
|
|||
|
|
//预留
|
|||
|
|
tank->Default_C2 = 2.585; // 默认C2成分比
|
|||
|
|
tank->Default_C3 = 0.489; // 默认C3成分比
|
|||
|
|
tank->Default_C4 = 0.227; // 默认C4成分比
|
|||
|
|
tank->Default_N2 = 0.4; // 默认N2成分比
|
|||
|
|
tank->TimeYJ = 5; // 安全阀起跳预警值
|
|||
|
|
tank->RJJ = 0; //结果相关性修正系数—截距
|
|||
|
|
tank->RXL = 1; // 结果相关性修正系数—斜率
|
|||
|
|
tank->RQP = 0; // 结果相关性修正区间起始压力
|
|||
|
|
tank->QZP = 0.651; // 结果相关性修正区间终止压力
|
|||
|
|
tank->ZQQ = 0.03024; // 重罐轻罐权重系数-气相导热系数
|
|||
|
|
tank->ZQY = 0.22; // 重罐轻罐权重系数-液相导热系数
|
|||
|
|
tank->ZQFai0 = 5; // 重罐轻罐权重修正起始充装率
|
|||
|
|
tank->ZQFaiN = 95; // 重罐轻罐权重修正终止充装率
|
|||
|
|
tank->SFKZ1 = 2; // 算法控制参数1(是否启用区间结果相关性修正)
|
|||
|
|
tank->SFKZ2 = 1; // 算法控制参数2(重罐-轻罐权重系数)
|
|||
|
|
tank->SFKZ3 = 1; // 算法控制参数3(临界参数你和修正)
|
|||
|
|
tank->SFKZ4 = 1; // 算法控制参数4(温度系数K2修正)
|
|||
|
|
tank->SFKZ5 = 1; // 算法控制参数5(日漏热量修正)
|
|||
|
|
tank->SFKZ6 = 1; // 算法控制参数6(罐箱用途)
|
|||
|
|
|
|||
|
|
tank->Tcr = 89; //临界温度
|
|||
|
|
tank->dTmax = 5; //罐内最大温差
|
|||
|
|
tank->dTP = 0.5; //安全阀起跳状态判断参数
|
|||
|
|
|
|||
|
|
tank->csY3 = 0; // 常数预留变量
|
|||
|
|
tank->csY4 = 0;
|
|||
|
|
tank->csY5 = 0;
|
|||
|
|
tank->csY6 = 0;
|
|||
|
|
tank->csY7 = 0;
|
|||
|
|
tank->csY8 = 0;
|
|||
|
|
tank->csY9 = 0;
|
|||
|
|
tank->csY10 = 0;
|
|||
|
|
|
|||
|
|
/////
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
////第3类 罐箱固定参数
|
|||
|
|
tank->P75 = 0.75; //满罐安全阀起跳压力,文件输入
|
|||
|
|
tank->a20 = 0.167; //液氮静态蒸发率,文件输入
|
|||
|
|
tank->TankVolYX = 39.24; // 有效容积,文件输入
|
|||
|
|
tank->TankVol = 43.6; // 总容积,文件输入
|
|||
|
|
tank->D = 2.21; // 罐子直径
|
|||
|
|
tank->fai = 0.82; // 额定充装率,文件输入
|
|||
|
|
tank->GT = 1; //罐箱用途 运输罐箱为01,燃料罐箱为02
|
|||
|
|
tank->TankType = 1; // 罐箱绝热型式,文件输入
|
|||
|
|
tank->ZC = 2; //罐箱支撑型式 01代表两点支撑,02代表8点支撑,02为默认值
|
|||
|
|
tank->ZKD = 0.003; //真空度
|
|||
|
|
tank->Phz = 0.551; // 安全阀回座压力
|
|||
|
|
tank->minFai = 0.001001; //最小可识别充装率
|
|||
|
|
tank->RL = 11.744; // 罐箱圆柱段长度
|
|||
|
|
|
|||
|
|
tank->gxY3 = 0; // 预留参数
|
|||
|
|
tank->gxY4 = 0;
|
|||
|
|
tank->gxY5 = 0;
|
|||
|
|
tank->gxY6 = 0;
|
|||
|
|
tank->gxY7 = 0;
|
|||
|
|
tank->gxY8 = 0;
|
|||
|
|
tank->gxY9 = 0;
|
|||
|
|
tank->gxY10 = 0;
|
|||
|
|
|
|||
|
|
////////// 第5类 组分航次参数,营运输入,每航次变更
|
|||
|
|
tank->ch4 = 96.299; // 甲烷成分比
|
|||
|
|
tank->C2 = 2.585; // C2摩尔百分比(体积比)
|
|||
|
|
tank->C3 = 0.489; // C3摩尔百分比(体积比)
|
|||
|
|
tank->C4 = 0.227; // C4摩尔百分比(体积比)
|
|||
|
|
tank->N2 = 0.4; // N2摩尔百分比(体积比)
|
|||
|
|
tank->hcY1 = 0; //航次预留系数
|
|||
|
|
tank->hcY2 = 0;
|
|||
|
|
tank->hcY3 = 0;
|
|||
|
|
tank->hcY4 = 0;
|
|||
|
|
tank->hcY5 = 0;
|
|||
|
|
tank->hcY6 = 0;
|
|||
|
|
tank->hcY7 = 0;
|
|||
|
|
tank->hcY8 = 0;
|
|||
|
|
tank->hcY9 = 0;
|
|||
|
|
tank->hcY10 = 0;
|
|||
|
|
|
|||
|
|
tank->sfbm=230401; //算法版本编码 00010001 0001算法版本 0001系数版本
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//初始化算法基本常量参数
|
|||
|
|
//在程序最初开始运行时调用此函数,进行算法基本常量的赋值,如遇程序异常重启,导致存储计算数据清零,也需要重新调用此函数进行初始化
|
|||
|
|
void InitConstantPara(struct TankPara *tank)
|
|||
|
|
{
|
|||
|
|
// 应对以下参数赋初值
|
|||
|
|
tank->DT_0=0;
|
|||
|
|
|
|||
|
|
tank->Nday_0=0;
|
|||
|
|
|
|||
|
|
tank->Pcr_0=0;
|
|||
|
|
|
|||
|
|
tank->VN_0=0;
|
|||
|
|
|
|||
|
|
tank->Kymax=0;
|
|||
|
|
|
|||
|
|
tank->Kymin=0;
|
|||
|
|
|
|||
|
|
tank->Tz_0=0;
|
|||
|
|
|
|||
|
|
tank->T_0=0;
|
|||
|
|
|
|||
|
|
tank->L_0=0;
|
|||
|
|
|
|||
|
|
tank->Fai_0=0;
|
|||
|
|
|
|||
|
|
tank->DL0=0;
|
|||
|
|
|
|||
|
|
tank->Eta_V=0;
|
|||
|
|
|
|||
|
|
tank->QHQR_0=0;
|
|||
|
|
|
|||
|
|
tank->K_1=0;
|
|||
|
|
|
|||
|
|
tank->Stable_Day=0;
|
|||
|
|
|
|||
|
|
tank->Default_CH4=0;
|
|||
|
|
|
|||
|
|
tank->Dis_0=0;
|
|||
|
|
|
|||
|
|
tank->Lamda_0=0;
|
|||
|
|
|
|||
|
|
tank->Pa_0=0;
|
|||
|
|
|
|||
|
|
tank->MTime_0=0;
|
|||
|
|
|
|||
|
|
tank->R_0=0;
|
|||
|
|
|
|||
|
|
tank->Mavg_0=0;
|
|||
|
|
|
|||
|
|
tank->Tc_0=0;
|
|||
|
|
|
|||
|
|
tank->RhoLng_0=0;
|
|||
|
|
|
|||
|
|
tank->Fai_bz0=0;
|
|||
|
|
|
|||
|
|
tank->Da_0=0;
|
|||
|
|
|
|||
|
|
tank->Db_0=0;
|
|||
|
|
|
|||
|
|
tank->Dc_0=0;
|
|||
|
|
|
|||
|
|
tank->Dd_0=0;
|
|||
|
|
|
|||
|
|
tank->Nx_0=0;
|
|||
|
|
|
|||
|
|
tank->Ny_0=0;
|
|||
|
|
|
|||
|
|
tank->Nz_0=0;
|
|||
|
|
|
|||
|
|
tank->Default_C2=0;
|
|||
|
|
|
|||
|
|
tank->Default_C3 = 0;
|
|||
|
|
|
|||
|
|
tank->Default_C4 = 0;
|
|||
|
|
|
|||
|
|
tank->Default_N2 = 0;
|
|||
|
|
|
|||
|
|
tank->TimeYJ=0;
|
|||
|
|
|
|||
|
|
tank->ZQQ=0;
|
|||
|
|
|
|||
|
|
tank->ZQY=0;
|
|||
|
|
|
|||
|
|
tank->Tcr=0;
|
|||
|
|
|
|||
|
|
tank->dTmax=0;
|
|||
|
|
|
|||
|
|
tank->dTP=0;
|
|||
|
|
|
|||
|
|
tank->SFKZ1 = 0;
|
|||
|
|
|
|||
|
|
tank->RQP = 0;
|
|||
|
|
|
|||
|
|
tank->QZP = 0;
|
|||
|
|
|
|||
|
|
tank->RJJ = 0;
|
|||
|
|
|
|||
|
|
tank->RXL = 0;
|
|||
|
|
|
|||
|
|
tank->ZQFai0 = 0;
|
|||
|
|
|
|||
|
|
tank->ZQFaiN = 0;
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
//#define T_0 150 // 温度判断基准
|
|||
|
|
//#define L_0 0.75 // 液位判断基准
|
|||
|
|
//#define Fai_0 0.75 //充装率判断基准
|
|||
|
|
//#define DL0 5 //充装率差基准,单位百分比,判断是否充装或使用
|
|||
|
|
//#define Eta_V 0.95 //容积安全系数,用于计算最小液体密度时的容积折减
|
|||
|
|
//#define QHQR_0 511.12 //标态LNG气化潜热
|
|||
|
|
//#define K_1 0.6583 //标态LNG和液氮气化潜热的转换系数
|
|||
|
|
//#define Stable_Day 1 // 静置天数
|
|||
|
|
//#define Default_CH4 95 // 默认甲烷成分比
|
|||
|
|
//#define Dis_0 1000 // 默认移动距离
|
|||
|
|
//#define Lamda_0 0.5 // 默认安全系数
|
|||
|
|
//#define Pa_0 0.1013 // 标准大气压
|
|||
|
|
//
|
|||
|
|
//#define MTime_0 300 //安全预报时间
|
|||
|
|
//#define R_0 8.314 //理想气体常数
|
|||
|
|
//#define Mavg_0 16 //摩尔质量
|
|||
|
|
//#define Tc_0 293.15 //常温
|
|||
|
|
//#define RhoLng_0 434.15 //标准LNG密度
|
|||
|
|
//#define Fai_bz0 95 //标准充装率
|
|||
|
|
//
|
|||
|
|
//#define Da_0 20.2 //运动模型参数Da
|
|||
|
|
//#define Db_0 230 //运动模型参数Da
|
|||
|
|
//#define Dc_0 125 //运动模型参数Da
|
|||
|
|
//#define Dd_0 309 //运动模型参数Da
|
|||
|
|
//
|
|||
|
|
//#define Nx_0 0.35 //长度方向加权系数
|
|||
|
|
//#define Ny_0 0.5 //宽度方向加权系数
|
|||
|
|
//#define Nz_0 0.15 //高度方向加权系数
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//初始化罐箱固有参数
|
|||
|
|
void InitTankPara(struct TankPara *tank)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
//应根据罐箱参数赋值
|
|||
|
|
tank->TankType=0; //罐箱类型
|
|||
|
|
|
|||
|
|
tank->ZC=0; //支撑型式
|
|||
|
|
|
|||
|
|
tank->TankVol=0; // 总容积
|
|||
|
|
|
|||
|
|
tank->TankVolYX=0; //有效容积
|
|||
|
|
|
|||
|
|
tank->D=0; //直径
|
|||
|
|
|
|||
|
|
tank->a20=0;//液氮静态蒸发率
|
|||
|
|
|
|||
|
|
tank->P75=0;//起跳压力
|
|||
|
|
|
|||
|
|
tank->GT=0; //罐箱用途
|
|||
|
|
|
|||
|
|
tank->QDay_0=0; //默认日漏热量
|
|||
|
|
|
|||
|
|
tank->Phz=0;//安全阀回座压力
|
|||
|
|
|
|||
|
|
tank->minFai=0; // 最低可识别充装率
|
|||
|
|
|
|||
|
|
tank->RL=0;// 罐箱圆柱段长度
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//初始化罐箱每次充装参数
|
|||
|
|
//每次罐箱重新充装后,充装率或甲烷成分比变化,需要调用此函数重新初始化
|
|||
|
|
void InitLoadPara(struct TankPara *tank)
|
|||
|
|
{
|
|||
|
|
///////// 应根据每次充装数据修改
|
|||
|
|
tank->fai=0; //充装率
|
|||
|
|
|
|||
|
|
tank->ch4=0;//甲烷成分比
|
|||
|
|
|
|||
|
|
//////////////////////////////////
|
|||
|
|
|
|||
|
|
if (tank->ch4<0)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//计算初始化,以下不用改
|
|||
|
|
tank->isStart=0;
|
|||
|
|
tank->MaintainTime=0;
|
|||
|
|
|
|||
|
|
tank->ZeroDate = -1;
|
|||
|
|
tank->ZeroL =0;
|
|||
|
|
tank->ForeCast_Sec = -1;
|
|||
|
|
tank->ForeCast_Date = -1;
|
|||
|
|
tank->nData=0;
|
|||
|
|
tank->nday=0;
|
|||
|
|
|
|||
|
|
tank->iday=0;
|
|||
|
|
tank->ihour=0;
|
|||
|
|
tank->iQday=0;
|
|||
|
|
tank->QDay_0=0;
|
|||
|
|
|
|||
|
|
tank->GT=1;
|
|||
|
|
tank->CY=0;
|
|||
|
|
|
|||
|
|
tank->breakDate = -1;
|
|||
|
|
tank->isCal = 0;
|
|||
|
|
tank->isChange = 0;
|
|||
|
|
tank->isBreak = 0;
|
|||
|
|
tank->iMbreak = 0;
|
|||
|
|
tank->iMhour = 0;
|
|||
|
|
////////////////
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//维持时间计算主函数,每次采集到罐箱状态(液位、压力、温度等)新数据后,调用此函数进行计算
|
|||
|
|
//目前接口:Mdata存储每次采集的罐箱状态数据,tank存储算法和罐箱的基本参数,以及计算结果
|
|||
|
|
//tank数据每次计算完之后需要保存,并且再给到下一次计算
|
|||
|
|
void PredictTime( struct MonitoringData * MData, struct TankPara * tank )
|
|||
|
|
{
|
|||
|
|
short int i,k,isStart;
|
|||
|
|
double ZeroDate;
|
|||
|
|
float MaintainTime,ZeroL, ForeCast_Sec, ForeCast_Date, breakSec;
|
|||
|
|
double Record_Date=MData->Record_Date;
|
|||
|
|
|
|||
|
|
struct tm ZeroDate_Str;
|
|||
|
|
struct tm NowDate_Str;
|
|||
|
|
|
|||
|
|
struct tm BreakDate_Str;
|
|||
|
|
|
|||
|
|
struct tm PreDate_Str;
|
|||
|
|
|
|||
|
|
float StablePeriod = 1 * 24* 3600;
|
|||
|
|
struct PhysicochemicalPara PCi[1];
|
|||
|
|
|
|||
|
|
float chongzhuangbhl,dt,weizhibhl,lam;
|
|||
|
|
float totalM = 0,mi=0;
|
|||
|
|
float m0Max=0,m0Min=0;
|
|||
|
|
|
|||
|
|
|
|||
|
|
SetTankPara(tank);
|
|||
|
|
StablePeriod = tank->Stable_Day * 24* 3600;
|
|||
|
|
tank->hcY1=1;
|
|||
|
|
if (abs(MData->WE)>0.0001&&abs(MData->SN)>0.0001)
|
|||
|
|
{
|
|||
|
|
//异常
|
|||
|
|
tank->hcY1=0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//jzw 20230227 采集温度为℃,转换为k 测试数据单位为k
|
|||
|
|
MData->Record_OutT =tank->Tc_0;// cqr-20230420 安捷汇不采集环境温度 MData->Record_OutT + 273.15; //cqr
|
|||
|
|
MData->Record_Tl = MData->Record_Tl + 273.15;
|
|||
|
|
if(MData->Record_Tg < -200 )
|
|||
|
|
{
|
|||
|
|
MData->Record_Tg = MData->Record_Tl;
|
|||
|
|
MData->Record_T = MData->Record_Tl;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
MData->Record_Tg = MData->Record_Tg + 273.15;
|
|||
|
|
MData->Record_T = 0.5*(MData->Record_Tg + MData->Record_Tl);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
MData->Record_L = MData->Record_L * 0.01;
|
|||
|
|
tank->SQdLng2 = tank->QDay_0;
|
|||
|
|
tank->fai=MData->Record_L;
|
|||
|
|
//for(i=0;i<50;i++)
|
|||
|
|
{
|
|||
|
|
// tank->RZ[i]=0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
tank->ztbm = 0;
|
|||
|
|
tank->ztbm += 1 * pow(10, 10);
|
|||
|
|
|
|||
|
|
if (tank->ZeroDate<1)
|
|||
|
|
{
|
|||
|
|
tank->ZeroDate =Record_Date;
|
|||
|
|
tank->ZeroL=MData->Record_L;
|
|||
|
|
|
|||
|
|
ConvertDateFormat( Record_Date, &ZeroDate_Str);
|
|||
|
|
tank->ForeCast_Sec = 0;
|
|||
|
|
tank->ForeCast_Date = 0;
|
|||
|
|
//tank->DisplayInfo = 1;
|
|||
|
|
//tank->CalModel=-1;
|
|||
|
|
tank->Dis=0;
|
|||
|
|
|
|||
|
|
tank->nday=0;
|
|||
|
|
tank->iday=0;
|
|||
|
|
tank->ihour=0;
|
|||
|
|
tank->iQday=0;
|
|||
|
|
|
|||
|
|
if (tank->hcY1 >0.5 )
|
|||
|
|
{
|
|||
|
|
tank->WE0=MData->WE;
|
|||
|
|
tank->SN0=MData->SN;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
tank->Pre_fai=MData->Record_L;
|
|||
|
|
tank->preDate=Record_Date;
|
|||
|
|
|
|||
|
|
tank->isChange=0;
|
|||
|
|
tank->isCal=1;
|
|||
|
|
tank->iMhour = 0;
|
|||
|
|
tank->iMbreak = 0;
|
|||
|
|
tank->isBreak = 0;
|
|||
|
|
tank->CZ = 0; //充装状态
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
ConvertDateFormat(tank->preDate , &PreDate_Str);
|
|||
|
|
ConvertDateFormat( Record_Date, &NowDate_Str);
|
|||
|
|
|
|||
|
|
dt = (mktime(&NowDate_Str) - mktime(&PreDate_Str)) / 60;
|
|||
|
|
|
|||
|
|
if (tank->hcY1 >0.5 )
|
|||
|
|
{
|
|||
|
|
tank->Dis=getDistanceFromGPS(tank->WE0,tank->SN0,MData->WE,MData->SN);
|
|||
|
|
tank->WE0=MData->WE;
|
|||
|
|
tank->SN0=MData->SN;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (dt>5) //5分钟
|
|||
|
|
{
|
|||
|
|
chongzhuangbhl=fabs(MData->Record_L - tank->Pre_fai )/(dt/60);
|
|||
|
|
if (tank->hcY1 >0.5 )
|
|||
|
|
weizhibhl=tank->Dis/(dt/60);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
chongzhuangbhl=0;
|
|||
|
|
weizhibhl=0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
tank->Pre_fai=MData->Record_L;
|
|||
|
|
tank->preDate=Record_Date;
|
|||
|
|
|
|||
|
|
if (tank->GT==1)
|
|||
|
|
{
|
|||
|
|
if (chongzhuangbhl< tank->DL0*0.01)
|
|||
|
|
{
|
|||
|
|
if (weizhibhl < tank->Dis_0)
|
|||
|
|
{
|
|||
|
|
tank->CY=1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
tank->CY=2;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (MData->Record_L > tank->Pre_fai )
|
|||
|
|
{
|
|||
|
|
tank->CY=3;
|
|||
|
|
}
|
|||
|
|
else if (MData->Record_L < tank->Pre_fai && weizhibhl < tank->Dis_0 )
|
|||
|
|
{
|
|||
|
|
tank->CY=4;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
tank->CY=5;
|
|||
|
|
tank->ztbm += 3 * pow(10, 10);
|
|||
|
|
tank->GJ = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
tank->isChange=0;
|
|||
|
|
tank->isCal=1;
|
|||
|
|
tank->iMhour = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
tank->ztbm += tank->CY * pow(10, 13);
|
|||
|
|
|
|||
|
|
if (tank->CY>2)
|
|||
|
|
{
|
|||
|
|
ConvertDateFormat(tank->ZeroDate , &ZeroDate_Str);
|
|||
|
|
|
|||
|
|
ConvertDateFormat( Record_Date, &NowDate_Str);
|
|||
|
|
|
|||
|
|
|
|||
|
|
tank->ForeCast_Sec = (mktime(&NowDate_Str) - mktime(&ZeroDate_Str));
|
|||
|
|
tank->ForeCast_Date = tank->ForeCast_Sec / 86400;
|
|||
|
|
|
|||
|
|
|
|||
|
|
tank->ZeroDate =-1;
|
|||
|
|
tank->ForeCast_Date = -1;
|
|||
|
|
tank->MaintainTime=-1;
|
|||
|
|
//tank->DisplayInfo = 1;
|
|||
|
|
tank->isStart=0;
|
|||
|
|
//tank->CalModel=-1;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
tank->nday=0;
|
|||
|
|
tank->iday=0;
|
|||
|
|
tank->ihour=0;
|
|||
|
|
tank->iQday=0;
|
|||
|
|
|
|||
|
|
for (i=0;i<20;i++)
|
|||
|
|
{
|
|||
|
|
tank->Qday[i]=0;
|
|||
|
|
tank->day[i]=0;
|
|||
|
|
|
|||
|
|
tank->Qhour[i]=0;
|
|||
|
|
tank->hour[i]=0;
|
|||
|
|
}
|
|||
|
|
for (i=20;i<24;i++)
|
|||
|
|
{
|
|||
|
|
tank->Qhour[i]=0;
|
|||
|
|
tank->hour[i]=0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
tank->Dis=0;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
tank->ZeroL = MData->Record_L;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
ConvertDateFormat(tank->ZeroDate , &ZeroDate_Str);
|
|||
|
|
|
|||
|
|
ConvertDateFormat( Record_Date, &NowDate_Str);
|
|||
|
|
|
|||
|
|
|
|||
|
|
tank->ForeCast_Sec = (mktime(&NowDate_Str) - mktime(&ZeroDate_Str));
|
|||
|
|
tank->ForeCast_Date = tank->ForeCast_Sec / 86400;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(tank->isChange == 0)
|
|||
|
|
{
|
|||
|
|
tank->m0 = Calculate_m(tank,MData);
|
|||
|
|
|
|||
|
|
|
|||
|
|
if(tank->ForeCast_Sec > StablePeriod)
|
|||
|
|
tank->isChange =1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
if(tank->isCal == 1 && tank->CY == 1)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
tank->isChange =1;
|
|||
|
|
|
|||
|
|
//if(tank->ForeCast_Sec < 3600 || tank->iMhour < 4) //1h内或数组数量不够方差计算时,进行质量实时计算
|
|||
|
|
if(tank->ForeCast_Sec <= StablePeriod)// cqr-20230420 基准静置时间内
|
|||
|
|
{
|
|||
|
|
mi=Calculate_m(tank,MData);
|
|||
|
|
if(tank->iMhour >= 12)
|
|||
|
|
{
|
|||
|
|
for (i=0;i<tank->iMhour-1;i++)
|
|||
|
|
{
|
|||
|
|
tank->Mhour[i]=tank->Mhour[i+1];
|
|||
|
|
}
|
|||
|
|
tank->Mhour[tank->iMhour-1] = mi;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
tank->Mhour[tank->iMhour] = mi;
|
|||
|
|
tank->iMhour = tank->iMhour + 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (tank->iMhour >= 4)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
totalM = 0;
|
|||
|
|
m0Max=0;
|
|||
|
|
m0Min= tank->Mhour[0];
|
|||
|
|
for (i=0;i<tank->iMhour;i++)
|
|||
|
|
{
|
|||
|
|
totalM = totalM + tank->Mhour[i];
|
|||
|
|
if(m0Max < tank->Mhour[i])
|
|||
|
|
{
|
|||
|
|
m0Max = tank->Mhour[i];
|
|||
|
|
}
|
|||
|
|
if(m0Min > tank->Mhour[i])
|
|||
|
|
{
|
|||
|
|
m0Min = tank->Mhour[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
tank->m0 = (totalM-m0Max-m0Min)/(tank->iMhour-2);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
tank->m0 = tank->Mhour[tank->iMhour-1];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if(tank->iMhour >= 4)
|
|||
|
|
{
|
|||
|
|
tank->isCal=0;
|
|||
|
|
tank->iMhour = 0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
tank->Mhour[tank->iMhour] = Calculate_m(tank,MData);
|
|||
|
|
tank->iMhour = tank->iMhour + 1;
|
|||
|
|
|
|||
|
|
if (tank->iMhour >= 4)
|
|||
|
|
{
|
|||
|
|
totalM = 0; mi=0;
|
|||
|
|
m0Max=0;
|
|||
|
|
m0Min= tank->Mhour[0];
|
|||
|
|
for (i=0;i<tank->iMhour;i++)
|
|||
|
|
{
|
|||
|
|
totalM = totalM + tank->Mhour[i];
|
|||
|
|
if(m0Max < tank->Mhour[i])
|
|||
|
|
{
|
|||
|
|
m0Max = tank->Mhour[i];
|
|||
|
|
}
|
|||
|
|
if(m0Min > tank->Mhour[i])
|
|||
|
|
{
|
|||
|
|
m0Min = tank->Mhour[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
tank->m0 = (totalM-m0Max-m0Min)/(tank->iMhour-2);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
tank->m0 = tank->Mhour[tank->iMhour-1];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(tank->isBreak == 1)
|
|||
|
|
{
|
|||
|
|
ConvertDateFormat(tank->breakDate , &BreakDate_Str);
|
|||
|
|
ConvertDateFormat( Record_Date, &NowDate_Str);
|
|||
|
|
breakSec = (mktime(&NowDate_Str) - mktime(&BreakDate_Str));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(tank->isBreak == 1)
|
|||
|
|
{
|
|||
|
|
if(breakSec <= 3600 || tank->iMbreak < 4)
|
|||
|
|
{
|
|||
|
|
tank->Mbreak[tank->iMbreak] = Calculate_m(tank,MData);
|
|||
|
|
tank->iMbreak = tank->iMbreak + 1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if(breakSec <= 3600*4)
|
|||
|
|
{
|
|||
|
|
totalM = 0;mi = 0;
|
|||
|
|
m0Max=0;
|
|||
|
|
m0Min= tank->Mbreak[0];
|
|||
|
|
for (i=0;i<tank->iMbreak;i++)
|
|||
|
|
{
|
|||
|
|
totalM = totalM + tank->Mbreak[i];
|
|||
|
|
if(m0Max < tank->Mbreak[i])
|
|||
|
|
{
|
|||
|
|
m0Max = tank->Mbreak[i];
|
|||
|
|
}
|
|||
|
|
if(m0Min > tank->Mbreak[i])
|
|||
|
|
{
|
|||
|
|
m0Min = tank->Mbreak[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
mi = (totalM-m0Max-m0Min)/(tank->iMbreak-2);
|
|||
|
|
if(tank->iMbreak >= 12)
|
|||
|
|
{
|
|||
|
|
for (i=0;i<tank->iMbreak-1;i++)
|
|||
|
|
{
|
|||
|
|
tank->Mbreak[i]=tank->Mbreak[i+1];
|
|||
|
|
}
|
|||
|
|
tank->Mhour[tank->iMbreak-1] = mi;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
tank->Mbreak[tank->iMbreak] = mi;
|
|||
|
|
tank->iMbreak = tank->iMbreak + 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
tank->m0 = tank->Mbreak[tank->iMbreak-1];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(tank->isBreak == 1 && breakSec > 4*3600)
|
|||
|
|
{
|
|||
|
|
tank->iMbreak = 0;
|
|||
|
|
for (i=0;i<12;i++)
|
|||
|
|
{
|
|||
|
|
tank->Mbreak[i]=0;
|
|||
|
|
}
|
|||
|
|
tank->isBreak = 0;
|
|||
|
|
}
|
|||
|
|
if((tank->Pre_P - MData->Record_P) >= (tank->P75-tank->Phz)*tank->dTP) //Pi-1 - Pi >= (Pn-Pn1)*dtP 时判断起跳
|
|||
|
|
{
|
|||
|
|
tank->breakDate = Record_Date;
|
|||
|
|
tank->isBreak = 1;
|
|||
|
|
tank->isChange = 1;
|
|||
|
|
}
|
|||
|
|
tank->Pre_P = MData->Record_P;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (MData->Record_T< tank->T_0)
|
|||
|
|
{
|
|||
|
|
tank->ztbm += 1 * pow(10, 12);
|
|||
|
|
|
|||
|
|
if (tank->isStart <= 1 && tank->CY <= 2 && tank->CY > 0)
|
|||
|
|
{
|
|||
|
|
tank->isStart=1;
|
|||
|
|
TankInit(1, tank,MData);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
tank->ztbm += 2 * pow(10, 12);
|
|||
|
|
|
|||
|
|
if(tank->CY <= 2 && (tank->CZ ==20 ||tank->CZ ==21))
|
|||
|
|
{
|
|||
|
|
if (tank->isStart <= 1 )
|
|||
|
|
{
|
|||
|
|
tank->isStart=1;
|
|||
|
|
TankInit(1, tank,MData);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
tank->MaintainTime=-1;
|
|||
|
|
tank->isStart=0;
|
|||
|
|
tank->GJ=2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
StablePeriod =tank->Stable_Day * 24* 3600;
|
|||
|
|
if (tank->ForeCast_Sec >= StablePeriod && (tank->isStart==1))
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
tank->ztbm += 1 * pow(10, 9);
|
|||
|
|
tank->isStart=2;
|
|||
|
|
tank->lamda=1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//tank->DisplayInfo = 3;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
tank->ztbm += 2 * pow(10, 9);
|
|||
|
|
if (tank->isStart==1)
|
|||
|
|
{
|
|||
|
|
//tank->DisplayInfo = 2;
|
|||
|
|
lam=tank->ForeCast_Sec / StablePeriod + 0.2;
|
|||
|
|
tank->lamda=pow(lam, tank->Lamda_0);
|
|||
|
|
|
|||
|
|
if(tank->ForeCast_Sec > StablePeriod *(1-0.2))
|
|||
|
|
{
|
|||
|
|
tank->lamda=1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
tank->YJ=1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
tank->RhoLn = CalculateLiquidRho(tank->ch4, tank->Pn);
|
|||
|
|
tank->RhoL = CalculateLiquidRho(tank->ch4, MData->Record_P);
|
|||
|
|
tank->faiMax = tank->Eta_V * tank->RhoLn / tank->RhoL;
|
|||
|
|
tank->mMin = tank->Mavg_0 * (tank->Pn + tank->Pa_0) * tank->TankVolYX * 1000 / (tank->R_0 * tank->Tc_0);
|
|||
|
|
|
|||
|
|
if (tank->fai > tank->L_0)
|
|||
|
|
{
|
|||
|
|
if (tank->fai > tank->faiMax)
|
|||
|
|
{
|
|||
|
|
tank->CZ = 12;
|
|||
|
|
tank->ztbm += 1 * pow(10, 11);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
tank->CZ = 11;
|
|||
|
|
tank->ztbm += 2 * pow(10, 11);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (tank->m0 >= tank->mMin)
|
|||
|
|
{
|
|||
|
|
tank->CZ = 21;
|
|||
|
|
tank->ztbm += 3 * pow(10, 11);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
tank->CZ = 22;
|
|||
|
|
tank->ztbm += 4 * pow(10, 11);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (tank->isStart>=1)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
|
|||
|
|
tank->VLf=tank->TankVolYX*MData->Record_L;
|
|||
|
|
tank->VGf=tank->TankVolYX*(1-MData->Record_L);
|
|||
|
|
CalculatePhyChemPara(tank, MData->Record_P, PCi );
|
|||
|
|
tank->TavgL=(MData->Record_T+tank->TLp)*0.5;
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (tank->CZ == 21||tank->CZ == 20)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if (tank->fai < tank->minFai || tank->rhoG >= tank->m0 / tank->TankVolYX || MData->Record_Tl > tank->TLp +
|
|||
|
|
tank->dTmax)
|
|||
|
|
{
|
|||
|
|
//tank->XT = 1;
|
|||
|
|
tank->CZ = 20;
|
|||
|
|
tank->MaintainTime = EmptyTankAlgorithm(tank, MData); // *PCi, cqr-20230213 //cqr-1028修改
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
tank->CZ = 21;
|
|||
|
|
SaveDailyHeatLoss(tank);
|
|||
|
|
tank->MaintainTime = FullTankAlgorithm(tank, MData);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (tank->CZ == 11 || tank->CZ == 12)
|
|||
|
|
{
|
|||
|
|
SaveDailyHeatLoss(tank);
|
|||
|
|
tank->MaintainTime = FullTankAlgorithm(tank, MData);
|
|||
|
|
}
|
|||
|
|
if (tank->CZ == 22)
|
|||
|
|
{
|
|||
|
|
tank->MaintainTime = tank->MTime_0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (tank->MaintainTime > tank->MTime_0)
|
|||
|
|
{
|
|||
|
|
tank->MaintainTime = tank->MTime_0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (tank->SFKZ1 == 2 && MData->Record_P >= tank->RQP && MData->Record_P <= tank->QZP)
|
|||
|
|
{
|
|||
|
|
tank->MaintainTime = (tank->MaintainTime - tank->RJJ) / tank->RXL;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (tank->MaintainTime<0)
|
|||
|
|
{
|
|||
|
|
tank->MaintainTime=0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (tank->MaintainTime < 5)
|
|||
|
|
{
|
|||
|
|
tank->ztbm += 2 * pow(10, 10);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
tank->ztbm += tank->SFKZ1 * pow(10, 7);
|
|||
|
|
tank->ztbm += tank->SFKZ2 * pow(10, 6);
|
|||
|
|
tank->ztbm += tank->SFKZ3 * pow(10, 5);
|
|||
|
|
tank->ztbm += tank->SFKZ4 * pow(10, 4);
|
|||
|
|
tank->ztbm += tank->SFKZ5 * pow(10, 3);
|
|||
|
|
tank->ztbm += tank->SFKZ6 * pow(10, 2);
|
|||
|
|
//k=0; //cqr-202302323
|
|||
|
|
/*for(i=1;i<50;i++)
|
|||
|
|
{
|
|||
|
|
if (tank->RZ[i]>=1)
|
|||
|
|
{
|
|||
|
|
k=k+1;
|
|||
|
|
tank->RZ[k]=tank->RZ[i];
|
|||
|
|
if (i>k)
|
|||
|
|
{
|
|||
|
|
tank->RZ[i]=0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
tank->RZ[0]=k;*/
|
|||
|
|
tank->QDay_0 = tank->SQdLng2;
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void TankInit(int InitTime, struct TankPara *tank, struct MonitoringData *data)
|
|||
|
|
{
|
|||
|
|
float V0,ch4,fai0;//,p,k1;
|
|||
|
|
float RhoGn,Pn, P2,m0,RhoL,RhoG,VL,VG,HL,HG,fai_m;
|
|||
|
|
|
|||
|
|
float Factor_Rho=1.0;
|
|||
|
|
float Factor_P=1.0;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
// k1=tank->K_1;
|
|||
|
|
|
|||
|
|
tank->P0=data->Record_P;
|
|||
|
|
tank->T0=data->Record_T;
|
|||
|
|
|
|||
|
|
//p=tank->P0;
|
|||
|
|
V0=tank->TankVolYX;
|
|||
|
|
ch4=tank->ch4;
|
|||
|
|
fai0=tank->ZeroL;
|
|||
|
|
tank->aLNG20=tank->a20* tank->K_1;
|
|||
|
|
|
|||
|
|
if (ch4<70)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
if (ch4>98)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
tank->QHQR0=tank->QHQR_0;
|
|||
|
|
tank->RhoLNG0=tank->RhoLng_0;
|
|||
|
|
tank->QdLNG20=V0* (tank->Fai_bz0 *0.01) * tank->RhoLNG0 *( tank->aLNG20*0.01) * tank->QHQR0;
|
|||
|
|
|
|||
|
|
RhoL=CalculateLiquidRho(ch4,tank->P0);
|
|||
|
|
RhoG=CalculateGasRho(ch4,tank->P0);
|
|||
|
|
|
|||
|
|
VL=V0*fai0;
|
|||
|
|
VG=V0-VL;//V0*(1-fai0);
|
|||
|
|
m0 = tank->m0;
|
|||
|
|
|
|||
|
|
/*if (V0<0.01)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
if (p<0)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
if (p>1)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}*/
|
|||
|
|
|
|||
|
|
tank->RhoLimit=m0/(V0*tank->Eta_V);
|
|||
|
|
//tank->m0=m0;
|
|||
|
|
|
|||
|
|
HL=CalculateLiquid_H(ch4,tank->P0);
|
|||
|
|
HG=CalculateGasH(ch4,tank->P0);
|
|||
|
|
|
|||
|
|
tank->Q0=RhoL*VL*HL+RhoG*VG*HG;
|
|||
|
|
|
|||
|
|
|
|||
|
|
Pn=tank->P75;
|
|||
|
|
tank->RhoLn=CalculateLiquidRho(ch4,Pn);
|
|||
|
|
|
|||
|
|
/*if (tank->RhoLimit<1.4)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
if (tank->RhoLimit>500)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (RhoL<350)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
if (RhoL>500)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}*/
|
|||
|
|
|
|||
|
|
P2= Factor_P*CalculateLiquidPressure(ch4,tank->RhoLimit*Factor_Rho);
|
|||
|
|
|
|||
|
|
fai_m=tank->Eta_V*tank->RhoLn/RhoL;
|
|||
|
|
|
|||
|
|
tank->faiMax=fai_m;
|
|||
|
|
|
|||
|
|
|
|||
|
|
////tank->CalModel=2;
|
|||
|
|
if(data->Record_L>=fai_m)
|
|||
|
|
{
|
|||
|
|
Pn=P2;
|
|||
|
|
//tank->CalModel=3;
|
|||
|
|
tank->CZ=12;
|
|||
|
|
}
|
|||
|
|
tank->Pn=Pn;
|
|||
|
|
tank->Tn=CalculateLiquidTemperature(ch4,Pn);
|
|||
|
|
tank->TAvg=(tank->T0 + tank->Tn)*0.5;
|
|||
|
|
|
|||
|
|
RhoGn=CalculateGasRho(ch4,Pn);
|
|||
|
|
|
|||
|
|
|
|||
|
|
//if (tank->R_0*tank->Tc_0<0.1)
|
|||
|
|
//{
|
|||
|
|
//
|
|||
|
|
//}
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
tank->mMin=tank->Mavg_0*(Pn+tank->Pa_0)*V0*1000/(tank->R_0*tank->Tc_0);
|
|||
|
|
|
|||
|
|
HL=CalculateLiquid_H(ch4,Pn);
|
|||
|
|
HG=CalculateGasH(ch4,Pn);
|
|||
|
|
|
|||
|
|
RhoL=CalculateLiquidRho(ch4,Pn);
|
|||
|
|
RhoG=CalculateGasRho(ch4,Pn);
|
|||
|
|
|
|||
|
|
|
|||
|
|
tank->rhoG_n=RhoG;
|
|||
|
|
tank->rhoL_n=RhoL;
|
|||
|
|
|
|||
|
|
|
|||
|
|
VL=(m0-V0*RhoG)/(RhoL-RhoG);
|
|||
|
|
VG=V0-VL;
|
|||
|
|
|
|||
|
|
tank->Qn=RhoL*VL*HL+RhoG*VG*HG;
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (InitTime==0)
|
|||
|
|
{
|
|||
|
|
//tank->DisplayInfo=1;
|
|||
|
|
tank->isStart=0;
|
|||
|
|
tank->MaintainTime=0;
|
|||
|
|
|
|||
|
|
tank->ZeroDate = -1;
|
|||
|
|
tank->ZeroL =0;
|
|||
|
|
tank->ForeCast_Sec = 0;
|
|||
|
|
tank->ForeCast_Date = 0;
|
|||
|
|
|
|||
|
|
tank->nday=0;
|
|||
|
|
tank->nData=0;
|
|||
|
|
tank->iday=0;
|
|||
|
|
|
|||
|
|
tank->ihour=0;
|
|||
|
|
tank->iQday=0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
void ConvertDateFormat( double Record_Date, struct tm *Date_Str )
|
|||
|
|
{
|
|||
|
|
char Str_Temp[15];
|
|||
|
|
|
|||
|
|
sprintf(Str_Temp, "%.0lf", Record_Date);
|
|||
|
|
|
|||
|
|
Date_Str->tm_year = (Str_Temp[0] - '0') * 1000 + (Str_Temp[1] - '0') * 100 + (Str_Temp[2] - '0') * 10 + (Str_Temp[3] - '0') - 1900;
|
|||
|
|
Date_Str->tm_mon = (Str_Temp[4] - '0') * 10 + (Str_Temp[5] - '0') - 1;
|
|||
|
|
Date_Str->tm_mday = (Str_Temp[6] - '0') * 10 + (Str_Temp[7] - '0');
|
|||
|
|
Date_Str->tm_hour = (Str_Temp[8] - '0') * 10 + (Str_Temp[9] - '0');
|
|||
|
|
Date_Str->tm_min = (Str_Temp[10] - '0') * 10 + (Str_Temp[11] - '0');
|
|||
|
|
|
|||
|
|
Date_Str->tm_sec = 0;
|
|||
|
|
Date_Str->tm_wday = 0;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void SaveDailyHeatLoss( struct TankPara * tank)//, struct PhysicochemicalPara * PCi )
|
|||
|
|
{
|
|||
|
|
short int k,i=0;
|
|||
|
|
float tQ=0;
|
|||
|
|
float ForeCast_Date = tank->ForeCast_Date;
|
|||
|
|
float Thour=ForeCast_Date*24;
|
|||
|
|
short int Nd=floor(ForeCast_Date);
|
|||
|
|
short int n=tank->Tz_0;
|
|||
|
|
tank->DayNow=ForeCast_Date;
|
|||
|
|
|
|||
|
|
if (Thour<0)
|
|||
|
|
{
|
|||
|
|
Thour=0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
k=tank->iday;
|
|||
|
|
if (tank->ihour< n)
|
|||
|
|
{
|
|||
|
|
tank->Qhour[tank->ihour]=tank->Qi; //cqr-20230230 PCi->Q;
|
|||
|
|
tank->hour[tank->ihour]=Thour;
|
|||
|
|
tank->ihour=tank->ihour+1;
|
|||
|
|
tank->iQday=0;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
tank->dQi[tank->iQday]= 24* (tank->Qi - tank->Qhour[0]) / (Thour- tank->hour[0]); //cqr-20230230 PCi->Q;
|
|||
|
|
tank->iQday=tank->iQday+1;
|
|||
|
|
|
|||
|
|
for (i=0;i<tank->ihour-1;i++)
|
|||
|
|
{
|
|||
|
|
tank->Qhour[i]=tank->Qhour[i+1];
|
|||
|
|
tank->hour[i]=tank->hour[i+1];
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
tank->Qhour[tank->ihour-1]=tank->Qi; //cqr-20230230 PCi->Q;
|
|||
|
|
tank->hour[tank->ihour-1]=Thour ;
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (tank->iQday>0)
|
|||
|
|
{
|
|||
|
|
tQ=0;
|
|||
|
|
for (i=0;i<tank->iQday;i++)
|
|||
|
|
tQ+=tank->dQi[i];
|
|||
|
|
|
|||
|
|
if (tank->iday >= tank->Nday_0 )
|
|||
|
|
{
|
|||
|
|
for (i=0;i< tank->iday -1;i++)
|
|||
|
|
{
|
|||
|
|
tank->Qday[i]=tank->Qday[i+1];
|
|||
|
|
tank->day[i]=tank->day[i+1];
|
|||
|
|
}
|
|||
|
|
tank->iday =tank->iday -1;
|
|||
|
|
k=tank->iday;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
tank->Qday[k]=tQ/tank->iQday;
|
|||
|
|
tank->day[k]=Nd;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (tank->iQday==n)
|
|||
|
|
{
|
|||
|
|
for (i=0;i<tank->iQday;i++)
|
|||
|
|
tank->dQi[i]=0;
|
|||
|
|
tank->iQday=0;
|
|||
|
|
tank->iday=k+1;
|
|||
|
|
k=k+1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
// tank->Qi=PCi->Q;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
float Calculate_m(struct TankPara* tank, struct MonitoringData* data)
|
|||
|
|
{
|
|||
|
|
float mi, RhoL, RhoG, VL, VG;
|
|||
|
|
RhoL = CalculateLiquidRho(tank->ch4, data->Record_P);
|
|||
|
|
RhoG = CalculateGasRho(tank->ch4, data->Record_P);
|
|||
|
|
VL = tank->TankVolYX * data->Record_L;
|
|||
|
|
VG = tank->TankVolYX - VL;
|
|||
|
|
mi = RhoL * VL + RhoG * VG;
|
|||
|
|
return mi;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CalculatePhyChemPara(struct TankPara *tank, float p, struct PhysicochemicalPara *PCi )
|
|||
|
|
{
|
|||
|
|
float m0=tank->m0;
|
|||
|
|
float V0=tank->TankVolYX;
|
|||
|
|
float ch4=tank->ch4;
|
|||
|
|
|
|||
|
|
(*PCi).P=p;
|
|||
|
|
(*PCi).HL=CalculateLiquid_H(ch4,p);
|
|||
|
|
(*PCi).HG=CalculateGasH(ch4,p);
|
|||
|
|
|
|||
|
|
(*PCi).RhoL=CalculateLiquidRho(ch4,p);
|
|||
|
|
(*PCi).RhoG=CalculateGasRho(ch4,p);
|
|||
|
|
|
|||
|
|
//if ((*PCi).RhoL<350)
|
|||
|
|
{
|
|||
|
|
// tank->RZ[7]=61;
|
|||
|
|
}
|
|||
|
|
// if ((*PCi).RhoL>500)
|
|||
|
|
{
|
|||
|
|
// tank->RZ[7]=62;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
(*PCi).VL=(m0-V0*(*PCi).RhoG)/((*PCi).RhoL-(*PCi).RhoG);
|
|||
|
|
(*PCi).VG=V0-(*PCi).VL;
|
|||
|
|
|
|||
|
|
tank->VLp=(*PCi).VL;
|
|||
|
|
tank->VGp=(*PCi).VG;
|
|||
|
|
tank->TLp=CalculateLiquidTemperature(ch4,p);
|
|||
|
|
|
|||
|
|
tank->fai_p=tank->VLp/V0;
|
|||
|
|
tank->VLavg=(tank->VLp+tank->VLf)*0.5;
|
|||
|
|
tank->VGavg=(tank->VGp+tank->VGf)*0.5;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
tank->rhoG=(*PCi).RhoG;
|
|||
|
|
tank->rhoL=(*PCi).RhoL;
|
|||
|
|
tank->mL=tank->VLavg*(*PCi).RhoL;
|
|||
|
|
tank->mG=tank->VGavg*(*PCi).RhoG;
|
|||
|
|
|
|||
|
|
|
|||
|
|
PCi->QL=(*PCi).RhoL*(tank->VLp+tank->VLf)*0.5*(*PCi).HL;
|
|||
|
|
PCi->QG=(*PCi).RhoG*(tank->VGp+tank->VGf)*0.5*(*PCi).HG;
|
|||
|
|
PCi->Q=(PCi->QL)+(PCi->QG);
|
|||
|
|
|
|||
|
|
|
|||
|
|
tank->Qi=PCi->Q; //cqr-20230230
|
|||
|
|
|
|||
|
|
// if (PCi->QL <0.01)
|
|||
|
|
{
|
|||
|
|
// tank->RZ[8]=71;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
float RussiaCorrect(struct TankPara *tank ,struct MonitoringData *data, float F )
|
|||
|
|
{
|
|||
|
|
float LngFillRate=tank->fai;
|
|||
|
|
float Pn=tank->Pn;
|
|||
|
|
float Pi=data->Record_P;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
float Pcr=tank->Pcr_0 - tank->Pa_0;
|
|||
|
|
float ZeroDimension_P = (Pn - Pi) / (Pcr - Pi);
|
|||
|
|
|
|||
|
|
float s1=(2.2125 - 1.66*ZeroDimension_P + 0.83*ZeroDimension_P*ZeroDimension_P);
|
|||
|
|
float s2=(-4.38*LngFillRate*LngFillRate*LngFillRate + 8.861*LngFillRate*LngFillRate - 5.539*LngFillRate + 1.959);
|
|||
|
|
float s3=(-204 * F*F + 20.48*F + 0.8);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
float FR = s1*s2*s3;
|
|||
|
|
tank->Kr=FR;
|
|||
|
|
return FR;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
float Calculate_k2(struct TankPara *tank ,struct MonitoringData *data)
|
|||
|
|
{
|
|||
|
|
float RegressionQHQR(float x);
|
|||
|
|
float t1=110.56;
|
|||
|
|
float t2=293.15;
|
|||
|
|
float k2=1;
|
|||
|
|
float QHQR0=tank->QHQR0;
|
|||
|
|
float TAvg=tank->TAvg;
|
|||
|
|
|
|||
|
|
float Pi=data->Record_P;
|
|||
|
|
float OutT=data->Record_OutT;
|
|||
|
|
|
|||
|
|
float LT=(data->Record_T+tank->TLp)*0.5;
|
|||
|
|
float QHQRi=RegressionQHQR(Pi);
|
|||
|
|
//int tankType=tank->TankType;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
//switch (tankType)
|
|||
|
|
//{
|
|||
|
|
// case 1:
|
|||
|
|
// k2 = 0.7*(t2 - t1) / (OutT - LT) + 0.3* (t2*t2*t2*t2 - t1*t1*t1*t1) /(OutT*OutT*OutT*OutT - LT* LT* LT* LT);
|
|||
|
|
// break;
|
|||
|
|
// case 2:
|
|||
|
|
// k2 =(t2 - t1) / (OutT - LT);
|
|||
|
|
// break;
|
|||
|
|
// case 3:
|
|||
|
|
// k2 = (t2*t2*t2*t2 - t1*t1*t1*t1) /(OutT*OutT*OutT*OutT - LT* LT* LT* LT);
|
|||
|
|
// break;
|
|||
|
|
// default:
|
|||
|
|
// k2 = 0.7*(t2 - t1) / (OutT - LT) + 0.3* (t2*t2*t2*t2 - t1*t1*t1*t1) /(OutT*OutT*OutT*OutT - LT* LT* LT* LT);
|
|||
|
|
// break;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
switch (tank->TankType)
|
|||
|
|
{
|
|||
|
|
case 1:
|
|||
|
|
k2 =127.813 / (OutT - LT) + 2170722109 /(OutT*OutT*OutT*OutT - LT* LT* LT* LT);
|
|||
|
|
break;
|
|||
|
|
case 2:
|
|||
|
|
k2 =182.59/ (OutT - LT);
|
|||
|
|
break;
|
|||
|
|
case 3:
|
|||
|
|
k2 = 7235740364 /(OutT*OutT*OutT*OutT - LT* LT* LT* LT);
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
k2 = 127.813 / (OutT - LT) + 2170722109 /(OutT*OutT*OutT*OutT - LT* LT* LT* LT);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//if (QHQRi<0.001)
|
|||
|
|
{
|
|||
|
|
// tank->RZ[10]=91;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
k2=k2*QHQRi/QHQR0;
|
|||
|
|
tank->K2=k2;
|
|||
|
|
return k2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
float Calculate_kzc(struct TankPara *tank )
|
|||
|
|
{
|
|||
|
|
float k;
|
|||
|
|
int zc=tank->ZC;
|
|||
|
|
switch (zc)
|
|||
|
|
{
|
|||
|
|
case 1:
|
|||
|
|
k = 0.8;
|
|||
|
|
break;
|
|||
|
|
case 2:
|
|||
|
|
k =1 ;
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
k = 1;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
tank->Kf=k;
|
|||
|
|
return k;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
float Calculate_ky(struct TankPara *tank ,struct MonitoringData *data)
|
|||
|
|
{
|
|||
|
|
float k;
|
|||
|
|
float Re2,Re3;
|
|||
|
|
|
|||
|
|
|
|||
|
|
float Af=tank->Nx_0*data->Record_Amp_x*data->Record_fr_x+tank->Ny_0*data->Record_Amp_y*data->Record_fr_y+tank->Nz_0*data->Record_Amp_z*data->Record_fr_z;
|
|||
|
|
float a=0;
|
|||
|
|
float b=0;
|
|||
|
|
float c=1;
|
|||
|
|
float l=0;
|
|||
|
|
float m=0;
|
|||
|
|
float n=1;
|
|||
|
|
|
|||
|
|
|
|||
|
|
float Re=40000*Af*tank->D/tank->VN_0;
|
|||
|
|
Re2=Re*Re;
|
|||
|
|
Re3=Re2*Re;
|
|||
|
|
k=tank->Da_0*Re3-tank->Db_0*Re2-tank->Dc_0*Re-tank->Dd_0;
|
|||
|
|
|
|||
|
|
k=k*0.0001;
|
|||
|
|
|
|||
|
|
if (k< tank->Kymin)
|
|||
|
|
{
|
|||
|
|
k=tank->Kymin;
|
|||
|
|
}
|
|||
|
|
if (k> tank->Kymax)
|
|||
|
|
{
|
|||
|
|
k=tank->Kymax;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
k=1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
tank->Ky=k;
|
|||
|
|
return k;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CalSQdLng2( struct TankPara *tank,struct MonitoringData *data )
|
|||
|
|
{
|
|||
|
|
short int i;
|
|||
|
|
float tQ=0;
|
|||
|
|
float k2 = Calculate_k2(tank,data);
|
|||
|
|
float Thour=tank->ForeCast_Date*24;
|
|||
|
|
|
|||
|
|
tank->LQdLng1=tank->QdLNG20 / k2;
|
|||
|
|
|
|||
|
|
tQ=0;
|
|||
|
|
for (i=0;i<tank->iday;i++)
|
|||
|
|
{
|
|||
|
|
tQ+=tank->Qday[i];
|
|||
|
|
}
|
|||
|
|
if (Thour < 12*tank->Nday_0) //24/2
|
|||
|
|
{
|
|||
|
|
if (tank->SQdLng2<0.001)
|
|||
|
|
{
|
|||
|
|
tank->LR=1;
|
|||
|
|
tank->QdAvg=(tQ + tank->LQdLng1 *(tank->Nday_0-tank->iday))/tank->Nday_0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
tank->LR=2;
|
|||
|
|
|
|||
|
|
tank->SQdLng2=(tQ+tank->SQdLng2*(tank->Nday_0-tank->iday))/tank->Nday_0;
|
|||
|
|
tank->QdAvg=tank->SQdLng2;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if(Thour < 24*tank->Nday_0)
|
|||
|
|
{
|
|||
|
|
if (tank->SQdLng2<0.001)
|
|||
|
|
{
|
|||
|
|
tank->LR=3;
|
|||
|
|
tank->QdAvg=(tQ+tank->LQdLng1*(tank->Nday_0-tank->iday))/tank->Nday_0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
tank->LR=2;
|
|||
|
|
tank->SQdLng2=(tQ+tank->SQdLng2*(tank->Nday_0-tank->iday))/tank->Nday_0;
|
|||
|
|
tank->QdAvg=tank->SQdLng2;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
tank->LR=2;
|
|||
|
|
|
|||
|
|
tank->SQdLng2=tQ/tank->iday;
|
|||
|
|
tank->QdAvg=tank->SQdLng2;
|
|||
|
|
}
|
|||
|
|
tank->ztbm += tank->LR * pow(10, 8);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
float t1ByTheoretical(struct TankPara *tank,struct MonitoringData *data)
|
|||
|
|
{
|
|||
|
|
float Calculate_k2(struct TankPara *tank ,struct MonitoringData *data);
|
|||
|
|
float RussiaCorrect(struct TankPara *tank ,struct MonitoringData *data, float F );
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
float QHQR0=tank->QHQR0;
|
|||
|
|
float QdLNG20=tank->QdLNG20;
|
|||
|
|
|
|||
|
|
float Qn=tank->Qn;
|
|||
|
|
float Qi=tank->Qi;
|
|||
|
|
|
|||
|
|
float k2 = Calculate_k2(tank,data);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
float QdLNG1=tank->QdLNG20 / k2;
|
|||
|
|
float t0=(Qn-Qi)/QdLNG1;
|
|||
|
|
|
|||
|
|
|
|||
|
|
float ci=CalculateLiquidC(tank->ch4,data->Record_P);
|
|||
|
|
|
|||
|
|
float F=QdLNG1/(tank->m0*ci*tank->TavgL)/24;
|
|||
|
|
|
|||
|
|
|
|||
|
|
//float Factor_Stable = 0.95;
|
|||
|
|
|
|||
|
|
float Factor_Russia = RussiaCorrect(tank,data, F);
|
|||
|
|
float Factor_Kf = Calculate_kzc(tank) ;
|
|||
|
|
|
|||
|
|
|
|||
|
|
float Factor_y =Calculate_ky(tank,data) ;
|
|||
|
|
|
|||
|
|
float MaintainTime = t0*Factor_Kf* Factor_y *tank->lamda/ Factor_Russia;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
// if (Factor_Russia<0.7)
|
|||
|
|
{
|
|||
|
|
// tank->RZ[9]=81;
|
|||
|
|
}
|
|||
|
|
// if (Factor_Russia>2)
|
|||
|
|
{
|
|||
|
|
// tank->RZ[9]=82;
|
|||
|
|
}
|
|||
|
|
return MaintainTime;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
float t2ByMeasuredData(struct TankPara *tank,struct MonitoringData *data)
|
|||
|
|
{
|
|||
|
|
float Calculate_k2(struct TankPara *tank ,struct MonitoringData *data);
|
|||
|
|
float RussiaCorrect(struct TankPara *tank ,struct MonitoringData *data, float F );
|
|||
|
|
float Qn=tank->Qn;
|
|||
|
|
float Qi=tank->Qi;
|
|||
|
|
float tQ=Qn-Qi;
|
|||
|
|
|
|||
|
|
float k2=Calculate_k2(tank,data);
|
|||
|
|
float QdLNG2=tank->QdAvg;
|
|||
|
|
|
|||
|
|
float t0=tQ/QdLNG2;
|
|||
|
|
|
|||
|
|
|
|||
|
|
//float Factor_Stable = 0.95;
|
|||
|
|
|
|||
|
|
float ci=CalculateLiquidC(tank->ch4,data->Record_P);
|
|||
|
|
float F=QdLNG2/(tank->m0*ci*tank->TavgL)/24;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
float Factor_Russia = RussiaCorrect(tank,data, F);
|
|||
|
|
|
|||
|
|
float Factor_y =Calculate_ky(tank,data) ;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
float MaintainTime = t0*Factor_y / Factor_Russia*tank->lamda;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
return MaintainTime;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
float FullTankAlgorithm(struct TankPara *tank,struct MonitoringData *data)
|
|||
|
|
{
|
|||
|
|
float MT1,MT2;
|
|||
|
|
float MaintainTime=200;
|
|||
|
|
float Nday=tank->Nday_0;
|
|||
|
|
short int Nd2=Nday/2;
|
|||
|
|
float day = tank->ForeCast_Date;
|
|||
|
|
float Lamda1=1.0;
|
|||
|
|
|
|||
|
|
CalSQdLng2(tank,data);
|
|||
|
|
|
|||
|
|
if (tank->LR==1)
|
|||
|
|
{
|
|||
|
|
if (tank->CZ == 21)
|
|||
|
|
{
|
|||
|
|
MT1 = (tank->Qn - tank->Qi) / tank->QdLNG20;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Lamda1 = 1;
|
|||
|
|
MT1 = t1ByTheoretical(tank, data) * Lamda1; // pci, cqr-20230213
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
MaintainTime = floor(MT1);
|
|||
|
|
}
|
|||
|
|
else if (tank->LR == 2)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if (tank->CZ == 21)
|
|||
|
|
{
|
|||
|
|
MT2 = (tank->Qn - tank->Qi) / tank->QdAvg;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
MT2 = t2ByMeasuredData(tank, data); // pci, cqr-20230213
|
|||
|
|
}
|
|||
|
|
MaintainTime = floor(MT2);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if (tank->CZ == 21)
|
|||
|
|
{
|
|||
|
|
MT1 = (tank->Qn - tank->Qi) / tank->QdLNG20;
|
|||
|
|
MT2 = (tank->Qn - tank->Qi) / tank->QdAvg;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
MT1 = t1ByTheoretical(tank, data);
|
|||
|
|
MT2 = t2ByMeasuredData(tank, data);
|
|||
|
|
}
|
|||
|
|
MaintainTime = (Nday - day) * MT1 / Nd2 + (day - Nd2) * MT2 / Nd2;
|
|||
|
|
MaintainTime = floor(MaintainTime);
|
|||
|
|
}
|
|||
|
|
return MaintainTime;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
float UniteAlgorithm(struct TankPara *tank,struct MonitoringData *data)
|
|||
|
|
{
|
|||
|
|
float t0,QdLNG2, F, Factor_Russia, Afai;
|
|||
|
|
short int MTk,MTm;
|
|||
|
|
float MT,MT1,MT2;
|
|||
|
|
short int MaintainTime=tank->MTime_0;
|
|||
|
|
short int Nday=tank->Nday_0;
|
|||
|
|
short int Nd2=Nday/2;
|
|||
|
|
float day = tank->ForeCast_Date;
|
|||
|
|
|
|||
|
|
|
|||
|
|
float k2 = Calculate_k2(tank,data);
|
|||
|
|
|
|||
|
|
float ci=CalculateLiquidC(tank->ch4,data->Record_P);
|
|||
|
|
|
|||
|
|
float Factor_Kf = Calculate_kzc(tank) ;
|
|||
|
|
|
|||
|
|
float Factor_y =Calculate_ky(tank,data) ;
|
|||
|
|
|
|||
|
|
CalSQdLng2(tank,data);
|
|||
|
|
|
|||
|
|
if (tank->LR==1)
|
|||
|
|
{
|
|||
|
|
//////
|
|||
|
|
t0=(tank->Qn - tank->Qi) *k2 /tank->QdLNG20 ;
|
|||
|
|
|
|||
|
|
F=tank->QdLNG20/ k2 /(tank->m0*ci*tank->TavgL)/24;
|
|||
|
|
Factor_Russia = RussiaCorrect(tank,data, F);
|
|||
|
|
|
|||
|
|
MT = t0*Factor_Kf* Factor_y *tank->lamda/ Factor_Russia;
|
|||
|
|
|
|||
|
|
MTm= floor(MT);
|
|||
|
|
|
|||
|
|
MT=(tank->Qn_kg - tank->Qi_kg) *k2 /tank->QdLNG20 ;
|
|||
|
|
MTk= floor(MT);
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else if(tank->LR==2)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
t0=(tank->Qn - tank->Qi)/tank->QdAvg;
|
|||
|
|
|
|||
|
|
F=tank->QdAvg/(tank->m0*ci*tank->TavgL)/24; // QdLNG2=tank->QdAvg
|
|||
|
|
|
|||
|
|
Factor_Russia = RussiaCorrect(tank,data, F);
|
|||
|
|
|
|||
|
|
MT = t0* Factor_y / Factor_Russia*tank->lamda;
|
|||
|
|
MTm= floor(MT);
|
|||
|
|
|
|||
|
|
MT=(tank->Qn_kg - tank->Qi_kg)/tank->QdAvg;
|
|||
|
|
MTk= floor(MT);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
t0=(tank->Qn - tank->Qi) *k2 /tank->QdLNG20 ;
|
|||
|
|
F=tank->QdLNG20/ k2 /(tank->m0*ci*tank->TavgL)/24;
|
|||
|
|
Factor_Russia = RussiaCorrect(tank,data, F);
|
|||
|
|
MT1 = t0*Factor_Kf* Factor_y *tank->lamda/ Factor_Russia;
|
|||
|
|
|
|||
|
|
t0=(tank->Qn - tank->Qi)/tank->QdAvg;
|
|||
|
|
F=tank->QdAvg/(tank->m0*ci*tank->TavgL)/24; // QdLNG2=tank->QdAvg
|
|||
|
|
Factor_Russia = RussiaCorrect(tank,data, F);
|
|||
|
|
MT2 = t0* Factor_y / Factor_Russia*tank->lamda;
|
|||
|
|
|
|||
|
|
MT=(Nday-day)*MT1/Nd2+(day-Nd2)*MT2/Nd2;
|
|||
|
|
MTm= floor(MT);
|
|||
|
|
|
|||
|
|
MT1=(tank->Qn_kg - tank->Qi_kg) *k2 /tank->QdLNG20 ;
|
|||
|
|
MT2=(tank->Qn_kg - tank->Qi_kg)/tank->QdAvg;
|
|||
|
|
MT=(Nday-day)*MT1/Nd2+(day-Nd2)*MT2/Nd2;
|
|||
|
|
MTk= floor(MT);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Afai=acos(1 - data->Yewei/(0.5*tank->D))/3.14159;
|
|||
|
|
MT=( tank->ZQY*Afai*MTm + tank->ZQQ*(1- Afai)*MTk ) / (tank->ZQY*Afai + tank->ZQQ*(1- Afai)); //ZQY =k2 ,ZQQ=k1
|
|||
|
|
|
|||
|
|
MaintainTime= floor(MT);
|
|||
|
|
|
|||
|
|
return MaintainTime;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
float ExpandTankAlgorithm(struct PhysicochemicalPara *PCn)
|
|||
|
|
{
|
|||
|
|
float Pn=0.75;
|
|||
|
|
float SafetyFactor=0.95;
|
|||
|
|
|
|||
|
|
float RhoSafe=SafetyFactor*(*PCn).RhoL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
float EmptyTankAlgorithm(struct TankPara *tank,struct MonitoringData *data)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
float MT1, MT2;
|
|||
|
|
float MaintainTime = tank->MTime_0;
|
|||
|
|
float Nday = tank->Nday_0;
|
|||
|
|
short int Nd2 = Nday / 2;
|
|||
|
|
float day = tank->ForeCast_Date;
|
|||
|
|
float v, Hi, Hn;
|
|||
|
|
|
|||
|
|
v = tank->R_0 * data->Record_Tg / ((data->Record_P + 0.1) * tank->Mavg_0 * 1000);
|
|||
|
|
Hi = CalculateGasH(tank->ch4, data->Record_P);
|
|||
|
|
Hn = CalculateGasH(tank->ch4, tank->Pn);
|
|||
|
|
tank->Qi = tank->TankVolYX * Hi / v;
|
|||
|
|
tank->Qn = tank->TankVolYX * Hn / v;
|
|||
|
|
|
|||
|
|
SaveDailyHeatLoss(tank);
|
|||
|
|
|
|||
|
|
CalSQdLng2(tank, data);
|
|||
|
|
|
|||
|
|
if (tank->LR == 1)
|
|||
|
|
{
|
|||
|
|
MT1 = (tank->Qn - tank->Qi) / tank->QdLNG20;
|
|||
|
|
MaintainTime = floor(MT1);
|
|||
|
|
}
|
|||
|
|
else if (tank->LR == 2)
|
|||
|
|
{
|
|||
|
|
MT2 = (tank->Qn - tank->Qi) / tank->QdAvg;
|
|||
|
|
MaintainTime = floor(MT2);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
MT1 = (tank->Qn - tank->Qi) / tank->QdLNG20;
|
|||
|
|
MT2 = (tank->Qn - tank->Qi) / tank->QdAvg;
|
|||
|
|
|
|||
|
|
MaintainTime = (Nday - day) * MT1 / Nd2 + (day - Nd2) * MT2 / Nd2;
|
|||
|
|
MaintainTime = floor(MaintainTime);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return MaintainTime;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
float RegressionQHQR(float x)
|
|||
|
|
{
|
|||
|
|
float result = 0;
|
|||
|
|
float x2, x3;
|
|||
|
|
x2 = x * x;
|
|||
|
|
x3 = x2 * x;
|
|||
|
|
|
|||
|
|
if (x <= 0.5)
|
|||
|
|
{
|
|||
|
|
result = -178.95 * x3 + 226.49 * x2 - 192.60 * x + 510.65;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
result = -12.14 * x3 + 42.16 * x2 - 123.63 * x + 501.63;
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
float CalculateLiquidTemperature(float ch4,float x)
|
|||
|
|
{
|
|||
|
|
float RegressionFormulaOfLT(short int CH4,float x);
|
|||
|
|
float y1,y2, y =0;
|
|||
|
|
short int CH4,CH5;
|
|||
|
|
|
|||
|
|
CH4 = 98 - floor((98-ch4)/4)*4;
|
|||
|
|
y1 = RegressionFormulaOfLT(CH4, x);
|
|||
|
|
|
|||
|
|
CH5 = 98 - ceil((98-ch4)/4)*4;
|
|||
|
|
y2 = RegressionFormulaOfLT(CH5, x);
|
|||
|
|
|
|||
|
|
if (CH4==CH5)
|
|||
|
|
{
|
|||
|
|
y=y1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
y=y1+(y2-y1)*(ch4-CH4)/(CH5-CH4);
|
|||
|
|
return y;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
float RegressionFormulaOfLT(short int CH4,float x)
|
|||
|
|
{
|
|||
|
|
float y = 0;
|
|||
|
|
float x2, x3;
|
|||
|
|
x2 = x * x;
|
|||
|
|
x3 = x2 * x;
|
|||
|
|
|
|||
|
|
if (x <= 0.5)
|
|||
|
|
{
|
|||
|
|
switch (CH4)
|
|||
|
|
{
|
|||
|
|
case 98: y = 122.33 * x3 - 154.12 * x2 + 100.88 * x + 112.15;
|
|||
|
|
break;
|
|||
|
|
case 94: y = 123.45 * x3 - 155.49 * x2 + 102.03 * x + 112.64;
|
|||
|
|
break;
|
|||
|
|
case 90: y = 124.55 * x3 - 156.88 * x2 + 103.19 * x + 113.14;
|
|||
|
|
break;
|
|||
|
|
case 86: y = 125.46 * x3 - 158.15 * x2 + 104.35 * x + 113.63;
|
|||
|
|
break;
|
|||
|
|
case 82: y = 126.70 * x3 - 159.66 * x2 + 105.58 * x + 114.13;
|
|||
|
|
break;
|
|||
|
|
case 78: y = 127.80 * x3 - 161.10 * x2 + 106.85 * x + 114.65;
|
|||
|
|
break;
|
|||
|
|
case 74: y = 128.92 * x3 - 162.60 * x2 + 108.19 * x + 115.18;
|
|||
|
|
break;
|
|||
|
|
case 70: y = 130.42 * x3 - 164.42 * x2 + 109.65 * x + 115.73;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
switch (CH4)
|
|||
|
|
{
|
|||
|
|
case 98: y = 7.60 * x3 - 27.91 * x2 + 53.86 * x + 118.27;
|
|||
|
|
break;
|
|||
|
|
case 94: y = 7.67 * x3 - 28.14 * x2 + 54.57 * x + 118.83;
|
|||
|
|
break;
|
|||
|
|
case 90: y = 7.70 * x3 - 28.32 * x2 + 55.26 * x + 119.38;
|
|||
|
|
break;
|
|||
|
|
case 86: y = 7.83 * x3 - 28.71 * x2 + 56.12 * x + 119.91;
|
|||
|
|
break;
|
|||
|
|
case 82: y = 7.89 * x3 - 28.95 * x2 + 56.87 * x + 120.48;
|
|||
|
|
break;
|
|||
|
|
case 78: y = 7.92 * x3 - 29.13 * x2 + 57.62 * x + 121.07;
|
|||
|
|
break;
|
|||
|
|
case 74: y = 7.99 * x3 - 29.41 * x2 + 58.46 * x + 121.67;
|
|||
|
|
break;
|
|||
|
|
case 70: y = 8.13 * x3 - 29.85 * x2 + 59.47 * x + 122.27;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
return y;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
float CalculateLiquidRhoAtP0(float ch4)
|
|||
|
|
{
|
|||
|
|
float y =0;
|
|||
|
|
|
|||
|
|
y= -0.0101343* ch4*ch4 - 0.748486*ch4 + 598.8173 ;
|
|||
|
|
return y;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
float CalculateLiquidRho(float ch4,float x)
|
|||
|
|
{
|
|||
|
|
float RegressionFormulaOfLRho(short int CH4, float x);
|
|||
|
|
float y1, y2, y = 0;
|
|||
|
|
short int CH4, CH5;
|
|||
|
|
|
|||
|
|
CH4 = 98 - floor((98-ch4)/4)*4;
|
|||
|
|
y1 = RegressionFormulaOfLRho(CH4, x);
|
|||
|
|
|
|||
|
|
CH5 = 98 - ceil((98-ch4)/4)*4;
|
|||
|
|
y2 = RegressionFormulaOfLRho(CH5, x);
|
|||
|
|
|
|||
|
|
if (CH4==CH5)
|
|||
|
|
{
|
|||
|
|
y=y1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
y=y1+(y2-y1)*(ch4-CH4)/(CH5-CH4);
|
|||
|
|
return y;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
float RegressionFormulaOfLRho(short int CH4,float x)
|
|||
|
|
{
|
|||
|
|
float y = 0;
|
|||
|
|
float x2, x3, x4, x5, x6;
|
|||
|
|
x2 = x * x;
|
|||
|
|
x3 = x2 * x;
|
|||
|
|
if (x <= 0.5)
|
|||
|
|
{
|
|||
|
|
switch (CH4)
|
|||
|
|
{
|
|||
|
|
case 98: y = -164.03 * x3 + 206.76 * x2 - 148.13 * x + 427.60;
|
|||
|
|
break;
|
|||
|
|
case 94: y = -163.15 * x3 + 205.76 * x2 - 146.79 * x + 438.41;
|
|||
|
|
break;
|
|||
|
|
case 90: y = -162.53 * x3 + 205.02 * x2 - 145.72 * x + 448.86;
|
|||
|
|
break;
|
|||
|
|
case 86: y = -162.12 * x3 + 204.50 * x2 - 144.89 * x + 458.99;
|
|||
|
|
break;
|
|||
|
|
case 82: y = -161.84 * x3 + 204.14 * x2 - 144.28 * x + 468.78;
|
|||
|
|
break;
|
|||
|
|
case 78: y = -161.74 * x3 + 203.97 * x2 - 143.89 * x + 478.26;
|
|||
|
|
break;
|
|||
|
|
case 74: y = -161.75 * x3 + 203.97 * x2 - 143.72 * x + 487.42;
|
|||
|
|
break;
|
|||
|
|
case 70: y = -161.96 * x3 + 204.20 * x2 - 143.79 * x + 496.27;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
switch (CH4)
|
|||
|
|
{
|
|||
|
|
case 98: y = -10.61 * x3 + 37.76 * x2 - 85.04 * x + 419.37;
|
|||
|
|
break;
|
|||
|
|
case 94: y = -10.37 * x3 + 37.30 * x2 - 83.78 * x + 430.16;
|
|||
|
|
break;
|
|||
|
|
case 90: y = -10.40 * x3 + 37.39 * x2 - 83.10 * x + 440.68;
|
|||
|
|
break;
|
|||
|
|
case 86: y = -10.28 * x3 + 37.16 * x2 - 82.36 * x + 450.81;
|
|||
|
|
break;
|
|||
|
|
case 82: y = -10.27 * x3 + 37.13 * x2 - 81.90 * x + 460.63;
|
|||
|
|
break;
|
|||
|
|
case 78: y = -10.22 * x3 + 37.03 * x2 - 81.54 * x + 470.11;
|
|||
|
|
break;
|
|||
|
|
case 74: y = -10.33 * x3 + 37.28 * x2 - 81.56 * x + 479.32;
|
|||
|
|
break;
|
|||
|
|
case 70: y = -10.24 * x3 + 37.10 * x2 - 81.41 * x + 488.12;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return y;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
float CalculateLiquidPressure(float ch4,float x)
|
|||
|
|
{
|
|||
|
|
float RegressionFormulaOfLP(short int CH4, float x);
|
|||
|
|
float y1, y2, y = 0;
|
|||
|
|
short int CH4, CH5;
|
|||
|
|
|
|||
|
|
CH4 = 98 - floor((98-ch4)/4)*4;
|
|||
|
|
y1 = RegressionFormulaOfLP(CH4, x);
|
|||
|
|
|
|||
|
|
CH5 = 98 - ceil((98-ch4)/4)*4;
|
|||
|
|
y2 = RegressionFormulaOfLP(CH5, x);
|
|||
|
|
|
|||
|
|
if (CH4==CH5)
|
|||
|
|
{
|
|||
|
|
y=y1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
y=y1+(y2-y1)*(ch4-CH4)/(CH5-CH4);
|
|||
|
|
|
|||
|
|
return y;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
float RegressionFormulaOfLP(short int CH4,float x)
|
|||
|
|
{
|
|||
|
|
float y = 0;
|
|||
|
|
float x2, x3,x4;
|
|||
|
|
|
|||
|
|
|
|||
|
|
x=x/1000.0;
|
|||
|
|
|
|||
|
|
x2 = x * x;
|
|||
|
|
x3 = x2 * x;
|
|||
|
|
x4 = x3 * x;
|
|||
|
|
|
|||
|
|
if (CH4 == 98) { y = -5705.7232 * x4 + 9012.0160 * x3 - 5185.3260 * x2 + 1269.7312 * x - 108.6789; }
|
|||
|
|
else if (CH4 == 94) { y = -5807.2057 * x4 + 9386.1696 * x3 - 5530.0392 * x2 + 1388.1830 * x - 122.0828; }
|
|||
|
|
else if (CH4 == 90) { y = -5957.1338 * x4 + 9848.0073 * x3 - 5940.2872 * x2 + 1529.3348 * x - 138.4160; }
|
|||
|
|
else if (CH4 == 86) { y = -5987.9029 * x4 + 10114.9401 * x3 - 6237.8634 * x2 + 1643.5345 * x - 152.5390; }
|
|||
|
|
else if (CH4 == 82) { y = -6065.9838 * x4 + 10465.5030 * x3 - 6597.6234 * x2 + 1779.7678 * x - 169.6392; }
|
|||
|
|
else if (CH4 == 78) { y = -6061.2901 * x4 + 10671.7238 * x3 - 6869.9006 * x2 + 1894.5804 * x - 185.0293; }
|
|||
|
|
else if (CH4 == 74) { y = -6111.6234 * x4 + 11082.4332 * x3 - 7358.2200 * x2 + 2098.0316 * x - 212.8264; }
|
|||
|
|
else { y = -6106.1082 * x4 + 10966.0253 * x3 - 7207.7210 * x2 + 2032.8882 * x - 203.6900; }
|
|||
|
|
|
|||
|
|
|
|||
|
|
return y;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
float CalculateLiquid_H(float ch4,float x)
|
|||
|
|
{
|
|||
|
|
float RegressionFormulaOfLH(short int CH4, float x);
|
|||
|
|
float y1, y2, y = 0;
|
|||
|
|
short int CH4, CH5;
|
|||
|
|
|
|||
|
|
CH4 = 98 - floor((98-ch4)/4)*4;
|
|||
|
|
y1 = RegressionFormulaOfLH(CH4, x);
|
|||
|
|
|
|||
|
|
CH5 = 98 - ceil((98-ch4)/4)*4;
|
|||
|
|
y2 = RegressionFormulaOfLH(CH5, x);
|
|||
|
|
|
|||
|
|
if (CH4==CH5)
|
|||
|
|
{
|
|||
|
|
y=y1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
y=y1+(y2-y1)*(ch4-CH4)/(CH5-CH4);
|
|||
|
|
return y;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
float RegressionFormulaOfLH(short int CH4,float x)
|
|||
|
|
{
|
|||
|
|
float y = 0;
|
|||
|
|
float x2, x3, x4, x5, x6;
|
|||
|
|
x2 = x * x;
|
|||
|
|
x3 = x2 * x;
|
|||
|
|
if (x <= 0.5)
|
|||
|
|
{
|
|||
|
|
switch (CH4)
|
|||
|
|
{
|
|||
|
|
case 98: y = 408.6621 * x3 - 514.7035 * x2 + 349.7897 * x + 0.7425;
|
|||
|
|
break;
|
|||
|
|
case 94: y = 401.8792 * x3 - 506.2911 * x2 + 344.0044 * x + 0.7301;
|
|||
|
|
break;
|
|||
|
|
case 90: y = 395.8130 * x3 - 498.7525 * x2 + 338.9289 * x + 0.7188;
|
|||
|
|
break;
|
|||
|
|
case 86: y = 390.4063 * x3 - 492.0258 * x2 + 334.5137 * x + 0.7087;
|
|||
|
|
break;
|
|||
|
|
case 82: y = 385.6236 * x3 - 486.0729 * x2 + 330.7247 * x + 0.6996;
|
|||
|
|
break;
|
|||
|
|
case 78: y = 381.4272 * x3 - 480.8513 * x2 + 327.5332 * x + 0.6913;
|
|||
|
|
break;
|
|||
|
|
case 74: y = 377.8063 * x3 - 476.3438 * x2 + 324.9221 * x + 0.6840;
|
|||
|
|
break;
|
|||
|
|
case 70: y = 374.7320 * x3 - 472.5257 * x2 + 322.8822 * x + 0.6773;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
switch (CH4)
|
|||
|
|
{
|
|||
|
|
case 98: y = 25.6124 * x3 - 92.9922 * x2 + 192.4485 * x + 21.2673;
|
|||
|
|
break;
|
|||
|
|
case 94: y = 25.1048 * x3 - 91.4094 * x2 + 189.1625 * x + 20.9381;
|
|||
|
|
break;
|
|||
|
|
case 90: y = 24.6776 * x3 - 90.0344 * x2 + 186.3589 * x + 20.6360;
|
|||
|
|
break;
|
|||
|
|
case 86: y = 24.4165 * x3 - 89.0386 * x2 + 184.1263 * x + 20.3316;
|
|||
|
|
break;
|
|||
|
|
case 82: y = 24.0721 * x3 - 87.9078 * x2 + 182.0935 * x + 20.1025;
|
|||
|
|
break;
|
|||
|
|
case 78: y = 23.9066 * x3 - 87.2079 * x2 + 180.6453 * x + 19.8552;
|
|||
|
|
break;
|
|||
|
|
case 74: y = 23.6234 * x3 - 86.3052 * x2 + 179.3353 * x + 19.6866;
|
|||
|
|
break;
|
|||
|
|
case 70: y = 23.4863 * x3 - 85.7562 * x2 + 178.5390 * x + 19.5130;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return y;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
float CalculateGasRho(float ch4,float x)
|
|||
|
|
{
|
|||
|
|
float RegressionFormulaOfGasRho(short int CH4, float x);
|
|||
|
|
float y1, y2, y = 0;
|
|||
|
|
short int CH4, CH5;
|
|||
|
|
CH4 = 98 - floor((98-ch4)/4)*4;
|
|||
|
|
y1 = RegressionFormulaOfGasRho(CH4, x);
|
|||
|
|
|
|||
|
|
CH5 = 98 - ceil((98-ch4)/4)*4;
|
|||
|
|
y2 = RegressionFormulaOfGasRho(CH5, x);
|
|||
|
|
|
|||
|
|
if (CH4==CH5)
|
|||
|
|
{
|
|||
|
|
y=y1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
y=y1+(y2-y1)*(ch4-CH4)/(CH5-CH4);
|
|||
|
|
return y;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
float RegressionFormulaOfGasRho(short int CH4,float x)
|
|||
|
|
{
|
|||
|
|
float y = 0;
|
|||
|
|
float x2, x3; //,x4,x5,x6;
|
|||
|
|
x2 = x * x;
|
|||
|
|
x3 = x2 * x;
|
|||
|
|
|
|||
|
|
if (x <= 0.5)
|
|||
|
|
{
|
|||
|
|
switch (CH4)
|
|||
|
|
{
|
|||
|
|
case 98: y = 1.5037 * x3 - 1.2647 * x2 + 13.9240 * x + 1.4903;
|
|||
|
|
break;
|
|||
|
|
case 94: y = 1.5800 * x3 - 1.6362 * x2 + 13.2188 * x + 1.4277;
|
|||
|
|
break;
|
|||
|
|
case 90: y = 1.6362 * x3 - 1.8383 * x2 + 13.0824 * x + 1.4197;
|
|||
|
|
break;
|
|||
|
|
case 86: y = 1.6862 * x3 - 1.9767 * x2 + 13.1128 * x + 1.4276;
|
|||
|
|
break;
|
|||
|
|
case 82: y = 1.7397 * x3 - 2.0879 * x2 + 13.2236 * x + 1.4431;
|
|||
|
|
break;
|
|||
|
|
case 78: y = 1.7912 * x3 - 2.1799 * x2 + 13.3805 * x + 1.4629;
|
|||
|
|
break;
|
|||
|
|
case 74: y = 1.8404 * x3 - 2.2581 * x2 + 13.5671 * x + 1.4856;
|
|||
|
|
break;
|
|||
|
|
case 70: y = 1.8925 * x3 - 2.3297 * x2 + 13.7752 * x + 1.5102;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
switch (CH4)
|
|||
|
|
{
|
|||
|
|
case 98: y = 0.2936 * x3 + 0.1331 * x2 + 13.3682 * x + 1.5685;
|
|||
|
|
break;
|
|||
|
|
case 94: y = 0.2931 * x3 - 0.1545 * x2 + 12.6338 * x + 1.5089;
|
|||
|
|
break;
|
|||
|
|
case 90: y = 0.2746 * x3 - 0.2611 * x2 + 12.4535 * x + 1.5083;
|
|||
|
|
break;
|
|||
|
|
case 86: y = 0.2685 * x3 - 0.3282 * x2 + 12.4520 * x + 1.5214;
|
|||
|
|
break;
|
|||
|
|
case 82: y = 0.2749 * x3 - 0.3904 * x2 + 12.5471 * x + 1.5382;
|
|||
|
|
break;
|
|||
|
|
case 78: y = 0.2719 * x3 - 0.4115 * x2 + 12.6704 * x + 1.5639;
|
|||
|
|
break;
|
|||
|
|
case 74: y = 0.2788 * x3 - 0.4425 * x2 + 12.8398 * x + 1.5886;
|
|||
|
|
break;
|
|||
|
|
case 70: y = 0.2885 * x3 - 0.4690 * x2 + 13.0324 * x + 1.6149;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return y;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
float CalculateGasH(float ch4,float x)
|
|||
|
|
{
|
|||
|
|
float RegressionFormulaOfGasH(short int CH4, float x);
|
|||
|
|
float y1, y2, y = 0;
|
|||
|
|
short int CH4, CH5;
|
|||
|
|
|
|||
|
|
CH4 = 98 - floor((98-ch4)/4)*4;
|
|||
|
|
y1 = RegressionFormulaOfGasH(CH4, x);
|
|||
|
|
|
|||
|
|
CH5 = 98 - ceil((98-ch4)/4)*4;
|
|||
|
|
y2 = RegressionFormulaOfGasH(CH5, x);
|
|||
|
|
|
|||
|
|
if (CH4==CH5)
|
|||
|
|
{
|
|||
|
|
y=y1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
y=y1+(y2-y1)*(ch4-CH4)/(CH5-CH4);
|
|||
|
|
return y;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
float RegressionFormulaOfGasH(short int CH4,float x)
|
|||
|
|
{
|
|||
|
|
float y = 0;
|
|||
|
|
float x2, x3; //,x4,x5,x6;
|
|||
|
|
x2 = x * x;
|
|||
|
|
x3 = x2 * x;
|
|||
|
|
|
|||
|
|
if (x <= 0.5)
|
|||
|
|
{
|
|||
|
|
switch (CH4)
|
|||
|
|
{
|
|||
|
|
case 98: y = 198.79 * x3 - 245.75 * x2 + 123.85 * x + 561.67;
|
|||
|
|
break;
|
|||
|
|
case 94: y = 225.06 * x3 - 279.39 * x2 + 146.15 * x + 582.90;
|
|||
|
|
break;
|
|||
|
|
case 90: y = 236.53 * x3 - 294.02 * x2 + 157.09 * x + 593.51;
|
|||
|
|
break;
|
|||
|
|
case 86: y = 243.06 * x3 - 302.41 * x2 + 163.76 * x + 600.52;
|
|||
|
|
break;
|
|||
|
|
case 82: y = 246.96 * x3 - 307.52 * x2 + 168.13 * x + 605.66;
|
|||
|
|
break;
|
|||
|
|
case 78: y = 249.25 * x3 - 310.63 * x2 + 171.09 * x + 609.62;
|
|||
|
|
break;
|
|||
|
|
case 74: y = 250.75 * x3 - 312.64 * x2 + 173.14 * x + 612.75;
|
|||
|
|
break;
|
|||
|
|
case 70: y = 251.28 * x3 - 313.53 * x2 + 174.48 * x + 615.26;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
switch (CH4)
|
|||
|
|
{
|
|||
|
|
case 98: y = 10.64 * x3 - 39.70 * x2 + 47.50 * x + 571.55;
|
|||
|
|
break;
|
|||
|
|
case 94: y = 12.69 * x3 - 46.95 * x2 + 60.13 * x + 594.01;
|
|||
|
|
break;
|
|||
|
|
case 90: y = 13.47 * x3 - 49.74 * x2 + 66.62 * x + 605.20;
|
|||
|
|
break;
|
|||
|
|
case 86: y = 13.87 * x3 - 51.24 * x2 + 70.62 * x + 612.58;
|
|||
|
|
break;
|
|||
|
|
case 82: y = 14.20 * x3 - 52.38 * x2 + 73.51 * x + 617.91;
|
|||
|
|
break;
|
|||
|
|
case 78: y = 14.38 * x3 - 53.07 * x2 + 75.51 * x + 622.00;
|
|||
|
|
break;
|
|||
|
|
case 74: y = 14.49 * x3 - 53.52 * x2 + 76.96 * x + 625.22;
|
|||
|
|
break;
|
|||
|
|
case 70: y = 14.66 * x3 - 54.02 * x2 + 78.17 * x + 627.74;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return y;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
float CalculateLiquidC(float ch4,float x)
|
|||
|
|
{
|
|||
|
|
float RegressionFormulaOfLC(short int CH4, float x);
|
|||
|
|
float y1, y2, y = 0;
|
|||
|
|
short int CH4, CH5;
|
|||
|
|
|
|||
|
|
CH4 = 98 - floor((98-ch4)/4)*4;
|
|||
|
|
y1 = RegressionFormulaOfLC(CH4, x);
|
|||
|
|
|
|||
|
|
CH5 = 98 - ceil((98-ch4)/4)*4;
|
|||
|
|
y2 = RegressionFormulaOfLC(CH5, x);
|
|||
|
|
|
|||
|
|
if (CH4==CH5)
|
|||
|
|
{
|
|||
|
|
y=y1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
y=y1+(y2-y1)*(ch4-CH4)/(CH5-CH4);
|
|||
|
|
return y;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
float RegressionFormulaOfLC(short int CH4,float x)
|
|||
|
|
{
|
|||
|
|
float y = 0;
|
|||
|
|
float x2, x3; //,x4,x5,x6;
|
|||
|
|
x2 = x * x;
|
|||
|
|
x3 = x2 * x;
|
|||
|
|
|
|||
|
|
if (x <= 0.5)
|
|||
|
|
{
|
|||
|
|
switch (CH4)
|
|||
|
|
{
|
|||
|
|
case 98: y = 0.5366 * x3 - 0.5947 * x2 + 0.7390 * x + 3.4317;
|
|||
|
|
break;
|
|||
|
|
case 94: y = 0.4788 * x3 - 0.5426 * x2 + 0.6556 * x + 3.3389;
|
|||
|
|
break;
|
|||
|
|
case 90: y = 0.4280 * x3 - 0.4934 * x2 + 0.5850 * x + 3.2543;
|
|||
|
|
break;
|
|||
|
|
case 86: y = 0.3810 * x3 - 0.4460 * x2 + 0.5245 * x + 3.1768;
|
|||
|
|
break;
|
|||
|
|
case 82: y = 0.3383 * x3 - 0.4012 * x2 + 0.4724 * x + 3.1057;
|
|||
|
|
break;
|
|||
|
|
case 78: y = 0.3001 * x3 - 0.3599 * x2 + 0.4273 * x + 3.0400;
|
|||
|
|
break;
|
|||
|
|
case 74: y = 0.2651 * x3 - 0.3211 * x2 + 0.3881 * x + 2.9792;
|
|||
|
|
break;
|
|||
|
|
case 70: y = 0.2316 * x3 - 0.2839 * x2 + 0.3537 * x + 2.9228;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
switch (CH4)
|
|||
|
|
{
|
|||
|
|
case 98: y = 0.0575 * x3 - 0.0691 * x2 + 0.5441 * x + 3.4569;
|
|||
|
|
break;
|
|||
|
|
case 94: y = 0.0461 * x3 - 0.0662 * x2 + 0.4780 * x + 3.3620;
|
|||
|
|
break;
|
|||
|
|
case 90: y = 0.0371 * x3 - 0.0604 * x2 + 0.4221 * x + 3.2758;
|
|||
|
|
break;
|
|||
|
|
case 86: y = 0.0330 * x3 - 0.0605 * x2 + 0.3796 * x + 3.1959;
|
|||
|
|
break;
|
|||
|
|
case 82: y = 0.0285 * x3 - 0.0562 * x2 + 0.3418 * x + 3.1230;
|
|||
|
|
break;
|
|||
|
|
case 78: y = 0.0258 * x3 - 0.0538 * x2 + 0.3113 * x + 3.0554;
|
|||
|
|
break;
|
|||
|
|
case 74: y = 0.0237 * x3 - 0.0512 * x2 + 0.2856 * x + 2.9929;
|
|||
|
|
break;
|
|||
|
|
case 70: y = 0.0207 * x3 - 0.0458 * x2 + 0.2621 * x + 2.9352;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return y;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
double getDistanceFromGPS(double lat_a, double lng_a, double lat_b, double lng_b)
|
|||
|
|
{
|
|||
|
|
double pk = 3.1415926 /180 ;
|
|||
|
|
|
|||
|
|
double a1 = lat_a * pk;
|
|||
|
|
double a2 = lng_a * pk;
|
|||
|
|
double b1 = lat_b * pk;
|
|||
|
|
double b2 = lng_b * pk;
|
|||
|
|
|
|||
|
|
|
|||
|
|
double t1 = cos(a1) * cos(a2) * cos(b1) * cos(b2);
|
|||
|
|
double t2 = cos(a1) * sin(a2) * cos(b1) * sin(b2);
|
|||
|
|
double t3 = sin(a1) * sin(b1);
|
|||
|
|
double d = acos(t1 + t2 + t3);
|
|||
|
|
|
|||
|
|
d = d * 6378138;
|
|||
|
|
|
|||
|
|
return d;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|