Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit b91f4440 authored by Michael KRISPER's avatar Michael KRISPER
Browse files

test coverage increased

parent 7d8cbe68
No related branches found
No related tags found
No related merge requests found
......@@ -65,7 +65,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
AddClutchLoss(torque, angularVelocity, out torqueIn, out engineSpeedIn);
var retVal = NextComponent.Request(absTime, dt, torqueIn, engineSpeedIn, dryRun);
retVal.ClutchPowerRequest = Formulas.TorqueToPower(torque, angularVelocity);
retVal.ClutchPowerRequest = torque * angularVelocity;
return retVal;
}
......@@ -76,6 +76,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
AddClutchLoss(torque, angularVelocity, out torqueIn, out engineSpeedIn);
var retVal = NextComponent.Initialize(torqueIn, engineSpeedIn);
retVal.ClutchPowerRequest = torque * angularVelocity;
return retVal;
}
......
......@@ -76,7 +76,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
VehicleStopped = false;
Log.Debug("==== DRIVER Request ====");
Log.Debug(
"Request: absTime: {0}, ds: {1}, targetVelocity: {2}, gradient: {3} | distance: {4}, velocity: {5}, vehicle stopped: {7}",
"Request: absTime: {0}, ds: {1}, targetVelocity: {2}, gradient: {3} | distance: {4}, velocity: {5}, vehicle stopped: {6}",
absTime, ds, targetVelocity, gradient, DataBus.Distance, DataBus.VehicleSpeed, VehicleStopped);
var retVal = DriverStrategy.Request(absTime, ds, targetVelocity, gradient);
......
......@@ -139,8 +139,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
internal ResponseDryRun Initialize(uint gear, NewtonMeter outTorque, PerSecond outAngularVelocity)
{
var inAngularVelocity = outAngularVelocity * Data.Gears[Gear].Ratio;
var inTorque = Data.Gears[Gear].LossMap.GearboxInTorque(inAngularVelocity, outTorque);
var inAngularVelocity = outAngularVelocity * Data.Gears[gear].Ratio;
var inTorque = Data.Gears[gear].LossMap.GearboxInTorque(inAngularVelocity, outTorque);
if (!inAngularVelocity.IsEqual(0)) {
var alpha = (Data.Inertia.IsEqual(0))
......@@ -169,6 +169,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
return new ResponseDryRun {
Source = this,
EnginePowerRequest = response.EnginePowerRequest,
ClutchPowerRequest = response.ClutchPowerRequest,
GearboxPowerRequest = outTorque * outAngularVelocity,
DeltaFullLoad = response.EnginePowerRequest - fullLoad
};
}
......@@ -289,10 +291,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
_powerLoss = inTorque * inEngineSpeed - outTorque * outEngineSpeed;
if (!inEngineSpeed.IsEqual(0)) {
var torqueLossInertia = Formulas.InertiaPower(inEngineSpeed, _previousInAngularSpeed, Data.Inertia, dt) /
inEngineSpeed;
_powerLossInertia = torqueLossInertia * inEngineSpeed;
inTorque += torqueLossInertia;
_powerLossInertia = Formulas.InertiaPower(inEngineSpeed, _previousInAngularSpeed, Data.Inertia, dt);
inTorque += _powerLossInertia / inEngineSpeed;
} else {
_powerLossInertia = 0.SI<Watt>();
}
......@@ -304,7 +304,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
}
if (!inEngineSpeed.IsEqual(0)) {
if (_strategy.ShiftRequired(absTime, dt, outTorque, outEngineSpeed, inTorque, inEngineSpeed, Gear, _shiftTime)) {
if (_strategy.ShiftRequired(absTime, dt, outTorque, outEngineSpeed, inTorque, inEngineSpeed, Gear,
_shiftTime + Data.TractionInterruption)) {
_shiftTime = absTime + Data.TractionInterruption;
Log.Debug("Gearbox is shifting. absTime: {0}, dt: {1}, shiftTime: {2}, out: ({3}, {4}), in: ({5}, {6})", absTime,
......
......@@ -99,36 +99,34 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
PreviousGear = 1;
}
private uint GetGear(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outEngineSpeed, bool skipGears,
private uint GetGear(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularSpeed, bool skipGears,
double torqueReserve)
{
// maxGear ratio must not result in a angularSpeed below idle-speed
var maxGear = (uint)(skipGears ? Data.Gears.Count : Math.Min(PreviousGear + 1, Data.Gears.Count));
while (outEngineSpeed * Data.Gears[maxGear].Ratio < DataBus.EngineIdleSpeed && maxGear > 1) {
var minGear = skipGears ? 1 : Math.Max(PreviousGear - 1, 1);
while (outAngularSpeed * Data.Gears[maxGear].Ratio < DataBus.EngineIdleSpeed && maxGear > minGear) {
maxGear--;
}
// minGear ratio must not result in an angularSpeed above ratedspeed-range * 1.2
var minGear = skipGears ? 1 : Math.Max(PreviousGear - 1, 1);
while ((outEngineSpeed * Data.Gears[minGear].Ratio - DataBus.EngineIdleSpeed) /
(DataBus.EngineRatedSpeed - DataBus.EngineIdleSpeed) >= 1.2 && minGear < Data.Gears.Count) {
minGear++;
}
if (maxGear < minGear) {
throw new VectoSimulationException("ShiftStrategy couldn't find an appropriate gear.");
while ((outAngularSpeed * Data.Gears[minGear].Ratio - DataBus.EngineIdleSpeed) /
(DataBus.EngineRatedSpeed - DataBus.EngineIdleSpeed) >= 1.2 && minGear < maxGear) {
minGear++;
}
// loop only runs from maxGear to minGear+1 because minGear is returned afterwards anyway.
for (var gear = maxGear; gear > minGear; gear--) {
Gearbox.Gear = gear;
var response = (ResponseDryRun)Gearbox.Request(absTime, dt, outTorque, outEngineSpeed, true);
var response = (ResponseDryRun)Gearbox.Request(absTime, dt, outTorque, outAngularSpeed, true);
var currentPower = response.EnginePowerRequest;
var fullLoadPower = currentPower - response.DeltaFullLoad;
var reserve = 1 - (currentPower / fullLoadPower).Cast<Scalar>();
var inAngularSpeed = outEngineSpeed * Data.Gears[gear].Ratio;
var inAngularSpeed = outAngularSpeed * Data.Gears[gear].Ratio;
var inTorque = response.ClutchPowerRequest / inAngularSpeed;
// if in shift curve and torque reserve is provided: return the current gear
......@@ -159,7 +157,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
public override bool ShiftRequired(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
NewtonMeter inTorque, PerSecond inAngularVelocity, uint gear, Second lastShiftTime)
{
// todo: During start (clutch slipping) no gear shift (cPower.vb::2077) still needed?
if (DataBus.VehicleStopped) {
return false;
}
var minimumShiftTimePassed = (lastShiftTime + Data.ShiftTime).IsSmallerOrEqual(absTime);
if (!minimumShiftTimePassed) {
return false;
}
var speedTooLowForEngine = inAngularVelocity < DataBus.EngineIdleSpeed;
var speedToHighForEngine = (inAngularVelocity * Data.Gears[gear].Ratio - DataBus.EngineIdleSpeed) /
......@@ -170,36 +175,34 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
return true;
}
var minimumShiftTimePassed = (lastShiftTime + Data.ShiftTime).IsSmallerOrEqual(absTime);
if (minimumShiftTimePassed) {
// todo: simulate traction interruption power request change after shift
// and only shift if simulated power request still fullfills the shift conditions.
// todo: simulate traction interruption power request change after shift
// and only shift if simulated power request still fullfills the shift conditions.
if (IsBelowDownShiftCurve(gear, inTorque, inAngularVelocity) ||
IsAboveUpShiftCurve(gear, inTorque, inAngularVelocity)) {
return true;
}
if (IsBelowDownShiftCurve(gear, inTorque, inAngularVelocity) ||
IsAboveUpShiftCurve(gear, inTorque, inAngularVelocity)) {
return true;
}
if (Data.EarlyShiftUp) {
// try if next gear would provide enough torque reserve
var nextGear = gear + 1;
if (Data.EarlyShiftUp && gear < Data.Gears.Count) {
// try if next gear would provide enough torque reserve
var nextGear = gear + 1;
//todo: is initialize correct? shouldnt it be a dry run request? but gear has to be set in advance
var response = Gearbox.Initialize(nextGear, outTorque, outAngularVelocity);
//todo: is initialize correct? shouldnt it be a dry run request? but gear has to be set in advance
var response = Gearbox.Initialize(nextGear, outTorque, outAngularVelocity);
var nextAngularVelocity = Data.Gears[nextGear].Ratio * outAngularVelocity;
var nextAngularVelocity = Data.Gears[nextGear].Ratio * outAngularVelocity;
if (!IsBelowDownShiftCurve(nextGear, response.ClutchPowerRequest / nextAngularVelocity, nextAngularVelocity)) {
var fullLoadPower = response.EnginePowerRequest - response.DeltaFullLoad;
var reserve = 1 - (response.EnginePowerRequest / fullLoadPower).Cast<Scalar>();
if (!IsBelowDownShiftCurve(nextGear, response.ClutchPowerRequest / nextAngularVelocity, nextAngularVelocity)) {
var fullLoadPower = response.EnginePowerRequest - response.DeltaFullLoad;
var reserve = 1 - (response.EnginePowerRequest / fullLoadPower).Cast<Scalar>();
if (reserve >= Data.TorqueReserve) {
return true;
}
if (reserve >= Data.TorqueReserve) {
return true;
}
}
}
return false;
}
......
......@@ -199,6 +199,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
var port = new MockTnOutPort();
gearbox.InPort().Connect(port);
container.Engine = port;
var ratios = new[] { 0.0, 6.38, 4.63, 3.44, 2.59, 1.86, 1.35, 1, 0.76 };
// the first element 0.0 is just a placeholder for axlegear, not used in this test
......@@ -374,9 +375,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
var absTime = 0.SI<Second>();
var dt = 2.SI<Second>();
//just for test driver
driver.VehicleStopped = true;
var response = gearbox.OutPort().Request(absTime, dt, 50.SI<NewtonMeter>(), 10000.SI<PerSecond>());
var response = gearbox.OutPort().Request(absTime, dt, 50.SI<NewtonMeter>(), 1000000.RPMtoRad());
Assert.IsInstanceOfType(response, typeof(ResponseSuccess));
AssertHelper.AreRelativeEqual(absTime, port.AbsTime);
AssertHelper.AreRelativeEqual(dt, port.Dt);
......
......@@ -31,6 +31,7 @@ namespace TUGraz.VectoCore.Tests.Utils
Source = this,
GearboxPowerRequest = torque * angularVelocity,
EnginePowerRequest = torque * angularVelocity,
ClutchPowerRequest = torque * angularVelocity,
DeltaFullLoad = (torque - 2300.SI<NewtonMeter>()) * angularVelocity,
DeltaDragLoad = (torque - -100.SI<NewtonMeter>()) * angularVelocity
};
......@@ -40,12 +41,17 @@ namespace TUGraz.VectoCore.Tests.Utils
Source = this,
GearboxPowerRequest = torque * angularVelocity,
EnginePowerRequest = torque * angularVelocity,
ClutchPowerRequest = torque * angularVelocity,
};
}
public IResponse Initialize(NewtonMeter torque, PerSecond angularVelocity)
{
return new ResponseSuccess { Source = this, EnginePowerRequest = torque * angularVelocity, };
return new ResponseSuccess {
Source = this,
EnginePowerRequest = torque * angularVelocity,
ClutchPowerRequest = torque * angularVelocity,
};
}
public void DoCommitSimulationStep()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment