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

Improved speed controller - speed can be selected by SecondControlPosition

This commit is contained in:
Królik Uszasty
2018-04-15 14:58:51 +02:00
committed by tmj-fstate
parent aac16c55be
commit 0cb90a4e9a
4 changed files with 54 additions and 5 deletions

View File

@@ -2728,13 +2728,14 @@ bool TController::IncSpeed()
{ {
OK = mvControlling->IncMainCtrl(std::max(1,mvOccupied->MainCtrlPosNo/10)); OK = mvControlling->IncMainCtrl(std::max(1,mvOccupied->MainCtrlPosNo/10));
//tutaj jeszcze powinien być tempomat //tutaj jeszcze powinien być tempomat
mvControlling->IncScndCtrl(1);
double SpeedCntrl = VelDesired; double SpeedCntrl = VelDesired;
if (fProximityDist < 50) if (fProximityDist < 50)
{ {
SpeedCntrl = std::min(SpeedCntrl, VelNext); SpeedCntrl = std::min(SpeedCntrl, VelNext);
} }
mvControlling->RunCommand("SpeedCntrl", VelDesired, mvControlling->CabNo); this->SpeedCntrl(SpeedCntrl);
} }
break; break;
case WheelsDriven: case WheelsDriven:
@@ -3011,6 +3012,21 @@ void TController::SpeedSet()
} }
}; };
void TController::SpeedCntrl(double DesiredSpeed)
{
if (mvControlling->ScndCtrlPosNo == 1)
{
mvControlling->IncScndCtrl(1);
mvControlling->RunCommand("SpeedCntrl", DesiredSpeed, mvControlling->CabNo);
}
else if (mvControlling->ScndCtrlPosNo > 1)
{
int DesiredPos = 1 + mvControlling->ScndCtrlPosNo * ((DesiredSpeed - 1.0) / mvControlling->Vmax);
while (mvControlling->ScndCtrlPos > DesiredPos) mvControlling->DecScndCtrl(1);
while (mvControlling->ScndCtrlPos < DesiredPos) mvControlling->IncScndCtrl(1);
}
};
// otwieranie/zamykanie drzwi w składzie albo (tylko AI) EZT // otwieranie/zamykanie drzwi w składzie albo (tylko AI) EZT
void TController::Doors( bool const Open, int const Side ) { void TController::Doors( bool const Open, int const Side ) {

View File

@@ -304,6 +304,7 @@ private:
bool IncSpeed(); bool IncSpeed();
bool DecSpeed(bool force = false); bool DecSpeed(bool force = false);
void SpeedSet(); void SpeedSet();
void SpeedCntrl(double DesiredSpeed);
void Doors(bool const Open, int const Side = 0); void Doors(bool const Open, int const Side = 0);
// returns true if any vehicle in the consist has an open door // returns true if any vehicle in the consist has an open door
bool doors_open() const; bool doors_open() const;

View File

@@ -940,6 +940,7 @@ public:
double PlatformMaxShift = 0.5; /*wysuniecie stopnia*/ double PlatformMaxShift = 0.5; /*wysuniecie stopnia*/
int PlatformOpenMethod = 1; /*sposob animacji stopnia*/ int PlatformOpenMethod = 1; /*sposob animacji stopnia*/
bool ScndS = false; /*Czy jest bocznikowanie na szeregowej*/ bool ScndS = false; /*Czy jest bocznikowanie na szeregowej*/
double SpeedCtrlDelay = 2; /*opoznienie dzialania tempomatu z wybieralna predkoscia*/
/*--sekcja zmiennych*/ /*--sekcja zmiennych*/
/*--opis konkretnego egzemplarza taboru*/ /*--opis konkretnego egzemplarza taboru*/
TLocation Loc; //pozycja pojazdów do wyznaczenia odległości pomiędzy sprzęgami TLocation Loc; //pozycja pojazdów do wyznaczenia odległości pomiędzy sprzęgami
@@ -1127,6 +1128,8 @@ public:
/*- zmienne dla lokomotyw z silnikami indukcyjnymi -*/ /*- zmienne dla lokomotyw z silnikami indukcyjnymi -*/
double eimv[21]; double eimv[21];
static std::vector<std::string> const eimv_labels; static std::vector<std::string> const eimv_labels;
double SpeedCtrlTimer = 0; /*zegar dzialania tempomatu z wybieralna predkoscia*/
double NewSpeed = 0; /*nowa predkosc do zadania*/
/*-zmienne dla drezyny*/ /*-zmienne dla drezyny*/
double PulseForce = 0.0; /*przylozona sila*/ double PulseForce = 0.0; /*przylozona sila*/

View File

@@ -2002,7 +2002,7 @@ bool TMoverParameters::IncScndCtrl(int CtrlSpeed)
if (LastRelayTime > CtrlDelay) if (LastRelayTime > CtrlDelay)
LastRelayTime = 0; LastRelayTime = 0;
if ((OK) && (EngineType == ElectricInductionMotor)) if ((OK) && (EngineType == ElectricInductionMotor) && (ScndCtrlPosNo == 1))
{ {
// NOTE: round() already adds 0.5, are the ones added here as well correct? // NOTE: round() already adds 0.5, are the ones added here as well correct?
if ((Vmax < 250)) if ((Vmax < 250))
@@ -2060,7 +2060,7 @@ bool TMoverParameters::DecScndCtrl(int CtrlSpeed)
if (LastRelayTime > CtrlDownDelay) if (LastRelayTime > CtrlDownDelay)
LastRelayTime = 0; LastRelayTime = 0;
if ((OK) && (EngineType == ElectricInductionMotor)) if ((OK) && (EngineType == ElectricInductionMotor) && (ScndCtrlPosNo == 1))
{ {
ScndCtrlActualPos = 0; ScndCtrlActualPos = 0;
SendCtrlToNext("SpeedCntrl", ScndCtrlActualPos, CabNo); SendCtrlToNext("SpeedCntrl", ScndCtrlActualPos, CabNo);
@@ -4992,6 +4992,32 @@ double TMoverParameters::TractionForce(double dt)
} }
if( true == Mains ) { if( true == Mains ) {
//tempomat
if (ScndCtrlPosNo > 1)
{
if (ScndCtrlPos != NewSpeed)
{
SpeedCtrlTimer = 0;
NewSpeed = ScndCtrlPos;
}
else
{
SpeedCtrlTimer += dt;
if (SpeedCtrlTimer > SpeedCtrlDelay)
{
int NewSCAP = (Vmax < 250 ? 1 : 0.5) * (float)ScndCtrlPos / (float)ScndCtrlPosNo * Vmax;
if (NewSCAP != ScndCtrlActualPos)
{
ScndCtrlActualPos = NewSCAP;
SendCtrlToNext("SpeedCntrl", ScndCtrlActualPos, CabNo);
}
}
}
}
dtrans = Hamulec->GetEDBCP(); dtrans = Hamulec->GetEDBCP();
if (((DoorLeftOpened) || (DoorRightOpened))) if (((DoorLeftOpened) || (DoorRightOpened)))
DynamicBrakeFlag = true; DynamicBrakeFlag = true;
@@ -5031,7 +5057,7 @@ double TMoverParameters::TractionForce(double dt)
eimv[eimv_Fzad] = PosRatio; eimv[eimv_Fzad] = PosRatio;
if ((Flat) && (eimc[eimc_p_F0] * eimv[eimv_Fful] > 0)) if ((Flat) && (eimc[eimc_p_F0] * eimv[eimv_Fful] > 0))
PosRatio = Min0R(PosRatio * eimc[eimc_p_F0] / eimv[eimv_Fful], 1); PosRatio = Min0R(PosRatio * eimc[eimc_p_F0] / eimv[eimv_Fful], 1);
if (ScndCtrlActualPos > 0) if (ScndCtrlActualPos > 0) //speed control
if (Vmax < 250) if (Vmax < 250)
PosRatio = Min0R(PosRatio, Max0R(-1, 0.5 * (ScndCtrlActualPos - Vel))); PosRatio = Min0R(PosRatio, Max0R(-1, 0.5 * (ScndCtrlActualPos - Vel)));
else else
@@ -8093,6 +8119,9 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) {
extract_value( StopBrakeDecc, "SBD", line, "" ); extract_value( StopBrakeDecc, "SBD", line, "" );
// speed control
extract_value( SpeedCtrlDelay, "SpeedCtrlDelay", line, "" );
// converter // converter
{ {
std::map<std::string, start> starts { std::map<std::string, start> starts {