• slide

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • slide

     

     

     

     

     

     

     

     

     

     

     

     

     

  • slide

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • slide

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • slide

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • slide

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

× Einleitung 1. Grundlagen über Labels 2. Erstellen eines Labels 3. Events und Trigger 4. Hinzufügen/Ändern von Labels über Trigger 5. Welche Parameter sind verfügbar? 6. Labelwerte auslesen 7. Labelwerte auslesen fortgeschritten Fazit

Tutorial 2: Einführung in Labels und Trigger

Dauer des Tutorials: ca. 20 Minuten

Geeignet für: Einsteiger

Ziel:
Nach diesem Tutorial wissen Sie was Labels und Trigger sind und wie Sie diese eigenständig dazu nutzen, um Ihr Modell zu steuern.

In diesem Modell wird die Prozesszeit durch die auf der Maschine (Processor) liegenden Teile beeinflusst.

Einleitung

Labels sind eines der wichtigsten Instrumente zum Aufbau von Simulationsmodellen in FlexSim. Sie werden verwendet um Informationen zu speichern. Dies können bestimmte Eigenschaften eines Objektes sein, Daten für die Modellanalyse, wie zum Beispiel Wartezeiten oder Referenzen auf andere Objekte, damit zum Beispiel ein Transporter weiß, wohin ein Werkstück als nächstes gebracht werden muss.

Trigger bieten die Möglichkeit während der Laufzeit des Modells auf Events zu reagieren. Mit ihrer Hilfe lassen sich zum Beispiel Werte, die den Prozessablauf steuern, dynamisch anpassen oder auch Informationen zu den zugehörigen Events festhalten

Grundlagen über Labels

Zunächst wollen wir Labels allgemein definieren, bevor wir im nächsten Abschnitt erklären, wie man diese erstellt.
Jedes Label setzt sich aus drei Komponenten zusammen:

  1. Das Objekt auf dem es sich befindet

    Label können auf so gut wie jedem Objekt in FlexSim angelegt werden. Am meisten Verwendung finden sie auf FlowItems, Fixed Resources, Task Executern und Process Flow Tokens. Nur über eine Referenz auf das jeweilige Objekt kann auf ein Label zugegriffen werden.
     
  2. Der Name des Labels

    Objekte können beliebig viele Labels besitzen. Um zwischen ihnen zu unterscheiden, wird jedem Label ein Name gegeben. Dieser muss, für Labels auf dem jeweiligen Objekt, einzigartig sein.
     
  3. Der Wert des Labels

    Die eigentliche Information, die im Label gespeichert ist. Wie bereits im Eingangstext angedeutet handelt es sich hierbei meist um Zahlen, Text (string im Programmierjargon) oder Referenzen auf andere Objekte im Modell (sogenannte pointer).

Erstellen eines Labels

Statische Labels können einem ausgewählten Objekt manuell in der Eigenschaftenleiste am rechten Bildschirmrand hinzugefügt werden. Klicken Sie hierzu auf das grüne Plus-Symbol  im entsprechenden Bereich. Dann müssen Sie auswählen, welchen Datentyp das Label enthalten soll. Die häufigsten Arten sind wie bereits erwähnt Zahlen (Number), Text (String) und Objektreferenzen (Pointer).

Hinzugefügte Labels erscheinen in einer tabellarischen Übersicht mit zwei Spalten. In der linken Spalte steht, grau hinterlegt, der Name des Labels. In der rechten Spalte steht der Wert des Labels. Beides kann geändert werden, indem Sie auf die entsprechende Zelle klicken und den neuen Namen/Wert eintippen.

Bei einem Pointer-Label bietet es sich an, statt den Namen des Objektes direkt einzutippen (was fehleranfällig sein kann), den Verweis auf das Objekt über das Sampler-Tool automatisch zu generieren. Klicken Sie dazu zunächst auf die Pipette , die oberhalb der Labeltabelle erscheint, wenn ein Pointer-Feld ausgewählt ist. Klicken Sie anschließend auf das Objekt, auf das verwiesen werden soll.

Bevor wir uns anschauen, wie Label dynamisch während der Modelllaufzeit erzeugt und darauf zugegriffen werden kann, wollen wir zunächst ein weiteres wichtiges Thema behandeln – Events und Trigger.

Events und Trigger

FlexSim arbeitet eventbasiert. Das Simulationsmodell reagiert auf diskrete Ereignisse, wie den Abschluss eines Arbeitsschritts, dem Verstreichen einer Wartezeit oder dem Erreichen eines bestimmten Punktes auf einem Förderband.

