8. März 2022

INOSIM 13 – WWB.NET vs. WWB-COM

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 Basic .NET kompatibel ist. Damit können auch .NET Bibliotheken in INOSIM verwendet werden. In der neuen INOSIM Version wird für die Sprache in Visual Basic deshalb jetzt standardmäßig WWB.NET verwendet. Bisher galt in INOSIM WWB-COM als Standardsprache für den Code in VBA.

Standardsprache bedeutet, dass bei Einfügen eines neuen Makros in ein Projekt die Standardsprache in dem jeweiligen Makro gesetzt wird. Bereits bestehende Makros sind davon nicht betroffen. Welche Sprache ein Makro verwendet, ist in der ersten Codezeile zu sehen:


Makro mit WWB-COM


Makro mit WWB.NET

Durch Ändern der ersten Codezeile kann so auch die verwendete Sprache für das entsprechende Makro umgestellt werden.

Welche Standardsprache für ein neues Makro verwendet wird, ist ebenfalls änderbar. Die Einstellung ist im INOSIM Basic-Editor unter Extras > Optionen zu finden:

Bei der Verwendung von WWB.NET müssen einige Unterschiede im Vergleich zu WWB-COM beachtet werden! Im Folgenden werden die wichtigsten Unterschiede dargestellt.

Set-Anweisung

In WWB-COM ist es erforderlich, dass bei der Zuordnung von Objekten ein Set genutzt wird. Diese Anweisung gibt es in WWB.NET nicht. Die Objektzuweisung erfolgt, wie auch bei anderen Zuordnungen von Variablen, mit einem einfachen Gleichheitszeichen.

Im folgenden Beispiel wird ein Produktionsauftrag erstellt. Für die Zuordnung eines Rezeptes, eines Materials und des neuen Auftrags zu der Auftrags-Variablen wird in WWB-COM hier ein Set benötigt, da es sich um Objekte handelt.

'#Language "WWB-COM"
Set o = New Order 'set because an object is assigned
o.Name = "Order"
Set o.Recipe = Recipes("Production (V1)") 'set because an object is assigned
Set o.Material = Materials("Produkt") 'set because an object is assigned
Orders.Add o

'#Language "WWB.NET"
o = New Order
o.Name = "Order"
o.Recipe = Recipes("Production (V1)")
o.Material = Materials("Produkt")
Orders.Add o

Events wie Simulation_Init

Bei Prozeduren (Subs), die bestimmte Events handhaben, muss dieses Event explizit angegeben werden. Beispiele für dieses geänderte Verhalten sind die Initialisierung der Simulation und die EndSim, also das Ende der Simulation.

Für die Initialisierung ändert sich der Code in WWB.NET im Vergleich zu WWB-COM wie folgt. Durch die explizite Angabe, welches Event diese Prozedur handhabt, ist es möglich, die Routine in WWB.NET umzubenennen.

'#Language "WWB-COM"
Private Sub Simulation_Init()

End Sub

'#Language "WWB.NET"
Private Sub Simulation_Init() Handles Simulation.Init
    
End Sub

IsEmpty/IsNull/IsObject

Die Funktionen IsEmpty, IsNull und IsObject gibt es in WWB.NET nicht. Mit der Funktion isEmpty kann in WWB-COM danach gefragt werden, ob einem Variant bereits ein Wert zugeordnet wurde. Ist noch kein Wert zugewiesen, so gibt die Funktion isEmpty den Wert False zurück. In WWB.NET gibt es den Typ Variant nicht, weshalb die Funktion nicht mehr benötigt wird.

Mit der Funktion isNull kann in WWB-COM bestimmt werden, ob etwas den Wert Null (nicht 0) hat. Einträge in Dictionaries und in Table-Objekten, denen noch kein Wert zugewiesen worden ist, haben den Wert Null. Dies ist auch relevant für Benutzerdefinierte Attribute, da diese Eigenschaft ein Dictionary ist. Wenn man ein Benutzerdefiniertes Attribut in VBA erzeugt und diesem noch kein Wert zugeordnet wurde, hat es den Wert Null. Um in WWB.NET zu bestimmen, ob ein Wert Null ist, wird stattdessen die Funktion IsDBNull verwendet.

'#Language "WWB-COM"
If IsNull(Units("Tank 1").CustomAttributes("Diameter")) Then
    Units("Tank 1").CustomAttributes("Diameter") = 3
End If

'#Language "WWB.NET"
If IsDBNull(Units("Tank 1").CustomAttributes("Diameter")) Then
    Units("Tank 1").CustomAttributes("Diameter") = 3
End If

Mit IsObject lässt sich bestimmen, ob es sich bei der abgefragten Variablen um ein Objekt handelt. In WWB.NET kann dies durch die Funktion IsReference ermittelt werden.

'#Language "WWB-COM"
If IsObject(Units("Tank 1")) Then
      'True
End If

'#Language "WWB.NET"
If IsReference(Units("Tank 1")) Then
      'True
End If

Enum

