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

Skip to content
Snippets Groups Projects
Commit 84e03f48 authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

fine-grain simulation of stop intervals for more accurate fuel consumption during long stops

parent 32477ca5
No related branches found
No related tags found
No related merge requests found
......@@ -179,9 +179,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
private Second GetStopTimeInterval()
{
if (!Left.PTOActive || IdleController == null) {
return Left.StoppingTime.IsGreater(3 * Constants.SimulationSettings.TargetTimeInterval)
? GetStopTimeIntervalThreePhases()
: Left.StoppingTime;
if ((Left.StoppingTime - CurrentState.WaitTime).IsGreater(2 * Constants.SimulationSettings.TargetTimeInterval,
0.1 * Constants.SimulationSettings.TargetTimeInterval)) {
return 2 * Constants.SimulationSettings.TargetTimeInterval;
}
return Left.StoppingTime - CurrentState.WaitTime;
}
if (Left.StoppingTime.IsGreater(6 * Constants.SimulationSettings.TargetTimeInterval)) {
// 7 phases
......@@ -196,20 +198,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
return IdleController.GetNextCycleTime();
}
private Second GetStopTimeIntervalThreePhases()
{
switch (CurrentState.WaitPhase) {
case 1:
case 3:
CurrentState.WaitPhase++;
return Constants.SimulationSettings.TargetTimeInterval;
case 2:
CurrentState.WaitPhase++;
return Left.StoppingTime - 2 * Constants.SimulationSettings.TargetTimeInterval;
}
return null;
}
private Second GetStopTimeIntervalThreePhasesPTO()
{
switch (CurrentState.WaitPhase) {
......@@ -390,8 +378,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
/// </summary>
public double Progress
{
get
{
get {
return Data.Entries.Count > 0
? (CurrentState.Distance.Value() - Data.Entries.First().Distance.Value()) /
(Data.Entries.Last().Distance.Value() - Data.Entries.First().Distance.Value())
......@@ -448,8 +435,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
public CycleData CycleData
{
get
{
get {
return new CycleData {
AbsTime = CurrentState.AbsTime,
AbsDistance = CurrentState.Distance,
......
......@@ -29,91 +29,91 @@
* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
*/
using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Models.Connector.Ports;
using TUGraz.VectoCore.Models.Simulation;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
{
public abstract class TransmissionComponent :
StatefulVectoSimulationComponent<TransmissionComponent.TransmissionState>, IPowerTrainComponent, ITnInPort,
ITnOutPort
{
protected ITnOutPort NextComponent;
[ValidateObject] internal readonly TransmissionData ModelData;
public class TransmissionState : SimpleComponentState
{
public TransmissionLossMap.LossMapResult TorqueLossResult;
//public NewtonMeter TorqueLoss = 0.SI<NewtonMeter>();
}
protected TransmissionComponent(IVehicleContainer container, TransmissionData modelData) : base(container)
{
ModelData = modelData;
}
public virtual ITnInPort InPort()
{
return this;
}
public virtual ITnOutPort OutPort()
{
return this;
}
public virtual void Connect(ITnOutPort other)
{
NextComponent = other;
}
public virtual IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
bool dryRun = false)
{
Log.Debug("request: torque: {0}, angularVelocity: {1}", outTorque, outAngularVelocity);
var inAngularVelocity = outAngularVelocity * ModelData.Ratio;
var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
var torqueLossResult = ModelData.LossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque);
var inTorque = outTorque / ModelData.Ratio + torqueLossResult.Value;
CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
CurrentState.TorqueLossResult = torqueLossResult;
var retVal = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity, dryRun);
return retVal;
}
public virtual IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
{
var inAngularVelocity = outAngularVelocity * ModelData.Ratio;
var torqueLossResult = ModelData.LossMap.GetTorqueLoss(outAngularVelocity, outTorque);
var inTorque = outTorque / ModelData.Ratio + torqueLossResult.Value;
PreviousState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
PreviousState.TorqueLossResult = torqueLossResult;
return NextComponent.Initialize(inTorque, inAngularVelocity);
}
protected override void DoCommitSimulationStep()
{
if (CurrentState.TorqueLossResult.Extrapolated) {
Log.Warn("{2} LossMap data was extrapolated: range for loss map is not sufficient: n:{0}, torque:{1}",
CurrentState.OutAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.OutTorque, GetType().Name);
if (DataBus.ExecutionMode == ExecutionMode.Declaration) {
throw new VectoException(
"{2} LossMap data was extrapolated in Declaration Mode: range for loss map is not sufficient: n:{0}, torque:{1}",
CurrentState.OutAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.OutTorque, GetType().Name);
}
}
AdvanceState();
}
}
using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Models.Connector.Ports;
using TUGraz.VectoCore.Models.Simulation;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
{
public abstract class TransmissionComponent :
StatefulVectoSimulationComponent<TransmissionComponent.TransmissionState>, IPowerTrainComponent, ITnInPort,
ITnOutPort
{
protected ITnOutPort NextComponent;
[ValidateObject] internal readonly TransmissionData ModelData;
public class TransmissionState : SimpleComponentState
{
public TransmissionLossMap.LossMapResult TorqueLossResult;
//public NewtonMeter TorqueLoss = 0.SI<NewtonMeter>();
}
protected TransmissionComponent(IVehicleContainer container, TransmissionData modelData) : base(container)
{
ModelData = modelData;
}
public virtual ITnInPort InPort()
{
return this;
}
public virtual ITnOutPort OutPort()
{
return this;
}
public virtual void Connect(ITnOutPort other)
{
NextComponent = other;
}
public virtual IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
bool dryRun = false)
{
Log.Debug("request: torque: {0}, angularVelocity: {1}", outTorque, outAngularVelocity);
var inAngularVelocity = outAngularVelocity * ModelData.Ratio;
var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
var torqueLossResult = ModelData.LossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque);
var inTorque = outTorque / ModelData.Ratio + torqueLossResult.Value;
CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
CurrentState.TorqueLossResult = torqueLossResult;
var retVal = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity, dryRun);
return retVal;
}
public virtual IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
{
var inAngularVelocity = outAngularVelocity * ModelData.Ratio;
var torqueLossResult = ModelData.LossMap.GetTorqueLoss(outAngularVelocity, outTorque);
var inTorque = outTorque / ModelData.Ratio + torqueLossResult.Value;
PreviousState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
PreviousState.TorqueLossResult = torqueLossResult;
return NextComponent.Initialize(inTorque, inAngularVelocity);
}
protected override void DoCommitSimulationStep()
{
if (CurrentState.TorqueLossResult.Extrapolated) {
Log.Warn("{2} LossMap data was extrapolated: range for loss map is not sufficient: n:{0}, torque:{1}",
CurrentState.OutAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.OutTorque, GetType().Name);
if (DataBus.ExecutionMode == ExecutionMode.Declaration) {
throw new VectoException(
"{2} LossMap data was extrapolated in Declaration Mode: range for loss map is not sufficient: n:{0}, torque:{1}",
CurrentState.OutAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.OutTorque, GetType().Name);
}
}
AdvanceState();
}
}
}
\ No newline at end of file
......@@ -29,23 +29,23 @@
* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
*/
using System;
using System.IO;
using System.Xml;
namespace TUGraz.VectoCore.Utils
{
public class XmlResourceResolver : XmlUrlResolver
{
internal const string BaseUri = "schema://";
public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
{
if (absoluteUri.Scheme == "schema") {
return RessourceHelper.LoadResourceAsStream(RessourceHelper.ResourceType.XMLSchema,
Path.GetFileName(absoluteUri.LocalPath));
}
return base.GetEntity(absoluteUri, role, ofObjectToReturn);
}
}
using System;
using System.IO;
using System.Xml;
namespace TUGraz.VectoCore.Utils
{
public class XmlResourceResolver : XmlUrlResolver
{
internal const string BaseUri = "schema://";
public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
{
if (absoluteUri.Scheme == "schema") {
return RessourceHelper.LoadResourceAsStream(RessourceHelper.ResourceType.XMLSchema,
Path.GetFileName(absoluteUri.LocalPath));
}
return base.GetEntity(absoluteUri, role, ofObjectToReturn);
}
}
}
\ No newline at end of file
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