From 6b56fbddbeb231f28fd11c08c88dd4ef95db8f93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Sat, 16 Mar 2019 20:43:12 +0100 Subject: [PATCH] New Handle type MHZ_6P for Traxx --- McZapkie/MOVER.h | 4 +- McZapkie/Mover.cpp | 8 ++- McZapkie/hamulce.cpp | 128 +++++++++++++++++++++++++++++++++++++++++++ McZapkie/hamulce.h | 27 +++++++++ 4 files changed, 165 insertions(+), 2 deletions(-) diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index f52691d0..0c8be69f 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -369,7 +369,7 @@ enum class TBrakeSystem { Individual, Pneumatic, ElectroPneumatic }; /*podtypy hamulcow zespolonych*/ enum class TBrakeSubSystem { ss_None, ss_W, ss_K, ss_KK, ss_Hik, ss_ESt, ss_KE, ss_LSt, ss_MT, ss_Dako }; enum class TBrakeValve { NoValve, W, W_Lu_VI, W_Lu_L, W_Lu_XR, K, Kg, Kp, Kss, Kkg, Kkp, Kks, Hikg1, Hikss, Hikp1, KE, SW, EStED, NESt3, ESt3, LSt, ESt4, ESt3AL2, EP1, EP2, M483, CV1_L_TR, CV1, CV1_R, Other }; -enum class TBrakeHandle { NoHandle, West, FV4a, M394, M254, FVE408, FVel6, D2, Knorr, FD1, BS2, testH, St113, MHZ_P, MHZ_T, MHZ_EN57, MHZ_K5P, MHZ_K8P }; +enum class TBrakeHandle { NoHandle, West, FV4a, M394, M254, FVE408, FVel6, D2, Knorr, FD1, BS2, testH, St113, MHZ_P, MHZ_T, MHZ_EN57, MHZ_K5P, MHZ_K8P, MHZ_6P }; /*typy hamulcow indywidualnych*/ enum class TLocalBrake { NoBrake, ManualBrake, PneumaticBrake, HydraulicBrake }; /*dla osob/towar: opoznienie hamowania/odhamowania*/ @@ -896,6 +896,8 @@ public: int BrakeMethod = 0; /*flaga rodzaju hamulca*/ bool Handle_AutomaticOverload = false; bool Handle_ManualOverload = false; + double Handle_GenericDoubleParameter1 = 0.0; + double Handle_GenericDoubleParameter2 = 0.0; /*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 4b4844ec..56f1e9b2 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -8408,6 +8408,7 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) { { "MHZ_EN57", TBrakeHandle::MHZ_EN57 }, { "MHZ_K5P", TBrakeHandle::MHZ_K5P }, { "MHZ_K8P", TBrakeHandle::MHZ_K8P }, + { "MHZ_6P", TBrakeHandle::MHZ_6P }, { "M394", TBrakeHandle::M394 }, { "Knorr", TBrakeHandle::Knorr }, { "Westinghouse", TBrakeHandle::West }, @@ -8423,6 +8424,8 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) { } Handle_AutomaticOverload = (extract_value("HAO", line) == "Yes"); Handle_ManualOverload = (extract_value("HMO", line) == "Yes"); + extract_value(Handle_GenericDoubleParameter1, "HGDP1", line, ""); + extract_value(Handle_GenericDoubleParameter2, "HGDP2", line, ""); // brakelochandle { std::map locbrakehandles{ @@ -9252,10 +9255,13 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir) case TBrakeHandle::MHZ_K5P: Handle = std::make_shared(); break; + case TBrakeHandle::MHZ_6P: + Handle = std::make_shared(); + break; default: Handle = std::make_shared(); } - Handle->SetParams(Handle_AutomaticOverload, Handle_ManualOverload, 0.0, 0.0); + Handle->SetParams(Handle_AutomaticOverload, Handle_ManualOverload, Handle_GenericDoubleParameter1, Handle_GenericDoubleParameter2); switch( BrakeLocHandle ) { case TBrakeHandle::FD1: diff --git a/McZapkie/hamulce.cpp b/McZapkie/hamulce.cpp index 85b3d0f0..47bbebe6 100644 --- a/McZapkie/hamulce.cpp +++ b/McZapkie/hamulce.cpp @@ -24,6 +24,7 @@ static double const DPL = 0.25; double const TFV4aM::pos_table[11] = {-2, 6, -1, 0, -2, 1, 4, 6, 0, 0, 0}; double const TMHZ_EN57::pos_table[11] = {-1, 10, -1, 0, 0, 2, 9, 10, 0, 0, 0}; double const TMHZ_K5P::pos_table[11] = { -1, 3, -1, 0, 1, 1, 2, 3, 0, 0, 0 }; +double const TMHZ_6P::pos_table[11] = { -1, 4, -1, 0, 2, 2, 3, 4, 0, 0, 0 }; double const TM394::pos_table[11] = {-1, 5, -1, 0, 1, 2, 4, 5, 0, 0, 0}; double const TH14K1::BPT_K[6][2] = {{10, 0}, {4, 1}, {0, 1}, {4, 0}, {4, -1}, {15, -1}}; double const TH14K1::pos_table[11] = {-1, 4, -1, 0, 1, 2, 3, 4, 0, 0, 0}; @@ -2801,6 +2802,133 @@ bool TMHZ_K5P::EQ(double pos, double i_pos) return (pos <= i_pos + 0.5) && (pos > i_pos - 0.5); } +//---MHZ_6P--- manipulator hamulca zespolonego 6-ciopozycyjny + +double TMHZ_6P::GetPF(double i_bcp, double PP, double HP, double dt, double ep) { + static int const LBDelay = 100; + + double LimCP; + double dpPipe; + double dpMainValve; + double ActFlowSpeed; + double DP; + double pom; + + for (int idx = 0; idx < 5; ++idx) { + Sounds[idx] = 0; + } + + DP = 0; + + i_bcp = Max0R(Min0R(i_bcp, 3.999), -0.999); // na wszelki wypadek, zeby nie wyszlo poza zakres + + if ((TP > 0)) + { + DP = 0.004; + TP = TP - DP * dt; + Sounds[s_fv4a_t] = DP; + } + else + { + TP = 0; + } + + if (EQ(i_bcp, 2)) //odcięcie - nie rób nic + LimCP = CP; + else if (i_bcp > 2.5) //hamowanie + LimCP = 3.4; + else //luzowanie + LimCP = 5.0; + pom = CP; + LimCP = Min0R(LimCP, HP); // pozycja + czasowy lub zasilanie + ActFlowSpeed = 4; + + 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(LimCP - CP), 0.05) * PR(CP, LimCP) * dt; // zbiornik sterujacy + + dpPipe = Min0R(HP, CP + TP + RedAdj); + + if (Fala && EQ(i_bcp, -1)) + { + dpPipe = 5.0 + TP + RedAdj + UnbrakeOverPressure; + ActFlowSpeed = 12; + } + + 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) && (AutoOvrld)) || (ManualOvrld && ManualOvrldActive)) + { + if ((TP < 1)) + TP = TP + 0.03 * dt; + } + + if (EQ(i_bcp, 4)) + { + DP = PF(0, PP, 2 * ActFlowSpeed / LBDelay); + dpMainValve = DP; + Sounds[s_fv4a_e] = DP; + Sounds[s_fv4a_u] = 0; + Sounds[s_fv4a_b] = 0; + Sounds[s_fv4a_x] = 0; + } + else + { + if (dpMainValve > 0) + Sounds[s_fv4a_b] = dpMainValve; + else + Sounds[s_fv4a_u] = -dpMainValve; + } + + return dpMainValve * dt; +} + +void TMHZ_6P::Init(double Press) +{ + CP = Press; +} + +void TMHZ_6P::SetReductor(double nAdj) +{ + RedAdj = nAdj; +} + +double TMHZ_6P::GetSound(int i) +{ + if (i > 4) + return 0; + else + return Sounds[i]; +} + +double TMHZ_6P::GetPos(int i) +{ + return pos_table[i]; +} + +double TMHZ_6P::GetCP() +{ + return RP; +} + +void TMHZ_6P::SetParams(bool AO, bool MO, double OverP, double) +{ + AutoOvrld = AO; + ManualOvrld = MO; + UnbrakeOverPressure = std::max(0.0, OverP); + Fala = (OverP > 0.01); + +} + +bool TMHZ_6P::EQ(double pos, double i_pos) +{ + return (pos <= i_pos + 0.5) && (pos > i_pos - 0.5); +} + //---M394--- Matrosow double TM394::GetPF(double i_bcp, double PP, double HP, double dt, double ep) diff --git a/McZapkie/hamulce.h b/McZapkie/hamulce.h index 53d688ef..d09427c5 100644 --- a/McZapkie/hamulce.h +++ b/McZapkie/hamulce.h @@ -632,6 +632,33 @@ public: {} }; +class TMHZ_6P : public TDriverHandle { + +private: + double CP = 0.0; //zbiornik sterujący + double TP = 0.0; //zbiornik czasowy + double RP = 0.0; //zbiornik redukcyjny + double RedAdj = 0.0; //dostosowanie reduktora cisnienia (krecenie kapturkiem) + bool Fala = false; //czy jest napelnianie uderzeniowe + double UnbrakeOverPressure = 0.0; //wartosc napelniania uderzeniowego + static double const pos_table[11]; //= { -2, 10, -1, 0, 0, 2, 9, 10, 0, 0, 0 }; + + bool EQ(double pos, double i_pos); + +public: + double GetPF(double i_bcp, double PP, double HP, double dt, double ep)/*override*/; + void Init(double Press)/*override*/; + void SetReductor(double nAdj)/*override*/; + double GetSound(int i)/*override*/; + double GetPos(int i)/*override*/; + double GetCP()/*override*/; + void SetParams(bool AO, bool MO, double, double); /*ovveride*/ + + inline TMHZ_6P(void) : + TDriverHandle() + {} +}; + /* FBS2= class(TTDriverHandle) private CP, TP, RP: real; //zbiornik sterujący, czasowy, redukcyjny