19. März 2020

Das Reporting-Objekt

Ab INOSIM 12 ist das Reporting-Objekt Bestandteil des Objektmodells. Es ermöglicht den Zugriff auf die Ergebnisberichte über Visual Basic und bietet dadurch vielfältige Optionen zur automatischen Erstellung und Nachbearbeitung der Ausgabe Ihrer Simulation mit INOSIM.

Dieser Tipp & Trick führt zunächst allgemein in die Anwendung des Reporting-Objekts und seiner verschiedenen Methoden ein. Weiterhin werden zwei seiner Methoden anhand eines Anwendungsbeispiels näher betrachtet.

Vorbereitung: Das EndSim-Ereignis

Falls Sie bereits mit dem EndSim-Ereignis vertraut sind, können Sie diesen Abschnitt übergehen.

Das Reporting-Objekt kann direkt während des EndSim-Ereignisses einer INOSIM Simulation verwendet werden. Öffnen Sie für den Zugriff auf das EndSim-Ereignis den INOSIM Basic-Editor.

Screenshot: Open Basic Editor in INOSIM

Erstellen Sie ein Makro, sofern noch nicht vorhanden.

Screenshot: Create a new Macro in INOSIM

Wählen Sie nun in Ihrem Makro im Objekt-Auswahlmenü den Punkt Simulation aus und im Proz-Auswahlmenü den Punkt EndSim. Die Auswahlmenüs finden Sie oberhalb des Makro-Sheets.

Screenshot: Access the EndSim Event as Subprocedure

Durch dieses Vorgehen erstellen Sie eine Private Sub-Anweisung namens Simulation_EndSim. Die Anweisung wird direkt zum Simulationsende aufgerufen und kann genutzt werden, um Ihre Ergebnisse auszuwerten und anzupassen.

Allgemeine Informationen

Das Reporting-Objekt lässt sich ausschließlich in einem EndSim-Ereignis einer Simulation aufrufen. Wenn Sie es ansprechen, haben Sie die Wahl zwischen verschiedenen Methoden. Die Methoden stimmen mit den Möglichkeiten für die Ergebnisberichte im INOSIM Ergebnismenü überein.

Screenshot: Method of the Reporting Object

Sie finden die Ergebnisberichte im INOSIM Hauptmenü.

Screenshot: INOSIM menu tabulated evaluation results

Die verschiedenen Methoden liefern dieselben Informationen wie die Ergebnisberichte, in einem ähnlichen Format. Je nach aufgerufener Methode erstellt das Reporting-Objekt ein Table-Objekt (bei Methoden, die Ergebnisberichten in einem Excel-Sheet entsprechen) oder ein Dictionary von Table-Objekten (bei Methoden, die Ergebnisberichten mit mehr als einem Excel-Sheet entsprechen).

Für jede dieser Methoden können Sie Start- und Enddatum für die Auswertung im Datumsformat der Simulation angeben. Das ermöglicht es Ihnen, Ein- und Auslaufzeiten Ihres Modells auszuschließen oder bestimmte Zeitspannen im Detail zu untersuchen. In der Voreinstellung entsprechen die Werte dem Start- und Enddatum eines Simulationslaufs.

Screenshot: Call a method of the reporting object in Basic

Je nach aufgerufener Methode können zusätzliche Eingabeparameter erforderlich sein. Detaillierte Informationen zu den einzelnen Methoden finden Sie in der INOSIM Anwenderdokumentation (Objektmodell -> Objekte-> Reporting-Objekt -> Methoden). Denken Sie daran, dass der entsprechende Ergebnisbericht Ihnen erschließen kann, welche Information von der jeweiligen Methode geliefert wird!

Das folgende Beispiel beschreibt einen Anwendungsfall, bei dem die Reporting-Objekt-Methoden UnitUtilization und ResourceAllocation genutzt werden, um benutzerdefinierte Auswertungen in Excel zu erzeugen.

Beispielfall: Beschreibung

Der folgende Beispielfall veranschaulicht die Funktionsweisen der UnitUtilization-Methode und der ResourceAllocation-Methode des Reporting-Objekts. Um die beschriebene Vorgehensweise nachzuvollziehen, können Sie das zugehörige Demo-Projekt am Ende der Seite herunterladen.

Im Beispiel ist ein zweistufiger Produktionsprozess modelliert. Die Anlage stellt drei ähnliche Produkte her, AB und C. Die Rezepte für diese Produkte unterscheiden sich lediglich hinsichtlich ihrer Dauer. In der ersten Stufe findet eine Reaktion statt. Dafür wird ein Pool aus zwei Reaktoren genutzt. Nach dieser Reaktion werden die Produkte in einen der drei Trockner weitergeleitet und weiterverarbeitet.

