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

Additionl 0 position for EIM EMUs, configurable Elf controller, first try of speedcontrol for EN57A

This commit is contained in:
Królik Uszasty
2019-05-08 21:44:19 +02:00
committed by tmj-fstate
parent 9185030b4b
commit 2db964ea40
3 changed files with 63 additions and 28 deletions

View File

@@ -2844,20 +2844,20 @@ bool TController::IncBrake()
bool TController::IncBrakeEIM() bool TController::IncBrakeEIM()
{ // zwiększenie hamowania { // zwiększenie hamowania
bool OK = false; bool OK = false;
switch (mvControlling->EIMCtrlType) switch (mvOccupied->EIMCtrlType)
{ {
case 0: case 0:
OK = mvControlling->IncLocalBrakeLevel(1); OK = mvOccupied->IncLocalBrakeLevel(1);
break; break;
case 1: case 1:
OK = mvControlling->MainCtrlPos > 0; OK = mvOccupied->MainCtrlPos > 0;
if (OK) if (OK)
mvControlling->MainCtrlPos = 0; mvOccupied->MainCtrlPos = 0;
break; break;
case 2: case 2:
OK = mvControlling->MainCtrlPos > 1; OK = mvOccupied->MainCtrlPos > 1;
if (OK) if (OK)
mvControlling->MainCtrlPos = 1; mvOccupied->MainCtrlPos = 1;
break; break;
} }
return OK; return OK;
@@ -2936,20 +2936,20 @@ bool TController::DecBrake()
bool TController::DecBrakeEIM() bool TController::DecBrakeEIM()
{ // zmniejszenie siły hamowania { // zmniejszenie siły hamowania
bool OK = false; bool OK = false;
switch (mvControlling->EIMCtrlType) switch (mvOccupied->EIMCtrlType)
{ {
case 0: case 0:
OK = mvControlling->DecLocalBrakeLevel(1); OK = mvOccupied->DecLocalBrakeLevel(1);
break; break;
case 1: case 1:
OK = mvControlling->MainCtrlPos < 2; OK = mvOccupied->MainCtrlPos < 2;
if (OK) if (OK)
mvControlling->MainCtrlPos = 2; mvOccupied->MainCtrlPos = 2;
break; break;
case 2: case 2:
OK = mvControlling->MainCtrlPos < 3; OK = mvOccupied->MainCtrlPos < 3;
if (OK) if (OK)
mvControlling->MainCtrlPos = 3; mvOccupied->MainCtrlPos = 3;
break; break;
} }
return OK; return OK;

View File

@@ -1312,6 +1312,8 @@ public:
double eim_localbrake = 0; /*nastawa hamowania dodatkowego pneumatycznego lokomotywy*/ double eim_localbrake = 0; /*nastawa hamowania dodatkowego pneumatycznego lokomotywy*/
int EIMCtrlType = 0; /*rodzaj wariantu zadajnika jazdy*/ int EIMCtrlType = 0; /*rodzaj wariantu zadajnika jazdy*/
bool SpeedCtrlTypeTime = false; /*czy tempomat sterowany czasowo*/ bool SpeedCtrlTypeTime = false; /*czy tempomat sterowany czasowo*/
int SpeedCtrlAutoTurnOffFlag = 0; /*czy tempomat sam się wyłącza*/
bool EIMCtrlAdditionalZeros = 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;

View File

@@ -2001,6 +2001,10 @@ bool TMoverParameters::IncScndCtrl(int CtrlSpeed)
ScndCtrlActualPos = Round(Vel); ScndCtrlActualPos = Round(Vel);
else else
ScndCtrlActualPos = Round(Vel * 0.5); ScndCtrlActualPos = Round(Vel * 0.5);
if ((EIMCtrlType == 0)&&(SpeedCtrlAutoTurnOffFlag == 1))
{
MainCtrlActualPos = MainCtrlPos;
}
SendCtrlToNext("SpeedCntrl", ScndCtrlActualPos, CabNo); SendCtrlToNext("SpeedCntrl", ScndCtrlActualPos, CabNo);
} }
@@ -6018,6 +6022,13 @@ void TMoverParameters::CheckEIMIC(double dt)
{ {
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 (eimic > 0.001)
eimic = std::max(0.002, eimic * (double)MainCtrlPosNo / ((double)MainCtrlPosNo - 1.0) - 1.0 / ((double)MainCtrlPosNo - 1.0));
if (eimic < -0.001)
eimic = std::min(-0.002, eimic * (double)LocalBrakePosNo / ((double)LocalBrakePosNo - 1.0) + 1.0 / ((double)LocalBrakePosNo - 1.0));
}
break; break;
case 1: case 1:
switch (MainCtrlPos) switch (MainCtrlPos)
@@ -6068,24 +6079,35 @@ void TMoverParameters::CheckEIMIC(double dt)
} }
break; break;
case 2: case 2:
if ((MainCtrlActualPos != MainCtrlPos) || (LastRelayTime>InitialCtrlDelay))
{
double delta = (MainCtrlActualPos == MainCtrlPos ? dt*CtrlDelay : 0.01);
switch (MainCtrlPos) switch (MainCtrlPos)
{ {
case 0: case 0:
case 1: case 1:
eimic -= clamp(1.0 + eimic, 0.0, dt*0.15); //odejmuj do -1 eimic -= clamp(1.0 + eimic, 0.0, delta); //odejmuj do -1
if (eimic > 0) eimic = 0; if (eimic > 0) eimic = 0;
break; break;
case 2: case 2:
eimic -= clamp(0.0 + eimic, 0.0, dt*0.15); //odejmuj do 0 eimic -= clamp(0.0 + eimic, 0.0, delta); //odejmuj do 0
break; break;
case 3: case 3:
eimic += clamp(0.0 - eimic, 0.0, dt*0.15); //dodawaj do 0 eimic += clamp(0.0 - eimic, 0.0, delta); //dodawaj do 0
break; break;
case 4: case 4:
eimic += clamp(1.0 - eimic, 0.0, dt*0.15); //dodawaj do 1 eimic += clamp(1.0 - eimic, 0.0, delta); //dodawaj do 1
if (eimic < 0) eimic = 0; if (eimic < 0) eimic = 0;
break; break;
} }
}
if (MainCtrlActualPos == MainCtrlPos)
LastRelayTime += dt;
else
{
LastRelayTime = 0;
MainCtrlActualPos = MainCtrlPos;
}
break; break;
case 3: case 3:
eimic -= clamp(-UniCtrlList[MainCtrlPos].SetCtrlVal + eimic, 0.0, dt * UniCtrlList[MainCtrlPos].SpeedDown); //odejmuj do X eimic -= clamp(-UniCtrlList[MainCtrlPos].SetCtrlVal + eimic, 0.0, dt * UniCtrlList[MainCtrlPos].SpeedDown); //odejmuj do X
@@ -6108,6 +6130,15 @@ void TMoverParameters::CheckSpeedCtrl()
eimicSpeedCtrl = clamp(0.5 * (ScndCtrlActualPos * 2 - Vel), -1.0, 1.0); eimicSpeedCtrl = clamp(0.5 * (ScndCtrlActualPos * 2 - Vel), -1.0, 1.0);
else else
eimicSpeedCtrl = 1; eimicSpeedCtrl = 1;
if ((EIMCtrlType == 0) && (SpeedCtrlAutoTurnOffFlag == 1) && (MainCtrlActualPos != MainCtrlPos))
{
DecScndCtrl(1);
if (CabNo == 0)
{
SendCtrlToNext("ScndCtrl", ScndCtrlPos, 1);
SendCtrlToNext("ScndCtrl", ScndCtrlPos, -1);
}
}
} }
// ************************************************************************************************* // *************************************************************************************************
@@ -8708,6 +8739,7 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) {
extract_value( EIMCtrlType, "EIMCtrlType", line, "" ); extract_value( EIMCtrlType, "EIMCtrlType", line, "" );
clamp( EIMCtrlType, 0, 3 ); clamp( EIMCtrlType, 0, 3 );
LocHandleTimeTraxx = (extract_value("LocalBrakeTraxx", line) == "Yes"); LocHandleTimeTraxx = (extract_value("LocalBrakeTraxx", line) == "Yes");
EIMCtrlAdditionalZeros = (extract_value("EIMCtrlAddZeros", line) == "Yes");
extract_value( ScndS, "ScndS", line, "" ); // brak pozycji rownoleglej przy niskiej nastawie PSR extract_value( ScndS, "ScndS", line, "" ); // brak pozycji rownoleglej przy niskiej nastawie PSR
@@ -8730,6 +8762,7 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) {
(extract_value("SpeedCtrlType", line) == "Time") ? (extract_value("SpeedCtrlType", line) == "Time") ?
true : true :
false; false;
extract_value(SpeedCtrlAutoTurnOffFlag, "SpeedCtrlATOF", line, "");
// converter // converter
{ {