mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-21 22:59:19 +02:00
Added emergency brake to main controller; additional limit for AI when hint factor for braking is too low
This commit is contained in:
17
Driver.cpp
17
Driver.cpp
@@ -3147,7 +3147,10 @@ bool TController::IncBrakeEIM()
|
|||||||
{
|
{
|
||||||
case 0: {
|
case 0: {
|
||||||
if( mvOccupied->MED_amax != 9.81 ) {
|
if( mvOccupied->MED_amax != 9.81 ) {
|
||||||
auto const brakeposition{ clamp( -1.0 * mvOccupied->AIHintLocalBrakeAccFactor * AccDesired / mvOccupied->MED_amax, 0.0, 1.0 ) };
|
auto const maxpos{mvOccupied->EIMCtrlEmergency ? 0.9 : 1.0 };
|
||||||
|
auto const brakelimit{ -2.2 * AccDesired / mvOccupied->MED_amax - 1.0}; //additional limit when hinted is too low
|
||||||
|
auto const brakehinted{ -1.0 * mvOccupied->AIHintLocalBrakeAccFactor * AccDesired / mvOccupied->MED_amax }; //preffered by AI
|
||||||
|
auto const brakeposition{ maxpos * clamp(std::max(brakelimit, brakehinted), 0.0, 1.0)};
|
||||||
OK = ( brakeposition != mvOccupied->LocalBrakePosA );
|
OK = ( brakeposition != mvOccupied->LocalBrakePosA );
|
||||||
mvOccupied->LocalBrakePosA = brakeposition;
|
mvOccupied->LocalBrakePosA = brakeposition;
|
||||||
}
|
}
|
||||||
@@ -3891,9 +3894,11 @@ void TController::SpeedSet()
|
|||||||
|
|
||||||
void TController::SpeedCntrl(double DesiredSpeed)
|
void TController::SpeedCntrl(double DesiredSpeed)
|
||||||
{
|
{
|
||||||
while (mvControlling->SpeedCtrlUnit.DesiredPower < mvControlling->SpeedCtrlUnit.MaxPower)
|
if (mvControlling->SpeedCtrlUnit.PowerStep > 0) {
|
||||||
{
|
while (mvControlling->SpeedCtrlUnit.DesiredPower < mvControlling->SpeedCtrlUnit.MaxPower)
|
||||||
mvControlling->SpeedCtrlPowerInc();
|
{
|
||||||
|
mvControlling->SpeedCtrlPowerInc();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (mvControlling->EngineType == TEngineType::DieselEngine)
|
if (mvControlling->EngineType == TEngineType::DieselEngine)
|
||||||
{
|
{
|
||||||
@@ -6835,6 +6840,10 @@ TController::UpdateSituation(double dt) {
|
|||||||
if( mvOccupied->LocalBrakePosA < 1.0 ) {
|
if( mvOccupied->LocalBrakePosA < 1.0 ) {
|
||||||
// dodatkowy na pozycję 1
|
// dodatkowy na pozycję 1
|
||||||
mvOccupied->IncLocalBrakeLevel( LocalBrakePosNo );
|
mvOccupied->IncLocalBrakeLevel( LocalBrakePosNo );
|
||||||
|
if (mvOccupied->EIMCtrlEmergency)
|
||||||
|
{
|
||||||
|
mvOccupied->DecLocalBrakeLevel(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -3170,8 +3170,9 @@ bool TDynamicObject::Update(double dt, double dt1)
|
|||||||
(LBR < 0.01);
|
(LBR < 0.01);
|
||||||
}
|
}
|
||||||
auto Fzad = amax * LBR * masa;
|
auto Fzad = amax * LBR * masa;
|
||||||
if ((MoverParameters->BrakeCtrlPos == MoverParameters->Handle->GetPos(bh_EB))
|
if (((MoverParameters->BrakeCtrlPos == MoverParameters->Handle->GetPos(bh_EB))
|
||||||
&& (MoverParameters->eimc[eimc_p_abed] < 0.001))
|
&& (MoverParameters->eimc[eimc_p_abed] < 0.001)) ||
|
||||||
|
(MoverParameters->EmergencyValveFlow > 0))
|
||||||
Fzad = amax * masa; //pętla bezpieczeństwa - pełne służbowe
|
Fzad = amax * masa; //pętla bezpieczeństwa - pełne służbowe
|
||||||
if ((MoverParameters->ScndS) &&
|
if ((MoverParameters->ScndS) &&
|
||||||
(MoverParameters->Vel > MoverParameters->eimc[eimc_p_Vh1]) && (FmaxED > 0))
|
(MoverParameters->Vel > MoverParameters->eimc[eimc_p_Vh1]) && (FmaxED > 0))
|
||||||
|
|||||||
@@ -1550,6 +1550,7 @@ public:
|
|||||||
bool SpeedCtrlTypeTime = false; /*czy tempomat sterowany czasowo*/
|
bool SpeedCtrlTypeTime = false; /*czy tempomat sterowany czasowo*/
|
||||||
int SpeedCtrlAutoTurnOffFlag = 0; /*czy tempomat sam się wyłącza*/
|
int SpeedCtrlAutoTurnOffFlag = 0; /*czy tempomat sam się wyłącza*/
|
||||||
bool EIMCtrlAdditionalZeros = false; /*czy ma dodatkowe zero jazdy i zero hamowania */
|
bool EIMCtrlAdditionalZeros = false; /*czy ma dodatkowe zero jazdy i zero hamowania */
|
||||||
|
bool EIMCtrlEmergency = false; /*czy ma dodatkowe zero jazdy i zero hamowania */
|
||||||
double eimv_pr = 0; /*realizowany procent dostepnej sily rozruchu/hamowania*/
|
double eimv_pr = 0; /*realizowany procent dostepnej sily rozruchu/hamowania*/
|
||||||
double eimv[21];
|
double eimv[21];
|
||||||
static std::vector<std::string> const eimv_labels;
|
static std::vector<std::string> const eimv_labels;
|
||||||
|
|||||||
@@ -4285,6 +4285,8 @@ void TMoverParameters::UpdatePipePressure(double dt)
|
|||||||
|
|
||||||
if( ( true == RadioStopFlag )
|
if( ( true == RadioStopFlag )
|
||||||
|| ( true == AlarmChainFlag )
|
|| ( true == AlarmChainFlag )
|
||||||
|
|| (( true == EIMCtrlEmergency)
|
||||||
|
&& (LocalBrakePosA >= 1.0))
|
||||||
|| ( true == TestFlag( SecuritySystem.Status, s_SHPebrake ) )
|
|| ( true == TestFlag( SecuritySystem.Status, s_SHPebrake ) )
|
||||||
|| ( true == TestFlag( SecuritySystem.Status, s_CAebrake ) )
|
|| ( true == TestFlag( SecuritySystem.Status, s_CAebrake ) )
|
||||||
/*
|
/*
|
||||||
@@ -6934,16 +6936,18 @@ bool TMoverParameters::DropAllPantographs( bool const State, range_t const Notif
|
|||||||
|
|
||||||
void TMoverParameters::CheckEIMIC(double dt)
|
void TMoverParameters::CheckEIMIC(double dt)
|
||||||
{
|
{
|
||||||
|
double offset = EIMCtrlAdditionalZeros ? 1.0 : 0.0;
|
||||||
|
double multiplier = (EIMCtrlEmergency ? 1.0 : 0.0) + offset;
|
||||||
switch (EIMCtrlType)
|
switch (EIMCtrlType)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
eimic = (LocalBrakeRatio() > 0.01 ? -LocalBrakeRatio() : (double)MainCtrlPos / (double)MainCtrlPosNo);
|
eimic = (LocalBrakeRatio() > 0.01 ? -LocalBrakeRatio() : (double)MainCtrlPos / (double)MainCtrlPosNo);
|
||||||
if (EIMCtrlAdditionalZeros)
|
if (EIMCtrlAdditionalZeros || EIMCtrlEmergency)
|
||||||
{
|
{
|
||||||
if (eimic > 0.001)
|
if (eimic > 0.001)
|
||||||
eimic = std::max(0.002, eimic * (double)MainCtrlPosNo / ((double)MainCtrlPosNo - 1.0) - 1.0 / ((double)MainCtrlPosNo - 1.0));
|
eimic = std::max(0.002, eimic * (double)MainCtrlPosNo / ((double)MainCtrlPosNo - offset) - offset / ((double)MainCtrlPosNo - offset));
|
||||||
if ((eimic < -0.001) && (BrakeHandle != TBrakeHandle::MHZ_EN57))
|
if ((eimic < -0.001) && (BrakeHandle != TBrakeHandle::MHZ_EN57))
|
||||||
eimic = std::min(-0.002, eimic * (double)LocalBrakePosNo / ((double)LocalBrakePosNo - 1.0) + 1.0 / ((double)LocalBrakePosNo - 1.0));
|
eimic = std::min(-0.002, eimic * (double)LocalBrakePosNo / ((double)LocalBrakePosNo - multiplier) + offset / ((double)LocalBrakePosNo - multiplier));
|
||||||
}
|
}
|
||||||
if ((eimic > 0.001) && (SpeedCtrlUnit.IsActive))
|
if ((eimic > 0.001) && (SpeedCtrlUnit.IsActive))
|
||||||
eimic = std::max(eimic, SpeedCtrlUnit.MinPower);
|
eimic = std::max(eimic, SpeedCtrlUnit.MinPower);
|
||||||
@@ -10125,6 +10129,7 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) {
|
|||||||
EIMCtrlType = clamp( EIMCtrlType, 0, 3 );
|
EIMCtrlType = clamp( EIMCtrlType, 0, 3 );
|
||||||
extract_value( LocHandleTimeTraxx, "LocalBrakeTraxx", line, "" );
|
extract_value( LocHandleTimeTraxx, "LocalBrakeTraxx", line, "" );
|
||||||
extract_value( EIMCtrlAdditionalZeros, "EIMCtrlAddZeros", line, "" );
|
extract_value( EIMCtrlAdditionalZeros, "EIMCtrlAddZeros", line, "" );
|
||||||
|
extract_value( EIMCtrlEmergency, "EIMCtrlEmergency", line, "");
|
||||||
|
|
||||||
extract_value( ScndS, "ScndS", line, "" ); // brak pozycji rownoleglej przy niskiej nastawie PSR
|
extract_value( ScndS, "ScndS", line, "" ); // brak pozycji rownoleglej przy niskiej nastawie PSR
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user