From 83743fe99b48cf3b1f6b1d7f3f20debd837c1041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Sun, 16 Jun 2019 22:57:22 +0200 Subject: [PATCH] Additional fetures for Voith-like gearbox, small fix for AI --- Driver.cpp | 45 ++++++++++++++++++++++----------------------- McZapkie/MOVER.h | 3 +++ McZapkie/Mover.cpp | 23 +++++++++++++++++++---- 3 files changed, 44 insertions(+), 27 deletions(-) diff --git a/Driver.cpp b/Driver.cpp index a306dfba..7381913a 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -3546,30 +3546,29 @@ void TController::SetTimeControllers() //5.1. Digital controller in DMUs with hydro if ((mvControlling->EngineType == TEngineType::DieselEngine) && (mvControlling->EIMCtrlType == 3)) { - if( mvControlling->Vel > 10 ) { - DizelPercentage_Speed = DizelPercentage; - auto const Factor{ 10 * ( mvControlling->Vmax ) / ( mvControlling->Vmax + 3 * mvControlling->Vel ) }; - auto DesiredPercentage{ clamp( - ( VelDesired > mvControlling->Vel ? - ( VelDesired - mvControlling->Vel ) / Factor : - 0 ), - 0.0, 1.0 ) }; - if( ( VelDesired < 0.5 * mvControlling->Vmax ) - && ( VelDesired - mvControlling->Vel < 10 ) ) { - DesiredPercentage = std::min( DesiredPercentage, 0.75 ); - } - DizelPercentage_Speed = std::round( DesiredPercentage * DizelPercentage ); - if( VelDesired < std::min( mvControlling->hydro_TC_LockupSpeed, mvControlling->Vmax / 5 ) ) { - DizelPercentage = std::min( DizelPercentage_Speed, 1 ); - } - } - else { - // HACK: workaround for the default mode breaking at low speeds - DizelPercentage = DizelPercentage_Speed = ( AccDesired > 0.0 ? 100 : 0 ); - } + DizelPercentage_Speed = DizelPercentage; //wstepnie procenty + auto MinVel{ std::min(mvControlling->hydro_TC_LockupSpeed, mvControlling->Vmax / 6) }; //minimal velocity + if (VelDesired > MinVel) //more power for faster ride + { + auto const Factor{ 10 * (mvControlling->Vmax) / (mvControlling->Vmax + 3 * mvControlling->Vel) }; + auto DesiredPercentage{ clamp( + (VelDesired > mvControlling->Vel ? + (VelDesired - mvControlling->Vel) / Factor : + 0), + 0.0, 1.0) }; //correction for reaching desired velocity + if ((VelDesired < 0.5 * mvControlling->Vmax) //low velocity and reaching desired + && (VelDesired - mvControlling->Vel < 10)) { + DesiredPercentage = std::min(DesiredPercentage, 0.75); + } + DizelPercentage_Speed = std::round(DesiredPercentage * DizelPercentage); + } + else + { + DizelPercentage_Speed = std::min(DizelPercentage, mvControlling->Vel > 0.99 * VelDesired ? 1 : 0); + } - auto const DizelActualPercentage { 100.4 * mvControlling->eimic_real }; + auto const DizelActualPercentage { int(100.4 * mvControlling->eimic_real) }; auto const PosInc { mvControlling->MainCtrlPosNo }; auto PosDec { 0 }; @@ -3587,7 +3586,7 @@ void TController::SetTimeControllers() && ( ( DizelActualPercentage - DizelPercentage_Speed > 50 ) || ( ( DizelPercentage_Speed == 0 ) && ( DizelActualPercentage > 10 ) ) ) ) { - //pozycję wczesniej powinno byc szybkie zejscie, jeśli trzeba + //one position earlier should be fast decreasing PosDec -= 1; } auto const DesiredPos { ( diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index 411d1fd6..cf9482b9 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -1039,7 +1039,10 @@ public: /* dizel_auto_min, dizel_auto_max: real; {predkosc obrotowa przelaczania automatycznej skrzyni biegow*/ double dizel_nmax_cutoff = 0.0; /*predkosc obrotowa zadzialania ogranicznika predkosci*/ double dizel_nmin = 0.0; /*najmniejsza dopuszczalna predkosc obrotowa*/ + double dizel_nmin_hdrive = 0.0; /*najmniejsza dopuszczalna predkosc obrotowa w czasie jazdy na hydro */ + double dizel_nmin_hdrive_factor = 0.0; /*wspolczynnik wzrostu obrotow minimalnych hydro zaleznosci od zadanego procentu*/ double dizel_minVelfullengage = 0.0; /*najmniejsza predkosc przy jezdzie ze sprzeglem bez poslizgu*/ + double dizel_maxVelANS = 3.0; /*predkosc progowa rozlaczenia przetwornika momentu*/ double dizel_AIM = 1.0; /*moment bezwladnosci walu itp*/ double dizel_engageDia = 0.5; double dizel_engageMaxForce = 6000.0; double dizel_engagefriction = 0.5; /*parametry sprzegla*/ double engagedownspeed = 0.9; diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index df79b80d..9af71673 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -6513,7 +6513,7 @@ bool TMoverParameters::dizel_Update(double dt) { double TMoverParameters::dizel_fillcheck(int mcp) { auto realfill { 0.0 }; - auto reg_factor { 0.98 }; + auto nreg_min { dizel_nmin * 0.98 }; if( ( true == Mains ) && ( MainCtrlPosNo > 0 ) @@ -6531,7 +6531,14 @@ double TMoverParameters::dizel_fillcheck(int mcp) if (EIMCtrlType > 0) { realfill = std::max(0.0, eimic_real); - reg_factor = 1.0; + if (eimic_real>0 && !hydro_TC_Lockup) + { + nreg_min = dizel_nmin_hdrive + eimic_real * dizel_nmin_hdrive_factor; + } + else + { + nreg_min = dizel_nmin; + } } else realfill = RList[mcp].R; @@ -6580,7 +6587,7 @@ double TMoverParameters::dizel_fillcheck(int mcp) realfill = 0; if (enrot < nreg) //pod predkoscia regulatora dawka zadana realfill = realfill; - if ((enrot < dizel_nmin * reg_factor)&&(RList[mcp].R>0.001)) //jesli ponizej biegu jalowego i niezerowa dawka, to dawaj pelna + if ((enrot < nreg_min)&&(RList[mcp].R>0.001)) //jesli ponizej biegu jalowego i niezerowa dawka, to dawaj pelna realfill = 1; } } @@ -6629,7 +6636,7 @@ double TMoverParameters::dizel_Momentum(double dizel_fill, double n, double dt) if ((IsPower) && (Mains) && (enrot>dizel_nmin*0.9)) hydro_TC_Fill += hydro_TC_FillRateInc * dt; //oproznianie przetwornika - if (((!IsPower) && (Vel<3)) + if (((!IsPower) && (Vel