Viele Objekte reagieren automatisch auf bestimmte, mit ihnen assoziierte Events und führen dazugehörige Logiken aus. So reichen zum Beispiel bereits wenige Verbindungen zwischen Objekten, um einen funktionieren Materialfluss zu erzeugen.

Um reale Prozesse nachzubilden, ist es allerdings fast immer nötig, eigene Funktionen und Logiken zu implementieren. Dazu dienen die sogenannten Trigger. Diese erlauben es Aktionen auszuführen, sobald ein bestimmtes Event eintritt. Sie können im Triggers-Tab, am unteren Ende der Eigenschaftenleiste eines Objektes, erstellt werden.

Wie bereits bei den Labels, kann ein neuer Trigger über das grüne Plus-Symbol  hinzugefügt werden. Welche Events dabei zur Verfügung stehen hängt von dem ausgewählten Objekt ab. Ein Prozessor bietet zum Beispiel die Möglichkeit auf das Eintreffen eines Items zu reagieren. Informationen über alle verfügbaren Trigger-Events sind in der englischen Dokumentation verfügbar.

Sobald ein Trigger hinzugefügt wurde, können wiederum eine oder mehrere Funktionen ausgewählt werden, die FlexSim ausführen soll, sobald das jeweilige Event eintritt. Welche Optionen zu Verfügung stehen, hängt wiederum von dem Event ab, zu dem diese ausgeführt werden sollen. So besitzt ein On Entry-Trigger Informationen über das Item, welches eingetroffen ist, sodass zum Beispiel Labels auf diesem erzeugt oder verändert werden können.

Hinzufügen/Ändern eines Labels über Trigger

Die Optionen zum Hinzufügen eines Labels bzw. dem Verändern eines Labelwertes finden sich bei passenden Triggern unter dem Menüpunkt Data.

Set Label ist die simpelste dieser Optionen. Dabei lassen sich die drei Komponenten angeben, die das Label definieren. Zu welchem Objekt das Label gehört, seinen Namen und seinen Wert. Existiert noch kein Label mit diesem Namen auf dem angegebenen Objekt wird es erzeugt, andernfalls wird lediglich der neue Wert zugewiesen. Der Name muss dabei als Text, also von Anführungszeichen eingeschlossen, eingegeben werden.

Es ist bei manuell erstellten Labels, denen ein neuer Wert zugewiesen werden soll, nicht zwingend darauf zu achten, dass der Datentyp des alten (Zahl, Text, etc.) mit dem des neuen Wertes übereinstimmt. FlexSim ändert den Labeltyp im Zweifelsfall automatisch zu dem des neu zugewiesenen Wertes.

Das Objekt, zu dem das Label gehört, kann entweder direkt über das Pipettentool ausgewählt werden, wenn es sich um ein fixes Objekt handelt. Oder es wird ausgehend von einem Parameter des Trigger-Events festgelegt. Wie bereits erwähnt, kann zum Beispiel im On Entry-Event das eingetroffene Item über item referenziert werden. Welche Parameter zur Verfügung stehen variiert von Event zu Event. Weitere Informationen sind in der englischen Dokumentation zu finden.

Ein Trigger besitzt immer eine Referenz auf das Objekt, auf dem er definiert ist. Dieses kann stets über current angesprochen werden. Dies ist nützlich, da, mit den passenden Befehlen, von diesem aus auch auf daran angebundene Objekte verwiesen werden kann oder Eigenschaften wie der Füllstand für Entscheidungsprozesse zu Rate gezogen werden können.

In diesem Fall wird zum Beispiel das Label "Status" auf dem Processor auf "Busy" gesetzt, sobald ein Item eintrifft.

Welche Parameter sind verfügbar?

Welche Parameter in den einzelnen Events und Optionen zur Verfügung stehen ist in den entsprechenden Abschnitten der FlexSim-Dokumentation aufgeführt.

Es existiert jedoch auch eine einfache Methode um direkt im Programm herauszufinden, welche Parameter eine Option bietet. Neben fast allen Optionen befindet sich ein Schriftrollen-Icon .

Dieses öffnet ein Fenster in dem man eigenen Code schreiben kann, um die Funktionalität von Objekten weiter anzupassen. Das Fenster ist beim erstem Öffnen jedoch meist nicht komplett leer. In den ersten Zeilen sind bereits die verfügbaren Variablen, die das Event oder die Option bereitstellt, vordefiniert. Ebenjene können auch als Parameter in den Eingabefeldern von Standardoptionen genutzt werden.



