Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

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

Merge pull request #643 in VECTO/vecto-sim from develop to master

* commit '2ec50f27':
  correcting contact mail address in VECTO GUI
  using correct mail address in about dialog (hashing tool)
  fix testcase when digest info is not available
  adding new files to project
  fix testcases for AT measured speed: use default TC in case the cycle does not contain engine speed
  update manufacturer schema
  adding file to project, adding type info to xml elements
  adding missing type information for xml report elements
  vtp simulation runs successfully
  read torque converter for vtp cycle
  pass pto data for initializing xml reports
  adding testcase illustrating wrong manufacturer report output
  adding a testcase for simulation-run specific fc correction factor
parents 06273c24 2ec50f27
No related branches found
No related tags found
No related merge requests found
Showing
with 329 additions and 106 deletions
File added
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" Margin="0, 155, 0,0"> <StackPanel Orientation="Horizontal" Margin="0, 155, 0,0">
<TextBlock Text="Support Contact:" Margin="0,0,30,0"/> <TextBlock Text="Support Contact:" Margin="0,0,30,0"/>
<TextBlock Text="vecto@jrc.ec.europa.com" Foreground="Blue" TextDecorations="Underline" MouseLeftButtonUp="Supportmail"> <TextBlock Text="JRC-VECTO@ec.europa.eu" Foreground="Blue" TextDecorations="Underline" MouseLeftButtonUp="Supportmail">
<TextBlock.Style> <TextBlock.Style>
<Style> <Style>
<Style.Triggers> <Style.Triggers>
......
...@@ -53,7 +53,7 @@ namespace HashingTool.Views ...@@ -53,7 +53,7 @@ namespace HashingTool.Views
private void Supportmail(object sender, MouseButtonEventArgs e) private void Supportmail(object sender, MouseButtonEventArgs e)
{ {
Process.Start("mailto:vecto@jrc.ec.europa.eu"); Process.Start("mailto:JRC-VECTO@ec.europa.eu");
} }
} }
} }
...@@ -85,7 +85,7 @@ Partial Class JiraDialog ...@@ -85,7 +85,7 @@ Partial Class JiraDialog
Me.LinkLabel3.Size = New System.Drawing.Size(122, 13) Me.LinkLabel3.Size = New System.Drawing.Size(122, 13)
Me.LinkLabel3.TabIndex = 18 Me.LinkLabel3.TabIndex = 18
Me.LinkLabel3.TabStop = True Me.LinkLabel3.TabStop = True
Me.LinkLabel3.Text = "vecto@jrc.ec.europa.eu" Me.LinkLabel3.Text = "JRC-VECTO@ec.europa.eu"
' '
'Label2 'Label2
' '
......
...@@ -24,7 +24,7 @@ Public Class JiraDialog ...@@ -24,7 +24,7 @@ Public Class JiraDialog
"- Country of workplace" & "%0A" & "- Country of workplace" & "%0A" &
"- Position" "- Position"
Process.Start("mailto:vecto@jrc.ec.europa.eu?subject=CITnet%20account&body=" & bodytext) Process.Start("mailto:JRC-VECTO@ec.europa.eu?subject=CITnet%20account&body=" & bodytext)
End Sub End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
<File FilePath="VectoCore\VectoCore\Resources\XSD\VectoEngineeringInput.0.7.xsd" HomeFolder="Yes"/> <File FilePath="VectoCore\VectoCore\Resources\XSD\VectoEngineeringInput.0.7.xsd" HomeFolder="Yes"/>
<File FilePath="VectoCore\VectoCore\Resources\XSD\VectoInput.1.0.xsd" HomeFolder="Yes"/> <File FilePath="VectoCore\VectoCore\Resources\XSD\VectoInput.1.0.xsd" HomeFolder="Yes"/>
<File FilePath="VectoCore\VectoCore\Resources\XSD\VectoOutputCustomer.0.4.xsd" HomeFolder="Yes"/> <File FilePath="VectoCore\VectoCore\Resources\XSD\VectoOutputCustomer.0.4.xsd" HomeFolder="Yes"/>
<File FilePath="VectoCore\VectoCore\Resources\XSD\VectoOutputCustomer.0.5.xsd" HomeFolder="Yes"/>
<File FilePath="VectoCore\VectoCore\Resources\XSD\VectoOutputManufacturer.0.4.xsd" HomeFolder="Yes"/> <File FilePath="VectoCore\VectoCore\Resources\XSD\VectoOutputManufacturer.0.4.xsd" HomeFolder="Yes"/>
<File FilePath="VectoCore\VectoCore\Resources\XSD\VectoOutputManufacturer.0.5.xsd" HomeFolder="Yes"/> <File FilePath="VectoCore\VectoCore\Resources\XSD\VectoOutputManufacturer.0.5.xsd" HomeFolder="Yes"/>
<File FilePath="VectoCore\VectoCore\Resources\XSD\VTPReport.0.1.xsd" HomeFolder="Yes"/> <File FilePath="VectoCore\VectoCore\Resources\XSD\VTPReport.0.1.xsd" HomeFolder="Yes"/>
......
...@@ -122,6 +122,12 @@ namespace TUGraz.VectoCommon.Utils ...@@ -122,6 +122,12 @@ namespace TUGraz.VectoCommon.Utils
return Interpolate(p1.X, p2.X, p1.Y, p2.Y, x); return Interpolate(p1.X, p2.X, p1.Y, p2.Y, x);
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static double Interpolate(Edge edge, double x)
{
return Interpolate(edge.P1, edge.P2, x);
}
/// <summary> /// <summary>
/// Linearly interpolates a value between two points. /// Linearly interpolates a value between two points.
/// </summary> /// </summary>
...@@ -332,6 +338,8 @@ namespace TUGraz.VectoCommon.Utils ...@@ -332,6 +338,8 @@ namespace TUGraz.VectoCommon.Utils
return retVal; return retVal;
} }
[DebuggerStepThrough] [DebuggerStepThrough]
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static T Ceiling<T>(T si) where T : SIBase<T> public static T Ceiling<T>(T si) where T : SIBase<T>
......
...@@ -256,7 +256,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter ...@@ -256,7 +256,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
ExecutionMode.Declaration, ratio, ExecutionMode.Declaration, ratio,
DeclarationData.TorqueConverter.CLUpshiftMinAcceleration, DeclarationData.TorqueConverter.CCUpshiftMinAcceleration); DeclarationData.TorqueConverter.CLUpshiftMinAcceleration, DeclarationData.TorqueConverter.CCUpshiftMinAcceleration);
retVal.TorqueConverterData.ModelName = gearbox.TorqueConverter.Model; retVal.TorqueConverterData.ModelName = gearbox.TorqueConverter.Model;
retVal.TorqueConverterData.DigestValueInput = gearbox.TorqueConverter.DigestValue.DigestValue; retVal.TorqueConverterData.DigestValueInput = gearbox.TorqueConverter.DigestValue?.DigestValue;
} }
return retVal; return retVal;
......
...@@ -739,6 +739,7 @@ namespace TUGraz.VectoCore.InputData.Reader ...@@ -739,6 +739,7 @@ namespace TUGraz.VectoCore.InputData.Reader
FanSpeed = row.ParseDouble(Fields.FanSpeed).RPMtoRad(), FanSpeed = row.ParseDouble(Fields.FanSpeed).RPMtoRad(),
Gear = (uint)row.ParseDoubleOrGetDefault(Fields.Gear), Gear = (uint)row.ParseDoubleOrGetDefault(Fields.Gear),
Fuelconsumption = row.ParseDoubleOrGetDefault(Fields.FuelConsumption).SI(Unit.SI.Gramm.Per.Hour).Cast<KilogramPerSecond>(), Fuelconsumption = row.ParseDoubleOrGetDefault(Fields.FuelConsumption).SI(Unit.SI.Gramm.Per.Hour).Cast<KilogramPerSecond>(),
TorqueConverterActive = row.ParseBooleanOrGetDefault(Fields.TorqueConverterActive),
TorqueWheelLeft = tqLeft, TorqueWheelLeft = tqLeft,
TorqueWheelRight = tqRight, TorqueWheelRight = tqRight,
WheelSpeedLeft = speedLeft, WheelSpeedLeft = speedLeft,
...@@ -772,6 +773,7 @@ namespace TUGraz.VectoCore.InputData.Reader ...@@ -772,6 +773,7 @@ namespace TUGraz.VectoCore.InputData.Reader
Fields.WheelTorqueLeft, Fields.WheelTorqueLeft,
Fields.WheelTorqueRight, Fields.WheelTorqueRight,
Fields.Gear, Fields.Gear,
Fields.TorqueConverterActive,
Fields.FuelConsumption Fields.FuelConsumption
}; };
......
...@@ -134,6 +134,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl ...@@ -134,6 +134,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
_dao.CreateAuxiliaryData(InputDataProvider.JobInputData.Vehicle.AuxiliaryInputData(), _dao.CreateAuxiliaryData(InputDataProvider.JobInputData.Vehicle.AuxiliaryInputData(),
_segment.Missions.First().MissionType, _segment.Missions.First().MissionType,
_segment.VehicleClass), _segment.VehicleClass),
PTO = _ptoTransmissionData,
InputDataHash = InputDataProvider.XMLHash InputDataHash = InputDataProvider.XMLHash
}; };
powertrainConfig.VehicleData.VehicleClass = _segment.VehicleClass; powertrainConfig.VehicleData.VehicleClass = _segment.VehicleClass;
......
...@@ -35,6 +35,7 @@ using System.ComponentModel.DataAnnotations; ...@@ -35,6 +35,7 @@ using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.Utils; using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Models.Declaration;
namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
{ {
...@@ -208,6 +209,28 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox ...@@ -208,6 +209,28 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
return FindOperatingPoint(inAngularVelocity, solutions.Max().SI<PerSecond>()); return FindOperatingPoint(inAngularVelocity, solutions.Max().SI<PerSecond>());
} }
public TorqueConverterOperatingPoint LookupOperatingPoint(
PerSecond outAngularVelocity, PerSecond inAngularVelocity, NewtonMeter outTorque)
{
var nu = outAngularVelocity / inAngularVelocity;
foreach (var edge in TorqueConverterEntries.Pairwise((p1, p2) => Edge.Create(new Point(p1.SpeedRatio, p1.TorqueRatio), new Point(p2.SpeedRatio, p2.TorqueRatio)))) {
if (nu >= edge.P1.X && nu < edge.P2.X) {
var my = VectoMath.Interpolate(edge, nu);
return new TorqueConverterOperatingPoint() {
InAngularVelocity = inAngularVelocity,
OutAngularVelocity = outAngularVelocity,
OutTorque = outTorque,
InTorque = outTorque / my,
SpeedRatio = nu,
TorqueRatio = my,
};
}
}
throw new VectoSimulationException(
"Torque Converter: Failed to find operating point for outputSpeed/outputTorque/inputSpeed! n_out: {0}, n_in: {1}, tq_out: {2}",
outAngularVelocity, inAngularVelocity, outTorque);
}
public TorqueConverterOperatingPoint FindOperatingPointForPowerDemand(Watt power, PerSecond prevInputSpeed, public TorqueConverterOperatingPoint FindOperatingPointForPowerDemand(Watt power, PerSecond prevInputSpeed,
PerSecond nextOutputSpeed, KilogramSquareMeter inertia, Second dt, Watt previousPower) PerSecond nextOutputSpeed, KilogramSquareMeter inertia, Second dt, Watt previousPower)
{ {
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
*/ */
using System.Linq;
using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils; using TUGraz.VectoCommon.Utils;
...@@ -54,7 +55,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -54,7 +55,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
protected bool? TorqueConverterActive; protected bool? TorqueConverterActive;
protected internal readonly TorqueConverter TorqueConverter; protected internal readonly TorqueConverterWrapper TorqueConverter;
public CycleGearbox(IVehicleContainer container, VectoRunData runData) public CycleGearbox(IVehicleContainer container, VectoRunData runData)
: base(container, runData) : base(container, runData)
...@@ -62,8 +63,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -62,8 +63,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
if (!ModelData.Type.AutomaticTransmission()) { if (!ModelData.Type.AutomaticTransmission()) {
return; return;
} }
var strategy = new CycleShiftStrategy(ModelData, null); var strategy = new CycleShiftStrategy(ModelData, null);
TorqueConverter = new TorqueConverter(this, strategy, container, ModelData.TorqueConverterData, runData);
TorqueConverter = new TorqueConverterWrapper(runData.Cycle.Entries.All(x => x.EngineSpeed != null),
new CycleTorqueConverter(container, ModelData.TorqueConverterData),
new TorqueConverter(this, strategy, container, ModelData.TorqueConverterData, runData));
if (TorqueConverter == null) { if (TorqueConverter == null) {
throw new VectoException("Torque Converter required for AT transmission!"); throw new VectoException("Torque Converter required for AT transmission!");
} }
...@@ -106,7 +112,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -106,7 +112,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
inTorque += torqueLossInertia; inTorque += torqueLossInertia;
response = TorqueConverterActive != null && TorqueConverterActive.Value && TorqueConverter != null response = TorqueConverterActive != null && TorqueConverterActive.Value && TorqueConverter != null
? TorqueConverter.Initialize(inTorque, inAngularVelocity) ? TorqueConverter.Initialize(inTorque, inAngularVelocity, GetEngineSpeedFromCycle())
: NextComponent.Initialize(inTorque, inAngularVelocity); : NextComponent.Initialize(inTorque, inAngularVelocity);
} else { } else {
response = NextComponent.Initialize(inTorque, inAngularVelocity); response = NextComponent.Initialize(inTorque, inAngularVelocity);
...@@ -130,7 +136,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -130,7 +136,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
/// <item><description>ResponseGearshift</description></item> /// <item><description>ResponseGearshift</description></item>
/// </list> /// </list>
/// </returns> /// </returns>
public override IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, public override IResponse Request(
Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
bool dryRun = false) bool dryRun = false)
{ {
Log.Debug("Gearbox Power Request: torque: {0}, angularVelocity: {1}", outTorque, outAngularVelocity); Log.Debug("Gearbox Power Request: torque: {0}, angularVelocity: {1}", outTorque, outAngularVelocity);
...@@ -150,6 +157,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -150,6 +157,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
// mk 2016-11-30: added additional check for outAngularVelocity due to failing test: MeasuredSpeed_Gear_AT_PS_Run // mk 2016-11-30: added additional check for outAngularVelocity due to failing test: MeasuredSpeed_Gear_AT_PS_Run
// mq 2016-12-16: changed check to vehicle halted due to failing test: MeasuredSpeed_Gear_AT_* // mq 2016-12-16: changed check to vehicle halted due to failing test: MeasuredSpeed_Gear_AT_*
var retVal = gear == 0 || DataBus.DriverBehavior == DrivingBehavior.Halted var retVal = gear == 0 || DataBus.DriverBehavior == DrivingBehavior.Halted
//|| (outAngularVelocity.IsSmallerOrEqual(0, 1) && outTorque.IsSmallerOrEqual(0, 1)) //|| (outAngularVelocity.IsSmallerOrEqual(0, 1) && outTorque.IsSmallerOrEqual(0, 1))
? RequestDisengaged(absTime, dt, outTorque, outAngularVelocity, dryRun) ? RequestDisengaged(absTime, dt, outTorque, outAngularVelocity, dryRun)
: RequestEngaged(absTime, dt, outTorque, outAngularVelocity, dryRun); : RequestEngaged(absTime, dt, outTorque, outAngularVelocity, dryRun);
...@@ -165,6 +173,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -165,6 +173,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
: DataBus.CycleData.RightSample.Gear; : DataBus.CycleData.RightSample.Gear;
} }
protected virtual PerSecond GetEngineSpeedFromCycle()
{
return DataBus.DriverBehavior == DrivingBehavior.Braking
? DataBus.CycleData.LeftSample.EngineSpeed
: DataBus.CycleData.RightSample.EngineSpeed;
}
/// <summary> /// <summary>
/// Handles requests when a gear is engaged /// Handles requests when a gear is engaged
/// </summary> /// </summary>
...@@ -174,7 +189,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -174,7 +189,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
/// <param name="outAngularVelocity"></param> /// <param name="outAngularVelocity"></param>
/// <param name="dryRun"></param> /// <param name="dryRun"></param>
/// <returns></returns> /// <returns></returns>
private IResponse RequestEngaged(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, private IResponse RequestEngaged(
Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
bool dryRun) bool dryRun)
{ {
Disengaged = null; Disengaged = null;
...@@ -222,15 +238,17 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -222,15 +238,17 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity); CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
CurrentState.Gear = Gear; CurrentState.Gear = Gear;
// end critical section // end critical section
if (TorqueConverter != null && !torqueConverterLocked) { if (TorqueConverter != null && !torqueConverterLocked) {
CurrentState.TorqueConverterActive = true; CurrentState.TorqueConverterActive = true;
return TorqueConverter.Request(absTime, dt, inTorque, inAngularVelocity); return TorqueConverter.Request(absTime, dt, inTorque, inAngularVelocity, GetEngineSpeedFromCycle());
} }
if (TorqueConverter != null) { if (TorqueConverter != null) {
TorqueConverter.Locked(CurrentState.InTorque, CurrentState.InAngularVelocity, CurrentState.InTorque, TorqueConverter.Locked(
CurrentState.InTorque, CurrentState.InAngularVelocity, CurrentState.InTorque,
CurrentState.InAngularVelocity); CurrentState.InAngularVelocity);
} }
var response = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity); var response = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity);
...@@ -241,7 +259,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -241,7 +259,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
private void CheckModelData(TransmissionLossMap effectiveLossMap, double effectiveRatio, bool torqueConverterLocked) private void CheckModelData(TransmissionLossMap effectiveLossMap, double effectiveRatio, bool torqueConverterLocked)
{ {
if (effectiveLossMap == null || double.IsNaN(effectiveRatio)) { if (effectiveLossMap == null || double.IsNaN(effectiveRatio)) {
throw new VectoSimulationException("Ratio or loss-map for gear {0}{1} invalid. Please check input data", Gear, throw new VectoSimulationException(
"Ratio or loss-map for gear {0}{1} invalid. Please check input data", Gear,
torqueConverterLocked ? "L" : "C"); torqueConverterLocked ? "L" : "C");
} }
if (!torqueConverterLocked && !ModelData.Gears[Gear].HasTorqueConverter) { if (!torqueConverterLocked && !ModelData.Gears[Gear].HasTorqueConverter) {
...@@ -249,12 +268,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -249,12 +268,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
} }
} }
private IResponse HandleDryRunRequest(Second absTime, Second dt, bool torqueConverterLocked, NewtonMeter inTorque, private IResponse HandleDryRunRequest(
Second absTime, Second dt, bool torqueConverterLocked, NewtonMeter inTorque,
PerSecond inAngularVelocity) PerSecond inAngularVelocity)
{ {
if (TorqueConverter != null && !torqueConverterLocked) { if (TorqueConverter != null && !torqueConverterLocked) {
return TorqueConverter.Request(absTime, dt, inTorque, inAngularVelocity, true); return TorqueConverter.Request(absTime, dt, inTorque, inAngularVelocity, GetEngineSpeedFromCycle(), true);
} }
// mk 2016-12-13 // mk 2016-12-13
//if (outTorque.IsSmaller(0) && inAngularVelocity.IsSmaller(DataBus.EngineIdleSpeed)) { //if (outTorque.IsSmaller(0) && inAngularVelocity.IsSmaller(DataBus.EngineIdleSpeed)) {
// //Log.Warn("engine speed would fall below idle speed - disengage! gear from cycle: {0}, vehicle speed: {1}", Gear, // //Log.Warn("engine speed would fall below idle speed - disengage! gear from cycle: {0}, vehicle speed: {1}", Gear,
...@@ -274,7 +295,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -274,7 +295,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
/// <param name="outAngularVelocity"></param> /// <param name="outAngularVelocity"></param>
/// <param name="dryRun"></param> /// <param name="dryRun"></param>
/// <returns></returns> /// <returns></returns>
private IResponse RequestDisengaged(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, private IResponse RequestDisengaged(
Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
bool dryRun) bool dryRun)
{ {
if (Disengaged == null) { if (Disengaged == null) {
...@@ -314,16 +336,19 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -314,16 +336,19 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
disengagedResponse = EngineIdleRequest(absTime, dt); disengagedResponse = EngineIdleRequest(absTime, dt);
} else { } else {
disengagedResponse = NextGear.Gear > 0 disengagedResponse = NextGear.Gear > 0
? NextComponent.Request(absTime, dt, 0.SI<NewtonMeter>(), ? NextComponent.Request(
absTime, dt, 0.SI<NewtonMeter>(),
outAngularVelocity * ModelData.Gears[NextGear.Gear].Ratio) outAngularVelocity * ModelData.Gears[NextGear.Gear].Ratio)
: EngineIdleRequest(absTime, dt); : EngineIdleRequest(absTime, dt);
} }
if (TorqueConverter != null) { if (TorqueConverter != null) {
if (DataBus.VehicleStopped) { if (DataBus.VehicleStopped) {
TorqueConverter.Locked(0.SI<NewtonMeter>(), disengagedResponse.EngineSpeed, CurrentState.InTorque, TorqueConverter.Locked(
0.SI<NewtonMeter>(), disengagedResponse.EngineSpeed, CurrentState.InTorque,
outAngularVelocity); outAngularVelocity);
} else { } else {
TorqueConverter.Locked(CurrentState.InTorque, disengagedResponse.EngineSpeed, CurrentState.InTorque, TorqueConverter.Locked(
CurrentState.InTorque, disengagedResponse.EngineSpeed, CurrentState.InTorque,
disengagedResponse.EngineSpeed); disengagedResponse.EngineSpeed);
} }
} }
...@@ -340,11 +365,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -340,11 +365,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
if (disengagedResponse is ResponseSuccess) { if (disengagedResponse is ResponseSuccess) {
return disengagedResponse; return disengagedResponse;
} }
var motoringSpeed = DataBus.EngineSpeed; var motoringSpeed = DataBus.EngineSpeed;
if (motoringSpeed.IsGreater(DataBus.EngineIdleSpeed)) { if (motoringSpeed.IsGreater(DataBus.EngineIdleSpeed)) {
var first = (ResponseDryRun)NextComponent.Request(absTime, dt, 0.SI<NewtonMeter>(), motoringSpeed, true); var first = (ResponseDryRun)NextComponent.Request(absTime, dt, 0.SI<NewtonMeter>(), motoringSpeed, true);
try { try {
motoringSpeed = SearchAlgorithm.Search(motoringSpeed, first.DeltaDragLoad, motoringSpeed = SearchAlgorithm.Search(
motoringSpeed, first.DeltaDragLoad,
Constants.SimulationSettings.EngineIdlingSearchInterval, Constants.SimulationSettings.EngineIdlingSearchInterval,
getYValue: result => ((ResponseDryRun)result).DeltaDragLoad, getYValue: result => ((ResponseDryRun)result).DeltaDragLoad,
evaluateFunction: n => NextComponent.Request(absTime, dt, 0.SI<NewtonMeter>(), n, true), evaluateFunction: n => NextComponent.Request(absTime, dt, 0.SI<NewtonMeter>(), n, true),
...@@ -378,6 +405,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -378,6 +405,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
? 0.SI<Watt>() ? 0.SI<Watt>()
: CurrentState.PowershiftLosses * avgInAngularSpeed; : CurrentState.PowershiftLosses * avgInAngularSpeed;
} }
// torque converter fields are written by TorqueConverter (if present), called from Vehicle container // torque converter fields are written by TorqueConverter (if present), called from Vehicle container
} }
...@@ -395,6 +423,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -395,6 +423,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
} }
} }
} }
base.DoCommitSimulationStep(); base.DoCommitSimulationStep();
} }
...@@ -402,11 +431,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -402,11 +431,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
public override GearInfo NextGear public override GearInfo NextGear
{ {
get get {
{
if (Disengaged == null) { if (Disengaged == null) {
return new GearInfo(Gear, !TorqueConverterActive ?? true); return new GearInfo(Gear, !TorqueConverterActive ?? true);
} }
var future = DataBus.LookAhead(ModelData.TractionInterruption * 5); var future = DataBus.LookAhead(ModelData.TractionInterruption * 5);
var nextGear = 0u; var nextGear = 0u;
var torqueConverterLocked = false; var torqueConverterLocked = false;
...@@ -419,24 +448,27 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -419,24 +448,27 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
// vehicle is stopped, no next gear, engine should go to idle // vehicle is stopped, no next gear, engine should go to idle
break; break;
} }
if (entry.Gear == 0) { if (entry.Gear == 0) {
continue; continue;
} }
nextGear = entry.Gear; nextGear = entry.Gear;
torqueConverterLocked = !entry.TorqueConverterActive ?? false; torqueConverterLocked = !entry.TorqueConverterActive ?? false;
break; break;
} }
return new GearInfo(nextGear, torqueConverterLocked); return new GearInfo(nextGear, torqueConverterLocked);
} }
} }
public override Second TractionInterruption public override Second TractionInterruption
{ {
get get {
{
if (Disengaged == null) { if (Disengaged == null) {
return ModelData.TractionInterruption; return ModelData.TractionInterruption;
} }
var future = DataBus.LookAhead(ModelData.TractionInterruption * 5); var future = DataBus.LookAhead(ModelData.TractionInterruption * 5);
foreach (var entry in future) { foreach (var entry in future) {
if (entry.VehicleTargetSpeed != null && entry.VehicleTargetSpeed.IsEqual(0)) { if (entry.VehicleTargetSpeed != null && entry.VehicleTargetSpeed.IsEqual(0)) {
...@@ -447,11 +479,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -447,11 +479,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
// vehicle is stopped, no next gear, engine should go to idle // vehicle is stopped, no next gear, engine should go to idle
break; break;
} }
if (entry.Gear == 0) { if (entry.Gear == 0) {
continue; continue;
} }
return entry.Time - Disengaged; return entry.Time - Disengaged;
} }
return ModelData.TractionInterruption; return ModelData.TractionInterruption;
} }
} }
...@@ -477,7 +512,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -477,7 +512,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
public override IGearbox Gearbox { get; set; } public override IGearbox Gearbox { get; set; }
public override bool ShiftRequired(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, public override bool ShiftRequired(
Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
NewtonMeter inTorque, NewtonMeter inTorque,
PerSecond inAngularVelocity, uint gear, Second lastShiftTime) PerSecond inAngularVelocity, uint gear, Second lastShiftTime)
{ {
......
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Models.Connector.Ports;
using TUGraz.VectoCore.Models.Simulation;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
using TUGraz.VectoCore.OutputData;
namespace TUGraz.VectoCore.Models.SimulationComponent.Impl {
public class CycleTorqueConverter : StatefulVectoSimulationComponent<TorqueConverter.TorqueConverterComponentState>
{
protected internal ITnOutPort NextComponent;
private TorqueConverterData ModelData;
public CycleTorqueConverter(IVehicleContainer container, TorqueConverterData modelData) : base(container)
{
ModelData = modelData;
}
public IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity, PerSecond inAngularVelocity)
{
var operatingPoint = ModelData.LookupOperatingPoint(outAngularVelocity, inAngularVelocity, outTorque);
PreviousState.OperatingPoint = operatingPoint;
return NextComponent.Initialize(operatingPoint.InTorque, inAngularVelocity);
}
public IResponse Request(
Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, PerSecond inAngularVelocity,
bool dryRun = false)
{
var operatingPoint = ModelData.LookupOperatingPoint(outAngularVelocity, inAngularVelocity, outTorque);
if (!dryRun) {
CurrentState.OperatingPoint = operatingPoint;
}
return NextComponent.Request(absTime, dt, operatingPoint.InTorque, inAngularVelocity, dryRun);
}
public void Locked(
NewtonMeter inTorque, PerSecond inAngularVelocity, NewtonMeter outTorque,
PerSecond outAngularVelocity) { }
#region Overrides of VectoSimulationComponent
protected override void DoWriteModalResults(IModalDataContainer container)
{
if (CurrentState.OperatingPoint == null) {
container[ModalResultField.TorqueConverterTorqueRatio] = 1.0;
container[ModalResultField.TorqueConverterSpeedRatio] = 1.0;
} else {
container[ModalResultField.TorqueConverterTorqueRatio] = CurrentState.OperatingPoint.TorqueRatio;
container[ModalResultField.TorqueConverterSpeedRatio] = CurrentState.OperatingPoint.SpeedRatio;
}
container[ModalResultField.TC_TorqueIn] = CurrentState.InTorque;
container[ModalResultField.TC_TorqueOut] = CurrentState.OutTorque;
container[ModalResultField.TC_angularSpeedIn] = CurrentState.InAngularVelocity;
container[ModalResultField.TC_angularSpeedOut] = CurrentState.OutAngularVelocity;
var avgOutVelocity = (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2.0;
var avgInVelocity = (PreviousState.InAngularVelocity + CurrentState.InAngularVelocity) / 2.0;
container[ModalResultField.P_TC_out] = CurrentState.OutTorque * avgOutVelocity;
container[ModalResultField.P_TC_loss] = CurrentState.InTorque * avgInVelocity -
CurrentState.OutTorque * avgOutVelocity;
}
protected override void DoCommitSimulationStep()
{
AdvanceState();
}
#endregion
}
}
\ No newline at end of file
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Models.Connector.Ports;
namespace TUGraz.VectoCore.Models.SimulationComponent.Impl {
public class TorqueConverterWrapper
{
protected internal CycleTorqueConverter CycleTorqueConverter;
protected internal TorqueConverter TorqueConverter;
protected bool UseCycleTorqueConverter;
public TorqueConverterWrapper(bool useCycle, CycleTorqueConverter cycleTorqueConverter, TorqueConverter torqueConverter)
{
UseCycleTorqueConverter = useCycle;
if (useCycle) {
CycleTorqueConverter = cycleTorqueConverter;
} else {
TorqueConverter = torqueConverter;
}
}
public ITnOutPort NextComponent
{
set {
if (UseCycleTorqueConverter) {
CycleTorqueConverter.NextComponent = value;
} else {
TorqueConverter.NextComponent = value;
}
}
}
public IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity, PerSecond inAngularVelocity)
{
return UseCycleTorqueConverter
? CycleTorqueConverter.Initialize(outTorque, outAngularVelocity, inAngularVelocity)
: TorqueConverter.Initialize(outTorque, outAngularVelocity);
}
public IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, PerSecond inAngularVelocity, bool dryRun = false)
{
return UseCycleTorqueConverter
? CycleTorqueConverter.Request(absTime, dt, outTorque, outAngularVelocity, inAngularVelocity, dryRun)
: TorqueConverter.Request(absTime, dt, outTorque, outAngularVelocity, dryRun);
}
public void Locked(NewtonMeter outTorque, PerSecond outAngularVelocity, NewtonMeter inTorque, PerSecond inAngularVelocity)
{
if (UseCycleTorqueConverter) {
CycleTorqueConverter.Locked(outTorque, outAngularVelocity, inTorque, inAngularVelocity);
} else {
TorqueConverter.Locked(outTorque, outAngularVelocity, inTorque, inAngularVelocity);
}
}
}
}
\ No newline at end of file
...@@ -47,7 +47,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -47,7 +47,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
{ {
internal class VTPCycle : PWheelCycle internal class VTPCycle : PWheelCycle
{ {
private uint StartGear; protected uint StartGear;
protected Second SimulationIntervalEndTime;
public VTPCycle(VehicleContainer container, IDrivingCycleData cycle) : base(container, cycle) { } public VTPCycle(VehicleContainer container, IDrivingCycleData cycle) : base(container, cycle) { }
...@@ -149,8 +151,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -149,8 +151,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
private void VerifyWheelTorque(DrivingCycleData.DrivingCycleEntry entry) private void VerifyWheelTorque(DrivingCycleData.DrivingCycleEntry entry)
{ {
var torqueRatio = VectoMath.Max( var torqueRatio = entry.TorqueWheelRight.IsEqual(0, 1e-9) && entry.TorqueWheelLeft.IsEqual(0, 1e-9) ? 0 :
entry.TorqueWheelLeft / entry.TorqueWheelRight, entry.TorqueWheelRight / entry.TorqueWheelLeft); Math.Max(entry.TorqueWheelLeft / entry.TorqueWheelRight, entry.TorqueWheelRight / entry.TorqueWheelLeft);
var torqueDiff = VectoMath.Abs(entry.TorqueWheelLeft - entry.TorqueWheelRight); var torqueDiff = VectoMath.Abs(entry.TorqueWheelLeft - entry.TorqueWheelRight);
if (torqueRatio > DeclarationData.VTPMode.WheelTorqueDifferenceFactor && if (torqueRatio > DeclarationData.VTPMode.WheelTorqueDifferenceFactor &&
torqueDiff > DeclarationData.VTPMode.MaxWheelTorqueDifference) { torqueDiff > DeclarationData.VTPMode.MaxWheelTorqueDifference) {
...@@ -256,6 +258,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -256,6 +258,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
var gearRatios = RunData.GearboxData.Gears.ToDictionary(g => g.Key, g => g.Value.Ratio); var gearRatios = RunData.GearboxData.Gears.ToDictionary(g => g.Key, g => g.Value.Ratio);
var stopped = false; var stopped = false;
var hasATGbx = RunData.GearboxData.TorqueConverterData != null && RunData.GearboxData.Type.AutomaticTransmission();
foreach (var entry in Data.Entries) { foreach (var entry in Data.Entries) {
stopped = stopped || entry.VehicleTargetSpeed.IsEqual(0.KMPHtoMeterPerSecond(), stopped = stopped || entry.VehicleTargetSpeed.IsEqual(0.KMPHtoMeterPerSecond(),
...@@ -271,6 +274,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -271,6 +274,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
entry.Gear = 0; entry.Gear = 0;
continue; continue;
} }
if (hasATGbx && entry.TorqueConverterActive != null && entry.TorqueConverterActive.Value) {
continue;
}
var ratio = (entry.EngineSpeed / cardanSpeed).Value(); var ratio = (entry.EngineSpeed / cardanSpeed).Value();
var gear = gearRatios.Aggregate((x, y) => var gear = gearRatios.Aggregate((x, y) =>
Math.Abs(ratio/x.Value - 1) < Math.Abs(ratio/y.Value - 1) ? x : y).Key; Math.Abs(ratio/x.Value - 1) < Math.Abs(ratio/y.Value - 1) ? x : y).Key;
...@@ -305,6 +313,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -305,6 +313,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
DeltaT = CycleIterator.RightSample.Time - absTime DeltaT = CycleIterator.RightSample.Time - absTime
}; };
} }
SimulationIntervalEndTime = absTime + dt;
if (CycleIterator.LeftSample.Time > absTime) {
Log.Warn("absTime: {0} cycle: {1}", absTime, CycleIterator.LeftSample.Time);
}
var tmp = NextComponent.Initialize(CycleIterator.LeftSample.Torque, CycleIterator.LeftSample.WheelAngularVelocity); var tmp = NextComponent.Initialize(CycleIterator.LeftSample.Torque, CycleIterator.LeftSample.WheelAngularVelocity);
return DoHandleRequest(absTime, dt, CycleIterator.LeftSample.WheelAngularVelocity); return DoHandleRequest(absTime, dt, CycleIterator.LeftSample.WheelAngularVelocity);
...@@ -319,6 +332,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -319,6 +332,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
} }
} }
protected override void DoCommitSimulationStep()
{
if (SimulationIntervalEndTime.IsGreaterOrEqual(CycleIterator.RightSample.Time)) {
CycleIterator.MoveNext();
}
AdvanceState();
}
protected override void DoWriteModalResults(IModalDataContainer container) protected override void DoWriteModalResults(IModalDataContainer container)
{ {
base.DoWriteModalResults(container); base.DoWriteModalResults(container);
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2016 rel. 2 (x64) (http://www.altova.com) by Helmut Eichlseder (TU Graz/Inst. f. VKM und THD) --> <!-- edited with XMLSpy v2016 rel. 2 sp1 (x64) (http://www.altova.com) by Helmut Eichlseder (TU Graz/Inst. f. VKM und THD) -->
<!--W3C XML Schema generated by XMLSpy vXMLSpy Professional Edition v2016 rel. 2 (x64) (http://www.altova.com)--> <!--W3C XML Schema generated by XMLSpy vXMLSpy Professional Edition v2016 rel. 2 (x64) (http://www.altova.com)-->
<xs:schema xmlns="urn:tugraz:ivt:VectoAPI:CustomerOutput:v0.4" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vdecdef="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v1.0" targetNamespace="urn:tugraz:ivt:VectoAPI:CustomerOutput:v0.4" elementFormDefault="qualified" attributeFormDefault="unqualified" version="0.4"> <xs:schema xmlns="urn:tugraz:ivt:VectoAPI:CustomerOutput:v0.4" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vdecdef="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v1.0" targetNamespace="urn:tugraz:ivt:VectoAPI:CustomerOutput:v0.4" elementFormDefault="qualified" attributeFormDefault="unqualified" version="0.4">
<xs:import namespace="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v1.0" schemaLocation="VectoDeclarationDefinitions.1.0.xsd"/> <xs:import namespace="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v1.0" schemaLocation="VectoDeclarationDefinitions.1.0.xsd"/>
...@@ -96,8 +96,8 @@ ...@@ -96,8 +96,8 @@
<xs:element name="ApplicationInformation"> <xs:element name="ApplicationInformation">
<xs:complexType> <xs:complexType>
<xs:sequence> <xs:sequence>
<xs:element name="SimulationToolVersion"/> <xs:element name="SimulationToolVersion" type="xs:string"/>
<xs:element name="Date"/> <xs:element name="Date" type="vdecdef:DateTimeWithTimezone"/>
</xs:sequence> </xs:sequence>
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
...@@ -112,7 +112,7 @@ ...@@ -112,7 +112,7 @@
<xs:element name="Model" type="vdecdef:ModelType"/> <xs:element name="Model" type="vdecdef:ModelType"/>
<xs:element name="Manufacturer" type="vdecdef:ManufacturerType"/> <xs:element name="Manufacturer" type="vdecdef:ManufacturerType"/>
<xs:element name="ManufacturerAddress" type="vdecdef:ManufacturerAddressType"/> <xs:element name="ManufacturerAddress" type="vdecdef:ManufacturerAddressType"/>
<xs:element name="VIN"> <xs:element name="VIN" type="vdecdef:VINType">
<xs:annotation> <xs:annotation>
<xs:documentation>P238</xs:documentation> <xs:documentation>P238</xs:documentation>
</xs:annotation> </xs:annotation>
......
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
<xs:element name="FuelConsumption" type="FuelConsumptionType" maxOccurs="unbounded"/> <xs:element name="FuelConsumption" type="FuelConsumptionType" maxOccurs="unbounded"/>
<xs:element name="CO2" type="CO2Type" maxOccurs="unbounded"/> <xs:element name="CO2" type="CO2Type" maxOccurs="unbounded"/>
</xs:sequence> </xs:sequence>
<xs:element name="Error"/> <xs:element name="Error" type="xs:string"/>
</xs:choice> </xs:choice>
</xs:sequence> </xs:sequence>
<xs:attribute name="status" use="required"> <xs:attribute name="status" use="required">
...@@ -96,8 +96,8 @@ ...@@ -96,8 +96,8 @@
<xs:element name="ApplicationInformation"> <xs:element name="ApplicationInformation">
<xs:complexType> <xs:complexType>
<xs:sequence> <xs:sequence>
<xs:element name="SimulationToolVersion"/> <xs:element name="SimulationToolVersion" type="xs:string"/>
<xs:element name="Date"/> <xs:element name="Date" type="vdecdef:DateTimeWithTimezone"/>
</xs:sequence> </xs:sequence>
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
...@@ -112,7 +112,7 @@ ...@@ -112,7 +112,7 @@
<xs:element name="Model" type="vdecdef:ModelType"/> <xs:element name="Model" type="vdecdef:ModelType"/>
<xs:element name="Manufacturer" type="vdecdef:ManufacturerType"/> <xs:element name="Manufacturer" type="vdecdef:ManufacturerType"/>
<xs:element name="ManufacturerAddress" type="vdecdef:ManufacturerAddressType"/> <xs:element name="ManufacturerAddress" type="vdecdef:ManufacturerAddressType"/>
<xs:element name="VIN"> <xs:element name="VIN" type="vdecdef:VINType">
<xs:annotation> <xs:annotation>
<xs:documentation>P238</xs:documentation> <xs:documentation>P238</xs:documentation>
</xs:annotation> </xs:annotation>
......
...@@ -23,10 +23,10 @@ ...@@ -23,10 +23,10 @@
</xs:element> </xs:element>
<xs:complexType name="AirdragType"> <xs:complexType name="AirdragType">
<xs:sequence> <xs:sequence>
<xs:element name="Model" minOccurs="0"/> <xs:element name="Model" type="vdecdef:ModelType" minOccurs="0"/>
<xs:element name="CertificationMethod" type="AirdragCertificationOptionType"/> <xs:element name="CertificationMethod" type="AirdragCertificationOptionType"/>
<xs:element name="CertificationNumber" minOccurs="0"/> <xs:element name="CertificationNumber" type="vdecdef:CertificationNumberType" minOccurs="0"/>
<xs:element name="DigestValue" minOccurs="0"/> <xs:element name="DigestValue" type="xs:token" minOccurs="0"/>
<xs:element name="CdxA" type="vdecdef:AirdragCdxAType"> <xs:element name="CdxA" type="vdecdef:AirdragCdxAType">
<xs:annotation> <xs:annotation>
<xs:documentation>P245</xs:documentation> <xs:documentation>P245</xs:documentation>
...@@ -361,7 +361,7 @@ ...@@ -361,7 +361,7 @@
</xs:complexType> </xs:complexType>
<xs:complexType name="TorqueLimitsType"> <xs:complexType name="TorqueLimitsType">
<xs:sequence> <xs:sequence>
<xs:element name="Entry" type="TorqueLimitsEntryType"/> <xs:element name="Entry" type="TorqueLimitsEntryType" maxOccurs="unbounded"/>
</xs:sequence> </xs:sequence>
</xs:complexType> </xs:complexType>
<xs:complexType name="VectoOutputDataType"> <xs:complexType name="VectoOutputDataType">
...@@ -385,8 +385,8 @@ ...@@ -385,8 +385,8 @@
<xs:element name="ApplicationInformation"> <xs:element name="ApplicationInformation">
<xs:complexType> <xs:complexType>
<xs:sequence> <xs:sequence>
<xs:element name="SimulationToolVersion"/> <xs:element name="SimulationToolVersion" type="xs:string"/>
<xs:element name="Date"/> <xs:element name="Date" type="vdecdef:DateTimeWithTimezone"/>
</xs:sequence> </xs:sequence>
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
...@@ -495,7 +495,7 @@ ...@@ -495,7 +495,7 @@
</xs:complexType> </xs:complexType>
<xs:complexType name="VehicleType"> <xs:complexType name="VehicleType">
<xs:sequence> <xs:sequence>
<xs:element name="VIN"> <xs:element name="VIN" type="vdecdef:VINType">
<xs:annotation> <xs:annotation>
<xs:documentation>P238</xs:documentation> <xs:documentation>P238</xs:documentation>
</xs:annotation> </xs:annotation>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment