From fb36c1348b09205138ba8be69d27cbdd02f3d0e2 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] 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 ca040145..83106f5d 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 8fa92475..030584de 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -8426,6 +8426,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{ @@ -9258,6 +9260,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()