From 9cd20971f577160aa40abb2b5c152f8d08284d21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Thu, 3 Aug 2017 22:55:46 +0200 Subject: [PATCH] =?UTF-8?q?Korekta=20progu=20dzia=C5=82ania,=20wyliczanie?= =?UTF-8?q?=20op=C3=B3=C5=BAnienia=20hamowania=20z=20uwzgl=C4=99dnieniem?= =?UTF-8?q?=20wcze=C5=9Bniejszego=20luzowania,=20dodanie=20poprawki=20wyma?= =?UTF-8?q?ganej=20pozycji=20zaworu=20maszynisty=20(si=C5=82y=20hamowania)?= =?UTF-8?q?=20w=20zale=C5=BCno=C5=9Bci=20od=20wyczerpania=20i=20prze=C5=82?= =?UTF-8?q?adowania=20hamulc=C3=B3w?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Driver.cpp | 69 ++++++++++++++++++++++++++++++-------------- Driver.h | 1 + McZapkie/Mover.cpp | 4 ++- McZapkie/hamulce.cpp | 5 ++++ McZapkie/hamulce.h | 2 +- World.cpp | 6 +++- 6 files changed, 62 insertions(+), 25 deletions(-) diff --git a/Driver.cpp b/Driver.cpp index 7e3fa07c..58ea8e4d 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -1680,13 +1680,13 @@ void TController::AutoRewident() d = d->Next(); // kolejny pojazd, podłączony od tyłu (licząc od czoła) } //teraz zerujemy tabelkę opóźnienia hamowania + double velstep = (mvOccupied->Vmax*0.5) / BrakeAccTableSize; for (int i = 0; i < BrakeAccTableSize; i++) { fBrake_a0[i+1] = 0; fBrake_a1[i+1] = 0; } d = pVehicles[0]; // pojazd na czele składu - float velstep = (mvOccupied->Vmax*0.5) / BrakeAccTableSize; while (d) { // 4. Przeliczanie siły hamowania for (int i = 0; i < BrakeAccTableSize; i++) @@ -1700,21 +1700,22 @@ void TController::AutoRewident() { fBrake_a1[i+1] -= fBrake_a0[i+1]; fBrake_a0[i+1] /= fMass; + fBrake_a0[i + 1] += 0.001*velstep*(1 + 2 * i); fBrake_a1[i+1] /= (12*fMass); } if (mvOccupied->TrainType == dt_EZT) { - fAccThreshold = -fBrake_a0[BrakeAccTableSize] - 10 * fBrake_a1[BrakeAccTableSize]; + fAccThreshold = -fBrake_a0[BrakeAccTableSize] - 8 * fBrake_a1[BrakeAccTableSize]; fBrakeReaction = 0.25; } else if (ustaw > 16) { - fAccThreshold = -fBrake_a0[BrakeAccTableSize] - 6 * fBrake_a1[BrakeAccTableSize]; - fBrakeReaction = 0.5; + fAccThreshold = -fBrake_a0[BrakeAccTableSize] - 4 * fBrake_a1[BrakeAccTableSize]; + fBrakeReaction = 0.75+fLength*0.001; } else { - fAccThreshold = -fBrake_a0[BrakeAccTableSize] - 2 * fBrake_a1[BrakeAccTableSize]; + fAccThreshold = -fBrake_a0[BrakeAccTableSize] - 1 * fBrake_a1[BrakeAccTableSize]; fBrakeReaction = 2.0; } }; @@ -1991,7 +1992,8 @@ bool TController::SetProximityVelocity(double NewDist,double NewVelNext) double TController::BrakeAccFactor() { - double Factor = 1 + fBrakeReaction*mvOccupied->Vel / (std::max(0.0, ActualProximityDist) + 1); +// double Factor = 1 + fBrakeReaction*mvOccupied->Vel / (std::max(0.0, ActualProximityDist) + 1); + double Factor = 1 + fBrakeReaction*mvOccupied->Vel / (std::max(0.0, ActualProximityDist) + 1) * ((AccDesired-AbsAccS_pub)/fAccThreshold); return Factor; } @@ -2345,13 +2347,34 @@ bool TController::IncBrake() } else { // dodane dla towarowego - double deltaAcc = -AccDesired*BrakeAccFactor() - (fBrake_a0[0] + 4 * (mvOccupied->BrakeCtrlPosR - 1)*fBrake_a1[0]); + float pos_corr = 0; - if( deltaAcc > 0) + TDynamicObject *d; + d = pVehicles[0]; // pojazd na czele składu + while (d) + { // przeliczanie dodatkowego potrzebnego spadku ciśnienia + pos_corr+=(d->MoverParameters->Hamulec->GetCRP() - 5.0)*d->MoverParameters->TotalMass; + d = d->Next(); // kolejny pojazd, podłączony od tyłu (licząc od czoła) + } + pos_corr = pos_corr / fMass * 2.5; + + if (mvOccupied->BrakeHandle == FV4a) { - OK = mvOccupied->BrakeLevelAdd(mvOccupied->BrakeCtrlPosR>0?0.25:1.0); - if ((deltaAcc > 5 * fBrake_a1[0])&&(mvOccupied->BrakeCtrlPosR<=3.0)) - mvOccupied->BrakeLevelAdd(1.0); + pos_corr += mvOccupied->Handle->GetCP()*0.2; + + } + double deltaAcc = -AccDesired*BrakeAccFactor() - (fBrake_a0[0] + 4.0 * (mvOccupied->BrakeCtrlPosR - 1 - pos_corr)*fBrake_a1[0]); + + if( deltaAcc > fBrake_a1[0]) + { + if (mvOccupied->BrakeCtrlPosR<0.1) + OK = mvOccupied->BrakeLevelAdd(1.0); + else + { + OK = mvOccupied->BrakeLevelAdd(0.25); + if ((deltaAcc > 5 * fBrake_a1[0]) && (mvOccupied->BrakeCtrlPosR <= 3.0)) + mvOccupied->BrakeLevelAdd(0.75); + } } else OK = false; @@ -2394,7 +2417,7 @@ bool TController::DecBrake() OK = mvOccupied->DecLocalBrakeLevel(1 + floor(0.5 + fabs(AccDesired))); break; case Pneumatic: - deltaAcc = -AccDesired*BrakeAccFactor() - (fBrake_a0[0] + 4 * (mvOccupied->BrakeCtrlPosR - 0.75)*fBrake_a1[0]); + deltaAcc = -AccDesired*BrakeAccFactor() - (fBrake_a0[0] + 4 * (mvOccupied->BrakeCtrlPosR)*fBrake_a1[0]); if (deltaAcc < 0) { if (mvOccupied->BrakeCtrlPosR > 0) @@ -3278,7 +3301,7 @@ bool TController::UpdateSituation(double dt) if ((iDrivigFlags & movePrimary) == 0) return true; // pasywny nic nie robi - double AbsAccS; + double AbsAccS = 0; // double VelReduced; //o ile km/h może przekroczyć dozwoloną prędkość bez hamowania bool UpdateOK = false; if (AIControllFlag) @@ -4300,6 +4323,7 @@ bool TController::UpdateSituation(double dt) AbsAccS /= fMass; //AbsAccS = iDirection * mvOccupied->AccS; // przyspieszenie chwilowe, liczone } + AbsAccS_pub = AbsAccS; // jako różnica skierowanej prędkości w // czasie // if (mvOccupied->V<0.0) AbsAccS=-AbsAccS; //Ra 2014-03: to trzeba przemyśleć @@ -4341,7 +4365,7 @@ bool TController::UpdateSituation(double dt) { // jedzie szybciej, niż trzeba na końcu ActualProximityDist, ale jeszcze // jest daleko if (vel < - VelNext + 40.0) // dwustopniowe hamowanie - niski przy małej różnicy + VelNext + 20.0) // dwustopniowe hamowanie - niski przy małej różnicy { // jeśli jedzie wolniej niż VelNext+35km/h //Ra: 40, żeby nie // kombinował na zwrotnicach if (VelNext == 0.0) @@ -4384,7 +4408,7 @@ bool TController::UpdateSituation(double dt) else AccDesired = -(vel * vel) / (25.92 * (ActualProximityDist + - 0.1)); //-fMinProximityDist));//-0.1; + 0.1-0.5*(fMinProximityDist+fMaxProximityDist))); //-fMinProximityDist));//-0.1; ////mniejsze opóźnienie przy // małej różnicy ReactionTime = 0.1; // i orientuj się szybciej, jak masz stanąć @@ -4405,10 +4429,12 @@ bool TController::UpdateSituation(double dt) // krytycznym przedziale } } - else // przy dużej różnicy wysoki stopień (1,00 potrzebnego opoznienia) - AccDesired = (VelNext * VelNext - vel * vel) / - (25.92 * ActualProximityDist + - 0.1); // najpierw hamuje mocniej, potem zluzuje + else { // przy dużej różnicy wysoki stopień (1,00 potrzebnego opoznienia) + double dist = (VelNext * VelNext - (VelNext + 20) * (VelNext + 20)) / (25.92)*(-1 / fBrake_a0[0] - 1 / fAccThreshold) + 1.5*VelNext; + AccDesired = (VelNext * VelNext - vel * vel) / + (25.92 * (std::max(ActualProximityDist - 2 * VelNext, std::min(ActualProximityDist, 2 * VelNext)) - dist) + + 0.1); // najpierw hamuje mocniej, potem zluzuje + } if (AccPreferred < AccDesired) AccDesired = AccPreferred; //(1+abs(AccDesired)) // ReactionTime=0.5*mvOccupied->BrakeDelay[2+2*mvOccupied->BrakeDelayFlag]; @@ -4459,7 +4485,7 @@ bool TController::UpdateSituation(double dt) AccDesired = 0.0; } else - AccDesired = fAccThreshold; // hamuj tak średnio + AccDesired = fBrake_a0[0]; // hamuj tak średnio // koniec predkosci aktualnej #ifdef DEBUGFAC if (fAccThreshold > -0.3) // bez sensu, ale dla towarowych korzystnie @@ -4684,7 +4710,7 @@ bool TController::UpdateSituation(double dt) // zatrzymania jest mniejszy fBrakeTime *= 0.5; // Ra: tymczasowo, bo przeżyna S1 } - if ((AccDesired < fAccGravity - 0.05) && (AbsAccS < AccDesired - fBrake_a1[0])) + if ((AccDesired < fAccGravity - 0.05) && (AbsAccS < AccDesired - fBrake_a1[0]*0.51)) // if ((AccDesired<0.0)&&(AbsAccSStationIndex; // zaktualizować wyświetlanie rozkładu fLastStopExpDist = -1.0f; // usunąć licznik } - if (AIControllFlag) { if (fWarningDuration > 0.0) // jeśli pozostało coś do wytrąbienia diff --git a/Driver.h b/Driver.h index 8866194b..c21eb050 100644 --- a/Driver.h +++ b/Driver.h @@ -202,6 +202,7 @@ class TController double BrakeAccFactor(); double fBrakeReaction = 1.0; //opóźnienie zadziałania hamulca - czas w s / (km/h) double fAccThreshold = 0.0; // próg opóźnienia dla zadziałania hamulca + double AbsAccS_pub = 0.0; // próg opóźnienia dla zadziałania hamulca double fBrake_a0[BrakeAccTableSize+1] = { 0.0 }; // próg opóźnienia dla zadziałania hamulca double fBrake_a1[BrakeAccTableSize+1] = { 0.0 }; // próg opóźnienia dla zadziałania hamulca public: diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 3d9f6416..3ad5ca42 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -3784,6 +3784,8 @@ double TMoverParameters::BrakeForceR(double ratio, double velocity) press = MaxBrakePress[3]; if (DynamicBrakeType == dbrake_automatic) ratio = ratio + (1.5 - ratio)*std::min(1.0, Vel*0.02); + if ((BrakeDelayFlag&bdelay_R) && (BrakeMethod != bp_Cosid) && (BrakeMethod != bp_D1) && (BrakeMethod != bp_D2)&&(Power>1)) + ratio = ratio / 2; } } @@ -3842,7 +3844,7 @@ double TMoverParameters::BrakeForce(const TTrackParam &Track) Ntotal = u * BrakeRigEff; else { - u = (BrakePress * P2FTrans) * BrakeCylMult[0] - BrakeSlckAdj; + u = ((BrakePress * P2FTrans) - BrakeCylSpring) * BrakeCylMult[0] - BrakeSlckAdj; if (u * (2.0 - BrakeRigEff) < Ntotal) // histereza na nacisku klockow Ntotal = u * (2.0 - BrakeRigEff); } diff --git a/McZapkie/hamulce.cpp b/McZapkie/hamulce.cpp index 2a1b300b..06e45445 100644 --- a/McZapkie/hamulce.cpp +++ b/McZapkie/hamulce.cpp @@ -2372,6 +2372,11 @@ double TFV4aM::GetPos(int i) return pos_table[i]; } +double TFV4aM::GetCP() +{ + return TP; +} + double TFV4aM::LPP_RP(double pos) // cisnienie z zaokraglonej pozycji; { int const i_pos = 2 + std::floor( pos ); // zaokraglone w dol diff --git a/McZapkie/hamulce.h b/McZapkie/hamulce.h index 25de35db..b23c6c06 100644 --- a/McZapkie/hamulce.h +++ b/McZapkie/hamulce.h @@ -551,7 +551,7 @@ class TFV4aM : public TDriverHandle { void SetReductor(double nAdj)/*override*/; double GetSound(int i)/*override*/; double GetPos(int i)/*override*/; - + double GetCP(); inline TFV4aM() : TDriverHandle() {} diff --git a/World.cpp b/World.cpp index 5c51f7b2..127a4aa6 100644 --- a/World.cpp +++ b/World.cpp @@ -1766,7 +1766,11 @@ TWorld::Update_UI() { && ( tmp->Mechanik->AIControllFlag == AIdriver ) ) { uitextline4 += "AI: Vd=" + to_string( tmp->Mechanik->VelDesired, 0 ) - + " ad=" + to_string( tmp->Mechanik->AccDesired, 2 ) + + " ad=" + to_string(tmp->Mechanik->AccDesired, 2) + + "/" + to_string(tmp->Mechanik->AccDesired*tmp->Mechanik->BrakeAccFactor(), 2) + + " atrain=" + to_string(tmp->Mechanik->fBrake_a0[0], 2) + + "+" + to_string(tmp->Mechanik->fBrake_a1[0], 2) + + " aS=" + to_string(tmp->Mechanik->AbsAccS_pub, 2) + " Pd=" + to_string( tmp->Mechanik->ActualProximityDist, 0 ) + " Vn=" + to_string( tmp->Mechanik->VelNext, 0 ); }