From ca4659791689c8678a1c730c35c7c75b0914b137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Mon, 11 Feb 2019 20:53:09 +0100 Subject: [PATCH 01/14] Added parameters of train (mass and length) for driver timetable panel --- driveruipanels.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/driveruipanels.cpp b/driveruipanels.cpp index e30f921b..e4f221f0 100644 --- a/driveruipanels.cpp +++ b/driveruipanels.cpp @@ -220,7 +220,17 @@ timetable_panel::update() { } else { auto const readycolor { glm::vec4( 84.0f / 255.0f, 164.0f / 255.0f, 132.0f / 255.0f, 1.f ) }; - // header + + text_lines.emplace_back("Brutto rozkl. " + to_string(table->LocLoad), Global.UITextColor); + auto fMass = owner->fMass / 1000; + if (owner->mvControlling->TrainType & (dt_DMU + dt_EZT) == 0) + { + //odejmij lokomotywy czynne, a przynajmniej aktualną + } + text_lines.emplace_back("Brutto rzecz. " + to_string(fMass,0), Global.UITextColor); + text_lines.emplace_back("Dl.poc. rzecz. " + to_string(owner->fLength,0), Global.UITextColor); + + // header text_lines.emplace_back( "+-----+------------------------------------+-------+-----+", Global.UITextColor ); TMTableLine const *tableline; From 2fefc39db951ac2beda7bcf5e744d8b7df18aa5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Sun, 3 Mar 2019 21:25:49 +0100 Subject: [PATCH 02/14] ref_commit --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 549b13c4..b9508dd8 100644 --- a/.gitignore +++ b/.gitignore @@ -70,4 +70,5 @@ ipch/ ref/ *.aps -builds/ \ No newline at end of file +builds/ +/gitignore From 5b20724845288f739ae50208d07aa227c961864d 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 03/14] 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 d56bbf16..09936bb3 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..99c172eb 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) && (Couplers[0].CouplingFlag & 4)) DynamicBrakeEMUStatus &= Couplers[0].Connected->DynamicBrakeEMUStatus; + if ((DCEMUED_CC & 2) && (Couplers[1].CouplingFlag & 4)) DynamicBrakeEMUStatus &= Couplers[1].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 ); From b11358f9bf945096f2adeb18c3981916fda6ccd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Wed, 6 Mar 2019 20:05:26 +0100 Subject: [PATCH 04/14] Unified multiplier for "brakes" gauge with other pneumatic gauges --- Train.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Train.cpp b/Train.cpp index 75a1942d..072aedc6 100644 --- a/Train.cpp +++ b/Train.cpp @@ -8026,7 +8026,7 @@ bool TTrain::initialize_gauge(cParser &Parser, std::string const &Label, int con Parser.getTokens(2, false); Parser >> i >> j; auto &gauge = Cabine[Cabindex].Gauge(-1); // pierwsza wolna gałka - gauge.Load(Parser, DynamicObject); + gauge.Load(Parser, DynamicObject, 0.1); gauge.AssignFloat(&fPress[i - 1][j]); } else if ((Label == "brakepress:") || (Label == "brakepressb:")) From 902ed83281422474457b435adc508b5480a70811 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Fri, 8 Mar 2019 19:35:34 +0100 Subject: [PATCH 05/14] New MainCtrlTypes for EIM Integrated Control dedicated to Traxx and Elf --- DynObj.cpp | 24 ++++++--- McZapkie/MOVER.h | 7 +++ McZapkie/Mover.cpp | 123 ++++++++++++++++++++++++++++++++++++--------- 3 files changed, 123 insertions(+), 31 deletions(-) diff --git a/DynObj.cpp b/DynObj.cpp index 3be66387..0119ca41 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -2684,7 +2684,7 @@ bool TDynamicObject::Update(double dt, double dt1) MoverParameters->EqvtPipePress = GetEPP(); // srednie cisnienie w PG if( ( Mechanik->Primary() ) && ( MoverParameters->EngineType == TEngineType::ElectricInductionMotor ) ) { - // jesli glowny i z asynchronami, to niech steruje hamulcem lacznie dla calego pociagu/ezt + // jesli glowny i z asynchronami, to niech steruje hamulcem i napedem lacznie dla calego pociagu/ezt auto const kier = (DirectionGet() * MoverParameters->ActiveCab > 0); auto FED { 0.0 }; auto np { 0 }; @@ -2696,6 +2696,16 @@ bool TDynamicObject::Update(double dt, double dt1) auto FmaxED { 0.0 }; auto Frj { 0.0 }; auto osie { 0 }; + // 0a. ustal aktualna nastawe zadania sily napedowej i hamowania + if (MoverParameters->Power < 1) + MoverParameters->MainCtrlPos = ctOwner->Controlling()->MainCtrlPos*MoverParameters->MainCtrlPosNo / std::max(1, ctOwner->Controlling()->MainCtrlPosNo); + MoverParameters->CheckEIMIC(dt1); + MoverParameters->CheckSpeedCtrl(); + + MoverParameters->eimic = Min0R(MoverParameters->eimic, MoverParameters->eimicSpeedCtrl); + MoverParameters->SendCtrlToNext("EIMIC", Max0R(0, MoverParameters->eimic), MoverParameters->CabNo); + auto LBR = Max0R(-MoverParameters->eimic, 0); + // 1. ustal wymagana sile hamowania calego pociagu // - opoznienie moze byc ustalane na podstawie charakterystyki // - opoznienie moze byc ustalane na podstawie mas i cisnien granicznych @@ -2758,22 +2768,22 @@ bool TDynamicObject::Update(double dt, double dt1) if (MoverParameters->ShuntMode) { MoverParameters->ShuntModeAllow = ( false == doorisopen ) && - (MoverParameters->LocalBrakeRatio() < 0.01); + (LBR < 0.01); } if( ( MoverParameters->Vel > 1 ) && ( false == doorisopen ) ) { MoverParameters->ShuntMode = false; MoverParameters->ShuntModeAllow = (MoverParameters->BrakePress > 0.2) && - (MoverParameters->LocalBrakeRatio() < 0.01); + (LBR < 0.01); } - auto Fzad = amax * MoverParameters->LocalBrakeRatio() * masa; + auto Fzad = amax * LBR * masa; if ((MoverParameters->BrakeCtrlPos == MoverParameters->Handle->GetPos(bh_EB)) && (MoverParameters->eimc[eimc_p_abed] < 0.001)) Fzad = amax * masa; //pętla bezpieczeństwa - pełne służbowe if ((MoverParameters->ScndS) && (MoverParameters->Vel > MoverParameters->eimc[eimc_p_Vh1]) && (FmaxED > 0)) { - Fzad = std::min(MoverParameters->LocalBrakeRatio() * FmaxED, FfulED); + Fzad = std::min(LBR * FmaxED, FfulED); } if (((MoverParameters->ShuntMode) && (Frj < 0.0015 * masa)) || (MoverParameters->V * MoverParameters->DirAbsolute < -0.2)) @@ -2845,7 +2855,7 @@ bool TDynamicObject::Update(double dt, double dt1) PrzekrF[i] = false; FzED[i] = (FmaxED > 0 ? FzadED / FmaxED : 0); p->MoverParameters->AnPos = - (MoverParameters->ScndS ? MoverParameters->LocalBrakeRatio() : FzED[i]); + (MoverParameters->ScndS ? LBR : FzED[i]); FzEP[ i ] = static_cast( FzadPN * p->MoverParameters->NAxles ) / static_cast( osie ); ++i; p->MoverParameters->ShuntMode = MoverParameters->ShuntMode; @@ -6597,7 +6607,7 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub if( Vehicle.EngineType == TEngineType::ElectricInductionMotor ) { if( Vehicle.InverterFrequency > 0.1 ) { - volume = inverter.m_amplitudeoffset + inverter.m_amplitudefactor * std::sqrt( std::abs( Vehicle.dizel_fill ) ); + volume = inverter.m_amplitudeoffset + inverter.m_amplitudefactor * std::sqrt( std::abs( Vehicle.eimv_pr) ); inverter .pitch( inverter.m_frequencyoffset + inverter.m_frequencyfactor * Vehicle.InverterFrequency ) diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index 09936bb3..11870517 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -1280,9 +1280,13 @@ public: double hydro_R_n = 0.0; /*predkosc obrotowa retardera*/ /*- zmienne dla lokomotyw z silnikami indukcyjnymi -*/ + double eimic = 0; /*aktualna pozycja zintegrowanego sterowania jazda i hamowaniem*/ + int EIMCtrlType = 0; /*rodzaj wariantu zadajnika jazdy*/ + double eimv_pr = 0; /*realizowany procent dostepnej sily rozruchu/hamowania*/ double eimv[21]; static std::vector const eimv_labels; double SpeedCtrlTimer = 0; /*zegar dzialania tempomatu z wybieralna predkoscia*/ + double eimicSpeedCtrl = 0; /*pozycja sugerowana przez tempomat*/ double NewSpeed = 0; /*nowa predkosc do zadania*/ double MED_EPVC_CurrentTime = 0; /*aktualny czas licznika czasu korekcji siły EP*/ @@ -1496,6 +1500,9 @@ public: bool PantFront( bool const State, range_t const Notify = range_t::consist ); //obsluga pantografou przedniego bool PantRear( bool const State, range_t const Notify = range_t::consist ); //obsluga pantografu tylnego + void CheckEIMIC(double dt); //sprawdzenie i zmiana nastawy zintegrowanego nastawnika jazdy/hamowania + void CheckSpeedCtrl(); + /*-funkcje typowe dla lokomotywy spalinowej z przekladnia mechaniczna*/ bool dizel_EngageSwitch(double state); bool dizel_EngageChange(double dt); diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 99c172eb..38614632 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -1613,7 +1613,7 @@ double TMoverParameters::ShowCurrent(int AmpN) const case 1: return WindingRes * Mm / Vadd; case 2: - return dizel_fill * WindingRes; + return eimv_pr * WindingRes; default: return ShowCurrentP(AmpN); // T_MoverParameters:: } @@ -4998,25 +4998,24 @@ double TMoverParameters::TractionForce( double dt ) { if (NewSCAP != ScndCtrlActualPos) { ScndCtrlActualPos = NewSCAP; - SendCtrlToNext("SpeedCntrl", ScndCtrlActualPos, CabNo); +// SendCtrlToNext("SpeedCntrl", ScndCtrlActualPos, CabNo); } } } } - - dtrans = Hamulec->GetEDBCP(); + double edBCP = Hamulec->GetEDBCP(); if( ( false == Doors.instances[ side::left ].is_closed ) || ( false == Doors.instances[ side::right ].is_closed ) || ( Doors.permit_needed && ( Doors.instances[ side::left ].open_permit || Doors.instances[ side::right ].open_permit ) ) ) { DynamicBrakeFlag = true; } - else if (((dtrans < 0.25) && (LocHandle->GetCP() < 0.25) && (AnPos < 0.01)) || - ((dtrans < 0.25) && (ShuntModeAllow) && (LocalBrakePosA < 0.01))) + else if (((edBCP < 0.25) && (LocHandle->GetCP() < 0.25) && (AnPos < 0.01)) || + ((edBCP < 0.25) && (ShuntModeAllow) && (LocalBrakePosA < 0.01))) DynamicBrakeFlag = false; - else if ((((BrakePress > 0.25) && (dtrans > 0.25) || (LocHandle->GetCP() > 0.25))) || + else if ((((BrakePress > 0.25) && (edBCP > 0.25) || (LocHandle->GetCP() > 0.25))) || (AnPos > 0.02)) DynamicBrakeFlag = true; - dtrans = Hamulec->GetEDBCP() * eimc[eimc_p_abed]; // stala napedu + edBCP = Hamulec->GetEDBCP() * eimc[eimc_p_abed]; // stala napedu if ((DynamicBrakeFlag)) { // ustalanie współczynnika blendingu do luzowania hamulca PN @@ -5024,7 +5023,7 @@ double TMoverParameters::TractionForce( double dt ) { { PosRatio = -Sign(V) * DirAbsolute * eimv[eimv_Fr] / (eimc[eimc_p_Fh] * - Max0R(dtrans,Max0R(0.01,Hamulec->GetEDBCP())) / MaxBrakePress[0]); + Max0R(edBCP,Max0R(0.01,Hamulec->GetEDBCP())) / MaxBrakePress[0]); PosRatio = clamp(PosRatio, 0.0, 1.0); } else @@ -5043,29 +5042,30 @@ double TMoverParameters::TractionForce( double dt ) { } else { - PosRatio = -std::max(std::min(dtrans * 1.0 / MaxBrakePress[0], 1.0), AnPos) * + PosRatio = -std::max(std::min(edBCP * 1.0 / MaxBrakePress[0], 1.0), AnPos) * std::max(0.0, std::min(1.0, (Vel - eimc[eimc_p_Vh0]) / (eimc[eimc_p_Vh1] - eimc[eimc_p_Vh0]))); - eimv[eimv_Fzad] = -std::max(LocalBrakeRatio(), dtrans / MaxBrakePress[0]); + eimv[eimv_Fzad] = -std::min(1.0,std::max(LocalBrakeRatio(), edBCP / MaxBrakePress[0])); } tmp = 5; } else { PosRatio = static_cast( MainCtrlPos ) / static_cast( MainCtrlPosNo ); + PosRatio = Max0R(eimic, 0); eimv[eimv_Fzad] = PosRatio; if ((Flat) && (eimc[eimc_p_F0] * eimv[eimv_Fful] > 0)) PosRatio = Min0R(PosRatio * eimc[eimc_p_F0] / eimv[eimv_Fful], 1); - if (ScndCtrlActualPos > 0) //speed control +/* if (ScndCtrlActualPos > 0) //speed control if (Vmax < 250) PosRatio = Min0R(PosRatio, Max0R(-1, 0.5 * (ScndCtrlActualPos - Vel))); else PosRatio = - Min0R(PosRatio, Max0R(-1, 0.5 * (ScndCtrlActualPos * 2 - Vel))); + Min0R(PosRatio, Max0R(-1, 0.5 * (ScndCtrlActualPos * 2 - Vel))); */ // PosRatio = 1.0 * (PosRatio * 0 + 1) * PosRatio; // 1 * 1 * PosRatio = PosRatio Hamulec->SetED(0); // (Hamulec as TLSt).SetLBP(LocBrakePress); - if ((PosRatio > dizel_fill)) + if ((PosRatio > eimv_pr)) tmp = 4; else tmp = 4; // szybkie malenie, powolne wzrastanie @@ -5083,8 +5083,8 @@ double TMoverParameters::TractionForce( double dt ) { Sandbox( false, range_t::unit ); } - dizel_fill += Max0R(Min0R(PosRatio - dizel_fill, 0.02), -0.02) * 12 * - (tmp /*2{+4*byte(PosRatio 0.01 ? -LocalBrakeRatio() : (double)MainCtrlPos / (double)MainCtrlPosNo); + break; + case 1: + switch (MainCtrlPos) + { + case 0: //B+ + eimic -= clamp(1.0 + eimic, 0.0, dt*0.3); //odejmuj do -1 + break; + case 1: //B + eimic -= clamp(0.0 + eimic, 0.0, dt*0.3); //odejmuj do 0 + break; + case 2: //B- + case 3: //0 + case 4: //T- + eimic -= clamp(0.0 + eimic, 0.0, dt*0.3); //odejmuj do 0 + eimic += clamp(0.0 - eimic, 0.0, dt*0.3); //dodawaj do 0 + break; + case 5: //T + eimic += clamp(0.0 - eimic, 0.0, dt*0.3); //dodawaj do 0 + break; + case 6: //T+ + eimic += clamp(1.0 - eimic, 0.0, dt*0.3); //dodawaj do 1 + break; + case 7: //TMax + eimic += clamp(1.0 - eimic, 0.0, dt*0.3); //dodawaj do 1, max + break; + } + break; + case 2: + switch (MainCtrlPos) + { + case 0: + eimic = -1.0; + break; + case 1: + eimic -= clamp(1.0 + eimic, 0.0, dt*0.3); //odejmuj do -1 + break; + case 2: + eimic -= clamp(0.0 + eimic, 0.0, dt*0.3); //odejmuj do 0 + break; + case 3: + eimic += clamp(0.0 - eimic, 0.0, dt*0.3); //dodawaj do 0 + break; + case 4: + eimic += clamp(1.0 - eimic, 0.0, dt*0.3); //dodawaj do 1 + break; + } + break; + } + eimic = clamp(eimic, -1.0, 1.0); +} + +void TMoverParameters::CheckSpeedCtrl() +{ + if (ScndCtrlActualPos > 0) //speed control + if (Vmax < 250) + eimicSpeedCtrl = clamp(0.5 * (ScndCtrlActualPos - Vel), -1.0, 1.0); + else + eimicSpeedCtrl = clamp(0.5 * (ScndCtrlActualPos * 2 - Vel), -1.0, 1.0); + else + eimicSpeedCtrl = 1; +} + // ************************************************************************************************* // Q: 20160715 // Zmienia parametr do którego dąży sprzęgło @@ -8427,6 +8495,8 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) { else { AutoRelayType = 0; } extract_value( CoupledCtrl, "CoupledCtrl", line, "" ); + extract_value( EIMCtrlType, "EIMCtrlType", line, "" ); + clamp( EIMCtrlType, 0, 2 ); extract_value( ScndS, "ScndS", line, "" ); // brak pozycji rownoleglej przy niskiej nastawie PSR @@ -9475,6 +9545,11 @@ bool TMoverParameters::RunCommand( std::string Command, double CValue1, double C OK:=SendCtrlToNext(command,CValue1,CValue2); end; end */ + else if (Command == "EIMIC") // ElectricInductionMotor Integrated Control - propulsion and brakes in relative values + { + eimic = CValue1; + OK = SendCtrlToNext(Command, CValue1, CValue2, Couplertype); + } else if (Command == "Brake") // youBy - jak sie EP hamuje, to trza sygnal wyslac... { if (CValue1 < 0.001) From d8f3f6fe6bae14c14a9057aa958adb43ac9c9e04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Fri, 8 Mar 2019 20:49:23 +0100 Subject: [PATCH 06/14] Corrected "desired percent" for Python screens --- Train.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Train.cpp b/Train.cpp index d9c3c7f1..85359348 100644 --- a/Train.cpp +++ b/Train.cpp @@ -5256,11 +5256,12 @@ bool TTrain::Update( double const Deltatime ) } } - if (mvControlled == mvOccupied) - fEIMParams[0][3] = mvControlled->eimv[eimv_Fzad]; // procent zadany - else - fEIMParams[0][3] = - mvControlled->eimv[eimv_Fzad] - mvOccupied->LocalBrakeRatio(); // procent zadany +// if (mvControlled == mvOccupied) +// fEIMParams[0][3] = mvControlled->eimv[eimv_Fzad]; // procent zadany +// else +// fEIMParams[0][3] = +// mvControlled->eimv[eimv_Fzad] - mvOccupied->LocalBrakeRatio(); // procent zadany + fEIMParams[0][3] = mvOccupied->eimic; fEIMParams[0][4] = Max0R(fEIMParams[0][3], 0); fEIMParams[0][5] = -Min0R(fEIMParams[0][3], 0); fEIMParams[0][1] = fEIMParams[0][4] * mvControlled->eimv[eimv_Fful]; From 2f755cfe21bd697a7a98258cfb5b5809b8734006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Sat, 9 Mar 2019 22:12:48 +0100 Subject: [PATCH 07/14] Corrected shifting speed for EIMCtrlType == 2 --- DynObj.cpp | 6 +++--- McZapkie/Mover.cpp | 10 ++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/DynObj.cpp b/DynObj.cpp index b2d8e257..b0b85b51 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -2702,9 +2702,9 @@ bool TDynamicObject::Update(double dt, double dt1) MoverParameters->CheckEIMIC(dt1); MoverParameters->CheckSpeedCtrl(); - MoverParameters->eimic = Min0R(MoverParameters->eimic, MoverParameters->eimicSpeedCtrl); - MoverParameters->SendCtrlToNext("EIMIC", Max0R(0, MoverParameters->eimic), MoverParameters->CabNo); - auto LBR = Max0R(-MoverParameters->eimic, 0); + auto eimic = Min0R(MoverParameters->eimic, MoverParameters->eimicSpeedCtrl); + MoverParameters->SendCtrlToNext("EIMIC", Max0R(0, eimic), MoverParameters->CabNo); + auto LBR = Max0R(-eimic, 0); // 1. ustal wymagana sile hamowania calego pociagu // - opoznienie moze byc ustalane na podstawie charakterystyki diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index f3de4a89..9567615f 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -5947,16 +5947,18 @@ void TMoverParameters::CheckEIMIC(double dt) eimic = -1.0; break; case 1: - eimic -= clamp(1.0 + eimic, 0.0, dt*0.3); //odejmuj do -1 + eimic -= clamp(1.0 + eimic, 0.0, dt*0.15); //odejmuj do -1 + if (eimic > 0) eimic = 0; break; case 2: - eimic -= clamp(0.0 + eimic, 0.0, dt*0.3); //odejmuj do 0 + eimic -= clamp(0.0 + eimic, 0.0, dt*0.15); //odejmuj do 0 break; case 3: - eimic += clamp(0.0 - eimic, 0.0, dt*0.3); //dodawaj do 0 + eimic += clamp(0.0 - eimic, 0.0, dt*0.15); //dodawaj do 0 break; case 4: - eimic += clamp(1.0 - eimic, 0.0, dt*0.3); //dodawaj do 1 + eimic += clamp(1.0 - eimic, 0.0, dt*0.15); //dodawaj do 1 + if (eimic < 0) eimic = 0; break; } break; From d307e962751f3d98ff3c3f3cdf0db26954b19b46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Sun, 10 Mar 2019 08:49:07 +0100 Subject: [PATCH 08/14] Added instant 0 for EIMCtrlType == 1 (Traxx) --- McZapkie/Mover.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 9567615f..5c8f8f9e 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -5939,6 +5939,8 @@ void TMoverParameters::CheckEIMIC(double dt) eimic += clamp(1.0 - eimic, 0.0, dt*0.3); //dodawaj do 1, max break; } + if (MainCtrlPos >= 3 && eimic < 0) eimic = 0; + if (MainCtrlPos <= 3 && eimic > 0) eimic = 0; break; case 2: switch (MainCtrlPos) From c36fc565e5c6d3557b4a71bb2a6b74b923826724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Tue, 12 Mar 2019 18:37:14 +0100 Subject: [PATCH 09/14] AI now uses EIMCtrlType no 1 and 2 correctly --- Driver.cpp | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++--- Driver.h | 4 +++ 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/Driver.cpp b/Driver.cpp index c8783c5e..35208c67 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -2789,7 +2789,7 @@ bool TController::IncBrake() OK = mvOccupied->BrakeLevelAdd(1.0); } else { - OK = mvOccupied->IncLocalBrakeLevel(1); + OK = IncBrakeEIM(); } } else if( mvOccupied->fBrakeCtrlPos != mvOccupied->Handle->GetPos( bh_EPB ) ) { @@ -2807,6 +2807,28 @@ bool TController::IncBrake() return OK; } +bool TController::IncBrakeEIM() +{ // zwiększenie hamowania + bool OK = false; + switch (mvControlling->EIMCtrlType) + { + case 0: + OK = mvControlling->IncLocalBrakeLevel(1); + break; + case 1: + OK = mvControlling->MainCtrlPos > 0; + if (OK) + mvControlling->MainCtrlPos = 0; + break; + case 2: + OK = mvControlling->MainCtrlPos > 1; + if (OK) + mvControlling->MainCtrlPos = 1; + break; + } + return OK; +} + bool TController::DecBrake() { // zmniejszenie siły hamowania bool OK = false; @@ -2844,7 +2866,7 @@ bool TController::DecBrake() OK = mvOccupied->BrakeLevelAdd(-1.0); } else { - OK = mvOccupied->DecLocalBrakeLevel(1); + OK = DecBrakeEIM(); } } else if (mvOccupied->fBrakeCtrlPos != mvOccupied->Handle->GetPos(bh_EPR)) @@ -2863,6 +2885,28 @@ bool TController::DecBrake() return OK; }; +bool TController::DecBrakeEIM() +{ // zmniejszenie siły hamowania + bool OK = false; + switch (mvControlling->EIMCtrlType) + { + case 0: + OK = mvControlling->DecLocalBrakeLevel(1); + break; + case 1: + OK = mvControlling->MainCtrlPos < 2; + if (OK) + mvControlling->MainCtrlPos = 2; + break; + case 2: + OK = mvControlling->MainCtrlPos < 3; + if (OK) + mvControlling->MainCtrlPos = 3; + break; + } + return OK; +} + bool TController::IncSpeed() { // zwiększenie prędkości; zwraca false, jeśli dalej się nie da zwiększać if( true == tsGuardSignal.is_playing() ) { @@ -3075,7 +3119,7 @@ bool TController::DecSpeed(bool force) OK = mvControlling->DecMainCtrl(2 + (mvControlling->MainCtrlPos / 2)); break; case TEngineType::ElectricInductionMotor: - OK = mvControlling->DecMainCtrl(1); + OK = DecSpeedEIM(); break; case TEngineType::WheelsDriven: if (!mvControlling->CabNo) @@ -3102,6 +3146,28 @@ bool TController::DecSpeed(bool force) return OK; }; +bool TController::DecSpeedEIM() +{ // zmniejszenie prędkości (ale nie hamowanie) + bool OK = false; // domyślnie false, aby wyszło z pętli while + switch (mvControlling->EIMCtrlType) + { + case 0: + OK = mvControlling->DecMainCtrl(1); + break; + case 1: + OK = mvControlling->MainCtrlPos > 4; + if (OK) + mvControlling->MainCtrlPos = 4; + break; + case 2: + OK = mvControlling->MainCtrlPos > 2; + if (OK) + mvControlling->MainCtrlPos = 2; + break; + } + return OK; +} + void TController::SpeedSet() { // Ra: regulacja prędkości, wykonywana w każdym przebłysku świadomości AI // ma dokręcać do bezoporowych i zdejmować pozycje w przypadku przekroczenia prądu diff --git a/Driver.h b/Driver.h index 53f8900a..e1b29651 100644 --- a/Driver.h +++ b/Driver.h @@ -211,6 +211,10 @@ private: bool DecBrake(); bool IncSpeed(); bool DecSpeed(bool force = false); + bool IncBrakeEIM(); + bool DecBrakeEIM(); + bool IncSpeedEIM(); + bool DecSpeedEIM(); void SpeedSet(); void SpeedCntrl(double DesiredSpeed); double ESMVelocity(bool Main); From f02d30fd9a52845bf88154742b9634db7af1c5e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Thu, 14 Mar 2019 14:44:19 +0100 Subject: [PATCH 10/14] SpeedCntrl affects also first vehicle now --- DynObj.cpp | 1 + McZapkie/Mover.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/DynObj.cpp b/DynObj.cpp index b0b85b51..3169c642 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -2703,6 +2703,7 @@ bool TDynamicObject::Update(double dt, double dt1) MoverParameters->CheckSpeedCtrl(); auto eimic = Min0R(MoverParameters->eimic, MoverParameters->eimicSpeedCtrl); + MoverParameters->eimic = eimic; MoverParameters->SendCtrlToNext("EIMIC", Max0R(0, eimic), MoverParameters->CabNo); auto LBR = Max0R(-eimic, 0); diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 5c8f8f9e..7a93fdc4 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -5051,7 +5051,6 @@ double TMoverParameters::TractionForce( double dt ) { } else { - PosRatio = static_cast( MainCtrlPos ) / static_cast( MainCtrlPosNo ); PosRatio = Max0R(eimic, 0); eimv[eimv_Fzad] = PosRatio; if ((Flat) && (eimc[eimc_p_F0] * eimv[eimv_Fful] > 0)) From 7249ffd06834e0cba8002b364ec2841c61c10361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Thu, 14 Mar 2019 18:58:31 +0100 Subject: [PATCH 11/14] Small fix to eimic and speedcontrol interaction --- DynObj.cpp | 2 +- McZapkie/MOVER.h | 1 + McZapkie/Mover.cpp | 4 ++-- Train.cpp | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/DynObj.cpp b/DynObj.cpp index 3169c642..d444aeff 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -2703,7 +2703,7 @@ bool TDynamicObject::Update(double dt, double dt1) MoverParameters->CheckSpeedCtrl(); auto eimic = Min0R(MoverParameters->eimic, MoverParameters->eimicSpeedCtrl); - MoverParameters->eimic = eimic; + MoverParameters->eimic_real = eimic; MoverParameters->SendCtrlToNext("EIMIC", Max0R(0, eimic), MoverParameters->CabNo); auto LBR = Max0R(-eimic, 0); diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index 814e3258..7dca6b4a 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -1281,6 +1281,7 @@ public: /*- zmienne dla lokomotyw z silnikami indukcyjnymi -*/ double eimic = 0; /*aktualna pozycja zintegrowanego sterowania jazda i hamowaniem*/ + double eimic_real = 0; /*faktycznie uzywana pozycja zintegrowanego sterowania jazda i hamowaniem*/ int EIMCtrlType = 0; /*rodzaj wariantu zadajnika jazdy*/ double eimv_pr = 0; /*realizowany procent dostepnej sily rozruchu/hamowania*/ double eimv[21]; diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 7a93fdc4..aaf74092 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -5051,7 +5051,7 @@ double TMoverParameters::TractionForce( double dt ) { } else { - PosRatio = Max0R(eimic, 0); + PosRatio = Max0R(eimic_real, 0); eimv[eimv_Fzad] = PosRatio; if ((Flat) && (eimc[eimc_p_F0] * eimv[eimv_Fful] > 0)) PosRatio = Min0R(PosRatio * eimc[eimc_p_F0] / eimv[eimv_Fful], 1); @@ -9550,7 +9550,7 @@ bool TMoverParameters::RunCommand( std::string Command, double CValue1, double C end */ else if (Command == "EIMIC") // ElectricInductionMotor Integrated Control - propulsion and brakes in relative values { - eimic = CValue1; + eimic_real = CValue1; OK = SendCtrlToNext(Command, CValue1, CValue2, Couplertype); } else if (Command == "Brake") // youBy - jak sie EP hamuje, to trza sygnal wyslac... diff --git a/Train.cpp b/Train.cpp index 85359348..d1b77982 100644 --- a/Train.cpp +++ b/Train.cpp @@ -5261,7 +5261,7 @@ bool TTrain::Update( double const Deltatime ) // else // fEIMParams[0][3] = // mvControlled->eimv[eimv_Fzad] - mvOccupied->LocalBrakeRatio(); // procent zadany - fEIMParams[0][3] = mvOccupied->eimic; + fEIMParams[0][3] = mvOccupied->eimic_real; fEIMParams[0][4] = Max0R(fEIMParams[0][3], 0); fEIMParams[0][5] = -Min0R(fEIMParams[0][3], 0); fEIMParams[0][1] = fEIMParams[0][4] * mvControlled->eimv[eimv_Fful]; From 1151925e1b7c182f2f22ee001a11fe177da5d79c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Fri, 15 Mar 2019 12:31:34 +0100 Subject: [PATCH 12/14] Fixed SpeedControl for EN57-like EMUs --- DynObj.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/DynObj.cpp b/DynObj.cpp index d444aeff..3e449752 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -2698,7 +2698,10 @@ bool TDynamicObject::Update(double dt, double dt1) auto osie { 0 }; // 0a. ustal aktualna nastawe zadania sily napedowej i hamowania if (MoverParameters->Power < 1) + { MoverParameters->MainCtrlPos = ctOwner->Controlling()->MainCtrlPos*MoverParameters->MainCtrlPosNo / std::max(1, ctOwner->Controlling()->MainCtrlPosNo); + MoverParameters->ScndCtrlActualPos = ctOwner->Controlling()->ScndCtrlActualPos; + } MoverParameters->CheckEIMIC(dt1); MoverParameters->CheckSpeedCtrl(); From ca0c904d6ad35fce99d1bbd007848376566aced4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Fri, 15 Mar 2019 20:41:11 +0100 Subject: [PATCH 13/14] Fix for MHZ_K5P - no sudden overload in middle posistion --- McZapkie/MOVER.h | 2 ++ McZapkie/Mover.cpp | 3 +++ McZapkie/hamulce.cpp | 32 +++++++++++++++++++++----------- McZapkie/hamulce.h | 19 ++++++++++++------- 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index 7dca6b4a..f52691d0 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -894,6 +894,8 @@ public: double P2FTrans = 0.0; double TrackBrakeForce = 0.0; /*sila nacisku hamulca szynowego*/ int BrakeMethod = 0; /*flaga rodzaju hamulca*/ + bool Handle_AutomaticOverload = false; + bool Handle_ManualOverload = false; /*max. cisnienie w cyl. ham., stala proporcjonalnosci p-K*/ double HighPipePress = 0.0; double LowPipePress = 0.0; diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index aaf74092..4b4844ec 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -8421,6 +8421,8 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) { lookup->second : TBrakeHandle::NoHandle; } + Handle_AutomaticOverload = (extract_value("HAO", line) == "Yes"); + Handle_ManualOverload = (extract_value("HMO", line) == "Yes"); // brakelochandle { std::map locbrakehandles{ @@ -9253,6 +9255,7 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir) default: Handle = std::make_shared(); } + Handle->SetParams(Handle_AutomaticOverload, Handle_ManualOverload, 0.0, 0.0); switch( BrakeLocHandle ) { case TBrakeHandle::FD1: diff --git a/McZapkie/hamulce.cpp b/McZapkie/hamulce.cpp index f01d6697..85b3d0f0 100644 --- a/McZapkie/hamulce.cpp +++ b/McZapkie/hamulce.cpp @@ -2274,6 +2274,11 @@ double TDriverHandle::GetEP(double pos) { return 0; } + +void TDriverHandle::OvrldButton(bool Active) +{ + ManualOvrldActive = Active; +} //---FV4a--- double TFV4a::GetPF(double i_bcp, double PP, double HP, double dt, double ep) @@ -2683,7 +2688,7 @@ bool TMHZ_EN57::EQ(double pos, double i_pos) double TMHZ_K5P::GetPF(double i_bcp, double PP, double HP, double dt, double ep) { static int const LBDelay = 100; - double LimPP; + double LimCP; double dpPipe; double dpMainValve; double ActFlowSpeed; @@ -2710,29 +2715,28 @@ double TMHZ_K5P::GetPF(double i_bcp, double PP, double HP, double dt, double ep) } if (EQ(i_bcp, 1)) //odcięcie - nie rób nic - LimPP = CP; + LimCP = CP; else if (i_bcp > 1) //hamowanie - LimPP = 3.4; + LimCP = 3.4; else //luzowanie - LimPP = 5.0; + LimCP = 5.0; pom = CP; - LimPP = Min0R(LimPP + TP + RedAdj, HP); // pozycja + czasowy lub zasilanie + LimCP = Min0R(LimCP, HP); // pozycja + czasowy lub zasilanie ActFlowSpeed = 4; - if ((LimPP > CP)) // podwyzszanie szybkie - CP = CP + 9 * Min0R(abs(LimPP - CP), 0.05) * PR(CP, LimPP) * dt; // zbiornik sterujacy; + if ((LimCP > CP)) // podwyzszanie szybkie + CP = CP + 9 * Min0R(abs(LimCP - CP), 0.05) * PR(CP, LimCP) * dt; // zbiornik sterujacy; else - CP = CP + 9 * Min0R(abs(LimPP - CP), 0.05) * PR(CP, LimPP) * dt; // zbiornik sterujacy + CP = CP + 9 * Min0R(abs(LimCP - CP), 0.05) * PR(CP, LimCP) * dt; // zbiornik sterujacy - LimPP = pom; // cp - dpPipe = Min0R(HP, LimPP); + dpPipe = Min0R(HP, CP + TP + RedAdj); if (dpPipe > PP) dpMainValve = -PFVa(HP, PP, ActFlowSpeed / LBDelay, dpPipe, 0.4); else dpMainValve = PFVd(PP, 0, ActFlowSpeed / LBDelay, dpPipe, 0.4); - if (EQ(i_bcp, -1)) + if ((EQ(i_bcp, -1)&&(AutoOvrld))||(ManualOvrld && ManualOvrldActive)) { if ((TP < 1)) TP = TP + 0.03 * dt; @@ -2786,6 +2790,12 @@ double TMHZ_K5P::GetCP() return RP; } +void TMHZ_K5P::SetParams(bool AO, bool MO, double, double) +{ + AutoOvrld = AO; + ManualOvrld = MO; +} + bool TMHZ_K5P::EQ(double pos, double i_pos) { return (pos <= i_pos + 0.5) && (pos > i_pos - 0.5); diff --git a/McZapkie/hamulce.h b/McZapkie/hamulce.h index ecec4c14..53d688ef 100644 --- a/McZapkie/hamulce.h +++ b/McZapkie/hamulce.h @@ -513,9 +513,11 @@ class TKE : public TBrake { //Knorr Einheitsbauart — jeden do wszystkiego //klasa obejmujaca krany class TDriverHandle { - private: + protected: // BCP: integer; - + bool AutoOvrld = false; //czy jest asymilacja automatyczna na pozycji -1 + bool ManualOvrld = false; //czy jest asymilacja reczna przyciskiem + bool ManualOvrldActive = false; //czy jest wcisniety przycisk asymilacji public: bool Time = false; bool TimeEP = false; @@ -524,10 +526,12 @@ class TDriverHandle { virtual double GetPF(double i_bcp, double PP, double HP, double dt, double ep); virtual void Init(double Press); virtual double GetCP(); - virtual void SetReductor(double nAdj); - virtual double GetSound(int i); - virtual double GetPos(int i); - virtual double GetEP(double pos); + virtual void SetReductor(double nAdj); //korekcja pozycji reduktora cisnienia + virtual double GetSound(int i); //pobranie glosnosci wybranego dzwieku + virtual double GetPos(int i); //pobranie numeru pozycji o zadanym kodzie (funkcji) + virtual double GetEP(double pos); //pobranie sily hamulca ep + virtual void SetParams(bool AO, bool MO, double, double) {}; //ustawianie jakichs parametrów dla zaworu + virtual void OvrldButton(bool Active); //przycisk recznego przeladowania/asymilacji inline TDriverHandle() { memset( Sounds, 0, sizeof( Sounds ) ); } }; @@ -609,7 +613,7 @@ private: double TP = 0.0; //zbiornik czasowy double RP = 0.0; //zbiornik redukcyjny double RedAdj = 0.0; //dostosowanie reduktora cisnienia (krecenie kapturkiem) - bool Fala = false; + bool Fala = false; //czy jest napelnianie uderzeniowe static double const pos_table[11]; //= { -2, 10, -1, 0, 0, 2, 9, 10, 0, 0, 0 }; bool EQ(double pos, double i_pos); @@ -621,6 +625,7 @@ public: double GetSound(int i)/*override*/; double GetPos(int i)/*override*/; double GetCP()/*override*/; + void SetParams(bool AO, bool MO, double, double); /*ovveride*/ inline TMHZ_K5P(void) : TDriverHandle() From 6b56fbddbeb231f28fd11c08c88dd4ef95db8f93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Sat, 16 Mar 2019 20:43:12 +0100 Subject: [PATCH 14/14] New Handle type MHZ_6P for Traxx --- McZapkie/MOVER.h | 4 +- McZapkie/Mover.cpp | 8 ++- McZapkie/hamulce.cpp | 128 +++++++++++++++++++++++++++++++++++++++++++ McZapkie/hamulce.h | 27 +++++++++ 4 files changed, 165 insertions(+), 2 deletions(-) diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index f52691d0..0c8be69f 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, FVE408, 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, MHZ_6P }; /*typy hamulcow indywidualnych*/ enum class TLocalBrake { NoBrake, ManualBrake, PneumaticBrake, HydraulicBrake }; /*dla osob/towar: opoznienie hamowania/odhamowania*/ @@ -896,6 +896,8 @@ public: int BrakeMethod = 0; /*flaga rodzaju hamulca*/ bool Handle_AutomaticOverload = false; bool Handle_ManualOverload = false; + double Handle_GenericDoubleParameter1 = 0.0; + double Handle_GenericDoubleParameter2 = 0.0; /*max. cisnienie w cyl. ham., stala proporcjonalnosci p-K*/ double HighPipePress = 0.0; double LowPipePress = 0.0; diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 4b4844ec..56f1e9b2 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -8408,6 +8408,7 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) { { "MHZ_EN57", TBrakeHandle::MHZ_EN57 }, { "MHZ_K5P", TBrakeHandle::MHZ_K5P }, { "MHZ_K8P", TBrakeHandle::MHZ_K8P }, + { "MHZ_6P", TBrakeHandle::MHZ_6P }, { "M394", TBrakeHandle::M394 }, { "Knorr", TBrakeHandle::Knorr }, { "Westinghouse", TBrakeHandle::West }, @@ -8423,6 +8424,8 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) { } Handle_AutomaticOverload = (extract_value("HAO", line) == "Yes"); Handle_ManualOverload = (extract_value("HMO", line) == "Yes"); + extract_value(Handle_GenericDoubleParameter1, "HGDP1", line, ""); + extract_value(Handle_GenericDoubleParameter2, "HGDP2", line, ""); // brakelochandle { std::map locbrakehandles{ @@ -9252,10 +9255,13 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir) case TBrakeHandle::MHZ_K5P: Handle = std::make_shared(); break; + case TBrakeHandle::MHZ_6P: + Handle = std::make_shared(); + break; default: Handle = std::make_shared(); } - Handle->SetParams(Handle_AutomaticOverload, Handle_ManualOverload, 0.0, 0.0); + Handle->SetParams(Handle_AutomaticOverload, Handle_ManualOverload, Handle_GenericDoubleParameter1, Handle_GenericDoubleParameter2); switch( BrakeLocHandle ) { case TBrakeHandle::FD1: diff --git a/McZapkie/hamulce.cpp b/McZapkie/hamulce.cpp index 85b3d0f0..47bbebe6 100644 --- a/McZapkie/hamulce.cpp +++ b/McZapkie/hamulce.cpp @@ -24,6 +24,7 @@ static double const DPL = 0.25; double const TFV4aM::pos_table[11] = {-2, 6, -1, 0, -2, 1, 4, 6, 0, 0, 0}; double const TMHZ_EN57::pos_table[11] = {-1, 10, -1, 0, 0, 2, 9, 10, 0, 0, 0}; double const TMHZ_K5P::pos_table[11] = { -1, 3, -1, 0, 1, 1, 2, 3, 0, 0, 0 }; +double const TMHZ_6P::pos_table[11] = { -1, 4, -1, 0, 2, 2, 3, 4, 0, 0, 0 }; double const TM394::pos_table[11] = {-1, 5, -1, 0, 1, 2, 4, 5, 0, 0, 0}; double const TH14K1::BPT_K[6][2] = {{10, 0}, {4, 1}, {0, 1}, {4, 0}, {4, -1}, {15, -1}}; double const TH14K1::pos_table[11] = {-1, 4, -1, 0, 1, 2, 3, 4, 0, 0, 0}; @@ -2801,6 +2802,133 @@ bool TMHZ_K5P::EQ(double pos, double i_pos) return (pos <= i_pos + 0.5) && (pos > i_pos - 0.5); } +//---MHZ_6P--- manipulator hamulca zespolonego 6-ciopozycyjny + +double TMHZ_6P::GetPF(double i_bcp, double PP, double HP, double dt, double ep) { + static int const LBDelay = 100; + + double LimCP; + double dpPipe; + double dpMainValve; + double ActFlowSpeed; + double DP; + double pom; + + for (int idx = 0; idx < 5; ++idx) { + Sounds[idx] = 0; + } + + DP = 0; + + i_bcp = Max0R(Min0R(i_bcp, 3.999), -0.999); // na wszelki wypadek, zeby nie wyszlo poza zakres + + if ((TP > 0)) + { + DP = 0.004; + TP = TP - DP * dt; + Sounds[s_fv4a_t] = DP; + } + else + { + TP = 0; + } + + if (EQ(i_bcp, 2)) //odcięcie - nie rób nic + LimCP = CP; + else if (i_bcp > 2.5) //hamowanie + LimCP = 3.4; + else //luzowanie + LimCP = 5.0; + pom = CP; + LimCP = Min0R(LimCP, HP); // pozycja + czasowy lub zasilanie + ActFlowSpeed = 4; + + if ((LimCP > CP)) // podwyzszanie szybkie + CP = CP + 9 * Min0R(abs(LimCP - CP), 0.05) * PR(CP, LimCP) * dt; // zbiornik sterujacy; + else + CP = CP + 9 * Min0R(abs(LimCP - CP), 0.05) * PR(CP, LimCP) * dt; // zbiornik sterujacy + + dpPipe = Min0R(HP, CP + TP + RedAdj); + + if (Fala && EQ(i_bcp, -1)) + { + dpPipe = 5.0 + TP + RedAdj + UnbrakeOverPressure; + ActFlowSpeed = 12; + } + + if (dpPipe > PP) + dpMainValve = -PFVa(HP, PP, ActFlowSpeed / LBDelay, dpPipe, 0.4); + else + dpMainValve = PFVd(PP, 0, ActFlowSpeed / LBDelay, dpPipe, 0.4); + + if ((EQ(i_bcp, -1) && (AutoOvrld)) || (ManualOvrld && ManualOvrldActive)) + { + if ((TP < 1)) + TP = TP + 0.03 * dt; + } + + if (EQ(i_bcp, 4)) + { + DP = PF(0, PP, 2 * ActFlowSpeed / LBDelay); + dpMainValve = DP; + Sounds[s_fv4a_e] = DP; + Sounds[s_fv4a_u] = 0; + Sounds[s_fv4a_b] = 0; + Sounds[s_fv4a_x] = 0; + } + else + { + if (dpMainValve > 0) + Sounds[s_fv4a_b] = dpMainValve; + else + Sounds[s_fv4a_u] = -dpMainValve; + } + + return dpMainValve * dt; +} + +void TMHZ_6P::Init(double Press) +{ + CP = Press; +} + +void TMHZ_6P::SetReductor(double nAdj) +{ + RedAdj = nAdj; +} + +double TMHZ_6P::GetSound(int i) +{ + if (i > 4) + return 0; + else + return Sounds[i]; +} + +double TMHZ_6P::GetPos(int i) +{ + return pos_table[i]; +} + +double TMHZ_6P::GetCP() +{ + return RP; +} + +void TMHZ_6P::SetParams(bool AO, bool MO, double OverP, double) +{ + AutoOvrld = AO; + ManualOvrld = MO; + UnbrakeOverPressure = std::max(0.0, OverP); + Fala = (OverP > 0.01); + +} + +bool TMHZ_6P::EQ(double pos, double i_pos) +{ + return (pos <= i_pos + 0.5) && (pos > i_pos - 0.5); +} + //---M394--- Matrosow double TM394::GetPF(double i_bcp, double PP, double HP, double dt, double ep) diff --git a/McZapkie/hamulce.h b/McZapkie/hamulce.h index 53d688ef..d09427c5 100644 --- a/McZapkie/hamulce.h +++ b/McZapkie/hamulce.h @@ -632,6 +632,33 @@ public: {} }; +class TMHZ_6P : public TDriverHandle { + +private: + double CP = 0.0; //zbiornik sterujący + double TP = 0.0; //zbiornik czasowy + double RP = 0.0; //zbiornik redukcyjny + double RedAdj = 0.0; //dostosowanie reduktora cisnienia (krecenie kapturkiem) + bool Fala = false; //czy jest napelnianie uderzeniowe + double UnbrakeOverPressure = 0.0; //wartosc napelniania uderzeniowego + static double const pos_table[11]; //= { -2, 10, -1, 0, 0, 2, 9, 10, 0, 0, 0 }; + + bool EQ(double pos, double i_pos); + +public: + double GetPF(double i_bcp, double PP, double HP, double dt, double ep)/*override*/; + void Init(double Press)/*override*/; + void SetReductor(double nAdj)/*override*/; + double GetSound(int i)/*override*/; + double GetPos(int i)/*override*/; + double GetCP()/*override*/; + void SetParams(bool AO, bool MO, double, double); /*ovveride*/ + + inline TMHZ_6P(void) : + TDriverHandle() + {} +}; + /* FBS2= class(TTDriverHandle) private CP, TP, RP: real; //zbiornik sterujący, czasowy, redukcyjny