From 143f3da9f78c7fcab70f25e5648ccebadf78bbaf Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Thu, 19 Sep 2019 14:23:43 +0200 Subject: [PATCH] refactoring: implementing BusAuxModules in new C# project --- VECTOAux/BusAuxiliaries/BusAuxiliaries.csproj | 81 ++++++++ .../DownstreamModules/Impl/AbstractModule.cs | 25 +++ .../DownstreamModules/Impl/M00Impl.cs | 77 ++++++++ .../DownstreamModules/Impl/M01Impl.cs | 98 ++++++++++ .../DownstreamModules/Impl/M02Impl.cs | 61 ++++++ .../DownstreamModules/Impl/M03Impl.cs | 141 ++++++++++++++ .../DownstreamModules/Impl/M04Impl.cs | 100 ++++++++++ .../DownstreamModules/Impl/M05Impl.cs | 55 ++++++ .../DownstreamModules/Impl/M06Impl.cs | 173 ++++++++++++++++++ .../DownstreamModules/Impl/M07Impl.cs | 94 ++++++++++ .../DownstreamModules/Impl/M08Impl.cs | 83 +++++++++ .../DownstreamModules/Impl/M09Impl.cs | 136 ++++++++++++++ .../DownstreamModules/Impl/M0_5Impl.cs | 105 +++++++++++ .../DownstreamModules/Impl/M10Impl.cs | 105 +++++++++++ .../DownstreamModules/Impl/M11Impl.cs | 152 +++++++++++++++ .../DownstreamModules/Impl/M12Impl.cs | 111 +++++++++++ .../DownstreamModules/Impl/M13Impl.cs | 58 ++++++ .../DownstreamModules/Impl/M14Impl.cs | 68 +++++++ .../BusAuxiliaries/Properties/AssemblyInfo.cs | 36 ++++ 19 files changed, 1759 insertions(+) create mode 100644 VECTOAux/BusAuxiliaries/BusAuxiliaries.csproj create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/AbstractModule.cs create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M00Impl.cs create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M01Impl.cs create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M02Impl.cs create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M03Impl.cs create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M04Impl.cs create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M05Impl.cs create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M06Impl.cs create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M07Impl.cs create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M08Impl.cs create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M09Impl.cs create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M0_5Impl.cs create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M10Impl.cs create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M11Impl.cs create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M12Impl.cs create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M13Impl.cs create mode 100644 VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M14Impl.cs create mode 100644 VECTOAux/BusAuxiliaries/Properties/AssemblyInfo.cs diff --git a/VECTOAux/BusAuxiliaries/BusAuxiliaries.csproj b/VECTOAux/BusAuxiliaries/BusAuxiliaries.csproj new file mode 100644 index 0000000000..e1c35c9c30 --- /dev/null +++ b/VECTOAux/BusAuxiliaries/BusAuxiliaries.csproj @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProjectGuid>{550D99D4-25F7-48D9-B0F0-E5DD6CB3485D}</ProjectGuid> + <OutputType>Library</OutputType> + <AppDesignerFolder>Properties</AppDesignerFolder> + <RootNamespace>TUGraz.VectoCore.BusAuxiliaries</RootNamespace> + <AssemblyName>BusAuxiliariesC</AssemblyName> + <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <TargetFrameworkProfile /> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>bin\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="System" /> + <Reference Include="System.Core" /> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System.Data.DataSetExtensions" /> + <Reference Include="Microsoft.CSharp" /> + <Reference Include="System.Data" /> + <Reference Include="System.Net.Http" /> + <Reference Include="System.Xml" /> + </ItemGroup> + <ItemGroup> + <Compile Include="DownstreamModules\Impl\AbstractModule.cs" /> + <Compile Include="DownstreamModules\Impl\M00Impl.cs" /> + <Compile Include="DownstreamModules\Impl\M02Impl.cs" /> + <Compile Include="DownstreamModules\Impl\M03Impl.cs" /> + <Compile Include="DownstreamModules\Impl\M04Impl.cs" /> + <Compile Include="DownstreamModules\Impl\M05Impl.cs" /> + <Compile Include="DownstreamModules\Impl\M0_5Impl.cs" /> + <Compile Include="DownstreamModules\Impl\M10Impl.cs" /> + <Compile Include="DownstreamModules\Impl\M11Impl.cs" /> + <Compile Include="DownstreamModules\Impl\M12Impl.cs" /> + <Compile Include="DownstreamModules\Impl\M13Impl.cs" /> + <Compile Include="DownstreamModules\Impl\M14Impl.cs" /> + <Compile Include="DownstreamModules\Impl\M01Impl.cs" /> + <Compile Include="DownstreamModules\Impl\M06Impl.cs" /> + <Compile Include="DownstreamModules\Impl\M07Impl.cs" /> + <Compile Include="DownstreamModules\Impl\M08Impl.cs" /> + <Compile Include="DownstreamModules\Impl\M09Impl.cs" /> + <Compile Include="Properties\AssemblyInfo.cs" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\VectoCommon\AdvancedAuxiliaryInterfaces\AdvancedAuxiliaryInterfaces.vbproj"> + <Project>{B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}</Project> + <Name>AdvancedAuxiliaryInterfaces</Name> + </ProjectReference> + <ProjectReference Include="..\..\VectoCommon\VectoCommon\VectoCommon.csproj"> + <Project>{79A066AD-69A9-4223-90F6-6ED5D2D084F4}</Project> + <Name>VectoCommon</Name> + </ProjectReference> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets. + <Target Name="BeforeBuild"> + </Target> + <Target Name="AfterBuild"> + </Target> + --> +</Project> \ No newline at end of file diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/AbstractModule.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/AbstractModule.cs new file mode 100644 index 0000000000..8eb867e312 --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/AbstractModule.cs @@ -0,0 +1,25 @@ +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + public abstract class AbstractModule + { + protected bool calculationValid { get; private set; } + + public AbstractModule() + { + calculationValid = false; + } + + public virtual void ResetCalculations() + { + calculationValid = false; + } + + protected virtual void Calculate() + { + DoCalculate(); + calculationValid = true; + } + + protected virtual void DoCalculate() { } + } +} diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M00Impl.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M00Impl.cs new file mode 100644 index 0000000000..f0d4272287 --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M00Impl.cs @@ -0,0 +1,77 @@ +using System; +using TUGraz.VectoCommon.Utils; +using VectoAuxiliaries; +using VectoAuxiliaries.DownstreamModules.Electrics; +using VectoAuxiliaries.Electrics; + +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + public class M00Impl : AbstractModule, IM0_NonSmart_AlternatorsSetEfficiency + { + protected Ampere _getHVACElectricalPowerDemandAmps; + protected double _alternatorsEfficiency; + protected IElectricalConsumerList _electricalConsumersList; + protected IAlternatorMap _alternatorEfficiencyMap; + protected Volt _powernetVoltage; + protected ISignals _signals; + protected ISSMTOOL _steadyStateModelHVAC; + protected Watt _ElectricalPowerW; + protected Watt _MechanicalPowerW; + protected LiterPerSecond _FuelingLPerH; + + public M00Impl( + IElectricalConsumerList electricalConsumers, IAlternatorMap alternatorEfficiencyMap, Volt powernetVoltage, + ISignals signals, ISSMTOOL ssmHvac) + { + if (electricalConsumers == null) { + throw new ArgumentException("No ElectricalConsumersList Supplied"); + } + + if (alternatorEfficiencyMap == null) { + throw new ArgumentException("No Alternator Efficiency Map Supplied"); + } + + if (powernetVoltage < ElectricConstants.PowenetVoltageMin || powernetVoltage > ElectricConstants.PowenetVoltageMax) { + throw new ArgumentException("Powernet Voltage out of range"); + } + + if (signals == null) { + throw new ArgumentException("No Signals reference was supplied."); + } + + _electricalConsumersList = electricalConsumers; + + _alternatorEfficiencyMap = alternatorEfficiencyMap; + + _powernetVoltage = powernetVoltage; + + _signals = signals; + + _steadyStateModelHVAC = ssmHvac; + + _ElectricalPowerW = ssmHvac.ElectricalWAdjusted.SI<Watt>(); + + _MechanicalPowerW = ssmHvac.MechanicalWBaseAdjusted.SI<Watt>(); + + _FuelingLPerH = ssmHvac.FuelPerHBaseAdjusted.SI<LiterPerSecond>(); + } + + #region Implementation of IM0_NonSmart_AlternatorsSetEfficiency + + public Ampere GetHVACElectricalPowerDemandAmps + { + get { return _ElectricalPowerW / _powernetVoltage; } + } + + public double AlternatorsEfficiency + { + get { + var baseCurrentDemandAmps = _electricalConsumersList.GetTotalAverageDemandAmps(false); + var totalDemandAmps = baseCurrentDemandAmps + GetHVACElectricalPowerDemandAmps; + return _alternatorEfficiencyMap.GetEfficiency(_signals.EngineSpeed.AsRPM, totalDemandAmps).Efficiency; + } + } + + #endregion + } +} diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M01Impl.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M01Impl.cs new file mode 100644 index 0000000000..d275331ca4 --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M01Impl.cs @@ -0,0 +1,98 @@ +using System; +using TUGraz.VectoCommon.Utils; +using VectoAuxiliaries; +using VectoAuxiliaries.DownstreamModules.Electrics; +using VectoAuxiliaries.Electrics; +using VectoAuxiliaries.Hvac; + +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + public class M01Impl : AbstractModule, IM1_AverageHVACLoadDemand + { + protected IM0_NonSmart_AlternatorsSetEfficiency _m0; + protected Double _alternatorGearEfficiency; + protected Double _compressorGearEfficiency; + protected ISignals _signals; + protected Volt _powernetVoltage; + protected ISSMTOOL _steadyStateModel; + + protected Watt _ElectricalPowerW; + protected Watt _MechanicalPowerW; + protected LiterPerSecond _FuelingLPerH; + + public M01Impl(IM0_NonSmart_AlternatorsSetEfficiency m0, double altGearEfficiency, double compressorGearEfficiency, Volt powernetVoltage, ISignals signals, ISSMTOOL ssm) + { + //'Sanity Check - Illegal operations without all params. + if (m0 == null) { + throw new ArgumentException("Module0 as supplied is null"); + } + + if (altGearEfficiency < ElectricConstants.AlternatorPulleyEfficiencyMin || + altGearEfficiency > ElectricConstants.AlternatorPulleyEfficiencyMax) { + throw new ArgumentException( + string.Format + ( + "Gear efficiency must be between {0} and {1}", + ElectricConstants.AlternatorPulleyEfficiencyMin, ElectricConstants.AlternatorPulleyEfficiencyMax)); + } + if (signals == null) { + throw new Exception("Signals object as supplied is null"); + } + + if (powernetVoltage < ElectricConstants.PowenetVoltageMin || powernetVoltage > ElectricConstants.PowenetVoltageMax) { + throw new ArgumentException( + string.Format( + "PowenetVoltage supplied must be in the range {0} to {1}", ElectricConstants.PowenetVoltageMin, + ElectricConstants.PowenetVoltageMax)); + } + + if (ssm == null ) { + throw new ArgumentException("Steady State model was not supplied"); + } + + if (compressorGearEfficiency < 0 || altGearEfficiency > 1) { + throw new ArgumentException(String.Format("Compressor Gear efficiency must be between {0} and {1}", 0, 1)); + } + + //'Assign + _m0 = m0; + _alternatorGearEfficiency = altGearEfficiency; + _signals = signals; + + _compressorGearEfficiency = compressorGearEfficiency; + _powernetVoltage = powernetVoltage; + + + _steadyStateModel = ssm; + + _ElectricalPowerW = ssm.ElectricalWAdjusted.SI<Watt>(); + _MechanicalPowerW = ssm.MechanicalWBaseAdjusted.SI<Watt>(); + _FuelingLPerH = ssm.FuelPerHBaseAdjusted.SI(Unit.SI.Liter.Per.Hour).Cast<LiterPerSecond>(); // ' SI(Of LiterPerHour)() + + } + + #region Implementation of IM1_AverageHVACLoadDemand + + public Watt AveragePowerDemandAtCrankFromHVACMechanicalsWatts() + { + return _MechanicalPowerW * (1 / _compressorGearEfficiency); + } + + public Watt AveragePowerDemandAtAlternatorFromHVACElectricsWatts() + { + return _ElectricalPowerW; + } + + public Watt AveragePowerDemandAtCrankFromHVACElectricsWatts() + { + return _ElectricalPowerW * (1 / _m0.AlternatorsEfficiency / _alternatorGearEfficiency); + } + + public LiterPerSecond HVACFuelingLitresPerHour() + { + return _FuelingLPerH; + } + + #endregion + } +} diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M02Impl.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M02Impl.cs new file mode 100644 index 0000000000..517cfb97eb --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M02Impl.cs @@ -0,0 +1,61 @@ +using System; +using TUGraz.VectoCommon.Utils; +using VectoAuxiliaries; +using VectoAuxiliaries.DownstreamModules.Electrics; +using VectoAuxiliaries.Electrics; + +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + public class M02Impl : AbstractModule, IM2_AverageElectricalLoadDemand + { + private Volt _powerNetVoltage; + private IElectricalConsumerList _electricalConsumers; + private IM0_NonSmart_AlternatorsSetEfficiency _module0; + private double _alternatorPulleyEffiency; + + public M02Impl( + IElectricalConsumerList electricalConsumers, IM0_NonSmart_AlternatorsSetEfficiency m0, double altPulleyEfficiency, + Volt powerNetVoltage, ISignals signals) + { + if (electricalConsumers == null) { + throw new ArgumentException("Electrical Consumer List must be supplied"); + } + if (m0 == null) { + throw new ArgumentException("Must supply module 0"); + } + if (altPulleyEfficiency.IsEqual(0) || altPulleyEfficiency > 1) { + throw new ArgumentException("Alternator Gear efficiency out of range."); + } + if (powerNetVoltage < ElectricConstants.PowenetVoltageMin || powerNetVoltage > ElectricConstants.PowenetVoltageMax) { + throw new ArgumentException("Powernet Voltage out of known range."); + } + + _powerNetVoltage = powerNetVoltage; + _electricalConsumers = electricalConsumers; + _module0 = m0; + _alternatorPulleyEffiency = altPulleyEfficiency; + } + + #region Implementation of IM2_AverageElectricalLoadDemand + + public Watt GetAveragePowerDemandAtAlternator() + { + return _powerNetVoltage * _electricalConsumers.GetTotalAverageDemandAmps(false); + } + + public Watt GetAveragePowerAtCrankFromElectrics() + { + var ElectricalPowerDemandsWatts = GetAveragePowerDemandAtAlternator(); + var alternatorsEfficiency = _module0.AlternatorsEfficiency; + var ElectricalPowerDemandsWattsDividedByAlternatorEfficiency = + ElectricalPowerDemandsWatts * (1 / alternatorsEfficiency); + + var averagePowerDemandAtCrankFromElectricsWatts = + ElectricalPowerDemandsWattsDividedByAlternatorEfficiency * (1 / _alternatorPulleyEffiency); + + return averagePowerDemandAtCrankFromElectricsWatts; + } + + #endregion + } +} diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M03Impl.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M03Impl.cs new file mode 100644 index 0000000000..004080d3a9 --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M03Impl.cs @@ -0,0 +1,141 @@ +using TUGraz.VectoCommon.Utils; +using VectoAuxiliaries; +using VectoAuxiliaries.Pneumatics; + +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + public class M03Impl : AbstractModule, IM3_AveragePneumaticLoadDemand + { + private IPneumaticUserInputsConfig _pneumaticUserInputsConfig; + private IPneumaticsAuxilliariesConfig _pneumaticAuxillariesConfig; + private IPneumaticActuationsMAP _pneumaticsActuationsMap; + private ICompressorMap _pneumaticsCompressorFlowRateMap; + private Kilogram _vehicleMassKG; + private string _cycleName; + private ISignals _signals; + private SI _averagePowerDemandPerCompressorUnitFlowRateInWPerLitresPerSecond; + private NormLiter _totalAirDemand; + + private double _cycleDurationMinutes; + + public M03Impl(IPneumaticUserInputsConfig pneumaticsUserInputConfig, IPneumaticsAuxilliariesConfig pneumaticsAuxillariesConfig, IPneumaticActuationsMAP pneumaticsActuationsMap, ICompressorMap pneumaticsCompressorFlowRateMap, Kilogram vehicleMassKG, string cycleName, ISignals signals) + { + _pneumaticUserInputsConfig = pneumaticsUserInputConfig; + _pneumaticAuxillariesConfig = pneumaticsAuxillariesConfig; + _pneumaticsActuationsMap = pneumaticsActuationsMap; + _pneumaticsCompressorFlowRateMap = pneumaticsCompressorFlowRateMap; + _vehicleMassKG = vehicleMassKG; + _cycleName = cycleName; + _signals = signals; + + + //'Total up the blow demands from compressor map + _averagePowerDemandPerCompressorUnitFlowRateInWPerLitresPerSecond = + (_pneumaticsCompressorFlowRateMap.GetAveragePowerDemandPerCompressorUnitFlowRate() / 60).SI(); + + //'Calculate the Total Required Air Delivery Rate L / S + _totalAirDemand = TotalAirDemandCalculation(); + } + + + private NormLiter TotalAirDemandCalculation() + { + //'These calculation are done directly from formulae provided from a supplied spreadsheet. + + //'* * Breaks * * + double numActuationsPerCycle = _pneumaticsActuationsMap.GetNumActuations(new ActuationsKey("Brakes", _cycleName)); + //'=IF(K10 = "yes", IF(COUNTBLANK(F33), G33, F33), IF(COUNTBLANK(F34), G34, F34)) * K16 + var airConsumptionPerActuationNI = _pneumaticUserInputsConfig.RetarderBrake + ? _pneumaticAuxillariesConfig.BrakingWithRetarderNIperKG + : _pneumaticAuxillariesConfig.BrakingNoRetarderNIperKG; + var Breaks = (numActuationsPerCycle * airConsumptionPerActuationNI * _vehicleMassKG.Value()).SI<NormLiter>(); + + //'* * ParkBrakesBreakplus2Doors * *Park break +2 doors + numActuationsPerCycle = + _pneumaticsActuationsMap.GetNumActuations(new ActuationsKey("Park brake + 2 doors", _cycleName)); + //'=SUM(IF(K14 = "electric", 0, IF(COUNTBLANK(F36), G36, F36)), PRODUCT(K16 * IF(COUNTBLANK(F37), G37, F37))) + airConsumptionPerActuationNI = _pneumaticUserInputsConfig.Doors == "Electric" + ? 0 + : _pneumaticAuxillariesConfig.PerDoorOpeningNI; + airConsumptionPerActuationNI += _pneumaticAuxillariesConfig.PerStopBrakeActuationNIperKG * _vehicleMassKG.Value(); + var ParkBrakesplus2Doors = (numActuationsPerCycle * airConsumptionPerActuationNI).SI<NormLiter>(); + + //'* * Kneeling * * + numActuationsPerCycle = _pneumaticsActuationsMap.GetNumActuations(new ActuationsKey("Kneeling", _cycleName)); + //'=IF(COUNTBLANK(F35), G35, F35) * K11 * K16 + airConsumptionPerActuationNI = _pneumaticAuxillariesConfig.BreakingPerKneelingNIperKGinMM * _vehicleMassKG.Value() * + _pneumaticUserInputsConfig.KneelingHeightMillimeters; + var Kneeling = (numActuationsPerCycle * airConsumptionPerActuationNI).SI<NormLiter>(); + + //'* * AdBlue * * + // '=IF(K13 = "electric", 0, G39 * F54) - Supplied Spreadsheet + var AdBlue = (_pneumaticUserInputsConfig.AdBlueDosing == "Electric" ? 0 : + _pneumaticAuxillariesConfig.AdBlueNIperMinute * (_signals.TotalCycleTimeSeconds / 60.0)).SI<NormLiter>(); + + //'* * Regeneration * * + // '=SUM(R6: R9) * IF(K9 = "yes", IF(COUNTBLANK(F41), G41, F41), IF(COUNTBLANK(F40), G40, F40)) - Supplied SpreadSheet + var Regeneration = Breaks + ParkBrakesplus2Doors + Kneeling + AdBlue; + var regenFraction = _pneumaticUserInputsConfig.SmartRegeneration + ? _pneumaticAuxillariesConfig.SmartRegenFractionTotalAirDemand + : _pneumaticAuxillariesConfig.NonSmartRegenFractionTotalAirDemand; + Regeneration = Regeneration * regenFraction; + + //'* * DeadVolBlowOuts * * + // '=IF(COUNTBLANK(F43), G43, F43) / (F54 / 60) - Supplied SpreadSheet + numActuationsPerCycle = _pneumaticAuxillariesConfig.DeadVolBlowOutsPerLitresperHour / + (60.0 / (_signals.TotalCycleTimeSeconds / 60.0)); + airConsumptionPerActuationNI = _pneumaticAuxillariesConfig.DeadVolumeLitres; + var DeadVolBlowOuts = (numActuationsPerCycle * airConsumptionPerActuationNI).SI<NormLiter>(); + + //'* * AirSuspension * * + // '=IF(K12 = "electrically", 0, G38 * F54) - Suplied Spreadsheet + var AirSuspension = (_pneumaticUserInputsConfig.AirSuspensionControl == "Electrically" ? 0 : + _pneumaticAuxillariesConfig.AirControlledSuspensionNIperMinute * _cycleDurationMinutes).SI<NormLiter>(); + + //'* * Total Air Demand** + var TotalAirDemand = Breaks + ParkBrakesplus2Doors + Kneeling + AdBlue + Regeneration + DeadVolBlowOuts + + AirSuspension; + + + return TotalAirDemand; + } + + + #region Implementation of IM3_AveragePneumaticLoadDemand + + public Watt GetAveragePowerDemandAtCrankFromPneumatics() + { + var Sum1 = _totalAirDemand / _signals.TotalCycleTimeSeconds.SI<Second>(); + var Sum6 = _pneumaticsCompressorFlowRateMap.GetFlowRate( + _signals.EngineSpeed.AsRPM * _pneumaticUserInputsConfig.CompressorGearRatio) / + 60; + var pon = _pneumaticsCompressorFlowRateMap.GetPowerCompressorOn( + _signals.EngineSpeed.AsRPM * _pneumaticUserInputsConfig.CompressorGearRatio); + var poff = _pneumaticsCompressorFlowRateMap.GetPowerCompressorOff( + _signals.EngineSpeed.AsRPM * _pneumaticUserInputsConfig.CompressorGearRatio); + var diff = pon - poff; + var Sum7 = diff; + + var Sum2 = (Sum7.Value() / Sum6.Value() * Sum1.Value()).SI<Watt>(); // ' Watt / Nl/s * Nl/s = Watt + var Sum3 = Sum2 + + _pneumaticsCompressorFlowRateMap.GetPowerCompressorOff( + _signals.EngineSpeed.AsRPM * _pneumaticUserInputsConfig.CompressorGearRatio); + var Sum4 = Sum3 * (1 / _pneumaticUserInputsConfig.CompressorGearEfficiency); + return Sum4; + } + + public NormLiterPerSecond AverageAirConsumedPerSecondLitre() + { + var Sum1 = _totalAirDemand / _signals.TotalCycleTimeSeconds.SI<Second>(); + return Sum1; + } + + public NormLiter TotalAirDemand + { + get { return _totalAirDemand; } + } + + + #endregion + } +} diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M04Impl.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M04Impl.cs new file mode 100644 index 0000000000..76ab64701c --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M04Impl.cs @@ -0,0 +1,100 @@ +using System; +using TUGraz.VectoCommon.Utils; +using VectoAuxiliaries; +using VectoAuxiliaries.Pneumatics; + +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + public class M04Impl : AbstractModule, IM4_AirCompressor + { + private const double MinRatio = 1; + private const double MaxRatio = 10; + private const double MinEff = 0; + private const double MaxEff = 1; + + private double _pulleyGearRatio; + private double _pulleyGearEfficiency; + private ICompressorMap _map; + private ISignals _signals; + + public M04Impl(ICompressorMap map, double pulleyGearRatio, double pulleyGearEfficiency, ISignals signals) + { + _map = map; + _pulleyGearRatio = pulleyGearRatio; + _pulleyGearEfficiency = pulleyGearEfficiency; + _signals = signals; + } + + #region Implementation of IM4_AirCompressor + + public double PulleyGearRatio + { + get { return _pulleyGearRatio; } + set { + if (value < MinRatio || value > MaxRatio) { + throw new ArgumentOutOfRangeException( + "pulleyGearRatio", value, + string.Format("Invalid value, should be in the range {0} to {1}", MinRatio, MaxRatio)); + } + + _pulleyGearRatio = value; + } + } + + public double PulleyGearEfficiency + { + get { return _pulleyGearEfficiency; } + set { + if (value < MinEff || value > MaxEff) { + throw new ArgumentOutOfRangeException( + "pulleyGearEfficiency", value, + String.Format("Invalid value, should be in the range {0} to {1}", MinEff, MaxEff) + ); + } + + _pulleyGearEfficiency = value; + } + } + + public bool Initialise() + { + return _map.Initialise(); + } + + public NormLiterPerSecond GetFlowRate() + { + var compressorRpm = _signals.EngineSpeed.AsRPM * PulleyGearRatio; + return _map.GetFlowRate(compressorRpm) / 60; + } + + public Watt GetPowerCompressorOff() + { + return GetCompressorPower(false); + } + + public Watt GetPowerCompressorOn() + { + return GetCompressorPower(true); + } + + public Watt GetPowerDifference() + { + var powerOn = GetPowerCompressorOn(); + var powerOff = GetPowerCompressorOff(); + return powerOn - powerOff; + } + + public SI GetAveragePowerDemandPerCompressorUnitFlowRate() + { + return _map.GetAveragePowerDemandPerCompressorUnitFlowRate().SI(); + } + + #endregion + + private Watt GetCompressorPower(bool compressorOn) + { + var compressorRpm = _signals.EngineSpeed.AsRPM * PulleyGearRatio; + return compressorOn ? _map.GetPowerCompressorOn(compressorRpm) : _map.GetPowerCompressorOff(compressorRpm); + } + } +} diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M05Impl.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M05Impl.cs new file mode 100644 index 0000000000..a4af601f2a --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M05Impl.cs @@ -0,0 +1,55 @@ +using System; +using TUGraz.VectoCommon.Utils; +using VectoAuxiliaries.DownstreamModules.Electrics; +using VectoAuxiliaries.Electrics; + +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + public class M05Impl : AbstractModule, IM5_SmartAlternatorSetGeneration + { + private IM0_5_SmartAlternatorSetEfficiency _m05; + private Volt _powerNetVoltage; + private double _alternatorGearEfficiency; + + public M05Impl(IM0_5_SmartAlternatorSetEfficiency m05, Volt powernetVoltage, double alternatorGearEfficiency) + { + //'sanity check + if (m05 == null) { + throw new ArgumentException("Please supply a valid module M05"); + } + + if (powernetVoltage < ElectricConstants.PowenetVoltageMin || powernetVoltage > ElectricConstants.PowenetVoltageMax) { + throw new ArgumentException("Powernet Voltage out of range"); + } + if (alternatorGearEfficiency < 0 || alternatorGearEfficiency > 1) { + throw new ArgumentException("AlternatorGearEfficiency Out of bounds, should be 0 to 1"); + } + + _m05 = m05; + _powerNetVoltage = powernetVoltage; + _alternatorGearEfficiency = alternatorGearEfficiency; + } + + #region Implementation of IM5_SmartAlternatorSetGeneration + + public Watt AlternatorsGenerationPowerAtCrankIdleWatts() + { + return _m05.SmartIdleCurrent * _powerNetVoltage * + (1 / (_m05.AlternatorsEfficiencyIdleResultCard * _alternatorGearEfficiency)); + } + + public Watt AlternatorsGenerationPowerAtCrankTractionOnWatts() + { + return _m05.SmartTractionCurrent * _powerNetVoltage * + (1 / (_m05.AlternatorsEfficiencyTractionOnResultCard * _alternatorGearEfficiency)); + } + + public Watt AlternatorsGenerationPowerAtCrankOverrunWatts() + { + return _m05.SmartOverrunCurrent * _powerNetVoltage * + (1 / (_m05.AlternatorsEfficiencyOverrunResultCard * _alternatorGearEfficiency)); + } + + #endregion + } +} diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M06Impl.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M06Impl.cs new file mode 100644 index 0000000000..37afc61473 --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M06Impl.cs @@ -0,0 +1,173 @@ +using TUGraz.VectoCommon.Utils; +using VectoAuxiliaries; +using VectoAuxiliaries.DownstreamModules; +using VectoAuxiliaries.Electrics; +using VectoAuxiliaries.Hvac; +using VectoAuxiliaries.Pneumatics; + +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + public class M06Impl : AbstractModule, IM6 + { + protected bool _overrunFlag; + protected bool _smartElecAndPneumaticsCompressorFlag; + protected Watt _smartElecAndPneumaticAltPowerGenAtCrank; + protected Watt _smartElecAndPneumaticAirCompPowerGenAtCrank; + protected Watt _smartElecOnlyAltPowerGenAtCrank; + protected Watt _averagePowerDemandAtCrankFromPneumatics; + protected Watt _smartPneumaticOnlyAirCompPowerGenAtCrank; + protected Watt _avgPowerDemandAtCrankFromElectricsIncHVAC; + protected bool _smartPneumaticsOnlyCompressorFlag; + + protected IM1_AverageHVACLoadDemand _m1; + protected IM2_AverageElectricalLoadDemand _m2; + protected IM3_AveragePneumaticLoadDemand _m3; + protected IM4_AirCompressor _m4; + protected IM5_SmartAlternatorSetGeneration _m5; + protected ISignals _signals; + + public M06Impl( + IM1_AverageHVACLoadDemand m1, IM2_AverageElectricalLoadDemand m2, IM3_AveragePneumaticLoadDemand m3, + IM4_AirCompressor m4, IM5_SmartAlternatorSetGeneration m5, ISignals signals) + { + _m1 = m1; + _m2 = m2; + _m3 = m3; + _m4 = m4; + _m5 = m5; + _signals = signals; + } + + protected override void DoCalculate() + { + var sum1 = _m1.AveragePowerDemandAtCrankFromHVACElectricsWatts() + _m2.GetAveragePowerAtCrankFromElectrics(); + var sw1 = _signals.SmartElectrics ? _m5.AlternatorsGenerationPowerAtCrankTractionOnWatts() : sum1; + var sum2 = _m1.AveragePowerDemandAtCrankFromHVACMechanicalsWatts() + sw1 + + _m3.GetAveragePowerDemandAtCrankFromPneumatics(); + var sum3 = _signals.EngineMotoringPower + _signals.InternalEnginePower + sum2; + var vc0 = sum3 <= 0; + + var sum4 = sum3 - sw1 - _m3.GetAveragePowerDemandAtCrankFromPneumatics() + _m4.GetPowerCompressorOff(); + var sum5 = vc0 ? sum4 : 0.SI<Watt>(); + var sum10 = _m5.AlternatorsGenerationPowerAtCrankOverrunWatts() * -1.0; + var max1 = sum5 > sum10 ? sum5 : sum10; + var sum11 = sum5 - max1; + var sum12 = _m4.GetPowerDifference() + sum11; + var vc2 = sum12 < 0 || sum12.IsEqual(0); + + var vc1 = sum12 > 0; + var sum14 = vc1 ? _m4.GetPowerCompressorOff() : 0.SI<Watt>(); + var sum15 = vc2 ? _m4.GetPowerCompressorOn() * _signals.PneumaticOverrunUtilisation : 0.SI<Watt>(); + var sum16 = sum14 + sum15; + + var sum6 = sum4 - _m4.GetPowerCompressorOff() + _m3.GetAveragePowerDemandAtCrankFromPneumatics(); + var sum7 = vc0 ? sum6 : 0.SI<Watt>(); + var max2 = sum7 > sum10 ? sum7 : sum10; + + var sum8 = sum4 + sw1; + var sum9 = vc0 ? sum8 : 0.SI<Watt>(); + var sum13 = sum9 + _m4.GetPowerDifference(); + var vc3 = sum13 > 0; + var vc4 = sum13 < 0 || sum13.IsEqual(0); + var sum17 = vc3 ? _m4.GetPowerCompressorOff() : 0.SI<Watt>(); + var sum18 = vc4 ? _m4.GetPowerCompressorOn() * _signals.PneumaticOverrunUtilisation : 0.SI<Watt>(); + var sum19 = sum17 + sum18; + + _overrunFlag = vc0; + _smartElecAndPneumaticsCompressorFlag = vc2; + _smartElecAndPneumaticAltPowerGenAtCrank = max1 * -1; + _smartElecAndPneumaticAirCompPowerGenAtCrank = sum16; + _smartElecOnlyAltPowerGenAtCrank = max2 * -1; + _averagePowerDemandAtCrankFromPneumatics = _m3.GetAveragePowerDemandAtCrankFromPneumatics(); + _smartPneumaticOnlyAirCompPowerGenAtCrank = sum19; + _avgPowerDemandAtCrankFromElectricsIncHVAC = sum1; + _smartPneumaticsOnlyCompressorFlag = vc4; + } + + #region Implementation of IM6 + + public bool OverrunFlag + { + get { + if (!calculationValid) { + Calculate(); + } + return _overrunFlag; + } + } + + public bool SmartElecAndPneumaticsCompressorFlag + { + get { + if (!calculationValid) { + Calculate(); + } + return _smartElecAndPneumaticsCompressorFlag; } + } + + public Watt SmartElecAndPneumaticAltPowerGenAtCrank + { + get { + if (!calculationValid) { + Calculate(); + } + return _smartElecAndPneumaticAltPowerGenAtCrank; } + } + + public Watt SmartElecAndPneumaticAirCompPowerGenAtCrank + { + get { + if (!calculationValid) { + Calculate(); + } + return _smartElecAndPneumaticAirCompPowerGenAtCrank; } + } + + public Watt SmartElecOnlyAltPowerGenAtCrank + { + get { + if (!calculationValid) { + Calculate(); + } + return _smartElecOnlyAltPowerGenAtCrank; } + } + + public Watt AveragePowerDemandAtCrankFromPneumatics + { + get { + if (!calculationValid) { + Calculate(); + } + return _averagePowerDemandAtCrankFromPneumatics; } + } + + public Watt SmartPneumaticOnlyAirCompPowerGenAtCrank + { + get { + if (!calculationValid) { + Calculate(); + } + return _smartPneumaticOnlyAirCompPowerGenAtCrank; } + } + + public Watt AvgPowerDemandAtCrankFromElectricsIncHVAC + { + get { + if (!calculationValid) { + Calculate(); + } + return _avgPowerDemandAtCrankFromElectricsIncHVAC; } + } + + public bool SmartPneumaticsOnlyCompressorFlag + { + get { + if (!calculationValid) { + Calculate(); + } + return _smartPneumaticsOnlyCompressorFlag; } + } + + #endregion + } +} diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M07Impl.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M07Impl.cs new file mode 100644 index 0000000000..4c897e1669 --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M07Impl.cs @@ -0,0 +1,94 @@ +using TUGraz.VectoCommon.Utils; +using VectoAuxiliaries; +using VectoAuxiliaries.DownstreamModules; +using VectoAuxiliaries.Electrics; + +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + public class M07Impl : AbstractModule, IM7 + { + protected Watt _smartElectricalAndPneumaticAuxAltPowerGenAtCrank; + protected Watt _smartElectricalAndPneumaticAuxAirCompPowerGenAtCrank; + protected Watt _smartElectricalOnlyAuxAltPowerGenAtCrank; + protected Watt _smartPneumaticOnlyAuxAirCompPowerGenAtCrank; + + protected IM5_SmartAlternatorSetGeneration _m5; + protected IM6 _m6; + protected ISignals _signals; + + public M07Impl(IM5_SmartAlternatorSetGeneration m5, IM6 m6, ISignals signals) + { + _m5 = m5; + _m6 = m6; + _signals = signals; + } + + protected override void DoCalculate() + { + var idle = _signals.EngineSpeed <= _signals.EngineIdleSpeed && + (!_signals.ClutchEngaged || _signals.InNeutral); + + var sw1 = idle + ? _m5.AlternatorsGenerationPowerAtCrankIdleWatts() + : _m5.AlternatorsGenerationPowerAtCrankTractionOnWatts(); + + var c1 = _m6.OverrunFlag && _signals.ClutchEngaged && _signals.InNeutral == false; + var sw2 = c1 ? _m6.SmartElecAndPneumaticAltPowerGenAtCrank : sw1; + + var sw3 = c1 ? _m6.SmartElecAndPneumaticAirCompPowerGenAtCrank : _m6.AveragePowerDemandAtCrankFromPneumatics; + + var sw4 = c1 ? _m6.SmartElecOnlyAltPowerGenAtCrank : sw1; + + var sw5 = c1 ? _m6.SmartPneumaticOnlyAirCompPowerGenAtCrank : _m6.AveragePowerDemandAtCrankFromPneumatics; + + _smartElectricalAndPneumaticAuxAltPowerGenAtCrank = sw2; + _smartElectricalAndPneumaticAuxAirCompPowerGenAtCrank = sw3; + _smartElectricalOnlyAuxAltPowerGenAtCrank = sw4; + _smartPneumaticOnlyAuxAirCompPowerGenAtCrank = sw5; + } + + #region Implementation of IM7 + + public Watt SmartElectricalAndPneumaticAuxAltPowerGenAtCrank + { + get { + if (!calculationValid) { + Calculate(); + } + return _smartElectricalAndPneumaticAuxAltPowerGenAtCrank; + } + } + + public Watt SmartElectricalAndPneumaticAuxAirCompPowerGenAtCrank + { + get { + if (!calculationValid) { + Calculate(); + } + return _smartElectricalAndPneumaticAuxAirCompPowerGenAtCrank; + } + } + + public Watt SmartElectricalOnlyAuxAltPowerGenAtCrank + { + get { + if (!calculationValid) { + Calculate(); + } + return _smartElectricalOnlyAuxAltPowerGenAtCrank; + } + } + + public Watt SmartPneumaticOnlyAuxAirCompPowerGenAtCrank + { + get { + if (!calculationValid) { + Calculate(); + } + return _smartPneumaticOnlyAuxAirCompPowerGenAtCrank; + } + } + + #endregion + } +} diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M08Impl.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M08Impl.cs new file mode 100644 index 0000000000..37a899b30b --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M08Impl.cs @@ -0,0 +1,83 @@ +using TUGraz.VectoCommon.Utils; +using VectoAuxiliaries; +using VectoAuxiliaries.DownstreamModules; +using VectoAuxiliaries.Hvac; + +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + public class M08Impl : AbstractModule, IM8 + { + protected Watt _auxPowerAtCrankFromElectricalHVACAndPneumaticsAncillaries; + protected Watt _smartElectricalAlternatorPowerGenAtCrank; + protected bool _compressorFlag; + + protected IM1_AverageHVACLoadDemand _m1; + protected IM6 _m6; + protected IM7 _m7; + protected ISignals _signals; + + public M08Impl(IM1_AverageHVACLoadDemand m1, IM6 m6, IM7 m7, ISignals signals) + { + _m1 = m1; + _m6 = m6; + _m7 = m7; + _signals = signals; + } + + + protected override void DoCalculate() + { + var sum1 = _m7.SmartElectricalAndPneumaticAuxAltPowerGenAtCrank + + _m7.SmartElectricalAndPneumaticAuxAirCompPowerGenAtCrank; + var sum2 = _m7.SmartElectricalOnlyAuxAltPowerGenAtCrank + _m6.AveragePowerDemandAtCrankFromPneumatics; + var sum3 = _m7.SmartPneumaticOnlyAuxAirCompPowerGenAtCrank + _m6.AvgPowerDemandAtCrankFromElectricsIncHVAC; + var sum4 = _m6.AvgPowerDemandAtCrankFromElectricsIncHVAC + _m6.AveragePowerDemandAtCrankFromPneumatics; + var sw1 = _signals.SmartPneumatics ? sum1 : sum2; + var sw2 = _signals.SmartPneumatics ? sum3 : sum4; + var sw5 = _signals.SmartElectrics ? sw1 : sw2; + var sw6 = !_signals.EngineStopped; + var sum5 = _m1.AveragePowerDemandAtCrankFromHVACMechanicalsWatts() + sw5; + var sum6 = sw6 ? sum5 : 0.SI<Watt>(); + + var sw3 = _signals.SmartPneumatics ? _m7.SmartElectricalAndPneumaticAuxAltPowerGenAtCrank : + _m7.SmartElectricalOnlyAuxAltPowerGenAtCrank; + + var sw4 = _signals.SmartElectrics ? _m6.SmartElecAndPneumaticsCompressorFlag : _m6.SmartPneumaticsOnlyCompressorFlag; + + _auxPowerAtCrankFromElectricalHVACAndPneumaticsAncillaries = sum6; + _smartElectricalAlternatorPowerGenAtCrank = sw3; + _compressorFlag = sw4; + } + + #region Implementation of IM8 + + public Watt AuxPowerAtCrankFromElectricalHVACAndPneumaticsAncillaries + { + get { + if (!calculationValid) { + Calculate(); + } + return _auxPowerAtCrankFromElectricalHVACAndPneumaticsAncillaries; } + } + + public Watt SmartElectricalAlternatorPowerGenAtCrank + { + get { + if (!calculationValid) { + Calculate(); + } + return _smartElectricalAlternatorPowerGenAtCrank; } + } + + public bool CompressorFlag + { + get { + if (!calculationValid) { + Calculate(); + } + return _compressorFlag; } + } + + #endregion + } +} diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M09Impl.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M09Impl.cs new file mode 100644 index 0000000000..162f4fbea6 --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M09Impl.cs @@ -0,0 +1,136 @@ +using System; +using TUGraz.VectoCommon.Utils; +using VectoAuxiliaries; +using VectoAuxiliaries.DownstreamModules; +using VectoAuxiliaries.Hvac; +using VectoAuxiliaries.Pneumatics; + +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + public class M09Impl : AbstractModule, IM9 + { + + #region "Aggregates" + + //'AG1 + protected NormLiter _LitresOfAirCompressorOnContinuallyAggregate; + + //'AG2 + protected NormLiter _LitresOfAirCompressorOnOnlyInOverrunAggregate; + + //'AG3 + protected Kilogram _TotalCycleFuelConsumptionCompressorOffContinuouslyAggregate; + + //'AG4 + protected Kilogram _TotalCycleFuelConsumptionCompressorOnContinuouslyAggregate; + + #endregion + + protected IM1_AverageHVACLoadDemand M1; + protected IM4_AirCompressor M4; + protected IM6 M6; + protected IM8 M8; + protected IFuelConsumptionMap FMAP; + protected IPneumaticsAuxilliariesConfig PSAC; + protected ISignals Signals; + + public M09Impl(IM1_AverageHVACLoadDemand m1, IM4_AirCompressor m4, IM6 m6, IM8 m8, IFuelConsumptionMap fmap, IPneumaticsAuxilliariesConfig psac, ISignals signals) + { + M1 = m1; + M4 = m4; + M6 = m6; + M8 = m8; + FMAP = fmap; + PSAC = psac; + Signals = signals; + ClearAggregates(); + } + + + #region Implementation of IAuxiliaryEvent + + public event IAuxiliaryEvent.AuxiliaryEventEventHandler AuxiliaryEvent; + + #endregion + + #region Implementation of IM9 + + public void ClearAggregates() + { + _LitresOfAirCompressorOnContinuallyAggregate = 0.SI<NormLiter>(); + _LitresOfAirCompressorOnOnlyInOverrunAggregate = 0.SI<NormLiter>(); + _TotalCycleFuelConsumptionCompressorOffContinuouslyAggregate = 0.SI<Kilogram>(); + _TotalCycleFuelConsumptionCompressorOnContinuouslyAggregate = 0.SI<Kilogram>(); + } + + protected PerSecond S0(PerSecond rpm) + { + if (rpm < 1) { + rpm = 1.RPMtoRad(); + } + + return rpm; + } + + public void CycleStep(Second stepTimeInSeconds) + { + if (Signals.EngineStopped) { + return; + } + + var s9 = M6.OverrunFlag && M8.CompressorFlag ? M4.GetFlowRate() : 0.SI<NormLiterPerSecond>(); + var s13 = Signals.ClutchEngaged && !(Signals.InNeutral) ? s9 : 0.SI<NormLiterPerSecond>(); + var s10 = s13 * PSAC.OverrunUtilisationForCompressionFraction; + + if (S0(Signals.EngineSpeed).IsEqual(0)) { + throw new DivideByZeroException("Engine speed is zero and cannot be used as a divisor."); + } + + var s1 = M6.AvgPowerDemandAtCrankFromElectricsIncHVAC + M1.AveragePowerDemandAtCrankFromHVACMechanicalsWatts(); + var s2 = M4.GetPowerCompressorOn() / S0(Signals.EngineSpeed); + var s3 = M4.GetPowerCompressorOff() / S0(Signals.EngineSpeed); + var s4 = s1 / S0(Signals.EngineSpeed); + var s14 = Signals.EngineDrivelineTorque + + Signals.PreExistingAuxPower / S0(Signals.EngineSpeed); + var s5 = s2 + s14; + var s6 = s14 + s3; + var s7 = s4 + s5; + var s8 = s4 + s6; + + var int1 = FMAP.GetFuelConsumption(s7, Signals.EngineSpeed); + int1 = int1 > 0 && !double.IsNaN(int1.Value()) ? int1 : 0.SI<KilogramPerSecond>(); + var s11 = int1; + + var int2 = FMAP.GetFuelConsumption(s8, Signals.EngineSpeed); + int2 = int2 > 0 && !double.IsNaN(int2.Value()) ? int2 : 0.SI<KilogramPerSecond>(); + var s12 = int2; + + _LitresOfAirCompressorOnContinuallyAggregate += M4.GetFlowRate() * stepTimeInSeconds; + _LitresOfAirCompressorOnOnlyInOverrunAggregate += s10 * stepTimeInSeconds; + _TotalCycleFuelConsumptionCompressorOnContinuouslyAggregate += s11 * stepTimeInSeconds; + _TotalCycleFuelConsumptionCompressorOffContinuouslyAggregate += s12 * stepTimeInSeconds; + } + + public NormLiter LitresOfAirCompressorOnContinually + { + get { return _LitresOfAirCompressorOnContinuallyAggregate; } + } + + public NormLiter LitresOfAirCompressorOnOnlyInOverrun + { + get { return _LitresOfAirCompressorOnOnlyInOverrunAggregate; } + } + + public Kilogram TotalCycleFuelConsumptionCompressorOnContinuously + { + get { return _TotalCycleFuelConsumptionCompressorOnContinuouslyAggregate; } + } + + public Kilogram TotalCycleFuelConsumptionCompressorOffContinuously + { + get { return _TotalCycleFuelConsumptionCompressorOffContinuouslyAggregate; } + } + + #endregion + } +} diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M0_5Impl.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M0_5Impl.cs new file mode 100644 index 0000000000..6a22571a85 --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M0_5Impl.cs @@ -0,0 +1,105 @@ +using System; +using TUGraz.VectoCommon.Utils; +using VectoAuxiliaries; +using VectoAuxiliaries.DownstreamModules.Electrics; +using VectoAuxiliaries.Electrics; + +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + public class M0_5Impl : AbstractModule, IM0_5_SmartAlternatorSetEfficiency + { + protected Ampere _smartIdleCurrent; + protected double _alternatorsEfficiencyIdleResultCard; + protected Ampere _smartTractionCurrent; + protected double _alternatorsEfficiencyTractionOnResultCard; + protected Ampere _smartOverrunCurrent; + protected double _alternatorsEfficiencyOverrunResultCard; + protected IM0_NonSmart_AlternatorsSetEfficiency _m0; + protected IElectricalConsumerList _electricalConsumables; + protected IAlternatorMap _alternatorMap; + protected IResultCard _resultCardIdle; + protected IResultCard _resultCardTraction; + protected IResultCard _resultCardOverrun; + protected ISignals _signals; + + public M0_5Impl(IM0_NonSmart_AlternatorsSetEfficiency m0, IElectricalConsumerList electricalConsumables, IAlternatorMap alternatorMap, IResultCard resultCardIdle, IResultCard resultCardTraction, IResultCard resultCardOverrun, ISignals signals) + { + //'Sanity Check on supplied arguments, throw an argument exception + if (m0 == null) { + throw new ArgumentException("Module 0 must be supplied");} + + if (electricalConsumables == null) { + throw new ArgumentException("ElectricalConsumablesList must be supplied even if empty"); + } + if (alternatorMap ==null) {throw new ArgumentException("Must supply a valid alternator map"); + } + if (resultCardIdle == null) { + throw new ArgumentException("Result Card 'IDLE' must be supplied even if it has no contents"); + } + + if (resultCardTraction == null) { + throw new ArgumentException("Result Card 'TRACTION' must be supplied even if it has no contents"); + } + + if (resultCardOverrun == null) { + throw new ArgumentException("Result Card 'OVERRUN' must be supplied even if it has no contents"); + } + if (signals == null) { + throw new ArgumentException("No Signals Reference object was provided ");} + + //'Assignments to private variables. + _m0 = m0; + _electricalConsumables = electricalConsumables; + _alternatorMap = alternatorMap; + _resultCardIdle = resultCardIdle; + _resultCardTraction = resultCardTraction; + _resultCardOverrun = resultCardOverrun; + _signals = signals; + } + + #region Implementation of IM0_5_SmartAlternatorSetEfficiency + + private Ampere HvacPlusNonBaseCurrents() + { + //'Stored Energy Efficience removed from V8.0 21/4/15 by Mike Preston //tb + return _m0.GetHVACElectricalPowerDemandAmps + _electricalConsumables.GetTotalAverageDemandAmps(true); //'/ElectricConstants.StoredEnergyEfficiency) + } + + public Ampere SmartIdleCurrent + { + get { + var hvac_Plus_None_Base = HvacPlusNonBaseCurrents(); + var smart_idle_current = _resultCardIdle.GetSmartCurrentResult(hvac_Plus_None_Base); + + return smart_idle_current; + } + } + + public double AlternatorsEfficiencyIdleResultCard + { + get { return _alternatorMap.GetEfficiency(_signals.EngineSpeed.AsRPM, SmartIdleCurrent).Efficiency; } + } + + public Ampere SmartTractionCurrent + { + get { return _resultCardTraction.GetSmartCurrentResult(HvacPlusNonBaseCurrents()); } + } + + public double AlternatorsEfficiencyTractionOnResultCard + { + get { return _alternatorMap.GetEfficiency(_signals.EngineSpeed.AsRPM, SmartTractionCurrent).Efficiency; } + } + + public Ampere SmartOverrunCurrent + { + get { return _resultCardOverrun.GetSmartCurrentResult(HvacPlusNonBaseCurrents()); } + } + + public double AlternatorsEfficiencyOverrunResultCard + { + get { return _alternatorMap.GetEfficiency(_signals.EngineSpeed.AsRPM, SmartOverrunCurrent).Efficiency; } + } + + #endregion + } +} diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M10Impl.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M10Impl.cs new file mode 100644 index 0000000000..8bd326904d --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M10Impl.cs @@ -0,0 +1,105 @@ +using System; +using TUGraz.VectoCommon.Utils; +using VectoAuxiliaries; +using VectoAuxiliaries.DownstreamModules; +using VectoAuxiliaries.Pneumatics; + +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + public class M10Impl : AbstractModule, IM10 + { + protected Kilogram _averageLoadsFuelConsumptionInterpolatedForPneumatics; + protected Kilogram _fuelConsumptionSmartPneumaticsAndAverageElectricalPowerDemand; + + protected IM3_AveragePneumaticLoadDemand M3; + + protected IM9 M9; + //'Not Currently used but there for ease of refactoring in future. + protected ISignals Signals; + + //'Aggregators + protected NormLiter _AverageAirConsumedLitre; + + + public M10Impl(IM3_AveragePneumaticLoadDemand m3, IM9 m9, ISignals signals) + { + M3 = m3; + M9 = m9; + Signals = signals; + _AverageAirConsumedLitre = 0.SI<NormLiter>(); + } + + protected enum InterpolationType + { + NonSmartPneumtaics, + SmartPneumtaics + } + + protected override void DoCalculate() + { + var intrp1 = Interpolate(InterpolationType.NonSmartPneumtaics); + var intrp2 = Interpolate(InterpolationType.SmartPneumtaics); + + _averageLoadsFuelConsumptionInterpolatedForPneumatics = intrp1; + _fuelConsumptionSmartPneumaticsAndAverageElectricalPowerDemand = intrp2; + } + + protected virtual Kilogram Interpolate(InterpolationType interpType) + { + var returnValue = 0.SI<Kilogram>(); + //' Dim x1,y1,x2,y2,x3,y3, xTA As Single + + var x1 = M9.LitresOfAirCompressorOnContinually; + var y1 = M9.TotalCycleFuelConsumptionCompressorOnContinuously; + var x2 = 0.SI<NormLiter>(); + var y2 = M9.TotalCycleFuelConsumptionCompressorOffContinuously; + var x3 = M9.LitresOfAirCompressorOnOnlyInOverrun; + var y3 = M9.TotalCycleFuelConsumptionCompressorOffContinuously; + + var xTA = _AverageAirConsumedLitre; //'m3.AverageAirConsumedPerSecondLitre + + switch (interpType) { + // 'Non-Smart Pneumatics ( OUT 1 ) + case InterpolationType.NonSmartPneumtaics: + //'returnValue = (y2 + (((y1 - y2) * xTA) / x1)) + returnValue = VectoMath.Interpolate(x1, x2, y1, y2, xTA); + break; + // 'Smart Pneumatics ( OUT 2 ) + case InterpolationType.SmartPneumtaics: + //'returnValue = (y3 + (((y1 - y3) / (x1 - x3)) * (xTA - x3))) + returnValue = VectoMath.Interpolate(x1, x3, y1, y3, xTA); + break; + default: throw new ArgumentOutOfRangeException(nameof(interpType), interpType, null); + } + + return returnValue; + } + + #region Implementation of IM10 + + public Kilogram AverageLoadsFuelConsumptionInterpolatedForPneumatics + { + get { + if (!calculationValid) { + Calculate(); + } + return _averageLoadsFuelConsumptionInterpolatedForPneumatics; } + } + + public Kilogram FuelConsumptionSmartPneumaticsAndAverageElectricalPowerDemand + { + get { + if (!calculationValid) { + Calculate(); + } + return _fuelConsumptionSmartPneumaticsAndAverageElectricalPowerDemand; } + } + + public void CycleStep(Second stepTimeInSeconds) + { + _AverageAirConsumedLitre += double.IsNaN(M3.AverageAirConsumedPerSecondLitre().Value()) ? 0.SI<NormLiter>() : M3.AverageAirConsumedPerSecondLitre() * stepTimeInSeconds; + } + + #endregion + } +} diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M11Impl.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M11Impl.cs new file mode 100644 index 0000000000..c24717ee08 --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M11Impl.cs @@ -0,0 +1,152 @@ +using TUGraz.VectoCommon.Utils; +using VectoAuxiliaries; +using VectoAuxiliaries.DownstreamModules; +using VectoAuxiliaries.Hvac; +using VectoAuxiliaries.Pneumatics; + +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + public class M11Impl : AbstractModule, IM11 + { + protected Joule _smartElectricalTotalCycleElectricalEnergyGeneratedDuringOverrunOnly; + protected Joule _smartElectricalTotalCycleEletricalEnergyGenerated; + protected Joule _totalCycleElectricalDemand; + protected Kilogram _totalCycleFuelConsumptionSmartElectricalLoad; + protected Kilogram _totalCycleFuelConsumptionZeroElectricalLoad; + protected Joule _stopStartSensitiveTotalCycleElectricalDemand; + protected Kilogram _totalCycleFuelConsuptionAverageLoads; + +#region "Private Aggregates" + protected Joule AG1; + protected Joule AG2; + protected Joule AG3; + protected Kilogram AG4; + protected Kilogram AG5; + protected Joule AG6; + protected Kilogram AG7; +#endregion + + protected IM1_AverageHVACLoadDemand M1; + protected IM3_AveragePneumaticLoadDemand M3; + protected IM6 M6; + protected IM8 M8; + protected IFuelConsumptionMap FMAP; + protected ISignals Signals; + + public M11Impl(IM1_AverageHVACLoadDemand m1, IM3_AveragePneumaticLoadDemand m3, IM6 m6, IM8 m8, IFuelConsumptionMap fmap, ISignals signals) + { + M1 = m1; + M3 = m3; + M6 = m6; + M8 = m8; + FMAP = fmap; + Signals = signals; + ClearAggregates(); + } + + #region Implementation of IM11 + + public Joule SmartElectricalTotalCycleElectricalEnergyGeneratedDuringOverrunOnly + { + get { return AG1; } + } + + public Joule SmartElectricalTotalCycleEletricalEnergyGenerated + { + get { return AG2; } + } + + public Joule TotalCycleElectricalDemand + { + get { return AG3; } + } + + public Kilogram TotalCycleFuelConsumptionSmartElectricalLoad + { + get { return AG4; } + } + + public Kilogram TotalCycleFuelConsumptionZeroElectricalLoad + { + get { return AG5; } + } + + public Joule StopStartSensitiveTotalCycleElectricalDemand + { + get { return AG6; } + } + + public Kilogram TotalCycleFuelConsuptionAverageLoads + { + get { return AG7; } + } + + public void ClearAggregates() + { + AG1 = 0.SI<Joule>(); + AG2 = 0.SI<Joule>(); + AG3 = 0.SI<Joule>(); + AG4 = 0.SI<Kilogram>(); + AG5 = 0.SI<Kilogram>(); + AG6 = 0.SI<Joule>(); + AG7 = 0.SI<Kilogram>(); + } + + protected PerSecond Sum0(PerSecond rpm) + { + if (rpm < 1) { + rpm = 1.RPMtoRad(); + } + + return rpm; // ' / RPM_to_RadiansPerSecond + } + + public void CycleStep(Second stepTimeInSeconds) + { + //'S/S Insensitive + AG3 += M6.AvgPowerDemandAtCrankFromElectricsIncHVAC * stepTimeInSeconds; + + + if (Signals.EngineStopped) { + return; + } + + // 'S/S Sensitive + + var sum1 = M6.OverrunFlag ? M8.SmartElectricalAlternatorPowerGenAtCrank : 0.SI<Watt>(); + AG1 += (sum1 * stepTimeInSeconds); + AG2 += (M8.SmartElectricalAlternatorPowerGenAtCrank * stepTimeInSeconds); + + AG6 += (M6.AvgPowerDemandAtCrankFromElectricsIncHVAC * stepTimeInSeconds); + + var sum2 = M3.GetAveragePowerDemandAtCrankFromPneumatics() + M1.AveragePowerDemandAtCrankFromHVACMechanicalsWatts(); + var sum3 = M8.SmartElectricalAlternatorPowerGenAtCrank / Sum0(Signals.EngineSpeed); + var sum4 = sum2 / Sum0(Signals.EngineSpeed); + var sum9 = Signals.EngineDrivelineTorque + + (Signals.PreExistingAuxPower / Sum0(Signals.EngineSpeed)); + var sum5 = sum4 + sum9; + var sum6 = sum3 + sum5; + var intrp1 = FMAP.GetFuelConsumption(sum6, Signals.EngineSpeed); + intrp1 = !double.IsNaN(intrp1.Value()) && intrp1 > 0 ? intrp1 : 0.SI<KilogramPerSecond>(); + var sum7 = intrp1; + + var intrp2 = FMAP.GetFuelConsumption(sum5, Signals.EngineSpeed); + intrp2 = !double.IsNaN(intrp2.Value()) && intrp2 > 0 ? intrp2 : 0.SI<KilogramPerSecond>(); + var sum8 = intrp2; + + var sum10 = M6.AvgPowerDemandAtCrankFromElectricsIncHVAC / Sum0(Signals.EngineSpeed); + var sum11 = sum5 + sum10; + var intrp3 = FMAP.GetFuelConsumption(sum11, Signals.EngineSpeed); + intrp3 = !double.IsNaN(intrp3.Value()) && intrp3 > 0 ? intrp3 : 0.SI<KilogramPerSecond>(); + var sum12 = intrp3; + + //'MQ: No longer needed - already per Second 'These need to be divided by 3600 as the Fuel + // Map output is in Grams / Second. + AG4 += sum7 * stepTimeInSeconds; // '/ 3600 + AG5 += sum8 * stepTimeInSeconds; // ' / 3600 + AG7 += sum12 * stepTimeInSeconds; // '/ 3600 + } + + #endregion + } +} diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M12Impl.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M12Impl.cs new file mode 100644 index 0000000000..ae8c057645 --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M12Impl.cs @@ -0,0 +1,111 @@ +using System; +using TUGraz.VectoCommon.Utils; +using VectoAuxiliaries; +using VectoAuxiliaries.DownstreamModules; + +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + public class M12Impl : AbstractModule, IM12 + { + protected IM11 M11; + protected IM10 M10; + protected ISignals Signals; + + protected Kilogram _fuelconsumptionwithsmartElectricsandAveragePneumaticPowerDemand; + protected Kilogram _baseFuelConsumptionWithTrueAuxiliaryLoads; + protected double _stopStartCorrection; + + public M12Impl(IM10 m10, IM11 m11, ISignals signals) + { + M10 = m10; + M11 = m11; + Signals = signals; + } + + private class Point + { + public Joule X; + public Kilogram Y; + } + + protected override void DoCalculate() + { + var p1 = new Point { X = 0.SI<Joule>(), Y = M11.TotalCycleFuelConsumptionZeroElectricalLoad }; + var p2 = new Point { + X = M11.SmartElectricalTotalCycleEletricalEnergyGenerated * Signals.StoredEnergyEfficiency, + Y = M11.TotalCycleFuelConsumptionSmartElectricalLoad + }; + + var ip5X = M11.TotalCycleElectricalDemand; + var tanTetaP2 = ((p2.Y - p1.Y).Value() / (p2.X - p1.X).Value()); + var ip5yP2 = (p1.Y.Value() + (tanTetaP2 * ip5X.Value())).SI<Kilogram>(); + + var interp1 = double.IsNaN(ip5yP2.Value()) ? 0.SI<Kilogram>() : ip5yP2; + + interp1 = !double.IsNaN(interp1.Value()) && M11.StopStartSensitiveTotalCycleElectricalDemand > 0 + ? interp1 + : M11.TotalCycleFuelConsumptionZeroElectricalLoad; + + _fuelconsumptionwithsmartElectricsandAveragePneumaticPowerDemand = interp1; + + var p3 = new Point { + X = M11.StopStartSensitiveTotalCycleElectricalDemand, + Y = M10.AverageLoadsFuelConsumptionInterpolatedForPneumatics + }; + + var tanTetaP3 = (p3.Y - p1.Y).Value() / (p3.X - p1.X).Value(); + + var ip5yP3 = p1.Y + (tanTetaP3 * ip5X.Value()).SI<Kilogram>(); + + var interp2 = double.IsNaN(ip5yP3.Value()) ? 0.SI<Kilogram>() : ip5yP3; + + interp2 = !double.IsNaN(interp2.Value()) && M11.StopStartSensitiveTotalCycleElectricalDemand > 0 + ? interp2 + : M10.AverageLoadsFuelConsumptionInterpolatedForPneumatics; + + _baseFuelConsumptionWithTrueAuxiliaryLoads = interp2; + + var stopStartCorrectionV = _baseFuelConsumptionWithTrueAuxiliaryLoads / + (M10.AverageLoadsFuelConsumptionInterpolatedForPneumatics > 0 + ? M10.AverageLoadsFuelConsumptionInterpolatedForPneumatics + : 1.SI<Kilogram>()); + + _stopStartCorrection = stopStartCorrectionV > 0 ? stopStartCorrectionV.Value() : 1; + } + + + #region Implementation of IM12 + + public Kilogram FuelconsumptionwithsmartElectricsandAveragePneumaticPowerDemand + { + get { + if (!calculationValid) { + Calculate(); + } + return _fuelconsumptionwithsmartElectricsandAveragePneumaticPowerDemand; + } + } + + public Kilogram BaseFuelConsumptionWithTrueAuxiliaryLoads + { + get { + if (!calculationValid) { + Calculate(); + } + return _baseFuelConsumptionWithTrueAuxiliaryLoads; + } + } + + public double StopStartCorrection + { + get { + if (!calculationValid) { + Calculate(); + } + return _stopStartCorrection; + } + } + + #endregion + } +} diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M13Impl.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M13Impl.cs new file mode 100644 index 0000000000..b6e08d7031 --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M13Impl.cs @@ -0,0 +1,58 @@ +using TUGraz.VectoCommon.Utils; +using VectoAuxiliaries; +using VectoAuxiliaries.DownstreamModules; + +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + + + public class M13Impl : AbstractModule, IM13 + { + protected IM10 M10; + protected IM11 M11; + protected IM12 M12; + protected ISignals Signals; + + private Kilogram _whtcTotalCycleFuelConsumptionGrams; + + public M13Impl(IM10 m10, IM11 m11, IM12 m12, ISignals signals) + { + M10 = m10; + M11 = m11; + M12 = m12; + Signals = signals; + } + + protected override void DoCalculate() + { + var sum1 = M11.TotalCycleFuelConsuptionAverageLoads * M12.StopStartCorrection; + var sum2 = M10.AverageLoadsFuelConsumptionInterpolatedForPneumatics * M12.StopStartCorrection; + var sum3 = M10.FuelConsumptionSmartPneumaticsAndAverageElectricalPowerDemand * M12.StopStartCorrection; + var sum4 = -M12.FuelconsumptionwithsmartElectricsandAveragePneumaticPowerDemand + sum1; + var sum5 = sum2 - sum3; + var sum6 = M12.BaseFuelConsumptionWithTrueAuxiliaryLoads - sum4; + var sum7 = M12.BaseFuelConsumptionWithTrueAuxiliaryLoads - sum5; + var sum8 = -sum4 + sum7; + var sw1 = Signals.SmartPneumatics? sum8: sum6; + var sw2 = Signals.SmartPneumatics ? sum3 : M12.BaseFuelConsumptionWithTrueAuxiliaryLoads; + var sw3 = Signals.SmartElectrics? sw1: sw2; + var sw4 = Signals.DeclarationMode ? Signals.WHTC : 1; + var sum9 = sw4 * sw3; + + _whtcTotalCycleFuelConsumptionGrams = sum9; + } + + #region Implementation of IM13 + + public Kilogram WHTCTotalCycleFuelConsumptionGrams + { + get { + if (!calculationValid) { + Calculate(); + } + return _whtcTotalCycleFuelConsumptionGrams; } + } + + #endregion + } +} diff --git a/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M14Impl.cs b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M14Impl.cs new file mode 100644 index 0000000000..04ca5e2985 --- /dev/null +++ b/VECTOAux/BusAuxiliaries/DownstreamModules/Impl/M14Impl.cs @@ -0,0 +1,68 @@ +using TUGraz.VectoCommon.Utils; +using VectoAuxiliaries; +using VectoAuxiliaries.DownstreamModules; +using VectoAuxiliaries.DownstreamModules.HVAC; +using VectoAuxiliaries.Hvac; + +namespace TUGraz.VectoCore.BusAuxiliaries.DownstreamModules.Impl +{ + public class M14Impl : AbstractModule, IM14 + { + protected IM13 M13; + protected ISignals Signals; + protected IHVACConstants Constants; + protected ISSMTOOL SSM; + + protected Kilogram _totalCycleFcGrams; + protected Liter _totalCycleFcLitres; + + public M14Impl(IM13 m13, ISSMTOOL ssm, IHVACConstants hvacConstants, ISignals signals) + { + M13 = m13; + SSM = ssm; + Constants = hvacConstants; + Signals = signals; + } + + + protected override void DoCalculate() + { + var s1 = M13.WHTCTotalCycleFuelConsumptionGrams * Constants.DieselGCVJperGram; + var s2 = SSM.GenInputs.AH_FuelEnergyToHeatToCoolant * s1; + var s3 = s2 * SSM.GenInputs.AH_CoolantHeatTransferredToAirCabinHeater; + var s4 = s3 / Signals.CurrentCycleTimeInSeconds.SI<Second>(); + var s5 = Signals.CurrentCycleTimeInSeconds.SI<Second>(); // ' / 3600 + var s6 = (s5 * SSM.FuelPerHBaseAsjusted(s4.Value() / 1000).SI(Unit.SI.Liter.Per.Hour)).Cast<Liter>() * Constants.FuelDensity; + var s7 = M13.WHTCTotalCycleFuelConsumptionGrams + s6; + var s8 = (s7 / (Constants.FuelDensity)).Cast<Liter>(); + _totalCycleFcGrams = s7; + _totalCycleFcLitres = s8; + + } + + + #region Implementation of IM14 + + public Kilogram TotalCycleFCGrams + { + get { + if (!calculationValid) { + Calculate(); + } + return _totalCycleFcGrams; + } + } + + public Liter TotalCycleFCLitres + { + get { + if (!calculationValid) { + Calculate(); + } + return _totalCycleFcLitres; + } + } + + #endregion + } +} diff --git a/VECTOAux/BusAuxiliaries/Properties/AssemblyInfo.cs b/VECTOAux/BusAuxiliaries/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..0efaa050d3 --- /dev/null +++ b/VECTOAux/BusAuxiliaries/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("BusAuxiliaries")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BusAuxiliaries")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("550d99d4-25f7-48d9-b0f0-e5dd6cb3485d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] -- GitLab