mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-22 19:49:19 +02:00
AI: Better acceleration with ElectricSeriesMotor - motor current is set acording to ahdesion and fuse limit
This commit is contained in:
committed by
tmj-fstate
parent
2b5a8288fe
commit
c3975e96a0
53
Driver.cpp
53
Driver.cpp
@@ -1719,7 +1719,41 @@ void TController::AutoRewident()
|
|||||||
fAccThreshold = -fBrake_a0[BrakeAccTableSize] - 1 * fBrake_a1[BrakeAccTableSize];
|
fAccThreshold = -fBrake_a0[BrakeAccTableSize] - 1 * fBrake_a1[BrakeAccTableSize];
|
||||||
fBrakeReaction = 1.00 + fLength*0.005;
|
fBrakeReaction = 1.00 + fLength*0.005;
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
double TController::ESMVelocity(bool Main)
|
||||||
|
{
|
||||||
|
double fCurrentCoeff = 0.9;
|
||||||
|
double fFrictionCoeff = 0.85;
|
||||||
|
double ESMVel = 9999;
|
||||||
|
int MCPN = mvControlling->MainCtrlActualPos;
|
||||||
|
int SCPN = mvControlling->ScndCtrlActualPos;
|
||||||
|
if (Main)
|
||||||
|
MCPN += 1;
|
||||||
|
else
|
||||||
|
SCPN += 1;
|
||||||
|
if ((mvControlling->RList[MCPN].ScndAct < 255)&&(mvControlling->ScndCtrlActualPos==0))
|
||||||
|
SCPN = mvControlling->RList[MCPN].ScndAct;
|
||||||
|
double FrictionMax = mvControlling->Mass*9.81*mvControlling->Adhesive(mvControlling->RunningTrack.friction)*fFrictionCoeff;
|
||||||
|
double IF = mvControlling->Imax;
|
||||||
|
double MS = 0;
|
||||||
|
double Fmax = 0;
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
MS = mvControlling->MomentumF(IF, IF, SCPN);
|
||||||
|
Fmax = MS * mvControlling->RList[MCPN].Bn*mvControlling->RList[MCPN].Mn * 2 / mvControlling->WheelDiameter * mvControlling->Transmision.Ratio;
|
||||||
|
IF = 0.5*IF*(1 + FrictionMax/Fmax);
|
||||||
|
}
|
||||||
|
IF = std::min(IF, mvControlling->Imax*fCurrentCoeff);
|
||||||
|
double R = mvControlling->RList[MCPN].R + mvControlling->CircuitRes + mvControlling->RList[MCPN].Mn*mvControlling->WindingRes;
|
||||||
|
double pole = mvControlling->MotorParam[SCPN].fi *
|
||||||
|
std::max(abs(IF) / (abs(IF) + mvControlling->MotorParam[SCPN].Isat) - mvControlling->MotorParam[SCPN].fi0, 0.0);
|
||||||
|
double Us = abs(mvControlling->Voltage) - IF*R;
|
||||||
|
double ns = std::max(0.0, Us / (pole*mvControlling->RList[MCPN].Mn));
|
||||||
|
ESMVel = ns * mvControlling->WheelDiameter*M_PI*3.6/mvControlling->Transmision.Ratio;
|
||||||
|
return ESMVel;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
int TController::CheckDirection() {
|
int TController::CheckDirection() {
|
||||||
|
|
||||||
@@ -2470,8 +2504,20 @@ bool TController::IncSpeed()
|
|||||||
// na pozycji 0 przejdzie, a na pozostałych będzie czekać, aż się załączą liniowe
|
// na pozycji 0 przejdzie, a na pozostałych będzie czekać, aż się załączą liniowe
|
||||||
// (zgaśnie DelayCtrlFlag)
|
// (zgaśnie DelayCtrlFlag)
|
||||||
if (Ready || (iDrivigFlags & movePress))
|
if (Ready || (iDrivigFlags & movePress))
|
||||||
if (fabs(mvControlling->Im) <
|
{
|
||||||
(fReady < 0.4 ? mvControlling->Imin : mvControlling->IminLo))
|
bool scndctrl = ((mvOccupied->Vel <= 30) ||
|
||||||
|
(mvControlling->Imax > mvControlling->ImaxLo) ||
|
||||||
|
(fVoltage + fVoltage <
|
||||||
|
mvControlling->EnginePowerSource.CollectorParameters.MinV +
|
||||||
|
mvControlling->EnginePowerSource.CollectorParameters.MaxV) ||
|
||||||
|
(mvControlling->MainCtrlPos == mvControlling->MainCtrlPosNo));
|
||||||
|
scndctrl = ((scndctrl) && (mvControlling->MainCtrlPos > 1) && (mvControlling->RList[mvControlling->MainCtrlActualPos].R < 0.01)&& (mvControlling->ScndCtrlPos != mvControlling->ScndCtrlPosNo));
|
||||||
|
double Vs = 99999;
|
||||||
|
if((mvControlling->MainCtrlPos != mvControlling->MainCtrlPosNo)||(mvControlling->ScndCtrlPos!=mvControlling->ScndCtrlPosNo))
|
||||||
|
Vs = ESMVelocity(!scndctrl);
|
||||||
|
|
||||||
|
if ((fabs(mvControlling->Im) <
|
||||||
|
(fReady < 0.4 ? mvControlling->Imin : mvControlling->IminLo))||(mvControlling->Vel>Vs))
|
||||||
{ // Ra: wywalał nadmiarowy, bo Im może być ujemne; jak nie odhamowany, to nie
|
{ // Ra: wywalał nadmiarowy, bo Im może być ujemne; jak nie odhamowany, to nie
|
||||||
// przesadzać z prądem
|
// przesadzać z prądem
|
||||||
if ((mvOccupied->Vel <= 30) ||
|
if ((mvOccupied->Vel <= 30) ||
|
||||||
@@ -2514,6 +2560,7 @@ bool TController::IncSpeed()
|
|||||||
else if (!OK) // nie da się wrzucić kolejnej pozycji
|
else if (!OK) // nie da się wrzucić kolejnej pozycji
|
||||||
OK = mvControlling->IncScndCtrl(1); // to dać bocznik
|
OK = mvControlling->IncScndCtrl(1); // to dać bocznik
|
||||||
}
|
}
|
||||||
|
}
|
||||||
mvControlling->AutoRelayCheck(); // sprawdzenie logiki sterowania
|
mvControlling->AutoRelayCheck(); // sprawdzenie logiki sterowania
|
||||||
break;
|
break;
|
||||||
case Dumb:
|
case Dumb:
|
||||||
|
|||||||
1
Driver.h
1
Driver.h
@@ -310,6 +310,7 @@ class TController
|
|||||||
void Activation(); // umieszczenie obsady w odpowiednim członie
|
void Activation(); // umieszczenie obsady w odpowiednim członie
|
||||||
void ControllingSet(); // znajduje człon do sterowania
|
void ControllingSet(); // znajduje człon do sterowania
|
||||||
void AutoRewident(); // ustawia hamulce w składzie
|
void AutoRewident(); // ustawia hamulce w składzie
|
||||||
|
double ESMVelocity(bool Main);
|
||||||
public:
|
public:
|
||||||
Mtable::TTrainParameters *Timetable()
|
Mtable::TTrainParameters *Timetable()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user