Screenshot: Layout of the example case study

Zusätzlich soll der Stromverbrauch der Anlage betrachtet werden. Dafür wird eine Ressource verwendet. Diese wird zum Rühren währen der Reaktion und für die Trocknung eingesetzt. Der Verbrauch variiert von Produkt zu Produkt. Die Produkte werden kampagnenweise hergestellt (siehe dazu die Auftragsliste).

Für die Analyse sollen die Auslastung aller Teilanlagen sowie der mittlere und maximale Verbrauch der Ressource ausgegeben werden. Darüber hinaus soll erfasst werden, wann die Ressource einen kritischen Wert von 30.000 Watt überschreitet.

Beispielfall: Einsatz des Reporting-Objekts

Zum Auslesen der Auslastungs-Ergebnisse wird die UnitUtilization-Methode genutzt. Diese fragt lediglich den gewünschten Auswertungszeitraum (Start- und Enddatum) als Eingabeparameter ab. Die Methode gibt ein Dictionary von zwei Table-Objekten aus. Das erste enthält die Ergebnisse für einzelne Teilanlagen. Es wird mit dem Verzeichnisschlüssel Units angesprochen. Das zweite Table-Objekt enthält die Ergebnisse für Teilanlagenpools. Es wird mit dem Schlüssel Unitpools angesprochen.

In einem ersten Schritt wird das Table-Objekt zur Belegung einzelner Teilanlagen in einer Variable gespeichert. Um die Ein- und Auslaufzeiten des Modells auszuschließen, wird das Startdatum auf einen Tag nach Simulationsstart und das Enddatum auf einen Tag vor Simulationsende gesetzt (SimDate im EndSim-Ereignis).

'Read report (excluding 1 day at start and 1 day at end of simulation) 
' and write to self-defined table variable
Dim d_Rep As Dictionary
Dim t_Utilization_Units As Table
Set d_Rep = Reporting.UnitUtilization(Simulation.RefDate+24*3600,Simulation.SimDate-24*3600)
Set t_Utilization_Units = d_Rep("Units")

Die resultierende Tabelle enthält alle Informationen, die auch in dem entsprechenden Ergebnisbericht vorhanden sind. Die erste Tabellenzeile wird als Spaltenindex genutzt und somit als Zeile 0 gespeichert. Ist der Spaltenindex aktiviert, können die einzelnen Spalten anhand ihrer Namen angesprochen werden (Eintrag in Zeile 0).

Die Auslastungszeiten sind in der Tabelle in Sekunden angegeben. Diese Maßeinheit soll bei der Neuberechnung in Stunden geändert werden. Weiterhin soll der Auslastungsanteil in Prozent angegeben werden. Um die Werte neu zu berechnen, wird eine Schleife durch alle Spalten aufgesetzt. Falls eine Spalte Zeitwerte (Spaltenüberschrift enthält Time) oder Zeitanteile (Spaltenüberschrift enthält Fraction) speichert, werden die Werte neu berechnet.

'Recalculate all time values to hours and all fractions to percentage

Dim row As Integer
Dim column As Integer

For column = 1 To t_Utilization_Units.ColumnCount
 If InStr(t_Utilization_Units(0,column),"Time")> 0 Then
  For row = 1 To t_Utilization_Units.RowCount
   t_Utilization_Units(row,column) = t_Utilization_Units(row,column)/3600
  Next
 ElseIf InStr(t_Utilization_Units(0,column),"Fraction")> 0 Then
  For row = 1 To t_Utilization_Units.RowCount
   t_Utilization_Units(row,column) = t_Utilization_Units(row,column)*100
  Next
 End If
Next

Am Ende wird die Tabelle mithilfe der write_table-Funktion in die Parameter-Arbeitsmappe geschrieben (siehe Tipp Table-Objekte anwenden).

'Write report to internal Excel sheet using the write_table 
' function provided by INOSIM (see Tip "Applying Table Objects")

Parameters.Sheets("Results").CellYX(1,1) = "Unit Utilization"
Write_Table(t_Utilization_Units,0,1,0,19,"Results",2,1)

Als zweites Ergebnis sollen Detailinformationen zum Stromverbrauch geliefert werden. Dafür wird die ResourceAllocation-Methode des Reporting-Objekts verwendet. Die Methode benötigt als Eingabeparameter die Ressource, die analysiert werden soll, und erzeugt als Ausgabe direkt ein Table-Objekt. Da wir den gesamten Simulationszeitraum analysieren möchten, kann die Parametereingabe von Start- und Enddatum ausgelassen werden.

