diff --git a/.gitignore b/.gitignore index 123b2d25..f33b6a1f 100644 --- a/.gitignore +++ b/.gitignore @@ -54,8 +54,8 @@ install_manifest.txt *.~pas *.opensdf *.sdf -#*.sln -#*.vcxproj +*.sln +*.vcxproj *.filters format_all_files.py *.suo @@ -71,10 +71,5 @@ ipch/ *.aps builds/ -doc/ -CMakeLists.txt.user - -*.vcxproj - -*.sln +CMakeLists.txt.user \ No newline at end of file diff --git a/DynObj.cpp b/DynObj.cpp index b1f9868f..6ca55c5d 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -2701,7 +2701,10 @@ bool TDynamicObject::Update(double dt, double dt1) auto osie { 0 }; // 0a. ustal aktualna nastawe zadania sily napedowej i hamowania if (MoverParameters->Power < 1) + { MoverParameters->MainCtrlPos = ctOwner->Controlling()->MainCtrlPos*MoverParameters->MainCtrlPosNo / std::max(1, ctOwner->Controlling()->MainCtrlPosNo); + MoverParameters->ScndCtrlActualPos = ctOwner->Controlling()->ScndCtrlActualPos; + } MoverParameters->CheckEIMIC(dt1); MoverParameters->CheckSpeedCtrl(); diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index 89769270..79f127b1 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*/ @@ -895,6 +895,10 @@ 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; + 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 e776296f..0497f4bb 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -8427,6 +8427,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 }, @@ -8440,6 +8441,10 @@ 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"); + extract_value(Handle_GenericDoubleParameter1, "HGDP1", line, ""); + extract_value(Handle_GenericDoubleParameter2, "HGDP2", line, ""); // brakelochandle { std::map locbrakehandles{ @@ -9269,9 +9274,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, Handle_GenericDoubleParameter1, Handle_GenericDoubleParameter2); switch( BrakeLocHandle ) { case TBrakeHandle::FD1: diff --git a/McZapkie/hamulce.cpp b/McZapkie/hamulce.cpp index f01d6697..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}; @@ -2274,6 +2275,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 +2689,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 +2716,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,11 +2791,144 @@ 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); } +//---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 ecec4c14..d09427c5 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,12 +625,40 @@ 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() {} }; +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