16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-21 00:09:19 +02:00

Stuff for EW58: handle FVE408, valve EP1, enhanced TUHEX for 3-stage ED brake, old blending for DC-ED and EP brake

This commit is contained in:
Królik Uszasty
2019-03-05 16:53:58 +01:00
parent 8082d45527
commit 5b20724845
4 changed files with 245 additions and 15 deletions

View File

@@ -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, FVel1, 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 };
/*typy hamulcow indywidualnych*/
enum class TLocalBrake { NoBrake, ManualBrake, PneumaticBrake, HydraulicBrake };
/*dla osob/towar: opoznienie hamowania/odhamowania*/
@@ -966,10 +966,16 @@ public:
int DynamicBrakeType = 0; /*patrz dbrake_**/
int DynamicBrakeAmpmeters = 2; /*liczba amperomierzy przy hamowaniu ED*/
double DynamicBrakeRes = 5.8; /*rezystancja oporników przy hamowaniu ED*/
double TUHEX_Sum = 750; /*nastawa sterownika hamowania ED*/
double DynamicBrakeRes1 = 5.8; /*rezystancja oporników przy hamowaniu ED - 1 tryb*/
double DynamicBrakeRes2 = 5.8; /*rezystancja oporników przy hamowaniu ED - 2 tryb*/
double TUHEX_Sum = 750; /*nastawa sterownika hamowania ED - aktualna*/
double TUHEX_Diff = 10; /*histereza działania sterownika hamowania ED*/
double TUHEX_MinIw = 60; /*minimalny prąd wzbudzenia przy hamowaniu ED - wynika z chk silnika*/
double TUHEX_MaxIw = 400; /*maksymalny prąd wzbudzenia przy hamowaniu ED - ograniczenie max siły*/
double TUHEX_Sum1 = 750; /*nastawa1 sterownika hamowania ED*/
double TUHEX_Sum2 = 750; /*nastawa2 sterownika hamowania ED*/
double TUHEX_Sum3 = 750; /*nastawa3 sterownika hamowania ED*/
int TUHEX_Stages = 0; /*liczba stopni hamowania ED*/
int RVentType = 0; /*0 - brak, 1 - jest, 2 - automatycznie wlaczany*/
double RVentnmax = 1.0; /*maks. obroty wentylatorow oporow rozruchowych*/
@@ -1049,6 +1055,12 @@ public:
bool MED_EPVC = 0; // czy korekcja sily hamowania EP, gdy nie ma dostepnego ED
double MED_EPVC_Time = 7; // czas korekcji sily hamowania EP, gdy nie ma dostepnego ED
bool MED_Ncor = 0; // czy korekcja sily hamowania z uwzglednieniem nacisku
int DCEMUED_CC; //na którym sprzęgu sprawdzać działanie ED
double DCEMUED_EP_max_Vel; //maksymalna prędkość, przy której działa EP przy włączonym ED w jednostce (dla tocznych)
double DCEMUED_EP_min_Im; //minimalny prąd, przy którym EP nie działa przy włączonym ED w członie (dla silnikowych)
double DCEMUED_EP_delay; //opóźnienie włączenia hamulca EP przy hamowaniu ED - zwłoka wstępna
/*-dla wagonow*/
struct load_attributes {
std::string name; // name of the cargo
@@ -1158,6 +1170,10 @@ public:
int BrakeOpModeFlag = 0; /*nastawa trybu pracy PS/PN/EP/MED 1/2/4/8*/
int BrakeOpModes = 0; /*nastawy mozliwe do uzyskania*/
bool DynamicBrakeFlag = false; /*czy wlaczony hamulec elektrodymiczny*/
bool DynamicBrakeEMUStatus = true; /*czy hamulec ED dziala w ezt*/
int TUHEX_StageActual = 0; /*aktualny stopien tuhexa*/
bool TUHEX_ResChange = false; /*czy zmiana rezystancji hamowania ED - odwzbudzanie*/
bool TUHEX_Active = false; /*czy hamowanie ED wywołane z zewnątrz*/
// NapUdWsp: integer;
double LimPipePress = 0.0; /*stabilizator cisnienia*/
double ActFlowSpeed = 0.0; /*szybkosc stabilizatora*/
@@ -1520,6 +1536,7 @@ private:
void LoadFIZ_TurboPos( std::string const &line );
void LoadFIZ_Cntrl( std::string const &line );
void LoadFIZ_Blending(std::string const &line);
void LoadFIZ_DCEMUED(std::string const &line);
void LoadFIZ_Light( std::string const &line );
void LoadFIZ_Security( std::string const &line );
void LoadFIZ_Clima( std::string const &line );

View File

@@ -99,7 +99,7 @@ double TMoverParameters::Current(double n, double U)
MotorCurrent = 0;
// i dzialanie hamulca ED w EP09
if (DynamicBrakeType == dbrake_automatic)
if ((DynamicBrakeType == dbrake_automatic)&&(TrainType != dt_EZT))
{
if (((Hamulec->GetEDBCP() < 0.25) && (Vadd < 1)) || (BrakePress > 2.1))
DynamicBrakeFlag = false;
@@ -107,6 +107,10 @@ double TMoverParameters::Current(double n, double U)
DynamicBrakeFlag = true;
DynamicBrakeFlag = (DynamicBrakeFlag && ConverterFlag);
}
if ((DynamicBrakeType == dbrake_automatic) && (TrainType == dt_EZT))
{
DynamicBrakeFlag = (ConverterFlag && (TUHEX_Active || (Vadd>TUHEX_MinIw)) && DynamicBrakeEMUStatus);
}
// wylacznik cisnieniowy yBARC - to jest chyba niepotrzebne tutaj Q: no to usuwam...
@@ -148,7 +152,7 @@ double TMoverParameters::Current(double n, double U)
if (DynamicBrakeFlag && (!FuseFlag) && (DynamicBrakeType == dbrake_automatic) &&
ConverterFlag && Mains) // hamowanie EP09 //TUHEX
{
// TODO: zrobic bardziej uniwersalne nie tylko dla EP09
// TODO: zrobic bardziej uniwersalne nie tylko dla EP09
MotorCurrent =
-Max0R(MotorParam[0].fi * (Vadd / (Vadd + MotorParam[0].Isat) - MotorParam[0].fi0), 0) * n * 2.0 / DynamicBrakeRes;
}
@@ -1410,6 +1414,9 @@ void TMoverParameters::compute_movement_( double const Deltatime ) {
UpdatePipePressure(Deltatime);
UpdateBatteryVoltage(Deltatime);
UpdateScndPipePressure(Deltatime); // druga rurka, youBy
if ((DCEMUED_CC & 1) && (Couplers[0].CouplingFlag & 4)) DynamicBrakeEMUStatus &= Couplers[0].Connected->DynamicBrakeEMUStatus;
if ((DCEMUED_CC & 2) && (Couplers[1].CouplingFlag & 4)) DynamicBrakeEMUStatus &= Couplers[1].Connected->DynamicBrakeEMUStatus;
if( ( BrakeSlippingTimer > 0.8 ) && ( ASBType != 128 ) ) { // ASBSpeed=0.8
// hamulec antypoślizgowy - wyłączanie
@@ -3596,6 +3603,7 @@ void TMoverParameters::UpdatePipePressure(double dt)
}
case TBrakeValve::EP2:
case TBrakeValve::EP1:
{
Hamulec->PLC( TotalMass-Mred );
break;
@@ -3638,7 +3646,7 @@ void TMoverParameters::UpdatePipePressure(double dt)
}
} // switch
if ((BrakeHandle == TBrakeHandle::FVel6) && (ActiveCab != 0))
if (((BrakeHandle == TBrakeHandle::FVel6)||(BrakeHandle == TBrakeHandle::FVE408)) && (ActiveCab != 0))
{
if ((Battery)
&& (ActiveDir != 0)
@@ -3647,7 +3655,16 @@ void TMoverParameters::UpdatePipePressure(double dt)
temp = Handle->GetCP();
else
temp = 0.0;
Hamulec->SetEPS(temp);
if (temp < 0.001)
DynamicBrakeEMUStatus = true;
double temp1 = temp;
if ((DCEMUED_EP_max_Vel > 0.001) && (Vel > DCEMUED_EP_max_Vel) && (DynamicBrakeEMUStatus))
temp1 = 0;
if ((DCEMUED_EP_min_Im > 0.001) && (abs(Im) > DCEMUED_EP_min_Im) && (DynamicBrakeEMUStatus))
temp1 = 0;
Hamulec->SetEPS(temp1);
TUHEX_StageActual = temp;
TUHEX_Active = TUHEX_StageActual > 0;
// Ra 2014-11: na tym się wysypuje, ale nie wiem, w jakich warunkach
SendCtrlToNext("Brake", temp, CabNo);
}
@@ -4578,11 +4595,43 @@ double TMoverParameters::TractionForce( double dt ) {
}
if ((DynamicBrakeType == dbrake_automatic) && (DynamicBrakeFlag))
{
if (((Vadd + abs(Im)) > TUHEX_Sum + TUHEX_Diff) || (Hamulec->GetEDBCP() < 0.25))
if (TUHEX_Stages > 0) //hamowanie wielostopniowe, nadpisuje wartości domyślne
{
if (Vel > 100) TUHEX_StageActual = std::min(TUHEX_StageActual, 1);
switch (TUHEX_StageActual)
{
case 1:
TUHEX_Sum = TUHEX_Sum1;
DynamicBrakeRes = DynamicBrakeRes1;
break;
case 2:
TUHEX_Sum = TUHEX_Sum2;
DynamicBrakeRes = DynamicBrakeRes1;
break;
case 3:
TUHEX_Sum = TUHEX_Sum3;
if ((Vadd > 0.99*TUHEX_MaxIw) && (DynamicBrakeRes == DynamicBrakeRes1))
TUHEX_ResChange = true;
if (TUHEX_ResChange && Vadd < 0.5*TUHEX_MaxIw)
{
TUHEX_ResChange = false;
DynamicBrakeRes = DynamicBrakeRes2;
}
break;
default:
DynamicBrakeRes = DynamicBrakeRes1;
TUHEX_Sum = 0;
break;
}
}
if (((Vadd + abs(Im)) > TUHEX_Sum + TUHEX_Diff) || (Hamulec->GetEDBCP() < 0.25) || (TUHEX_ResChange) || (TUHEX_StageActual==0 && TUHEX_Stages>0))
{
Vadd -= 500.0 * dt;
if (Vadd < 1)
Vadd = 0;
if (Vadd < TUHEX_MinIw)
{
Vadd = 0;
DynamicBrakeFlag = false;
}
}
else if ((DynamicBrakeFlag) && ((Vadd + abs(Im)) < TUHEX_Sum - TUHEX_Diff))
{
@@ -7642,6 +7691,14 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
continue;
}
if (issection("DCEMUED:", inputline)) {
startBPT = true; LISTLINE = 0;
fizlines.emplace("DCEMUED", inputline);
LoadFIZ_DCEMUED(inputline);
continue;
}
if( issection( "Light:", inputline ) ) {
startBPT = false;
@@ -8284,6 +8341,7 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) {
{ "Knorr", TBrakeHandle::Knorr },
{ "Westinghouse", TBrakeHandle::West },
{ "FVel6", TBrakeHandle::FVel6 },
{ "FVE408", TBrakeHandle::FVE408 },
{ "St113", TBrakeHandle::St113 }
};
auto lookup = brakehandles.find( extract_value( "BrakeHandle", line ) );
@@ -8462,6 +8520,16 @@ void TMoverParameters::LoadFIZ_Blending(std::string const &line) {
extract_value(MED_Ncor, "MED_Ncor", line, "");
}
void TMoverParameters::LoadFIZ_DCEMUED(std::string const &line) {
extract_value(DCEMUED_CC, "CouplerCheck", line, "0");
extract_value(DCEMUED_EP_max_Vel, "EP_max_Vel", line, "0");
extract_value(DCEMUED_EP_min_Im, "EP_min_Im", line, "0");
extract_value(DCEMUED_EP_delay, "EP_delay", line, "0");
}
void TMoverParameters::LoadFIZ_Light( std::string const &line ) {
LightPowerSource.SourceType = LoadFIZ_SourceDecode( extract_value( "Light", line ) );
@@ -8750,6 +8818,11 @@ void TMoverParameters::LoadFIZ_Circuit( std::string const &Input ) {
extract_value( TUHEX_Diff, "TUHEX_Diff", Input, "" );
extract_value( TUHEX_MaxIw, "TUHEX_MaxIw", Input, "" );
extract_value( TUHEX_MinIw, "TUHEX_MinIw", Input, "" );
extract_value( TUHEX_Sum1, "TUHEX_Sum1", Input, "");
extract_value( TUHEX_Sum2, "TUHEX_Sum2", Input, "" );
extract_value( TUHEX_Sum3, "TUHEX_Sum3", Input, "" );
extract_value( TUHEX_Stages, "TUHEX_Stages", Input, "0" );
}
void TMoverParameters::LoadFIZ_RList( std::string const &Input ) {
@@ -8778,6 +8851,8 @@ void TMoverParameters::LoadFIZ_RList( std::string const &Input ) {
extract_value( RVentMinI, "RVentMinI", Input, "" );
extract_value( RVentSpeed, "RVentSpeed", Input, "" );
extract_value( DynamicBrakeRes, "DynBrakeRes", Input, "");
extract_value( DynamicBrakeRes1, "DynBrakeRes1", Input, "");
extract_value( DynamicBrakeRes2, "DynBrakeRes2", Input, "");
}
void TMoverParameters::LoadFIZ_DList( std::string const &Input ) {
@@ -9048,6 +9123,13 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir)
Hamulec->SetLP( Mass, MBPM, MaxBrakePress[ 1 ] );
break;
}
case TBrakeValve::EP1:
{
WriteLog("XBT EP1");
Hamulec = std::make_shared<TEStEP1>(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA);
Hamulec->SetLP(Mass, MBPM, MaxBrakePress[1]);
break;
}
case TBrakeValve::CV1:
{
WriteLog( "XBT CV1" );
@@ -9077,6 +9159,9 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir)
case TBrakeHandle::FVel6:
Handle = std::make_shared<TFVel6>();
break;
case TBrakeHandle::FVE408:
Handle = std::make_shared<TFVE408>();
break;
case TBrakeHandle::testH:
Handle = std::make_shared<Ttest>();
break;
@@ -9392,7 +9477,18 @@ bool TMoverParameters::RunCommand( std::string Command, double CValue1, double C
end */
else if (Command == "Brake") // youBy - jak sie EP hamuje, to trza sygnal wyslac...
{
Hamulec->SetEPS(CValue1);
if (CValue1 < 0.001)
DynamicBrakeEMUStatus = true;
double temp1 = CValue1;
if ((DCEMUED_EP_max_Vel > 0.001) && (Vel > DCEMUED_EP_max_Vel) && (DynamicBrakeEMUStatus))
temp1 = 0;
if ((DCEMUED_EP_min_Im > 0.001) && (abs(Im) > DCEMUED_EP_min_Im) && (DynamicBrakeEMUStatus))
temp1 = 0;
Hamulec->SetEPS(temp1);
TUHEX_StageActual = CValue1;
TUHEX_Active = TUHEX_StageActual > 0;
if (CValue1 < 0.001)
DynamicBrakeEMUStatus = true;
// fBrakeCtrlPos:=BrakeCtrlPos; //to powinnno być w jednym miejscu, aktualnie w C++!!!
BrakePressureActual = BrakePressureTable[BrakeCtrlPos];
OK = SendCtrlToNext( Command, CValue1, CValue2, Couplertype );

View File

@@ -31,6 +31,7 @@ double const TSt113::BPT_K[6][2] = {{10, 0}, {4, 1}, {0, 1}, {4, 0}, {4, -1}, {1
double const TSt113::BEP_K[7] = {0, -1, 1, 0, 0, 0, 0};
double const TSt113::pos_table[11] = {-1, 5, -1, 0, 2, 3, 4, 5, 0, 0, 1};
double const TFVel6::pos_table[11] = {-1, 6, -1, 0, 6, 4, 4.7, 5, -1, 0, 1};
double const TFVE408::pos_table[11] = { 0, 10, 0, 0, 10, 7, 8, 9, 0, 1, 5 };
double PR(double P1, double P2)
{
@@ -133,6 +134,11 @@ double PFVd( double PH, double PL, double const S, double LIM, double const DP )
return 0;
}
bool is_EQ(double pos, double i_pos)
{
return (pos <= i_pos + 0.5) && (pos > i_pos - 0.5);
}
//---ZBIORNIKI---
double TReservoir::pa()
@@ -863,10 +869,7 @@ double TEStEP2::GetPF( double const PP, double const dt, double const Vel )
dV1 = dV1 - 0.96 * dv;
// hamulec EP
temp = BVP * int(EPS > 0);
dv = PF(temp, LBP, 0.00053 + 0.00060 * int(EPS < 0)) * dt * EPS * EPS *
int(LBP * EPS < MaxBP * LoadC);
LBP = LBP - dv;
EPCalc(dt);
// luzowanie KI
if ((BrakeStatus & b_hld) == b_off)
@@ -936,6 +939,24 @@ void TEStEP2::SetLP( double const TM, double const LM, double const TBP )
TareBP = TBP;
}
void TEStEP2::EPCalc(double dt)
{
double temp = BrakeRes->P() * int(EPS > 0);
double dv = PF(temp, LBP, 0.00053 + 0.00060 * int(EPS < 0)) * dt * EPS * EPS *
int(LBP * EPS < MaxBP * LoadC);
LBP = LBP - dv;
}
void TEStEP1::EPCalc(double dt)
{
double temp = EPS - std::floor(EPS); //część ułamkowa jest hamulcem EP
double LBPLim = Min0R(MaxBP * LoadC * temp, BrakeRes->P()); //do czego dążymy
double S = 10 * clamp(LBPLim - LBP, -0.1, 0.1); //przymykanie zaworku
double dv = PF(( S > 0 ? BrakeRes->P() : 0 ), LBP, abs(S)*(0.00053 + 0.00060 * int(S < 0))) * dt; //przepływ
LBP = LBP - dv;
}
//---EST3--
double TESt3::GetPF( double const PP, double const dt, double const Vel )
@@ -3133,4 +3154,71 @@ void TFVel6::Init(double Press)
TimeEP = true;
}
//---FVE408---
double TFVE408::GetPF(double i_bcp, double PP, double HP, double dt, double ep)
{
static int const LBDelay = 100;
double LimPP;
double dpMainValve;
double ActFlowSpeed;
LimPP = Min0R(5 * int(i_bcp < 6.5), HP);
if ((i_bcp >= 6.5) && ((i_bcp < 7.5) || (i_bcp > 9.5)))
ActFlowSpeed = 0;
else if ((i_bcp > 7.5) && (i_bcp < 8.5))
ActFlowSpeed = 2; // konsultacje wawa1 - bylo 8;
else if ((i_bcp < 6.5))
ActFlowSpeed = 2;
else
ActFlowSpeed = 4;
dpMainValve = PF(LimPP, PP, ActFlowSpeed / LBDelay) * dt;
Sounds[s_fv4a_e] = 0;
Sounds[s_fv4a_u] = 0;
Sounds[s_fv4a_b] = 0;
if ((i_bcp < 6.5))
Sounds[s_fv4a_u] = -dpMainValve;
else if ((i_bcp < 8.5))
Sounds[s_fv4a_b] = dpMainValve;
else if ((i_bcp < 9.5))
Sounds[s_fv4a_e] = dpMainValve;
if (is_EQ(i_bcp, 1)) EPS = 1.15; else
if (is_EQ(i_bcp, 2)) EPS = 1.40; else
if (is_EQ(i_bcp, 3)) EPS = 2.64; else
if (is_EQ(i_bcp, 4)) EPS = 3.84; else
if (is_EQ(i_bcp, 5)) EPS = 3.99; else
EPS = 0;
return dpMainValve;
}
double TFVE408::GetCP()
{
return EPS;
}
double TFVE408::GetPos(int i)
{
return pos_table[i];
}
double TFVE408::GetSound(int i)
{
if (i > 2)
return 0;
else
return Sounds[i];
}
void TFVE408::Init(double Press)
{
Time = true;
TimeEP = false;
}
// END

View File

@@ -381,7 +381,7 @@ class TEStED : public TLSt { //zawor z EP09 - Est4 z oddzielnym przekladnikiem,
class TEStEP2 : public TLSt {
private:
protected:
double TareM = 0.0; //masa proznego
double LoadM = 0.0; //masa pelnego
double TareBP = 0.0; //cisnienie dla proznego
@@ -394,12 +394,23 @@ public:
void PLC( double const mass ); //wspolczynnik cisnienia przystawki wazacej
void SetEPS( double const nEPS )/*override*/; //stan hamulca EP
void SetLP( double const TM, double const LM, double const TBP ); //parametry przystawki wazacej
void virtual EPCalc(double dt);
inline TEStEP2(double i_mbp, double i_bcr, double i_bcd, double i_brc, int i_bcn, int i_BD, int i_mat, int i_ba, int i_nbpa) :
TLSt( i_mbp, i_bcr, i_bcd, i_brc, i_bcn, i_BD, i_mat, i_ba, i_nbpa)
{}
};
class TEStEP1 : public TEStEP2 {
public:
void EPCalc(double dt);
inline TEStEP1(double i_mbp, double i_bcr, double i_bcd, double i_brc, int i_bcn, int i_BD, int i_mat, int i_ba, int i_nbpa) :
TEStEP2(i_mbp, i_bcr, i_bcd, i_brc, i_bcn, i_BD, i_mat, i_ba, i_nbpa)
{}
};
class TCV1 : public TBrake {
private:
@@ -775,6 +786,24 @@ class TFVel6 : public TDriverHandle {
{}
};
class TFVE408 : public TDriverHandle {
private:
double EPS = 0.0;
static double const pos_table[11]; // = {-1, 6, -1, 0, 6, 4, 4.7, 5, -1, 0, 1};
public:
double GetPF(double i_bcp, double PP, double HP, double dt, double ep)/*override*/;
double GetCP()/*override*/;
double GetPos(int i)/*override*/;
double GetSound(int i)/*override*/;
void Init(double Press)/*override*/;
inline TFVE408(void) :
TDriverHandle()
{}
};
extern double PF( double const P1, double const P2, double const S, double const DP = 0.25 );
extern double PF1( double const P1, double const P2, double const S );