'Read Reporting table and write to self-defined table variable

Dim t_Energy As Table
Set t_Energy = Reporting.ResourceAllocation(Resources("el Energy"),,)

Wiederum enthält die Tabelle ähnliche Informationen, wie sie in dem entsprechenden Ergebnisbericht gegeben werden. Sie listet alle Änderungen in der Ressourcenbelegung sowie die Zeiten, zu denen sie auftraten auf.

Default format of the Reporting objects ResourceAllocation table

In der erzeugten Tabelle wird das Datum als Simulationsdatum ausgegeben und die Zeitspalte entfällt (kann aber mithilfe des Datums leicht neu berechnet werden). Auch hier ist der Spaltenindex des Table-Objekts aktiviert.

Um den maximalen Verbrauch zu ermitteln, wird eine Schleife durch alle Zeilen verwendet. Der höchste Wert, der für einen Zeitschritt größer als Null aufgewendet worden ist, wird in der Variable Max gespeichert.

'Loop through table to find the maximum value of resource usage

Dim Max As Double
Dim Entries As Long
Max = 0
Entries = t_Energy.RowCount

For row = 1 To Entries
 If t_Energy(row,"Amount") > Max And t_Energy(row,"Date") <> t_Energy(row+1,"Date") Then
  Max = t_Energy(row,"Amount")
 End If
Next

Anschließend wird der mittlere Energieverbrauch berechnet, indem der letzte Eintrag in der Spalte CumulativeAmount (= Energie) durch die Simulationsdauer geteilt wird.

'Calculate mean value using cumulative amount divided by simulation time

Dim Mean As Double
Mean = t_Energy(Entries,"CumulativeAmount")/(Simulation.SimDate-Simulation.RefDate)

Als letzter Schritt erfolgt ein weiterer Loop durch die Tabelle, wobei erfasst wird, zu welchen Zeitpunkten ein Verbrauch von 30.000 Watt überschritten wurde. Die Variable dur_crit fasst zusammen, für wie lange ein solcher kritischer Wert nicht beibehalten werden kann.

'Calculate fraction of duration during which the critical
' amount of 30 000 Watt is exceeded

Dim dur_crit As Double
dur_crit = 0
For row = 1 To Entries
 If t_Energy(row,"Amount") > 30000 And t_Energy(row,"Date") <> t_Energy(row+1,"Date") Then
  dur_crit = dur_crit+(t_Energy(row+1,"Date") - t_Energy(row,"Date"))
 End If
Next

Abschließend werden die Ergebnisse in die Parameters-Arbeitsmappe übertragen.

'Write results to Excel

Parameters.Sheets("Results").CellYX(11,1) = "Resource Results: el Energy"

Parameters.Sheets("Results").CellYX(12,1) = "Max Value [W]"
Parameters.Sheets("Results").CellYX(13,1) = Max

Parameters.Sheets("Results").CellYX(12,2) = "Mean Value [W]"
Parameters.Sheets("Results").CellYX(13,2) = Mean

Parameters.Sheets("Results").CellYX(12,3) = "Fraction crit Value exceeded [%]"
Parameters.Sheets("Results").CellYX(13,3) = dur_crit/(Simulation.SimDate-Simulation.RefDate)*100

Downloads

(Nur für registrierte INOSIM Anwender)

  • Beispielprojekt
  • PDF-Ausdruck zu diesem Tipp & Trick

Fragen?

Möchten Sie mehr über dieses Thema erfahren oder haben weitere Fragen? Bitte kontaktieren Sie uns.

Array ( [posts_per_page] => 3 [post_type] => [category__in] => Array ( [0] => 171 ) [orderby] => rand [order] => ASC )

Mehr Tipps & Tricks

Erfahrenen Anwendenden von INOSIM ist bewusst, dass sie mit einer ereignisdiskreten Simulationssoftware arbeiten. Für die meisten dieser Ereignisse können VBA-Steuerungen aufgerufen werden, um das Simulationsverhalten…

Benutzerdefinierte Balken sind eine Neuerung in INOSIM 12. Sie ermöglichen die Anzeige von Prozessen, die nicht Teil der Simulation sind, in INOSIM Gantt. Somit können sie Daten…

Mit der neuen INOSIM 13 Version wurde der Basic-Editor umgestellt. So unterstützt dieser nun zusätzlich zu der WWB-COM auch die WWB.NET Sprachvariante, welche mit Visual…

mehr

INOSIM Kontakt

Zu den lokalen Geschäftszeiten

Deutschland +49 231 97 00 250

USA +1 214 663 3101

Indien +91 9766 331 092