mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-22 22:09:19 +02:00
New MainCtrlTypes for EIM Integrated Control dedicated to Traxx and Elf
This commit is contained in:
24
DynObj.cpp
24
DynObj.cpp
@@ -2684,7 +2684,7 @@ bool TDynamicObject::Update(double dt, double dt1)
|
|||||||
MoverParameters->EqvtPipePress = GetEPP(); // srednie cisnienie w PG
|
MoverParameters->EqvtPipePress = GetEPP(); // srednie cisnienie w PG
|
||||||
if( ( Mechanik->Primary() )
|
if( ( Mechanik->Primary() )
|
||||||
&& ( MoverParameters->EngineType == TEngineType::ElectricInductionMotor ) ) {
|
&& ( MoverParameters->EngineType == TEngineType::ElectricInductionMotor ) ) {
|
||||||
// jesli glowny i z asynchronami, to niech steruje hamulcem lacznie dla calego pociagu/ezt
|
// jesli glowny i z asynchronami, to niech steruje hamulcem i napedem lacznie dla calego pociagu/ezt
|
||||||
auto const kier = (DirectionGet() * MoverParameters->ActiveCab > 0);
|
auto const kier = (DirectionGet() * MoverParameters->ActiveCab > 0);
|
||||||
auto FED { 0.0 };
|
auto FED { 0.0 };
|
||||||
auto np { 0 };
|
auto np { 0 };
|
||||||
@@ -2696,6 +2696,16 @@ bool TDynamicObject::Update(double dt, double dt1)
|
|||||||
auto FmaxED { 0.0 };
|
auto FmaxED { 0.0 };
|
||||||
auto Frj { 0.0 };
|
auto Frj { 0.0 };
|
||||||
auto osie { 0 };
|
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->CheckEIMIC(dt1);
|
||||||
|
MoverParameters->CheckSpeedCtrl();
|
||||||
|
|
||||||
|
MoverParameters->eimic = Min0R(MoverParameters->eimic, MoverParameters->eimicSpeedCtrl);
|
||||||
|
MoverParameters->SendCtrlToNext("EIMIC", Max0R(0, MoverParameters->eimic), MoverParameters->CabNo);
|
||||||
|
auto LBR = Max0R(-MoverParameters->eimic, 0);
|
||||||
|
|
||||||
// 1. ustal wymagana sile hamowania calego pociagu
|
// 1. ustal wymagana sile hamowania calego pociagu
|
||||||
// - opoznienie moze byc ustalane na podstawie charakterystyki
|
// - opoznienie moze byc ustalane na podstawie charakterystyki
|
||||||
// - opoznienie moze byc ustalane na podstawie mas i cisnien granicznych
|
// - opoznienie moze byc ustalane na podstawie mas i cisnien granicznych
|
||||||
@@ -2758,22 +2768,22 @@ bool TDynamicObject::Update(double dt, double dt1)
|
|||||||
if (MoverParameters->ShuntMode)
|
if (MoverParameters->ShuntMode)
|
||||||
{
|
{
|
||||||
MoverParameters->ShuntModeAllow = ( false == doorisopen ) &&
|
MoverParameters->ShuntModeAllow = ( false == doorisopen ) &&
|
||||||
(MoverParameters->LocalBrakeRatio() < 0.01);
|
(LBR < 0.01);
|
||||||
}
|
}
|
||||||
if( ( MoverParameters->Vel > 1 ) && ( false == doorisopen ) )
|
if( ( MoverParameters->Vel > 1 ) && ( false == doorisopen ) )
|
||||||
{
|
{
|
||||||
MoverParameters->ShuntMode = false;
|
MoverParameters->ShuntMode = false;
|
||||||
MoverParameters->ShuntModeAllow = (MoverParameters->BrakePress > 0.2) &&
|
MoverParameters->ShuntModeAllow = (MoverParameters->BrakePress > 0.2) &&
|
||||||
(MoverParameters->LocalBrakeRatio() < 0.01);
|
(LBR < 0.01);
|
||||||
}
|
}
|
||||||
auto Fzad = amax * MoverParameters->LocalBrakeRatio() * 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))
|
||||||
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))
|
||||||
{
|
{
|
||||||
Fzad = std::min(MoverParameters->LocalBrakeRatio() * FmaxED, FfulED);
|
Fzad = std::min(LBR * FmaxED, FfulED);
|
||||||
}
|
}
|
||||||
if (((MoverParameters->ShuntMode) && (Frj < 0.0015 * masa)) ||
|
if (((MoverParameters->ShuntMode) && (Frj < 0.0015 * masa)) ||
|
||||||
(MoverParameters->V * MoverParameters->DirAbsolute < -0.2))
|
(MoverParameters->V * MoverParameters->DirAbsolute < -0.2))
|
||||||
@@ -2845,7 +2855,7 @@ bool TDynamicObject::Update(double dt, double dt1)
|
|||||||
PrzekrF[i] = false;
|
PrzekrF[i] = false;
|
||||||
FzED[i] = (FmaxED > 0 ? FzadED / FmaxED : 0);
|
FzED[i] = (FmaxED > 0 ? FzadED / FmaxED : 0);
|
||||||
p->MoverParameters->AnPos =
|
p->MoverParameters->AnPos =
|
||||||
(MoverParameters->ScndS ? MoverParameters->LocalBrakeRatio() : FzED[i]);
|
(MoverParameters->ScndS ? LBR : FzED[i]);
|
||||||
FzEP[ i ] = static_cast<float>( FzadPN * p->MoverParameters->NAxles ) / static_cast<float>( osie );
|
FzEP[ i ] = static_cast<float>( FzadPN * p->MoverParameters->NAxles ) / static_cast<float>( osie );
|
||||||
++i;
|
++i;
|
||||||
p->MoverParameters->ShuntMode = MoverParameters->ShuntMode;
|
p->MoverParameters->ShuntMode = MoverParameters->ShuntMode;
|
||||||
@@ -6597,7 +6607,7 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub
|
|||||||
if( Vehicle.EngineType == TEngineType::ElectricInductionMotor ) {
|
if( Vehicle.EngineType == TEngineType::ElectricInductionMotor ) {
|
||||||
if( Vehicle.InverterFrequency > 0.1 ) {
|
if( Vehicle.InverterFrequency > 0.1 ) {
|
||||||
|
|
||||||
volume = inverter.m_amplitudeoffset + inverter.m_amplitudefactor * std::sqrt( std::abs( Vehicle.dizel_fill ) );
|
volume = inverter.m_amplitudeoffset + inverter.m_amplitudefactor * std::sqrt( std::abs( Vehicle.eimv_pr) );
|
||||||
|
|
||||||
inverter
|
inverter
|
||||||
.pitch( inverter.m_frequencyoffset + inverter.m_frequencyfactor * Vehicle.InverterFrequency )
|
.pitch( inverter.m_frequencyoffset + inverter.m_frequencyfactor * Vehicle.InverterFrequency )
|
||||||
|
|||||||
@@ -1280,9 +1280,13 @@ public:
|
|||||||
double hydro_R_n = 0.0; /*predkosc obrotowa retardera*/
|
double hydro_R_n = 0.0; /*predkosc obrotowa retardera*/
|
||||||
|
|
||||||
/*- zmienne dla lokomotyw z silnikami indukcyjnymi -*/
|
/*- zmienne dla lokomotyw z silnikami indukcyjnymi -*/
|
||||||
|
double eimic = 0; /*aktualna pozycja zintegrowanego sterowania jazda i hamowaniem*/
|
||||||
|
int EIMCtrlType = 0; /*rodzaj wariantu zadajnika jazdy*/
|
||||||
|
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;
|
||||||
double SpeedCtrlTimer = 0; /*zegar dzialania tempomatu z wybieralna predkoscia*/
|
double SpeedCtrlTimer = 0; /*zegar dzialania tempomatu z wybieralna predkoscia*/
|
||||||
|
double eimicSpeedCtrl = 0; /*pozycja sugerowana przez tempomat*/
|
||||||
double NewSpeed = 0; /*nowa predkosc do zadania*/
|
double NewSpeed = 0; /*nowa predkosc do zadania*/
|
||||||
double MED_EPVC_CurrentTime = 0; /*aktualny czas licznika czasu korekcji siły EP*/
|
double MED_EPVC_CurrentTime = 0; /*aktualny czas licznika czasu korekcji siły EP*/
|
||||||
|
|
||||||
@@ -1496,6 +1500,9 @@ public:
|
|||||||
bool PantFront( bool const State, range_t const Notify = range_t::consist ); //obsluga pantografou przedniego
|
bool PantFront( bool const State, range_t const Notify = range_t::consist ); //obsluga pantografou przedniego
|
||||||
bool PantRear( bool const State, range_t const Notify = range_t::consist ); //obsluga pantografu tylnego
|
bool PantRear( bool const State, range_t const Notify = range_t::consist ); //obsluga pantografu tylnego
|
||||||
|
|
||||||
|
void CheckEIMIC(double dt); //sprawdzenie i zmiana nastawy zintegrowanego nastawnika jazdy/hamowania
|
||||||
|
void CheckSpeedCtrl();
|
||||||
|
|
||||||
/*-funkcje typowe dla lokomotywy spalinowej z przekladnia mechaniczna*/
|
/*-funkcje typowe dla lokomotywy spalinowej z przekladnia mechaniczna*/
|
||||||
bool dizel_EngageSwitch(double state);
|
bool dizel_EngageSwitch(double state);
|
||||||
bool dizel_EngageChange(double dt);
|
bool dizel_EngageChange(double dt);
|
||||||
|
|||||||
@@ -1613,7 +1613,7 @@ double TMoverParameters::ShowCurrent(int AmpN) const
|
|||||||
case 1:
|
case 1:
|
||||||
return WindingRes * Mm / Vadd;
|
return WindingRes * Mm / Vadd;
|
||||||
case 2:
|
case 2:
|
||||||
return dizel_fill * WindingRes;
|
return eimv_pr * WindingRes;
|
||||||
default:
|
default:
|
||||||
return ShowCurrentP(AmpN); // T_MoverParameters::
|
return ShowCurrentP(AmpN); // T_MoverParameters::
|
||||||
}
|
}
|
||||||
@@ -4998,25 +4998,24 @@ double TMoverParameters::TractionForce( double dt ) {
|
|||||||
if (NewSCAP != ScndCtrlActualPos)
|
if (NewSCAP != ScndCtrlActualPos)
|
||||||
{
|
{
|
||||||
ScndCtrlActualPos = NewSCAP;
|
ScndCtrlActualPos = NewSCAP;
|
||||||
SendCtrlToNext("SpeedCntrl", ScndCtrlActualPos, CabNo);
|
// SendCtrlToNext("SpeedCntrl", ScndCtrlActualPos, CabNo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
double edBCP = Hamulec->GetEDBCP();
|
||||||
dtrans = Hamulec->GetEDBCP();
|
|
||||||
if( ( false == Doors.instances[ side::left ].is_closed )
|
if( ( false == Doors.instances[ side::left ].is_closed )
|
||||||
|| ( false == Doors.instances[ side::right ].is_closed )
|
|| ( false == Doors.instances[ side::right ].is_closed )
|
||||||
|| ( Doors.permit_needed && ( Doors.instances[ side::left ].open_permit || Doors.instances[ side::right ].open_permit ) ) ) {
|
|| ( Doors.permit_needed && ( Doors.instances[ side::left ].open_permit || Doors.instances[ side::right ].open_permit ) ) ) {
|
||||||
DynamicBrakeFlag = true;
|
DynamicBrakeFlag = true;
|
||||||
}
|
}
|
||||||
else if (((dtrans < 0.25) && (LocHandle->GetCP() < 0.25) && (AnPos < 0.01)) ||
|
else if (((edBCP < 0.25) && (LocHandle->GetCP() < 0.25) && (AnPos < 0.01)) ||
|
||||||
((dtrans < 0.25) && (ShuntModeAllow) && (LocalBrakePosA < 0.01)))
|
((edBCP < 0.25) && (ShuntModeAllow) && (LocalBrakePosA < 0.01)))
|
||||||
DynamicBrakeFlag = false;
|
DynamicBrakeFlag = false;
|
||||||
else if ((((BrakePress > 0.25) && (dtrans > 0.25) || (LocHandle->GetCP() > 0.25))) ||
|
else if ((((BrakePress > 0.25) && (edBCP > 0.25) || (LocHandle->GetCP() > 0.25))) ||
|
||||||
(AnPos > 0.02))
|
(AnPos > 0.02))
|
||||||
DynamicBrakeFlag = true;
|
DynamicBrakeFlag = true;
|
||||||
dtrans = Hamulec->GetEDBCP() * eimc[eimc_p_abed]; // stala napedu
|
edBCP = Hamulec->GetEDBCP() * eimc[eimc_p_abed]; // stala napedu
|
||||||
if ((DynamicBrakeFlag))
|
if ((DynamicBrakeFlag))
|
||||||
{
|
{
|
||||||
// ustalanie współczynnika blendingu do luzowania hamulca PN
|
// ustalanie współczynnika blendingu do luzowania hamulca PN
|
||||||
@@ -5024,7 +5023,7 @@ double TMoverParameters::TractionForce( double dt ) {
|
|||||||
{
|
{
|
||||||
PosRatio = -Sign(V) * DirAbsolute * eimv[eimv_Fr] /
|
PosRatio = -Sign(V) * DirAbsolute * eimv[eimv_Fr] /
|
||||||
(eimc[eimc_p_Fh] *
|
(eimc[eimc_p_Fh] *
|
||||||
Max0R(dtrans,Max0R(0.01,Hamulec->GetEDBCP())) / MaxBrakePress[0]);
|
Max0R(edBCP,Max0R(0.01,Hamulec->GetEDBCP())) / MaxBrakePress[0]);
|
||||||
PosRatio = clamp(PosRatio, 0.0, 1.0);
|
PosRatio = clamp(PosRatio, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -5043,29 +5042,30 @@ double TMoverParameters::TractionForce( double dt ) {
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PosRatio = -std::max(std::min(dtrans * 1.0 / MaxBrakePress[0], 1.0), AnPos) *
|
PosRatio = -std::max(std::min(edBCP * 1.0 / MaxBrakePress[0], 1.0), AnPos) *
|
||||||
std::max(0.0, std::min(1.0, (Vel - eimc[eimc_p_Vh0]) /
|
std::max(0.0, std::min(1.0, (Vel - eimc[eimc_p_Vh0]) /
|
||||||
(eimc[eimc_p_Vh1] - eimc[eimc_p_Vh0])));
|
(eimc[eimc_p_Vh1] - eimc[eimc_p_Vh0])));
|
||||||
eimv[eimv_Fzad] = -std::max(LocalBrakeRatio(), dtrans / MaxBrakePress[0]);
|
eimv[eimv_Fzad] = -std::min(1.0,std::max(LocalBrakeRatio(), edBCP / MaxBrakePress[0]));
|
||||||
}
|
}
|
||||||
tmp = 5;
|
tmp = 5;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PosRatio = static_cast<double>( MainCtrlPos ) / static_cast<double>( MainCtrlPosNo );
|
PosRatio = static_cast<double>( MainCtrlPos ) / static_cast<double>( MainCtrlPosNo );
|
||||||
|
PosRatio = Max0R(eimic, 0);
|
||||||
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) //speed control
|
/* 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
|
||||||
PosRatio =
|
PosRatio =
|
||||||
Min0R(PosRatio, Max0R(-1, 0.5 * (ScndCtrlActualPos * 2 - Vel)));
|
Min0R(PosRatio, Max0R(-1, 0.5 * (ScndCtrlActualPos * 2 - Vel))); */
|
||||||
// PosRatio = 1.0 * (PosRatio * 0 + 1) * PosRatio; // 1 * 1 * PosRatio = PosRatio
|
// PosRatio = 1.0 * (PosRatio * 0 + 1) * PosRatio; // 1 * 1 * PosRatio = PosRatio
|
||||||
Hamulec->SetED(0);
|
Hamulec->SetED(0);
|
||||||
// (Hamulec as TLSt).SetLBP(LocBrakePress);
|
// (Hamulec as TLSt).SetLBP(LocBrakePress);
|
||||||
if ((PosRatio > dizel_fill))
|
if ((PosRatio > eimv_pr))
|
||||||
tmp = 4;
|
tmp = 4;
|
||||||
else
|
else
|
||||||
tmp = 4; // szybkie malenie, powolne wzrastanie
|
tmp = 4; // szybkie malenie, powolne wzrastanie
|
||||||
@@ -5083,8 +5083,8 @@ double TMoverParameters::TractionForce( double dt ) {
|
|||||||
Sandbox( false, range_t::unit );
|
Sandbox( false, range_t::unit );
|
||||||
}
|
}
|
||||||
|
|
||||||
dizel_fill += Max0R(Min0R(PosRatio - dizel_fill, 0.02), -0.02) * 12 *
|
eimv_pr += Max0R(Min0R(PosRatio - eimv_pr, 0.02), -0.02) * 12 *
|
||||||
(tmp /*2{+4*byte(PosRatio<dizel_fill)*/) *
|
(tmp /*2{+4*byte(PosRatio<eimv_pr)*/) *
|
||||||
dt; // wartość zadana/procent czegoś
|
dt; // wartość zadana/procent czegoś
|
||||||
|
|
||||||
if ((DynamicBrakeFlag))
|
if ((DynamicBrakeFlag))
|
||||||
@@ -5094,7 +5094,7 @@ double TMoverParameters::TractionForce( double dt ) {
|
|||||||
|
|
||||||
eimv[eimv_Uzsmax] = Min0R(Voltage - eimc[eimc_f_DU], tmp);
|
eimv[eimv_Uzsmax] = Min0R(Voltage - eimc[eimc_f_DU], tmp);
|
||||||
eimv[eimv_fkr] = eimv[eimv_Uzsmax] / eimc[eimc_f_cfu];
|
eimv[eimv_fkr] = eimv[eimv_Uzsmax] / eimc[eimc_f_cfu];
|
||||||
if( ( dizel_fill < 0 ) ) {
|
if( (eimv_pr < 0 ) ) {
|
||||||
eimv[ eimv_Pmax ] = eimc[ eimc_p_Ph ];
|
eimv[ eimv_Pmax ] = eimc[ eimc_p_Ph ];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -5115,15 +5115,15 @@ double TMoverParameters::TractionForce( double dt ) {
|
|||||||
/ eimc[ eimc_s_cfu ] )
|
/ eimc[ eimc_s_cfu ] )
|
||||||
* ( eimc[ eimc_s_dfmax ] * eimc[ eimc_s_dfic ] * eimc[ eimc_s_cim ] )
|
* ( eimc[ eimc_s_dfmax ] * eimc[ eimc_s_dfic ] * eimc[ eimc_s_cim ] )
|
||||||
* Transmision.Ratio * NPoweredAxles * 2.0 / WheelDiameter;
|
* Transmision.Ratio * NPoweredAxles * 2.0 / WheelDiameter;
|
||||||
if ((dizel_fill < 0))
|
if ((eimv_pr < 0))
|
||||||
{
|
{
|
||||||
eimv[eimv_Fful] = std::min(eimc[eimc_p_Ph] * 3.6 / (Vel != 0.0 ? Vel : 0.001),
|
eimv[eimv_Fful] = std::min(eimc[eimc_p_Ph] * 3.6 / (Vel != 0.0 ? Vel : 0.001),
|
||||||
std::min(eimc[eimc_p_Fh], eimv[eimv_FMAXMAX]));
|
std::min(eimc[eimc_p_Fh], eimv[eimv_FMAXMAX]));
|
||||||
eimv[eimv_Fmax] =
|
eimv[eimv_Fmax] =
|
||||||
-Sign(V) * (DirAbsolute)*std::min(
|
-Sign(V) * (DirAbsolute)*std::min(
|
||||||
eimc[eimc_p_Ph] * 3.6 / (Vel != 0.0 ? Vel : 0.001),
|
eimc[eimc_p_Ph] * 3.6 / (Vel != 0.0 ? Vel : 0.001),
|
||||||
std::min(-eimc[eimc_p_Fh] * dizel_fill, eimv[eimv_FMAXMAX]));
|
std::min(-eimc[eimc_p_Fh] * eimv_pr, eimv[eimv_FMAXMAX]));
|
||||||
double pr = dizel_fill;
|
double pr = eimv_pr;
|
||||||
if (EIMCLogForce)
|
if (EIMCLogForce)
|
||||||
pr = -log(1 - 4 * pr) / log(5);
|
pr = -log(1 - 4 * pr) / log(5);
|
||||||
eimv[eimv_Fr] =
|
eimv[eimv_Fr] =
|
||||||
@@ -5138,10 +5138,10 @@ double TMoverParameters::TractionForce( double dt ) {
|
|||||||
eimc[eimc_p_F0] - Vel * eimc[eimc_p_a1]),
|
eimc[eimc_p_F0] - Vel * eimc[eimc_p_a1]),
|
||||||
eimv[eimv_FMAXMAX]);
|
eimv[eimv_FMAXMAX]);
|
||||||
// if(not Flat)then
|
// if(not Flat)then
|
||||||
eimv[eimv_Fmax] = eimv[eimv_Fful] * dizel_fill;
|
eimv[eimv_Fmax] = eimv[eimv_Fful] * eimv_pr;
|
||||||
// else
|
// else
|
||||||
// eimv[eimv_Fmax]:=Min0R(eimc[eimc_p_F0]*dizel_fill,eimv[eimv_Fful]);
|
// eimv[eimv_Fmax]:=Min0R(eimc[eimc_p_F0]*eimv_pr,eimv[eimv_Fful]);
|
||||||
double pr = dizel_fill;
|
double pr = eimv_pr;
|
||||||
if (EIMCLogForce)
|
if (EIMCLogForce)
|
||||||
pr = log(1 + 4 * pr) / log(5);
|
pr = log(1 + 4 * pr) / log(5);
|
||||||
eimv[eimv_Fr] = eimv[eimv_Fful] * pr;
|
eimv[eimv_Fr] = eimv[eimv_Fful] * pr;
|
||||||
@@ -5219,7 +5219,7 @@ double TMoverParameters::TractionForce( double dt ) {
|
|||||||
Fw = 0.0;
|
Fw = 0.0;
|
||||||
Ft = 0.0;
|
Ft = 0.0;
|
||||||
Itot = 0.0;
|
Itot = 0.0;
|
||||||
dizel_fill = 0.0;
|
eimv_pr = 0.0;
|
||||||
EnginePower = 0.0;
|
EnginePower = 0.0;
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 21; ++i)
|
for (int i = 0; i < 21; ++i)
|
||||||
@@ -5907,6 +5907,74 @@ bool TMoverParameters::PantRear( bool const State, range_t const Notify )
|
|||||||
return PantRearUp;
|
return PantRearUp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TMoverParameters::CheckEIMIC(double dt)
|
||||||
|
{
|
||||||
|
switch (EIMCtrlType)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
eimic = (LocalBrakeRatio() > 0.01 ? -LocalBrakeRatio() : (double)MainCtrlPos / (double)MainCtrlPosNo);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
switch (MainCtrlPos)
|
||||||
|
{
|
||||||
|
case 0: //B+
|
||||||
|
eimic -= clamp(1.0 + eimic, 0.0, dt*0.3); //odejmuj do -1
|
||||||
|
break;
|
||||||
|
case 1: //B
|
||||||
|
eimic -= clamp(0.0 + eimic, 0.0, dt*0.3); //odejmuj do 0
|
||||||
|
break;
|
||||||
|
case 2: //B-
|
||||||
|
case 3: //0
|
||||||
|
case 4: //T-
|
||||||
|
eimic -= clamp(0.0 + eimic, 0.0, dt*0.3); //odejmuj do 0
|
||||||
|
eimic += clamp(0.0 - eimic, 0.0, dt*0.3); //dodawaj do 0
|
||||||
|
break;
|
||||||
|
case 5: //T
|
||||||
|
eimic += clamp(0.0 - eimic, 0.0, dt*0.3); //dodawaj do 0
|
||||||
|
break;
|
||||||
|
case 6: //T+
|
||||||
|
eimic += clamp(1.0 - eimic, 0.0, dt*0.3); //dodawaj do 1
|
||||||
|
break;
|
||||||
|
case 7: //TMax
|
||||||
|
eimic += clamp(1.0 - eimic, 0.0, dt*0.3); //dodawaj do 1, max
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
switch (MainCtrlPos)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
eimic = -1.0;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
eimic -= clamp(1.0 + eimic, 0.0, dt*0.3); //odejmuj do -1
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
eimic -= clamp(0.0 + eimic, 0.0, dt*0.3); //odejmuj do 0
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
eimic += clamp(0.0 - eimic, 0.0, dt*0.3); //dodawaj do 0
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
eimic += clamp(1.0 - eimic, 0.0, dt*0.3); //dodawaj do 1
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
eimic = clamp(eimic, -1.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TMoverParameters::CheckSpeedCtrl()
|
||||||
|
{
|
||||||
|
if (ScndCtrlActualPos > 0) //speed control
|
||||||
|
if (Vmax < 250)
|
||||||
|
eimicSpeedCtrl = clamp(0.5 * (ScndCtrlActualPos - Vel), -1.0, 1.0);
|
||||||
|
else
|
||||||
|
eimicSpeedCtrl = clamp(0.5 * (ScndCtrlActualPos * 2 - Vel), -1.0, 1.0);
|
||||||
|
else
|
||||||
|
eimicSpeedCtrl = 1;
|
||||||
|
}
|
||||||
|
|
||||||
// *************************************************************************************************
|
// *************************************************************************************************
|
||||||
// Q: 20160715
|
// Q: 20160715
|
||||||
// Zmienia parametr do którego dąży sprzęgło
|
// Zmienia parametr do którego dąży sprzęgło
|
||||||
@@ -8427,6 +8495,8 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) {
|
|||||||
else { AutoRelayType = 0; }
|
else { AutoRelayType = 0; }
|
||||||
|
|
||||||
extract_value( CoupledCtrl, "CoupledCtrl", line, "" );
|
extract_value( CoupledCtrl, "CoupledCtrl", line, "" );
|
||||||
|
extract_value( EIMCtrlType, "EIMCtrlType", line, "" );
|
||||||
|
clamp( EIMCtrlType, 0, 2 );
|
||||||
|
|
||||||
extract_value( ScndS, "ScndS", line, "" ); // brak pozycji rownoleglej przy niskiej nastawie PSR
|
extract_value( ScndS, "ScndS", line, "" ); // brak pozycji rownoleglej przy niskiej nastawie PSR
|
||||||
|
|
||||||
@@ -9475,6 +9545,11 @@ bool TMoverParameters::RunCommand( std::string Command, double CValue1, double C
|
|||||||
OK:=SendCtrlToNext(command,CValue1,CValue2);
|
OK:=SendCtrlToNext(command,CValue1,CValue2);
|
||||||
end;
|
end;
|
||||||
end */
|
end */
|
||||||
|
else if (Command == "EIMIC") // ElectricInductionMotor Integrated Control - propulsion and brakes in relative values
|
||||||
|
{
|
||||||
|
eimic = CValue1;
|
||||||
|
OK = SendCtrlToNext(Command, CValue1, CValue2, Couplertype);
|
||||||
|
}
|
||||||
else if (Command == "Brake") // youBy - jak sie EP hamuje, to trza sygnal wyslac...
|
else if (Command == "Brake") // youBy - jak sie EP hamuje, to trza sygnal wyslac...
|
||||||
{
|
{
|
||||||
if (CValue1 < 0.001)
|
if (CValue1 < 0.001)
|
||||||
|
|||||||
Reference in New Issue
Block a user