From 7fbc8648525a8f8324a704f3d55caabaf6b5ac3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Tue, 18 Jun 2019 17:31:23 +0200 Subject: [PATCH] Some additional functions for diesel engine regulator for hydrodiesel vehicles --- McZapkie/MOVER.h | 5 ++++- McZapkie/Mover.cpp | 30 ++++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index cf9482b9..b7e893bd 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -1041,6 +1041,7 @@ public: 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_nmin_retarder = 0.0; /*obroty pracy podczas hamowania retarderem*/ 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*/ @@ -1070,6 +1071,7 @@ public: double hydro_R_FillRateInc = 1.0; /*szybkosc napelniania sprzegla*/ double hydro_R_FillRateDec = 1.0; /*szybkosc oprozniania sprzegla*/ double hydro_R_MinVel = 1.0; /*minimalna predkosc, przy ktorej retarder dziala*/ + double hydro_R_EngageVel = 1.0; /*minimalna predkosc hamowania, przy ktorej sprzeglo jest wciaz wlaczone*/ /*- dla lokomotyw spalinowo-elektrycznych -*/ double AnPos = 0.0; // pozycja sterowania dokladnego (analogowego) bool AnalogCtrl = false; // @@ -1310,6 +1312,7 @@ public: double dizel_engagedeltaomega = 0.0; /*roznica predkosci katowych tarcz sprzegla*/ double dizel_n_old = 0.0; /*poredkosc na potrzeby obliczen sprzegiel*/ double dizel_Torque = 0.0; /*poredkosc na potrzeby obliczen sprzegiel*/ + double dizel_nreg_min = 0.0; /*predkosc regulatora minimalna, zmienna w hydro*/ /* - zmienne dla przetowrnika momentu */ double hydro_TC_Fill = 0.0; /*napelnienie*/ @@ -1565,7 +1568,7 @@ public: bool dizel_EngageSwitch(double state); bool dizel_EngageChange(double dt); bool dizel_AutoGearCheck(void); - double dizel_fillcheck(int mcp); + double dizel_fillcheck(int mcp, double dt); double dizel_Momentum(double dizel_fill, double n, double dt); double dizel_MomentumRetarder(double n, double dt); // moment hamowania retardera void dizel_HeatSet( float const Value ); diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 9af71673..a8e28b98 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -6359,10 +6359,15 @@ bool TMoverParameters::dizel_AutoGearCheck(void) if (EIMCtrlType > 0) //sterowanie komputerowe { if (dizel_automaticgearstatus == 0) - if ((hydro_TC && hydro_TC_Fill > 0.01 )||( eimic_real > 0.0 )) + { + if ((hydro_TC && hydro_TC_Fill > 0.01) || (eimic_real > 0.0)) dizel_EngageSwitch(1.0); else - dizel_EngageSwitch(0.0); + if (Vel > hydro_R_EngageVel && hydro_R && hydro_R_Fill > 0.01) + dizel_EngageSwitch(0.5); + else + dizel_EngageSwitch(0.0); + } else dizel_EngageSwitch(0.0); } @@ -6498,7 +6503,7 @@ bool TMoverParameters::dizel_Update(double dt) { dizel_EngageChange( dt ); DU = dizel_AutoGearCheck(); double const fillspeed { 2 }; - dizel_fill = dizel_fill + fillspeed * dt * ( dizel_fillcheck( MainCtrlPos ) - dizel_fill ); + dizel_fill = dizel_fill + fillspeed * dt * ( dizel_fillcheck( MainCtrlPos , dt ) - dizel_fill ); } dizel_Heat( dt ); @@ -6510,10 +6515,9 @@ bool TMoverParameters::dizel_Update(double dt) { // Q: 20160715 // oblicza napelnienie, uzwglednia regulator obrotow // ************************************************************************************************* -double TMoverParameters::dizel_fillcheck(int mcp) +double TMoverParameters::dizel_fillcheck(int mcp, double dt) { auto realfill { 0.0 }; - auto nreg_min { dizel_nmin * 0.98 }; if( ( true == Mains ) && ( MainCtrlPosNo > 0 ) @@ -6533,11 +6537,14 @@ double TMoverParameters::dizel_fillcheck(int mcp) realfill = std::max(0.0, eimic_real); if (eimic_real>0 && !hydro_TC_Lockup) { - nreg_min = dizel_nmin_hdrive + eimic_real * dizel_nmin_hdrive_factor; + dizel_nreg_min = std::min(dizel_nreg_min + 2.5 * dt, dizel_nmin_hdrive + eimic_real * dizel_nmin_hdrive_factor); } else { - nreg_min = dizel_nmin; + if (Vel < hydro_R_EngageVel && hydro_R && hydro_R_Fill > 0.01) + dizel_nreg_min = std::min(dizel_nreg_min + 5.0 * dt, dizel_nmin_retarder); + else + dizel_nreg_min = dizel_nmin; } } else @@ -6587,7 +6594,7 @@ double TMoverParameters::dizel_fillcheck(int mcp) realfill = 0; if (enrot < nreg) //pod predkoscia regulatora dawka zadana realfill = realfill; - if ((enrot < nreg_min)&&(RList[mcp].R>0.001)) //jesli ponizej biegu jalowego i niezerowa dawka, to dawaj pelna + if ((enrot < dizel_nreg_min)&&(RList[mcp].R>0.001)) //jesli ponizej biegu jalowego i niezerowa dawka, to dawaj pelna realfill = 1; } } @@ -9151,6 +9158,7 @@ void TMoverParameters::LoadFIZ_Engine( std::string const &Input ) { extract_value( dizel_nmin, "nmin", Input, "" ); dizel_nmin /= 60.0; + dizel_nreg_min = dizel_nmin * 0.98; extract_value(dizel_nmin_hdrive, "nmin_hdrive", Input, ""); dizel_nmin_hdrive /= 60.0; if (dizel_nmin_hdrive == 0.0) { @@ -9158,6 +9166,11 @@ void TMoverParameters::LoadFIZ_Engine( std::string const &Input ) { } extract_value(dizel_nmin_hdrive_factor, "nmin_hdrive_factor", Input, ""); dizel_nmin_hdrive_factor /= 60.0; + extract_value(dizel_nmin_retarder, "nmin_retarder", Input, ""); + dizel_nmin_retarder /= 60.0; + if (dizel_nmin_retarder == 0.0) { + dizel_nmin_retarder = dizel_nmin; + } // TODO: unify naming scheme and sort out which diesel engine params are used where and how extract_value( nmax, "nmax", Input, "" ); nmax /= 60.0; @@ -9203,6 +9216,7 @@ void TMoverParameters::LoadFIZ_Engine( std::string const &Input ) { extract_value(hydro_R_FillRateInc, "R_FRI", Input, ""); extract_value(hydro_R_FillRateDec, "R_FRD", Input, ""); extract_value(hydro_R_MinVel, "R_MinVel", Input, ""); + extract_value(hydro_R_EngageVel, "R_EngageVel", Input, ""); } } break;