From 69ad8943aefb96077a6bcb979569181fd727bb18 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] 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 5f17393f..01f86f8f 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -2686,7 +2686,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 }; @@ -2698,6 +2698,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 @@ -2760,22 +2770,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)) @@ -2847,7 +2857,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; @@ -6599,7 +6609,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 d8f210aa..814e3258 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 cfb0a013..f3de4a89 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)