Ein Enum ist ein Wertetyp, der in INOSIM für Variablen verwendet wird, für die nur bestimmte Konstanten in Frage kommen. Ein typisches Beispiel hierfür ist der OperationState, der den Zustand angibt, in dem eine Operation sich befindet. Der OperationState kann dabei bOpOpen, bOpStarting, bOpStarted, bOpFinished oder bOpCancelled sein. Weitere Beispiele für Enums in INOSIM sind: AllocationMode, OperationStage, MaintenanceControlArg, PendingUnitsMode etc.

Falls man Werte eines Enums in WWB.NET zuweisen möchte, muss zusätzlich zum Enum-Wert der Enum-Name angegeben werden.

In dem Beispiel wird die neue Poolbelegungssteuerung aus INOSIM 13 angewendet (siehe Neue Steuerungen für Unit Pools in INOSIM 13 anwenden). Hier wird das Enum PendingUnitMode verwendet, um zu entscheiden, welche Unit aus dem Pool für die Belegung in Frage kommt. In diesem Fall soll nur die Unit mit dem Namen Tank 1 belegt werden.

'#Language "WWB-COM"
Sub Pool_Allocation(proc As ProcedureInstance, p As UnitPool, u As Unit, ByRef allocate As Boolean)
    
    Dim pm As Unit
    If u Is Nothing Then 'identifies the first call of the control 
        For Each pm In p.Members
            If pm.Name="Tank 1" Then
                proc.PendingUnitsMode(pm.Name) = puAllocate
            Else
                'all other tanks are ignored
                proc.PendingUnitsMode(pm.Name) = puIgnore
            End If
        Next
    End If

End Sub


'#Language "WWB.NET"
Sub Pool_Allocation (proc As ProcedureInstance, p As UnitPool, u As Unit, ByRef allocate As Boolean)
    
    Dim pm As Unit
    If u Is Nothing Then
        'identifies the first call of the control
        For Each pm In p.Members
            If pm.Name="Tank 1"Then
                proc.PendingUnitsMode(pm.Name) = PendingUnitMode.puAllocate
            Else
                proc.PendingUnitsMode(pm.Name) = PendingUnitMode.puIgnore
                'all other tanks are ignored
            End If
        Next
    End If

End Sub

Variants und Arrays

In WWB.NET gibt es keine Variants. Alternativ können die Variablen als Objekte deklariert werden. So können auch Arrays, die in WWB-COM normalerweise als Variants deklariert werden, in WWB.NET als Object-Arrays definiert werden. Zusätzlich ist es in WWB.NET auch möglich, Listen statt Arrays zu nutzen, um mehr als einen Wert in einer Variablen zu speichern. In dem folgenden Beispiel werden Werte aus einem Excel-Sheet in einem Array gespeichert und anschließend der erste Wert aus dem Array in der Konsole ausgegeben.

'#Language "WWB-COM"
Private Sub Simulation_Init()
    Dim n_rows As Integer
    Dim n_columns As Integer
    n_rows=Parameters.Sheets("Sheet").LastRow 'number of last used row in Excel sheet
    n_columns=Parameters.Sheets("Sheet").LastColumn 'number of last used column in Excel sheet

    Dim a As Variant 'array as variant
    ReDim a (n_rows,n_columns) As Object 'sizing of dimensions
    a=Parameters.Sheets("Sheet").RangeYX(1,1,no_rows,no_columns) 'Read in values for array from Excel sheet

    Console.Print a(1,1) 'Print out the first value in the console
End Sub

'#Language "WWB.NET"
Private Sub Simulation_Init() Handles Simulation.Init
    Dim n_rows As Integer
    Dim n_columns As Integer
    n_rows=Parameters.Sheets("Sheet").LastRow 'number of last used row in Excel sheet
    n_columns=Parameters.Sheets("Sheet").LastColumn 'number of last used column in Excel sheet

    Dim a (,) As Object 'number of dimensions defined by comma
    ReDim a (n_rows,n_columns) As Object 'sizing of dimensions
    a=Parameters.Sheets("Sheet").RangeYX(1,1,no_rows,no_columns) 'Read in values for array from Excel sheet

    Console.Print a(1,1) 'Print out the first value in the console
End Sub

Datentypen

In WWB.NET sind die Grenzen für die Datentypen Long und Integer weiter. Zusätzlich gibt es für ganzzahlige Werte den Datentypen Short in WWB.NET:

Datentyp WWB.NET WWB-COM
Short – 32,768 to 32,767
Integer -2.15 E+18 to 2.15 E+18 – 32,768 to 32,767
Long – 9.2 E+18 to 9.2 E+18 -2.15 E+18 to 2.15 E+18

Downloads

(nur für registrierte INOSIM Kunden)

  • 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

Dieser Tipp & Trick stellt Ihnen ein praktisches Werkzeug zur Visualisierung und Analyse von Transfers in Ihrem Modell mit der BICON-Erweiterung zur Verfügung. Die Tableau-Arbeitsmappe…

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…

In diesem Tipp & Trick geht es um den Einsatz eines VBA Timers zur Messung der Ausführungsdauer von VBA Steuerungen. Um die Perfomance eines Modells…

mehr

INOSIM Kontakt

Zu den lokalen Geschäftszeiten

Deutschland +49 231 97 00 250