From 0366fa5cbe5eda6061a7702b11f2c20cb4a5e469 Mon Sep 17 00:00:00 2001
From: "Burns, Terry" <Terry.Burns@ricardo.com>
Date: Wed, 15 Apr 2015 07:58:23 +0000
Subject: [PATCH] V3,6/7of Model Complete + Events Included in Vecto from AA

1. BatteryEfficiency Renamed to Stored Energy Efficiency.

2.) Events from AA brought into Vecto.
      a.)  Compressor -Map Limiting Included.
      b.) SSMTOOL. AC Compressor inadequate.
            SSMTOOL. Fuel Fired Heating Enadequate.
      V06 and V07 of Model now included.






git-tfs-id: [http://tfs00.element.root.com:8080/tfs/TFSCollection]$/VECTO;C1888
---
 AdvancedAuxiliaryInterfaces/Enumerations.vb   |   6 +-
 .../IAdvancedAuxiliaries.vb                   |   6 +-
 VECTO/mAAUX_Global.vb                         | 126 +++++++++---------
 .../VectoAuxiliaries/AdvancedAuxiliaries.vb   |  12 +-
 .../Electrics/ElectricConstants.vb            |   2 +-
 .../M0_5_SmartAlternatorSetEfficiency.vb      |   2 +-
 .../M0_NonSmart_AlternatorsSetEfficiency.vb   |   2 +-
 .../M2_AverageElectricalLoadDemand.vb         |   2 +-
 VECTOAux/VectoAuxiliaries/Hvac/ISSMTOOL.vb    |   1 +
 VECTOAux/VectoAuxiliaries/Hvac/SSMTOOL.vb     |  85 +++++++++---
 .../Pneumatics/CompressorMap.vb               |  41 +++---
 11 files changed, 170 insertions(+), 115 deletions(-)

diff --git a/AdvancedAuxiliaryInterfaces/Enumerations.vb b/AdvancedAuxiliaryInterfaces/Enumerations.vb
index dbf9298dda..4430ca10ca 100644
--- a/AdvancedAuxiliaryInterfaces/Enumerations.vb
+++ b/AdvancedAuxiliaryInterfaces/Enumerations.vb
@@ -13,9 +13,9 @@
 
 Public Enum AdvancedAuxiliaryMessageType 
 
-   Information
-   Warning
-   Critical
+   Information=1
+   Warning=2
+   Critical=3
 
 
 End Enum
diff --git a/AdvancedAuxiliaryInterfaces/IAdvancedAuxiliaries.vb b/AdvancedAuxiliaryInterfaces/IAdvancedAuxiliaries.vb
index f24e0d2b80..1a2aeb25b9 100644
--- a/AdvancedAuxiliaryInterfaces/IAdvancedAuxiliaries.vb
+++ b/AdvancedAuxiliaryInterfaces/IAdvancedAuxiliaries.vb
@@ -10,7 +10,11 @@
 ' See the LICENSE.txt for the specific language governing permissions and limitations.
 
 Public Interface IAdvancedAuxiliaries
- Inherits IAuxiliaryEvent
+' Inherits IAuxiliaryEvent
+
+
+
+  Event AuxiliaryEvent( ByRef sender As Object, byval message As String, ByVal messageType As AdvancedAuxiliaryMessageType )
 
 
   'Information
diff --git a/VECTO/mAAUX_Global.vb b/VECTO/mAAUX_Global.vb
index 2ac4dcaccb..328a0af1e2 100644
--- a/VECTO/mAAUX_Global.vb
+++ b/VECTO/mAAUX_Global.vb
@@ -13,7 +13,7 @@ Module mAAUX_Global
   public PreExistingAuxPower As Single
   public Idle As Boolean
   public InNeutral As Boolean
-  Public advancedAuxModel As IAdvancedAuxiliaries
+  Public WithEvents advancedAuxModel As IAdvancedAuxiliaries
 
   Public RunningCalc As Boolean=false
 
@@ -23,61 +23,67 @@ Module mAAUX_Global
   'Doors during particular cycle types.
   Public CurrentCycleFile As string = String.Empty
 
-  'This is a default setting of 3114, but should be removed once coded in.
+  'This is a default setting of 3114 this will be set when the cycle begins.
   Public CycleTimeInSeconds As integer = 3114
 
+  Public Sub AAEventAuxiliaryEvent( ByRef sender As Object, byval message As String, ByVal messageType As AdvancedAuxiliaryMessageType ) Handles advancedAuxModel.AuxiliaryEvent
 
 
-'AA-TB
-Public Function InitialiseAdvancedAuxModel(  aauxFile As string) As Boolean
+     WorkerMsg(messageType,message, "Advanced Auxiliaries")
 
-     Dim o As System.Runtime.Remoting.ObjectHandle
-     Dim result As Boolean  = true
-
-    If VECTO_Global.VEC.AuxiliaryAssembly<>"CLASSIC"  then
-
-    Try
 
+  End Sub
 
-      'Open Assembly and invoke the validation using the paths supplied.
+ 'AA-TB
+  Public Function InitialiseAdvancedAuxModel(  aauxFile As string) As Boolean
+  
+       Dim o As System.Runtime.Remoting.ObjectHandle
+       Dim result As Boolean  = true
+  
+      If VECTO_Global.VEC.AuxiliaryAssembly<>"CLASSIC"  then
+  
       Try
-               o = Activator.CreateInstance(VEC.AuxiliaryAssembly, "VectoAuxiliaries.AdvancedAuxiliaries")
-               advancedAuxModel = DirectCast(o.Unwrap, IAdvancedAuxiliaries)
-
-               Dim message As String = String.Empty
-
-               'Set Statics
-               advancedAuxModel.VectoInputs.Cycle=DetermineCycleNameFromCurrentFile()
-               advancedAuxModel.VectoInputs.VehicleWeightKG= VEH.Mass
-               advancedAuxModel.VectoInputs.FuelMap= ENG.FuelMapFullPath 
-               
-               'Set Signals
-               advancedAuxModel.Signals.TotalCycleTimeSeconds=CycleTimeInSeconds
-               advancedAuxModel.RunStart( aauxFile, VEC.FilePath, message)
-
-            
-            Catch Ex As Exception
-    
-       result = false
-
+  
+  
+        'Open Assembly and invoke the validation using the paths supplied.
+        Try
+                 o = Activator.CreateInstance(VEC.AuxiliaryAssembly, "VectoAuxiliaries.AdvancedAuxiliaries")
+                 advancedAuxModel = DirectCast(o.Unwrap, IAdvancedAuxiliaries)
+  
+                 Dim message As String = String.Empty
+  
+                 'Set Statics
+                 advancedAuxModel.VectoInputs.Cycle=DetermineCycleNameFromCurrentFile()
+                 advancedAuxModel.VectoInputs.VehicleWeightKG= VEH.Mass
+                 advancedAuxModel.VectoInputs.FuelMap= ENG.FuelMapFullPath 
+                 
+                 'Set Signals
+                 advancedAuxModel.Signals.TotalCycleTimeSeconds=CycleTimeInSeconds
+                 advancedAuxModel.RunStart( aauxFile, VEC.FilePath, message)
+  
+  
+  
+              Catch Ex As Exception
+      
+         result = false
+  
+        End Try
+  
+        Return result
+  
+  
+      Catch ex As Exception
+  
+  
+  
       End Try
-
-      Return result
-
-
-    Catch ex As Exception
-
-
-
-    End Try
-
-
-    End If
-
-    Return False
-
-End Function
-
+  
+  
+      End If
+  
+      Return False
+  
+  End Function
 
   'AA-TB
   ''' <summary>
@@ -177,22 +183,22 @@ End Function
 
   End Function
 
-
-''' <summary>
+  
+  ''' <summary>
 ''' Gets location of Advanced Auxiliaries Directory which contains all the assemblies available.
 ''' </summary>
 ''' <returns>Path where Auxiliaries can be found : String</returns>
 ''' <remarks></remarks>
-Public Function GetAAUXSourceDirectory() As String
+  Public Function GetAAUXSourceDirectory() As String
 
 
      Return Path.GetDirectoryName(Application.ExecutablePath)
 
 
   End Function
-
-
- Public function ResolveAAUXFilePath( vectoPath as String, filename As string) as string
+  
+ 
+  Public function ResolveAAUXFilePath( vectoPath as String, filename As string) as string
 
      'No Vecto Path supplied
      If vectoPath="" then Return filename
@@ -207,9 +213,9 @@ Public Function GetAAUXSourceDirectory() As String
      End If
    
    End Function
-
-
-Public Function ValidateAAUXFile( ByVal absoluteAAuxPath As String, 
+  
+  
+  Public Function ValidateAAUXFile( ByVal absoluteAAuxPath As String, 
                                   ByVal assemblyName As String, 
                                   byval version As string, 
                                   byref message As string) As Boolean
@@ -241,14 +247,14 @@ Public Function ValidateAAUXFile( ByVal absoluteAAuxPath As String,
       Return result
 
 End Function
-
-
-''' <summary>
+  
+  
+  ''' <summary>
 ''' Will Apply an algorithm to the DRI cycle file being used and attempt to return a consitant name
 ''' </summary>
 ''' <returns>String : Cylename IE, Bus_Interurban, Bus_Urban,etc</returns>
 ''' <remarks></remarks>
-Public Function DetermineCycleNameFromCurrentFile() As String
+  Public Function DetermineCycleNameFromCurrentFile() As String
 
       'Get DriveFile without path and without extension
       Dim driveFile  As String  =  fFILE(CurrentCycleFile,False)
diff --git a/VECTOAux/VectoAuxiliaries/AdvancedAuxiliaries.vb b/VECTOAux/VectoAuxiliaries/AdvancedAuxiliaries.vb
index b26b673c25..267817c1a5 100644
--- a/VECTOAux/VectoAuxiliaries/AdvancedAuxiliaries.vb
+++ b/VECTOAux/VectoAuxiliaries/AdvancedAuxiliaries.vb
@@ -20,6 +20,7 @@ Public Class AdvancedAuxiliaries
  Implements IAdvancedAuxiliaries
 
 
+
     Private  auxConfig As AuxiliaryConfig
 
 
@@ -27,6 +28,9 @@ Public Class AdvancedAuxiliaries
     Private WithEvents compressorMap As ICompressorMap
    ' Private Withevents alternatorMap  As IAlternatorMap 
 
+     private WithEvents ssmTool As New SSMTOOL
+     Private WithEvents ssmToolModule14 As New SSMTOOL
+
     Private Withevents alternatorMap  As IAlternatorMap
     Private WithEvents actuationsMap As IPneumaticActuationsMAP
     Private WithEvents fuelMap       As IFUELMAP 
@@ -52,7 +56,7 @@ Public Class AdvancedAuxiliaries
     private vectoDirectory As String 
 
     'Event Handler top level bubble.
-    Public Sub VectoEventHandler( byref sender As Object, message As String, messageType As AdvancedAuxiliaryMessageType) handles compressorMap.AuxiliaryEvent, alternatorMap.AuxiliaryEvent
+    Public Sub VectoEventHandler( byref sender As Object, message As String, messageType As AdvancedAuxiliaryMessageType) handles compressorMap.AuxiliaryEvent, alternatorMap.AuxiliaryEvent, ssmTool.Message, ssmToolModule14.Message
 
 
     If Signals.AuxiliaryEventReportingLevel <= messageType then
@@ -115,11 +119,11 @@ Public Class AdvancedAuxiliaries
       'SSM HVAC
       Dim ssmPath as string = FilePathUtils.ResolveFilePath(vectoDirectory,auxConfig.HvacUserInputsConfig.SSMFilePath)
       Dim BusDatabase as String = FilePathUtils.ResolveFilePath(vectoDirectory,auxConfig.HvacUserInputsConfig.BusDatabasePath)     
-      Dim ssmTool As New SSMTOOL( ssmPath)
+      ssmTool = New SSMTOOL( ssmPath)
 
       'This duplicate SSM is being created for use in M14 as its properties will be dynamically changed at that point
       'to honour EngineWaste Heat Usage in Fueling calculations.
-      Dim ssmToolModule14 As New SSMTOOL( ssmPath)
+      ssmToolModule14 = New SSMTOOL( ssmPath)
 
 
       If( ssmTool.Load(ssmPath)=False OrElse ssmToolModule14.Load(ssmPath)=False)
@@ -188,7 +192,7 @@ End Sub
     Public Property Signals As ISignals Implements IAdvancedAuxiliaries.Signals
     Public Property VectoInputs As IVectoInputs Implements IAdvancedAuxiliaries.VectoInputs
 
-    Public Event AuxiliaryEvent(ByRef sender As Object, message As String, messageType As AdvancedAuxiliaryMessageType) Implements IAuxiliaryEvent.AuxiliaryEvent
+    Public Event AuxiliaryEvent(ByRef sender As Object, message As String, messageType As AdvancedAuxiliaryMessageType) Implements IAdvancedAuxiliaries.AuxiliaryEvent
 
     Public Function Configure(filePath As String, vectoFilePath As String ) As Boolean Implements VectoAuxiliaries.IAdvancedAuxiliaries.Configure
     
diff --git a/VECTOAux/VectoAuxiliaries/Electrics/ElectricConstants.vb b/VECTOAux/VectoAuxiliaries/Electrics/ElectricConstants.vb
index 0143204aa1..b398f7c690 100644
--- a/VECTOAux/VectoAuxiliaries/Electrics/ElectricConstants.vb
+++ b/VECTOAux/VectoAuxiliaries/Electrics/ElectricConstants.vb
@@ -31,7 +31,7 @@ Public Class ElectricConstants
     public const  AlternatorPulleyEfficiencyMax as single =1
 
     'Battery
-    Public Const BatteryEfficiency As Single = 0.9025
+    Public Const StoredEnergyEfficiency As Single = 0.9025
 
 
 End Class
diff --git a/VECTOAux/VectoAuxiliaries/Electrics/M0_5_SmartAlternatorSetEfficiency.vb b/VECTOAux/VectoAuxiliaries/Electrics/M0_5_SmartAlternatorSetEfficiency.vb
index e9004b9c27..09e7490d78 100644
--- a/VECTOAux/VectoAuxiliaries/Electrics/M0_5_SmartAlternatorSetEfficiency.vb
+++ b/VECTOAux/VectoAuxiliaries/Electrics/M0_5_SmartAlternatorSetEfficiency.vb
@@ -100,7 +100,7 @@ End Property
       <ExcludeFromCodeCoverage>
 Private function HvacPlusNonBaseCurrents() As Single
 
-   Return _m0.GetHVACElectricalPowerDemandAmps() + (_electricalConsumables.GetTotalAverageDemandAmps(true) /ElectricConstants.BatteryEfficiency)
+   Return _m0.GetHVACElectricalPowerDemandAmps() + (_electricalConsumables.GetTotalAverageDemandAmps(true) /ElectricConstants.StoredEnergyEfficiency)
 
 End Function
        
diff --git a/VECTOAux/VectoAuxiliaries/Electrics/M0_NonSmart_AlternatorsSetEfficiency.vb b/VECTOAux/VectoAuxiliaries/Electrics/M0_NonSmart_AlternatorsSetEfficiency.vb
index e972b39445..ad1fbddda6 100644
--- a/VECTOAux/VectoAuxiliaries/Electrics/M0_NonSmart_AlternatorsSetEfficiency.vb
+++ b/VECTOAux/VectoAuxiliaries/Electrics/M0_NonSmart_AlternatorsSetEfficiency.vb
@@ -53,7 +53,7 @@ Namespace Electrics
    Public ReadOnly Property  AlternatorsEfficiency As Single Implements IM0_NonSmart_AlternatorsSetEfficiency.AlternatorsEfficiency
 
      Get
-          Dim baseCurrentDemandAmps As Single = ( _electricalConsumersList.GetTotalAverageDemandAmps(false) /ElectricConstants.BatteryEfficiency)
+          Dim baseCurrentDemandAmps As Single = ( _electricalConsumersList.GetTotalAverageDemandAmps(false) /ElectricConstants.StoredEnergyEfficiency)
           Dim totalDemandAmps As Single = baseCurrentDemandAmps + GetHVACElectricalPowerDemandAmps
           Return _alternatorEfficiencyMap.GetEfficiency(_signals.EngineSpeed, totalDemandAmps).Efficiency
     End Get
diff --git a/VECTOAux/VectoAuxiliaries/Electrics/M2_AverageElectricalLoadDemand.vb b/VECTOAux/VectoAuxiliaries/Electrics/M2_AverageElectricalLoadDemand.vb
index 4076df4901..6aa6b21825 100644
--- a/VECTOAux/VectoAuxiliaries/Electrics/M2_AverageElectricalLoadDemand.vb
+++ b/VECTOAux/VectoAuxiliaries/Electrics/M2_AverageElectricalLoadDemand.vb
@@ -43,7 +43,7 @@ Namespace Electrics
         'Public class outputs (Properties)
         Public Function GetAveragePowerDemandAtAlternator() As Single Implements IM2_AverageElectricalLoadDemand.GetAveragePowerDemandAtAlternator
 
-             Return ( _electricalConsumers.GetTotalAverageDemandAmps(False)/ElectricConstants.BatteryEfficiency) * _powerNetVoltage
+             Return ( _electricalConsumers.GetTotalAverageDemandAmps(False)/ElectricConstants.StoredEnergyEfficiency) * _powerNetVoltage
 
         End Function
         Public Function GetAveragePowerAtCrankFromElectrics() As Single Implements IM2_AverageElectricalLoadDemand.GetAveragePowerAtCrankFromElectrics
diff --git a/VECTOAux/VectoAuxiliaries/Hvac/ISSMTOOL.vb b/VECTOAux/VectoAuxiliaries/Hvac/ISSMTOOL.vb
index 30e969ed7b..43ee2f4dbe 100644
--- a/VECTOAux/VectoAuxiliaries/Hvac/ISSMTOOL.vb
+++ b/VECTOAux/VectoAuxiliaries/Hvac/ISSMTOOL.vb
@@ -36,6 +36,7 @@ Function IsEqualTo(source As ISSMTOOL) As Boolean
 Function FuelPerHBaseAsjusted( AverageUseableEngineWasteHeatKW As Single ) As Single
 
 
+Event Message(ByRef sender As Object, message As String, messageType As AdvancedAuxiliaryMessageType)
 
 
 
diff --git a/VECTOAux/VectoAuxiliaries/Hvac/SSMTOOL.vb b/VECTOAux/VectoAuxiliaries/Hvac/SSMTOOL.vb
index de86d2a8ad..a9c93c0121 100644
--- a/VECTOAux/VectoAuxiliaries/Hvac/SSMTOOL.vb
+++ b/VECTOAux/VectoAuxiliaries/Hvac/SSMTOOL.vb
@@ -10,13 +10,17 @@ Namespace Hvac
 Public Class SSMTOOL
 Implements ISSMTOOL
 
-
-
+ 
  Private filePath As String
  Public Property GenInputs As ISSMGenInputs Implements ISSMTOOL.GenInputs
  Public Property TechList  As ISSMTechList  Implements ISSMTOOL.TechList
  Public Property Calculate As ISSMCalculate Implements ISSMTOOL.Calculate
 
+ 'Repeat Warning Flags
+ Private CompressorCapacityInsufficientWarned As Boolean 
+ Private FuelFiredHeaterInsufficientWarned As Boolean
+ 
+
  'Base Values
  Public ReadOnly Property ElectricalWBase As Single Implements ISSMTOOL.ElectricalWBase
     Get
@@ -25,12 +29,12 @@ Implements ISSMTOOL
  End Property
  Public ReadOnly Property MechanicalWBase As Single Implements ISSMTOOL.MechanicalWBase
     Get
-     Return  Calculate.MechanicalWBase
+        Return  Calculate.MechanicalWBase
     End Get
  End Property
  Public ReadOnly Property FuelPerHBase As Single Implements ISSMTOOL.FuelPerHBase
     Get
-      Return Calculate.FuelPerHBase
+        Return Calculate.FuelPerHBase
     End Get
  End Property
  'Adjusted Values
@@ -41,7 +45,19 @@ Implements ISSMTOOL
  End Property
  Public ReadOnly Property MechanicalWBaseAdjusted As Single Implements ISSMTOOL.MechanicalWBaseAdjusted
     Get
-      Return Calculate.MechanicalWBaseAdjusted
+        Dim mechAdjusted As Single  = Calculate.MechanicalWBaseAdjusted
+
+
+        If CompressorCapacityInsufficientWarned=False AndAlso (mechAdjusted)/(1000 * GenInputs.BC_COP)  > GenInputs.AC_CompressorCapacitykW then
+
+         OnMessage( Me, "HVAC SSM :AC-Compressor Capacity unable to service cooling, run continues as if capacity was sufficient.",AdvancedAuxiliaryMessageType.Warning)
+         CompressorCapacityInsufficientWarned=true
+
+        End If
+
+
+        Return mechAdjusted
+
      End Get
  End Property
  Public ReadOnly Property FuelPerHBaseAdjusted As Single Implements ISSMTOOL.FuelPerHBaseAdjusted
@@ -85,8 +101,6 @@ Implements ISSMTOOL
 
   End Sub
 
-
-
  'Persistance Functions
  Public Function Save(filePath As String) As Boolean Implements ISSMTOOL.Save
 
@@ -104,7 +118,7 @@ Implements ISSMTOOL
 
        Catch ex As Exception
 
-         'TODO:Do something meaningfull here perhaps logging
+         'Nothing to do except return false.
           returnValue = False
 
      End Try
@@ -143,7 +157,7 @@ End Function
 
       Catch ex As Exception
 
-        'TODO:Do something meaningfull here perhaps logging
+        'Nothing to do except return false.
 
          returnValue = False
       End Try
@@ -219,27 +233,58 @@ End Function
 
  End Function
 
+ 'Overrides
+ Public Overrides Function ToString() As String
+   
+
+     Dim sb As new StringBuilder 
+
+     sb.AppendLine( Calculate.ToString())
 
-        Public Overrides Function ToString() As String
-          
 
-            Dim sb As new StringBuilder 
+     Return sb.ToString()
+
+ End Function
+
+ 'Dynamicly Get Fuel having re-adjusted Engine Heat Waste, this was originally supposed to be Solid State. Late adjustment request 24/3/2015
+ Public Function FuelPerHBaseAsjusted(AverageUseableEngineWasteHeatKW As Single) As Single Implements ISSMTOOL.FuelPerHBaseAsjusted
 
-            sb.AppendLine( Calculate.ToString())
+    'Set Engine Waste Heat
+     GenInputs.AH_EngineWasteHeatkW= AverageUseableEngineWasteHeatKW
+     Dim fba As Single = FuelPerHBaseAdjusted
+     
+     Dim FuelFiredWarning As Boolean = fba * GenInputs.BC_AuxHeaterEfficiency * GenInputs.BC_VolumicMassDieselOrHeatingOil *  GenInputs.BC_GCVDieselOrHeatingOil*1000 > _
+                    ( AverageUseableEngineWasteHeatKW +  GenInputs.AH_FuelFiredHeaterkW ) 
 
 
-            Return sb.ToString()
+     If Not FuelFiredHeaterInsufficientWarned AndAlso FuelFiredWarning then
 
-        End Function
+        FuelFiredHeaterInsufficientWarned=true
 
+        OnMessage(Me,“ HVAC SSM : Fuel fired heater insufficient for heating requirements, run continues assuming it was sufficient.” ,AdvancedAuxiliaryMessageType.Warning )
 
-        Public Function FuelPerHBaseAsjusted(AverageUseableEngineWasteHeatKW As Single) As Single Implements ISSMTOOL.FuelPerHBaseAsjusted
+     End If
 
-           'Set Engine Waste Heat
-            GenInputs.AH_EngineWasteHeatkW= AverageUseableEngineWasteHeatKW
-            Return FuelPerHBaseAdjusted
 
-        End Function
+
+     Return fba
+
+ End Function
+
+ 'Events
+ Public Event Message(ByRef sender As Object, message As String, messageType As AdvancedAuxiliaryMessageType) Implements ISSMTOOL.Message 
+
+ 'Raise Message Event.
+ private Sub OnMessage(sender As Object, message As String, messageType As AdvancedAuxiliaryMessageType) 
+  
+  
+    If Not message is Nothing then
+  
+    RaiseEvent Message( Me, message, messageType)
+  
+    End If
+  
+  End Sub
 
 
 
diff --git a/VECTOAux/VectoAuxiliaries/Pneumatics/CompressorMap.vb b/VECTOAux/VectoAuxiliaries/Pneumatics/CompressorMap.vb
index 9759fcabcb..545a0cdc98 100644
--- a/VECTOAux/VectoAuxiliaries/Pneumatics/CompressorMap.vb
+++ b/VECTOAux/VectoAuxiliaries/Pneumatics/CompressorMap.vb
@@ -22,14 +22,9 @@ Namespace Pneumatics
         Implements ICompressorMap, 
         IAuxiliaryEvent
 
-
-
         Private ReadOnly filePath As String
-
         Private _averagePowerDemandPerCompressorUnitFlowRate As Single
-
-
-
+        Private _MapBoundariesExceeded As Boolean
 
         ''' <summary>
         ''' Dictionary of values keyed by the rpm valaues in the csv file
@@ -41,7 +36,6 @@ Namespace Pneumatics
         ''' <remarks></remarks>
         Private map As Dictionary(Of Integer, CompressorMapValues)
 
-
         'Returns the AveragePowerDemand ( Power On ) per unit flow rate
         Public Function AveragePowerDemandPerCompressorUnitFlowRate() As Single Implements ICompressorMap.GetAveragePowerDemandPerCompressorUnitFlowRate
 
@@ -153,7 +147,11 @@ Namespace Pneumatics
             Dim max As Integer = map.Keys.Max()
 
             If rpm < min OrElse rpm > max Then
-                OnMessage(Me,String.Format("Compresser has limited RPM of '{2}' to extent of map - rpm should be in the range {0} to {1}", min, max ,rpm), AdvancedAuxiliaryMessageType.Warning)    
+             If Not _MapBoundariesExceeded then
+                OnMessage(Me,String.Format("Compresser : limited RPM of '{2}' to extent of map - map range is {0} to {1}", min, max ,rpm), AdvancedAuxiliaryMessageType.Warning)    
+                _MapBoundariesExceeded=true
+            end if
+            
                'Limiting as agreed.
                If rpm > max then rpm=max
                If rpm < min then rpm=min
@@ -198,38 +196,39 @@ Namespace Pneumatics
         ''' </summary>
         ''' <remarks></remarks>
         ''' 
+
         Private Structure CompressorMapValues
 
-            ''' <summary>
+        ''' <summary>
             ''' Compressor flowrate
             ''' </summary>
             ''' <remarks></remarks>
-            Public ReadOnly FlowRate As Single
+        Public ReadOnly FlowRate As Single
 
-            ''' <summary>
+        ''' <summary>
             ''' Power, compressor on
             ''' </summary>
             ''' <remarks></remarks>
-            Public ReadOnly PowerCompressorOn As Single
+        Public ReadOnly PowerCompressorOn As Single
 
-            ''' <summary>
+        ''' <summary>
             ''' Power compressor off
             ''' </summary>
             ''' <remarks></remarks>
-            Public ReadOnly PowerCompressorOff As Single
+        Public ReadOnly PowerCompressorOff As Single
 
-            ''' <summary>
+        ''' <summary>
             ''' Creates a new instance of CompressorMapValues
             ''' </summary>
             ''' <param name="flowRate">flow rate</param>
             ''' <param name="powerCompressorOn">power - compressor on</param>
             ''' <param name="powerCompressorOff">power - compressor off</param>
             ''' <remarks></remarks>
-            Public Sub New(ByVal flowRate As Single, ByVal powerCompressorOn As Single, ByVal powerCompressorOff As Single)
+        Public Sub New(ByVal flowRate As Single, ByVal powerCompressorOn As Single, ByVal powerCompressorOff As Single)
                 Me.FlowRate = flowRate
                 Me.PowerCompressorOn = powerCompressorOn
                 Me.PowerCompressorOff = powerCompressorOff
-            End Sub
+        End Sub
 
         End Structure
 
@@ -237,7 +236,7 @@ Namespace Pneumatics
 
         Public Event Message(ByRef sender As Object, message As String, messageType As AdvancedAuxiliaryMessageType) Implements IAuxiliaryEvent.AuxiliaryEvent 
 
-        Public Sub OnMessage(sender As Object, message As String, messageType As AdvancedAuxiliaryMessageType) 
+        private Sub OnMessage(sender As Object, message As String, messageType As AdvancedAuxiliaryMessageType) 
 
 
           If Not message is Nothing then
@@ -247,11 +246,7 @@ Namespace Pneumatics
           End If
 
         End Sub
-    End Class
-
-
-
-
 
+    End Class
 
 End Namespace
\ No newline at end of file
-- 
GitLab