From f1ba909a94d05b188a87ad030ef4406e2637e3d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Tue, 5 Mar 2019 16:53:58 +0100 Subject: [PATCH] Stuff for EW58: handle FVE408, valve EP1, enhanced TUHEX for 3-stage ED brake, old blending for DC-ED and EP brake --- McZapkie/MOVER.h | 21 +++++++- McZapkie/Mover.cpp | 112 +++++++++++++++++++++++++++++++++++++++---- McZapkie/hamulce.cpp | 96 +++++++++++++++++++++++++++++++++++-- McZapkie/hamulce.h | 31 +++++++++++- 4 files changed, 245 insertions(+), 15 deletions(-) diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index 8a60c62d..d8f210aa 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -369,7 +369,7 @@ enum class TBrakeSystem { Individual, Pneumatic, ElectroPneumatic }; /*podtypy hamulcow zespolonych*/ enum class TBrakeSubSystem { ss_None, ss_W, ss_K, ss_KK, ss_Hik, ss_ESt, ss_KE, ss_LSt, ss_MT, ss_Dako }; enum class TBrakeValve { NoValve, W, W_Lu_VI, W_Lu_L, W_Lu_XR, K, Kg, Kp, Kss, Kkg, Kkp, Kks, Hikg1, Hikss, Hikp1, KE, SW, EStED, NESt3, ESt3, LSt, ESt4, ESt3AL2, EP1, EP2, M483, CV1_L_TR, CV1, CV1_R, Other }; -enum class TBrakeHandle { NoHandle, West, FV4a, M394, M254, FVel1, FVel6, D2, Knorr, FD1, BS2, testH, St113, MHZ_P, MHZ_T, MHZ_EN57, MHZ_K5P, MHZ_K8P }; +enum class TBrakeHandle { NoHandle, West, FV4a, M394, M254, FVE408, FVel6, D2, Knorr, FD1, BS2, testH, St113, MHZ_P, MHZ_T, MHZ_EN57, MHZ_K5P, MHZ_K8P }; /*typy hamulcow indywidualnych*/ enum class TLocalBrake { NoBrake, ManualBrake, PneumaticBrake, HydraulicBrake }; /*dla osob/towar: opoznienie hamowania/odhamowania*/ @@ -966,10 +966,16 @@ public: int DynamicBrakeType = 0; /*patrz dbrake_**/ int DynamicBrakeAmpmeters = 2; /*liczba amperomierzy przy hamowaniu ED*/ double DynamicBrakeRes = 5.8; /*rezystancja oporników przy hamowaniu ED*/ - double TUHEX_Sum = 750; /*nastawa sterownika hamowania ED*/ + double DynamicBrakeRes1 = 5.8; /*rezystancja oporników przy hamowaniu ED - 1 tryb*/ + double DynamicBrakeRes2 = 5.8; /*rezystancja oporników przy hamowaniu ED - 2 tryb*/ + double TUHEX_Sum = 750; /*nastawa sterownika hamowania ED - aktualna*/ double TUHEX_Diff = 10; /*histereza działania sterownika hamowania ED*/ double TUHEX_MinIw = 60; /*minimalny prąd wzbudzenia przy hamowaniu ED - wynika z chk silnika*/ double TUHEX_MaxIw = 400; /*maksymalny prąd wzbudzenia przy hamowaniu ED - ograniczenie max siły*/ + double TUHEX_Sum1 = 750; /*nastawa1 sterownika hamowania ED*/ + double TUHEX_Sum2 = 750; /*nastawa2 sterownika hamowania ED*/ + double TUHEX_Sum3 = 750; /*nastawa3 sterownika hamowania ED*/ + int TUHEX_Stages = 0; /*liczba stopni hamowania ED*/ int RVentType = 0; /*0 - brak, 1 - jest, 2 - automatycznie wlaczany*/ double RVentnmax = 1.0; /*maks. obroty wentylatorow oporow rozruchowych*/ @@ -1049,6 +1055,12 @@ public: bool MED_EPVC = 0; // czy korekcja sily hamowania EP, gdy nie ma dostepnego ED double MED_EPVC_Time = 7; // czas korekcji sily hamowania EP, gdy nie ma dostepnego ED bool MED_Ncor = 0; // czy korekcja sily hamowania z uwzglednieniem nacisku + + int DCEMUED_CC; //na którym sprzęgu sprawdzać działanie ED + double DCEMUED_EP_max_Vel; //maksymalna prędkość, przy której działa EP przy włączonym ED w jednostce (dla tocznych) + double DCEMUED_EP_min_Im; //minimalny prąd, przy którym EP nie działa przy włączonym ED w członie (dla silnikowych) + double DCEMUED_EP_delay; //opóźnienie włączenia hamulca EP przy hamowaniu ED - zwłoka wstępna + /*-dla wagonow*/ struct load_attributes { std::string name; // name of the cargo @@ -1158,6 +1170,10 @@ public: int BrakeOpModeFlag = 0; /*nastawa trybu pracy PS/PN/EP/MED 1/2/4/8*/ int BrakeOpModes = 0; /*nastawy mozliwe do uzyskania*/ bool DynamicBrakeFlag = false; /*czy wlaczony hamulec elektrodymiczny*/ + bool DynamicBrakeEMUStatus = true; /*czy hamulec ED dziala w ezt*/ + int TUHEX_StageActual = 0; /*aktualny stopien tuhexa*/ + bool TUHEX_ResChange = false; /*czy zmiana rezystancji hamowania ED - odwzbudzanie*/ + bool TUHEX_Active = false; /*czy hamowanie ED wywołane z zewnątrz*/ // NapUdWsp: integer; double LimPipePress = 0.0; /*stabilizator cisnienia*/ double ActFlowSpeed = 0.0; /*szybkosc stabilizatora*/ @@ -1520,6 +1536,7 @@ private: void LoadFIZ_TurboPos( std::string const &line ); void LoadFIZ_Cntrl( std::string const &line ); void LoadFIZ_Blending(std::string const &line); + void LoadFIZ_DCEMUED(std::string const &line); void LoadFIZ_Light( std::string const &line ); void LoadFIZ_Security( std::string const &line ); void LoadFIZ_Clima( std::string const &line ); diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index c3dbec3d..cfb0a013 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -99,7 +99,7 @@ double TMoverParameters::Current(double n, double U) MotorCurrent = 0; // i dzialanie hamulca ED w EP09 - if (DynamicBrakeType == dbrake_automatic) + if ((DynamicBrakeType == dbrake_automatic)&&(TrainType != dt_EZT)) { if (((Hamulec->GetEDBCP() < 0.25) && (Vadd < 1)) || (BrakePress > 2.1)) DynamicBrakeFlag = false; @@ -107,6 +107,10 @@ double TMoverParameters::Current(double n, double U) DynamicBrakeFlag = true; DynamicBrakeFlag = (DynamicBrakeFlag && ConverterFlag); } + if ((DynamicBrakeType == dbrake_automatic) && (TrainType == dt_EZT)) + { + DynamicBrakeFlag = (ConverterFlag && (TUHEX_Active || (Vadd>TUHEX_MinIw)) && DynamicBrakeEMUStatus); + } // wylacznik cisnieniowy yBARC - to jest chyba niepotrzebne tutaj Q: no to usuwam... @@ -148,7 +152,7 @@ double TMoverParameters::Current(double n, double U) if (DynamicBrakeFlag && (!FuseFlag) && (DynamicBrakeType == dbrake_automatic) && ConverterFlag && Mains) // hamowanie EP09 //TUHEX { - // TODO: zrobic bardziej uniwersalne nie tylko dla EP09 + // TODO: zrobic bardziej uniwersalne nie tylko dla EP09 MotorCurrent = -Max0R(MotorParam[0].fi * (Vadd / (Vadd + MotorParam[0].Isat) - MotorParam[0].fi0), 0) * n * 2.0 / DynamicBrakeRes; } @@ -1410,6 +1414,9 @@ void TMoverParameters::compute_movement_( double const Deltatime ) { UpdatePipePressure(Deltatime); UpdateBatteryVoltage(Deltatime); UpdateScndPipePressure(Deltatime); // druga rurka, youBy + + if( ( ( DCEMUED_CC & 1 ) != 0 ) && ( ( Couplers[ end::front ].CouplingFlag & coupling::control ) != 0 ) ) { DynamicBrakeEMUStatus &= Couplers[ end::front ].Connected->DynamicBrakeEMUStatus; } + if( ( ( DCEMUED_CC & 2 ) != 0 ) && ( ( Couplers[ end::rear ].CouplingFlag & coupling::control ) != 0 ) ) { DynamicBrakeEMUStatus &= Couplers[ end::rear ].Connected->DynamicBrakeEMUStatus; } if( ( BrakeSlippingTimer > 0.8 ) && ( ASBType != 128 ) ) { // ASBSpeed=0.8 // hamulec antypoślizgowy - wyłączanie @@ -3596,6 +3603,7 @@ void TMoverParameters::UpdatePipePressure(double dt) } case TBrakeValve::EP2: + case TBrakeValve::EP1: { Hamulec->PLC( TotalMass-Mred ); break; @@ -3638,7 +3646,7 @@ void TMoverParameters::UpdatePipePressure(double dt) } } // switch - if ((BrakeHandle == TBrakeHandle::FVel6) && (ActiveCab != 0)) + if (((BrakeHandle == TBrakeHandle::FVel6)||(BrakeHandle == TBrakeHandle::FVE408)) && (ActiveCab != 0)) { if ((Battery) && (ActiveDir != 0) @@ -3647,7 +3655,16 @@ void TMoverParameters::UpdatePipePressure(double dt) temp = Handle->GetCP(); else temp = 0.0; - Hamulec->SetEPS(temp); + if (temp < 0.001) + DynamicBrakeEMUStatus = true; + double temp1 = temp; + if ((DCEMUED_EP_max_Vel > 0.001) && (Vel > DCEMUED_EP_max_Vel) && (DynamicBrakeEMUStatus)) + temp1 = 0; + if ((DCEMUED_EP_min_Im > 0.001) && (abs(Im) > DCEMUED_EP_min_Im) && (DynamicBrakeEMUStatus)) + temp1 = 0; + Hamulec->SetEPS(temp1); + TUHEX_StageActual = temp; + TUHEX_Active = TUHEX_StageActual > 0; // Ra 2014-11: na tym się wysypuje, ale nie wiem, w jakich warunkach SendCtrlToNext("Brake", temp, CabNo); } @@ -4578,11 +4595,43 @@ double TMoverParameters::TractionForce( double dt ) { } if ((DynamicBrakeType == dbrake_automatic) && (DynamicBrakeFlag)) { - if (((Vadd + abs(Im)) > TUHEX_Sum + TUHEX_Diff) || (Hamulec->GetEDBCP() < 0.25)) + if (TUHEX_Stages > 0) //hamowanie wielostopniowe, nadpisuje wartości domyślne + { + if (Vel > 100) TUHEX_StageActual = std::min(TUHEX_StageActual, 1); + switch (TUHEX_StageActual) + { + case 1: + TUHEX_Sum = TUHEX_Sum1; + DynamicBrakeRes = DynamicBrakeRes1; + break; + case 2: + TUHEX_Sum = TUHEX_Sum2; + DynamicBrakeRes = DynamicBrakeRes1; + break; + case 3: + TUHEX_Sum = TUHEX_Sum3; + if ((Vadd > 0.99*TUHEX_MaxIw) && (DynamicBrakeRes == DynamicBrakeRes1)) + TUHEX_ResChange = true; + if (TUHEX_ResChange && Vadd < 0.5*TUHEX_MaxIw) + { + TUHEX_ResChange = false; + DynamicBrakeRes = DynamicBrakeRes2; + } + break; + default: + DynamicBrakeRes = DynamicBrakeRes1; + TUHEX_Sum = 0; + break; + } + } + if (((Vadd + abs(Im)) > TUHEX_Sum + TUHEX_Diff) || (Hamulec->GetEDBCP() < 0.25) || (TUHEX_ResChange) || (TUHEX_StageActual==0 && TUHEX_Stages>0)) { Vadd -= 500.0 * dt; - if (Vadd < 1) - Vadd = 0; + if (Vadd < TUHEX_MinIw) + { + Vadd = 0; + DynamicBrakeFlag = false; + } } else if ((DynamicBrakeFlag) && ((Vadd + abs(Im)) < TUHEX_Sum - TUHEX_Diff)) { @@ -7642,6 +7691,14 @@ bool TMoverParameters::LoadFIZ(std::string chkpath) continue; } + if (issection("DCEMUED:", inputline)) { + + startBPT = true; LISTLINE = 0; + fizlines.emplace("DCEMUED", inputline); + LoadFIZ_DCEMUED(inputline); + continue; + } + if( issection( "Light:", inputline ) ) { startBPT = false; @@ -8284,6 +8341,7 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) { { "Knorr", TBrakeHandle::Knorr }, { "Westinghouse", TBrakeHandle::West }, { "FVel6", TBrakeHandle::FVel6 }, + { "FVE408", TBrakeHandle::FVE408 }, { "St113", TBrakeHandle::St113 } }; auto lookup = brakehandles.find( extract_value( "BrakeHandle", line ) ); @@ -8462,6 +8520,16 @@ void TMoverParameters::LoadFIZ_Blending(std::string const &line) { extract_value(MED_Ncor, "MED_Ncor", line, ""); } + +void TMoverParameters::LoadFIZ_DCEMUED(std::string const &line) { + + extract_value(DCEMUED_CC, "CouplerCheck", line, "0"); + extract_value(DCEMUED_EP_max_Vel, "EP_max_Vel", line, "0"); + extract_value(DCEMUED_EP_min_Im, "EP_min_Im", line, "0"); + extract_value(DCEMUED_EP_delay, "EP_delay", line, "0"); + +} + void TMoverParameters::LoadFIZ_Light( std::string const &line ) { LightPowerSource.SourceType = LoadFIZ_SourceDecode( extract_value( "Light", line ) ); @@ -8750,6 +8818,11 @@ void TMoverParameters::LoadFIZ_Circuit( std::string const &Input ) { extract_value( TUHEX_Diff, "TUHEX_Diff", Input, "" ); extract_value( TUHEX_MaxIw, "TUHEX_MaxIw", Input, "" ); extract_value( TUHEX_MinIw, "TUHEX_MinIw", Input, "" ); + extract_value( TUHEX_Sum1, "TUHEX_Sum1", Input, ""); + extract_value( TUHEX_Sum2, "TUHEX_Sum2", Input, "" ); + extract_value( TUHEX_Sum3, "TUHEX_Sum3", Input, "" ); + extract_value( TUHEX_Stages, "TUHEX_Stages", Input, "0" ); + } void TMoverParameters::LoadFIZ_RList( std::string const &Input ) { @@ -8778,6 +8851,8 @@ void TMoverParameters::LoadFIZ_RList( std::string const &Input ) { extract_value( RVentMinI, "RVentMinI", Input, "" ); extract_value( RVentSpeed, "RVentSpeed", Input, "" ); extract_value( DynamicBrakeRes, "DynBrakeRes", Input, ""); + extract_value( DynamicBrakeRes1, "DynBrakeRes1", Input, ""); + extract_value( DynamicBrakeRes2, "DynBrakeRes2", Input, ""); } void TMoverParameters::LoadFIZ_DList( std::string const &Input ) { @@ -9048,6 +9123,13 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir) Hamulec->SetLP( Mass, MBPM, MaxBrakePress[ 1 ] ); break; } + case TBrakeValve::EP1: + { + WriteLog("XBT EP1"); + Hamulec = std::make_shared(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA); + Hamulec->SetLP(Mass, MBPM, MaxBrakePress[1]); + break; + } case TBrakeValve::CV1: { WriteLog( "XBT CV1" ); @@ -9077,6 +9159,9 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir) case TBrakeHandle::FVel6: Handle = std::make_shared(); break; + case TBrakeHandle::FVE408: + Handle = std::make_shared(); + break; case TBrakeHandle::testH: Handle = std::make_shared(); break; @@ -9392,7 +9477,18 @@ bool TMoverParameters::RunCommand( std::string Command, double CValue1, double C end */ else if (Command == "Brake") // youBy - jak sie EP hamuje, to trza sygnal wyslac... { - Hamulec->SetEPS(CValue1); + if (CValue1 < 0.001) + DynamicBrakeEMUStatus = true; + double temp1 = CValue1; + if ((DCEMUED_EP_max_Vel > 0.001) && (Vel > DCEMUED_EP_max_Vel) && (DynamicBrakeEMUStatus)) + temp1 = 0; + if ((DCEMUED_EP_min_Im > 0.001) && (abs(Im) > DCEMUED_EP_min_Im) && (DynamicBrakeEMUStatus)) + temp1 = 0; + Hamulec->SetEPS(temp1); + TUHEX_StageActual = CValue1; + TUHEX_Active = TUHEX_StageActual > 0; + if (CValue1 < 0.001) + DynamicBrakeEMUStatus = true; // fBrakeCtrlPos:=BrakeCtrlPos; //to powinnno być w jednym miejscu, aktualnie w C++!!! BrakePressureActual = BrakePressureTable[BrakeCtrlPos]; OK = SendCtrlToNext( Command, CValue1, CValue2, Couplertype ); diff --git a/McZapkie/hamulce.cpp b/McZapkie/hamulce.cpp index a58dc3d1..f01d6697 100644 --- a/McZapkie/hamulce.cpp +++ b/McZapkie/hamulce.cpp @@ -31,6 +31,7 @@ double const TSt113::BPT_K[6][2] = {{10, 0}, {4, 1}, {0, 1}, {4, 0}, {4, -1}, {1 double const TSt113::BEP_K[7] = {0, -1, 1, 0, 0, 0, 0}; double const TSt113::pos_table[11] = {-1, 5, -1, 0, 2, 3, 4, 5, 0, 0, 1}; double const TFVel6::pos_table[11] = {-1, 6, -1, 0, 6, 4, 4.7, 5, -1, 0, 1}; +double const TFVE408::pos_table[11] = { 0, 10, 0, 0, 10, 7, 8, 9, 0, 1, 5 }; double PR(double P1, double P2) { @@ -133,6 +134,11 @@ double PFVd( double PH, double PL, double const S, double LIM, double const DP ) return 0; } +bool is_EQ(double pos, double i_pos) +{ + return (pos <= i_pos + 0.5) && (pos > i_pos - 0.5); +} + //---ZBIORNIKI--- double TReservoir::pa() @@ -863,10 +869,7 @@ double TEStEP2::GetPF( double const PP, double const dt, double const Vel ) dV1 = dV1 - 0.96 * dv; // hamulec EP - temp = BVP * int(EPS > 0); - dv = PF(temp, LBP, 0.00053 + 0.00060 * int(EPS < 0)) * dt * EPS * EPS * - int(LBP * EPS < MaxBP * LoadC); - LBP = LBP - dv; + EPCalc(dt); // luzowanie KI if ((BrakeStatus & b_hld) == b_off) @@ -936,6 +939,24 @@ void TEStEP2::SetLP( double const TM, double const LM, double const TBP ) TareBP = TBP; } +void TEStEP2::EPCalc(double dt) +{ + double temp = BrakeRes->P() * int(EPS > 0); + double dv = PF(temp, LBP, 0.00053 + 0.00060 * int(EPS < 0)) * dt * EPS * EPS * + int(LBP * EPS < MaxBP * LoadC); + LBP = LBP - dv; +} + + +void TEStEP1::EPCalc(double dt) +{ + double temp = EPS - std::floor(EPS); //część ułamkowa jest hamulcem EP + double LBPLim = Min0R(MaxBP * LoadC * temp, BrakeRes->P()); //do czego dążymy + double S = 10 * clamp(LBPLim - LBP, -0.1, 0.1); //przymykanie zaworku + double dv = PF(( S > 0 ? BrakeRes->P() : 0 ), LBP, abs(S)*(0.00053 + 0.00060 * int(S < 0))) * dt; //przepływ + LBP = LBP - dv; +} + //---EST3-- double TESt3::GetPF( double const PP, double const dt, double const Vel ) @@ -3133,4 +3154,71 @@ void TFVel6::Init(double Press) TimeEP = true; } +//---FVE408--- + +double TFVE408::GetPF(double i_bcp, double PP, double HP, double dt, double ep) +{ + static int const LBDelay = 100; + + double LimPP; + double dpMainValve; + double ActFlowSpeed; + + LimPP = Min0R(5 * int(i_bcp < 6.5), HP); + if ((i_bcp >= 6.5) && ((i_bcp < 7.5) || (i_bcp > 9.5))) + ActFlowSpeed = 0; + else if ((i_bcp > 7.5) && (i_bcp < 8.5)) + ActFlowSpeed = 2; // konsultacje wawa1 - bylo 8; + else if ((i_bcp < 6.5)) + ActFlowSpeed = 2; + else + ActFlowSpeed = 4; + dpMainValve = PF(LimPP, PP, ActFlowSpeed / LBDelay) * dt; + + Sounds[s_fv4a_e] = 0; + Sounds[s_fv4a_u] = 0; + Sounds[s_fv4a_b] = 0; + if ((i_bcp < 6.5)) + Sounds[s_fv4a_u] = -dpMainValve; + else if ((i_bcp < 8.5)) + Sounds[s_fv4a_b] = dpMainValve; + else if ((i_bcp < 9.5)) + Sounds[s_fv4a_e] = dpMainValve; + + if (is_EQ(i_bcp, 1)) EPS = 1.15; else + if (is_EQ(i_bcp, 2)) EPS = 1.40; else + if (is_EQ(i_bcp, 3)) EPS = 2.64; else + if (is_EQ(i_bcp, 4)) EPS = 3.84; else + if (is_EQ(i_bcp, 5)) EPS = 3.99; else + EPS = 0; + + return dpMainValve; +} + +double TFVE408::GetCP() +{ + return EPS; +} + +double TFVE408::GetPos(int i) +{ + return pos_table[i]; +} + +double TFVE408::GetSound(int i) +{ + if (i > 2) + return 0; + else + return Sounds[i]; +} + +void TFVE408::Init(double Press) +{ + Time = true; + TimeEP = false; +} + // END + + diff --git a/McZapkie/hamulce.h b/McZapkie/hamulce.h index 07134e18..ecec4c14 100644 --- a/McZapkie/hamulce.h +++ b/McZapkie/hamulce.h @@ -381,7 +381,7 @@ class TEStED : public TLSt { //zawor z EP09 - Est4 z oddzielnym przekladnikiem, class TEStEP2 : public TLSt { -private: +protected: double TareM = 0.0; //masa proznego double LoadM = 0.0; //masa pelnego double TareBP = 0.0; //cisnienie dla proznego @@ -394,12 +394,23 @@ public: void PLC( double const mass ); //wspolczynnik cisnienia przystawki wazacej void SetEPS( double const nEPS )/*override*/; //stan hamulca EP void SetLP( double const TM, double const LM, double const TBP ); //parametry przystawki wazacej + void virtual EPCalc(double dt); inline TEStEP2(double i_mbp, double i_bcr, double i_bcd, double i_brc, int i_bcn, int i_BD, int i_mat, int i_ba, int i_nbpa) : TLSt( i_mbp, i_bcr, i_bcd, i_brc, i_bcn, i_BD, i_mat, i_ba, i_nbpa) {} }; +class TEStEP1 : public TEStEP2 { + +public: + void EPCalc(double dt); + + inline TEStEP1(double i_mbp, double i_bcr, double i_bcd, double i_brc, int i_bcn, int i_BD, int i_mat, int i_ba, int i_nbpa) : + TEStEP2(i_mbp, i_bcr, i_bcd, i_brc, i_bcn, i_BD, i_mat, i_ba, i_nbpa) + {} +}; + class TCV1 : public TBrake { private: @@ -775,6 +786,24 @@ class TFVel6 : public TDriverHandle { {} }; +class TFVE408 : public TDriverHandle { + +private: + double EPS = 0.0; + static double const pos_table[11]; // = {-1, 6, -1, 0, 6, 4, 4.7, 5, -1, 0, 1}; + +public: + double GetPF(double i_bcp, double PP, double HP, double dt, double ep)/*override*/; + double GetCP()/*override*/; + double GetPos(int i)/*override*/; + double GetSound(int i)/*override*/; + void Init(double Press)/*override*/; + + inline TFVE408(void) : + TDriverHandle() + {} +}; + extern double PF( double const P1, double const P2, double const S, double const DP = 0.25 ); extern double PF1( double const P1, double const P2, double const S );