So bietet der On Entry-Trigger einer Queue zum Beispiel, neben den bereits erwähnten Referenzen auf sich selbst (current) und das eintreffende Item (item), auch den Parameter port an. Dieser gibt den Rang der Verbindung an, durch die das Item in die Queue gelangt ist.

So könnte man ein Label vergeben, welches abhängig vom vorherigen Ort des Items ist.

Labelwerte auslesen

Anhand eines einfachen Beispielmodells wollen wir nun demonstrieren, wie Labelwerte ausgelesen werden können, um damit Einfluss auf die Simulation zu nehmen.

Das Modell besteht lediglich aus einer Source, einem Processor und einer Sink, die in dieser Reihenfolge über "A-Verbindungen" verkettet sind.

In der Source erzeugen wir auf den erzeugten Items ein Label namens ProcessTime. Dieses soll, für jedes Item individuell, bestimmen, wie viel Zeit der Processor zum Bearbeiten des Teils benötigt. Hierfür haben wir einen On Creation-Trigger hinzugefügt, der ausgelöst wird, wenn ein Item in der Source erzeugt wird. Darin haben wir die Option Set Label gewählt. Als Zielobjekt ist das erzeugte Item ausgewählt, welches als Parameter des Events zur Verfügung steht. Als Wert ist keine feste Zahl eingestellt. Stattdessen wurde aus den Optionen, die über den Pfeil rechts neben dem Eingabefeld zur Verfügung stehen, die statistische Verteilung uniform(5, 15) ausgewählt. Diese gibt, wenn sie aufgerufen wird, eine zufällige (Dezimal-)Zahl zwischen 5 und 15 aus.

Nun wollen wir erreichen, dass der Processor, statt einem festen Wert, das auf den Items angelegte Label als Prozesszeit verwendet. Es gibt zwei Befehle zum Auslesen eines Labels. Beide beginnen mit einer Referenz auf das Objekt, auf dem das Label gespeichert ist. Glücklicherweise bietet die Prozesszeitoption des Processors, ähnlich der Events, einige mit ihr verbundene Parameter. So können wir auch hier über „item“ auf das zu bearbeitende Objekt verweisen.

Um den Wert des Labels auszulesen fügen wir den Namen des Labels, durch einen Punkt abgetrennt, an die Referenz an. Und das war es auch schon. Lassen wir das Modell nun laufen, wird die Prozesszeit durch das entsprechende Label bestimmt.

Die Zeitanzeige wurde extra hinzugefügt, um die unterschiedlichen Prozesszeiten besser in der Animation sichtbar zu machen. Sie basiert auf einer "Kinetic Tracked Variable". Deren Wert wird jeweils zu Beginn eines Prozesses zurückgesetzt und zählt dann parallel zur Modellzeit hoch.

Auslesen von Labels

Die Syntax für das Auslesen eines Labelwertes ist

ReferenzAufLabelobjekt.LabelName

Oftmals kann ein vordefinierter Parameter eines Triggers oder einer Funktion als Referenz genutzt werden.

Fortgeschrittene Variante zum Auslesen von Labels

Die zweite Variante Zugriff auf das Label zu erhalten liest nicht direkt den Wert aus, sondern liefert zunächst eine Referenz auf den Node, den Punkt in der Modellstruktur, in dem das Label gespeichert ist. Die Syntax hierfür lautet:

ReferenzAufLabelobjekt.labels["LabelName"]

Hieran können dann weitere Befehle angehängt werden, die Zugriff auf andere Eigenschaften des Nodes, wie zum Beispiel den Namen (der auch der Name des Labels ist). Dafür müsste .name an den obigen Ausdruck angehängt werden. Über .value kann wiederum der Wert ausgelesen werden.

Eine weitere nützliche Funktion, die mit dieser Syntax verbunden ist, ist die Möglichkeit sicherzustellen, dass das angegebene Label überhaupt existiert. Dies ist über den Befehl assert möglich.

Referenz.labels.assert ("LabelName", DefaultValue).value

Existiert kein entsprechendes Label auf dem Objekt wird es erzeugt und ihm wird der, als zweiter Parameter des Befehls angegebene, Standardwert (DefaultValue) als Wert zugewiesen. Um den Wert anschließend auch auszulesen muss auch wieder .value angehängt werden.

In unserem Beispiel könnten wir so zum Beispiel auch Items ohne das „ProcessTime“-Label auf dem Processor bearbeiten. Dies allerdings nur mit einer festen Prozesszeit. Die weiter oben verwendete Syntax würde hingegen eine Fehlernachricht generieren, wenn ein Item ohne das Label den Processor betritt.