Creator und Destroyer

In dieser Rubrik befindet sich das gleichnamige Creator-Objekt.

Mit Creator-Objekten wird das Erzeugen von Kind-Objekten einer bestimmten ID gesteuert. Ist die Bedingung für das Erzeugen einer neuen Generation von Kind-Objekten erfüllt, dann werden diese als Kopie Ihre Mutter-Objekte an der Position ihrer Mutter-Objekte erzeugt.

Mit den Creator-Objekten lassen sich somit Objekt-Quellen in einer Anlage realisieren um z.B. Förderelemente mit Teilen zu versorgen.

Folgende Schritte sind notwendig, um ein dynamisches Objekt von einem Creator erzeugen zu lassen:

  1. Erzeugen des dynamischen Objekts (z.B. eine dynamische Ellipse).

  2. Innerhalb der Rubrik "Grundeinstellungen->Creator/Destroyer Einstellungen" in der Eigenschaft "Objekt ist ein Mutterobjekt mit der ID" eine im Projekt eindeutige ID angeben. Diese ID muss im Bereich 1 bis 30 liegen.

  3. Das Mutter-Objekt an der Stelle fixieren, an denen die Kind-Objekte erzeugt werden sollen. Hierzu wird oft ein feststehendes Objekt verwendet an dem das Mutter-Objekt über eine Verbindung mit konstanter Distanz angebunden wird.

  4. Creator-Objekt auf der Zeichenfläche erzeugen und an der Eigenschaft "Creator hat die ID" die am Mutter-Objekt eingestellte ID eintragen.

  5. An der Eigenschaft "Create-Trigger" einen Operanden (oder eine Konstante angeben), welcher als Trigger das Erzeugen der Mutter-Objekte steuert.

  6. An der Eigenschaft "Trigger-Typ" ist einzustellen, wann das Erzeugen erfolgen soll. Beispielsweise bei einer pos. Flanke des Operanden, der an "Create-Trigger" angegeben wurde. Ist bei "Create-Trigger" die Konstante '1' angegeben, dann muss als Typ "Bei Status 1 mit Pausezeit" selektiert sein. In diesem Fall ist dann auch eine "Trigger-Pausezeit" anzugeben.

Optional kann die max. Anzahl der Create-Zyklen (also die max. Anzahl der vorhandenen Generationen) in der Eigenschaft "Max. Create-Zyklen" festgelegt werden. Ist diese max. Anzahl erreicht, dann werden keine neuen Kind-Objekt mehr erzeugt, auch wenn die Bedingung dazu erfüllt ist. Erst wenn die Anzahl der vorhandenen Generationen, durch Zerstörung von Generationen mit Hilfe von Destroy-Objekten, unter der maximalen Anzahl liegt, können wieder neue Kind-Objekte erzeugt werden.

Beispiel

Im folgenden Bild ist eine Anordnung mit Creator zu sehen.

Das Mutter-Objekt welches vom Creator zu erzeugen ist, ist ein Kreis. Das Mutter-Objekt hat die ID = 1, d.h. die Eigenschaft "Objekt ist ein Mutterobjekt mit der ID" ist auf den Wert "1" eingestellt.

Der Kreis ist über eine Verbindung mit konstanter Distanz an einem feststehenden Objekt angebracht. Damit bleibt das Mutter-Objekt immer an der gleichen Stelle und die Kind-Objekte werden von dort aus in die Anordnung eingefügt.

Der Creator wird über ein blaues Rechteck symbolisiert. Bei ihm ist die Eigenschaft "Creator hat ID" auf "1" eingestellt, somit ist der Creator für diese ID "zuständig". Als "Create-Trigger Operand" wurde der Bit-Operand IM.M0.0 angegeben, dieser soll bei einer einer pos. Flanke das Erzeugen auslösen. Somit ist als "Trigger-Typ" die Auswahl "Bei pos. Flanke" zu selektieren.

Das Umschalten des Trigger-Operanden IM.M0.0 wird über einen Taster vorgenommen, dem dieser Operand zugeordnet wurde.

Die erzeugten Kind-Objekte werden in einem Behälter gesammelt, der sich unterhalb des Mutter-Objekts befindet und mit Hilfe von feststehenden Rechtecken zusammengebaut wurde.

Damit sind alle Teile der Anordnung beschrieben und die Simulation kann gestartet werden.

Zunächst fällt auf, dass das Creator-Objekt in der Simulation nicht mehr zu sehen ist, denn dieses hat ja als Objekt keine Funktion.

Sobald man den Taster betätigt, wird ein Kind-Objekt erzeugt und dieses fällt in den Behälter. Dort werden alle Kind-Objekte gesammelt. Auf diese Weise kann man eine Anordnung mit Objekten versorgen, die dann in irgendeiner Form weiterverabeitet werden.

Die Eigenschaft 'Neutral bei Kollision nicht kopieren' (ab V1.7.1.0)

Wenn diese Eigenschaft ausgewählt ist, kann ein Mutter-Objekt als neutral bei einer Kollision gesetzt werden, ohne dass die Kind-Objekte davon betroffen sind. Dies ist z.B. dann sinnvoll, wenn mehrere Mutter-Objekte mit unterschiedlichen Creator-IDs an der gleichen Position oder hintereinander platziert werden müssen. Dann werden die erzeugten Kind-Objekte von den einzelnen Mutter-Objekten nicht beeinflusst.

Im Beispiel haben beide Creator den gleichen Trigger. Diese erzeugen also gleichzeitig die Kind-Objekte.

Verwendung eines Destroyers

Im obigen Beispiel wurden Kind-Objekte erzeugt und danach in der Anordnung belassen. Meist werden Kind-Objekte in einem Anlagenvorgang verarbeitet und an einer anderen Stelle wieder beseitigt. Dies ist schon alleine deswegen sinnvoll, um die Anzahl der Objekte in einer Simulation möglichst gering zu halten. Denn jedes physikalische Objekt "belastet" die Physik-Engine und kostet somit Rechenzeit.

Um Kind-Objekte zu beseitigen, kommen Destroyer zum Einsatz. Dabei kann jedes geometrische Objekt als Destroyer konfiguriert werden. Dazu sind die Eigenschaften "Objekt ist ein Destroyer" und "Objekt zerstört Kind-Objekte mit ID" in der Rubrik "Grundeinstellungen->Creator/Destroyer Einstellungen" entprechend einzustellen.

Beispiel

Das obige Beispiel wird um einen Destroyer erweitert. Im folgenden Bild ist die veränderte Anordnung zu sehen.

Dabei wurde an der rechten Seite des Behälters die Seitenbegrenzung durch ein Rechteck ersetzt, welches an der Kolbenstange eines Zylinder befestigt ist. Als Verbindung wurde die Verbindung zu einem Körper verwendet.

Somit bewegt sich das Rechteck nach links, sobald der Zylinder ausfährt.

Innerhalb des roten Rechtecks wurde die Eigenschaft "Objekt ist ein Destroyer" ausgewählt und in "Objekt zerstört Kind-Objekte mit ID" die Zahl "1" angegeben. Denn der Destroyer soll nur die Kind-Objekte mit eben dieser ID beseitigen.

Wird hier die Zahl "0" angegeben, dann zerstört der Destroyer alle Kind-Objekte unabhängig von deren ID.

Damit zeigt die Anordnung in der Simulation folgendes Verhalten:

Nachdem einige Kind-Objekte erzeugt wurden, wird der Zylinder mit Hilfe des Tasters ausgefahren. Somit bewegt sich der Destroyer mit der Kolbenstange nach links. Jedes Kind-Objekt welches dabei von dem Destroyer berührt wird, wird beseitigt.

Destroyer zusätzlich von einem Operanden abhängig machen (ab V1.5.4.0)

Ab der Version 1.5.4.0 ist es möglich, zusätzlich einen Operanden für den Destroyer anzugeben. Dazu wird an der Eigenschaft "Operand für Destroyer" ein Bit-Operand eingetragen. Ist ein solcher Operand vorhanden, dann werden Kind-Objekte erst zerstört, wenn auch der Status des Operanden den Wert 1 (true) besitzt. Hat der Operand den Wert 0 (false), dann werden die Kind-Objekte nicht zerstört.

Ist an der Eigenschaft der Wert 0 und somit kein Operand angegeben, dann ist der Destroyer immer aktiv.

Destroyer von positiver oder negativer Flanke eines Operanden abhängig machen (ab V1.8.2.0)

Wurde ein Operand an der Eigenschaft "Operand für Destroyer" angegeben, dann kann ab der Version 1.8.2.0 auch die pos. bzw. neg. Flanke des Operanden für die Aktivierung des Destroyers verwendet werden. Dazu platziert man den Eingabecursor vor dem Operanden und betätigt die Tastenkombination [STRG] + [P] bzw. [STRG] + [N] um die Abfrage der positiven bzw. negativen Flanke einzufügen. Dabei wird das Symbol eines Pfeils nach oben bzw. das Symbol eines Pfeils nach unten in das Eingabefeld eingefügt.

Im folgenden Bild wurde die Tastenkombination [STRG] + [N] betätigt, um die negative Flanke des Operanden abzufragen.

Mehrere Objekte Erzeugen und Zerstören

In den vorausgegangenen Beschreibungen wurde teilweise von Generationen im Zusammenhang mit Kind-Objekten gesprochen. Diese Ausdrucksweise lies schon vermuten,. dass man nicht nur einzelne Objekte erzeugen lassen kann.

Möchte man mehrere Objekte in einem Vorgang erzeugen lassen, die dann einer Generation angehören, dann vergibt man bei allen Mutter-Objekten die gleiche ID. Dabei ist es unerheblich, ob diese Mutter-Objekte einen Bezug zueinander haben oder nicht. Auch müssen sich die Mutter-Objekte nicht an der gleichen Stelle befinden, diese können über die gesamte Anordnung verteilt sein.

Die Mutter-Objekte können aber auch eine (Körper-) Einheit bilden oder über andere Verbindungen zueinander in Bezug stehen.

Beispiel

Das bekannte Beispiel wurde nochmals verändert. Das Kreis-Objekt wurde ersetzt durch eine etwas komplexere Form.

Der neue Körper besteht aus insgesamt 6 dynamischen geometrischen Formen, welche über eine Körper-Gruppe zu einem Körper zusammengefügt wurden. Alle Objekte sind als Mutter-Objekt mit der gleichen ID (im Beispiel die ID = 1) konfiguriert. Somit werden deren Kind-Objekte in einem Creator-Zyklus erzeugt, bilden also eine Generation an Kind-Objekten. Berührt eines dieser Kind-Objekte einen Destroyer, dann wird die gesamte Generation beseitigt und nicht nur das den Destroyer berührende Kind-Objekt.

Sobald der Destroyer ein Kind-Objekt des Körpers berührt, wird der gesamte Körper beseitigt. Ein etwaiger zusätzlich vorhandener Körper ist davon zunächst nicht betroffen, denn dieser gehört einer anderen Generation an.

Fazit

Mit den Creator- und Destroyer-Objekten können die Quellen und Senken einer Anordnung realisiert werden. Die ID fasst dabei die Objekte zu einer Generation zusammen. Über diese ID wird auch die Zugehörigkeit zum Creator hergestellt.

Jede geometrische Form kann als Destoyer konfiguriert werden, sofern es sich um ein Physik-Objekt handelt (dynamisch oder feststehend). Ist eine bestimmte ID angegeben, dann werden nur Kind-Objekte mit dieser ID beseitigt. Sollen alle Kind-Objekte unabhängig von deren ID beseitigt werden, dann ist "0" als ID am Destroyer anzugeben.

Es ist zu beachten, dass ein Destroyer immer die gesamte Generation an Kind-Objekten zerstört, sobald auch nur ein Kind-Objekt diesen berührt.

Es können mehrere Destoyer auf die gleiche ID eingestellt werden, denn es ist ja durchaus denkbar, dass Kind-Objekte an unterschiedlichen Stellen der Anordnung zu beseitigen sind.

Mehrere Creator auf die gleiche ID einzustellen macht allerdings keinen Sinn.

Kind-Objekt mit X/Y-Offset erzeugen (ab V2.1.0.0)

Normalerweise werden die Kind-Objekte an der Stelle erzeugt, an welcher sich die Mutter-Objekte zum Zeitpunkt des Erzeugens befinden. Über die Eigenschaften "X-Offset Kind-Objekte" und "Y-Offset Kind-Objekte" können Offsets für das Erzeugen am Creator angegeben werden. Dabei ist die Angabe von Konstanten (z.B. "100" für einen Offset von 100 Pixel) oder von Operanden erlaubt. Die Angabe von Operanden ist insbesondere dann sinnvoll, wenn der Offset variabel zu gestalten ist.

Important

Der Zeichenbereich von PLC-Lab hat eine Ausdehnung von 5000 Pixel in X-Richtung (horizontal) und 5000 Pixel in Y-Richtung (vertikal). Dabei ist der Wert in X-Richtung von links nach rechts ansteigend. In Y-Richtung von oben nach unten. Falls Objekte wg. falscher Offsetangaben ausserhalb des sichtbaren Zeichenbereichs erzeugt werden, dann wird dies nicht verhindert! Dies kann aber zu einem Fehlverhalten bei der Simulation führen.

Das Zahlenformat für die Angabe der Offsets ist Int16, es können also sowohl positive als auch negative Offsets angegeben werden.

Beispiel 1

Im Beispiel werden Kind-Objekte eines Rechtecks über einen Creator erzeugt. Dabei sollen die Kind-Objekte mit einem Offset in X-Richtung erzeugt werden. Dieser Offset ist variabel und kann im Bereich von -300 bis 300 eingestellt werden. Für das Einstellen des Offsets wird ein Schieberegler verwendet. Nachfolgend sind die beiden Operanden für das Beispiel zu sehen.

Das Symbol "Create" soll die Erzeugung der Kind-Objekte triggern. Das Symbol "XOffset" ist für den Offset der Kind-Objekte in X-Richtung zuständig. Der Wortoperand hat den Datentyp Int16, kann also auch negative Werte annehmen. In der virtuellen Anlagen wird ein Schieberegler platziert, dessen Werte im Bereich -300 bis 300 einstellbar sind. Dem Schieberegler wird das Symbol "XOffset" zugewiesen.

Das zu erzeugende Rechteck ist ein dynamischen Physik-Objekt dessen Mutterobjekt-ID auf den Wert 1 eingestellt wird. Das Mutter-Objekt wird an ein feststehendes Rechteck angebunden, dazu wird eine Verbindung mit konstanter Distanz verwendet. Im unteren Bereich wird ein weiteres feststehendes Rechteck angebracht, dieses ist als Destoyer einzustellen, dabei wird die Zahl 0 als zu zerstörende ID angegeben, dies bedeutet, es werden alle Kind-Objekte unabhängig von deren Creator-ID zerstört. Des Weiteren wird ein Taster benötigt, um das Create-Symbol zu beeinflussen und jeweils eine positive Flanke für das Erzeugen der Kind-Objekte zu erhalten. Die Anlage hat somit folgendes Aussehen:

Nun folgt der Creator. Dieser wird ebenfalls auf der Zeichenfläche platziert und wie folgt ausgefüllt:

Dem Creator wird die ID 1 zugewiesen und als Trigger-Operand das Symbol "Create". In der Eigenschaft "XOffset Kind-Objekte" ist das Symbol "XOffset" anzugeben.

Damit sind alle Einstellungen vorgenommen und die Simulation kann gestartet werden.

In der Simulation wird zunächst der Offset auf 0 belassen, dann wird das Kind-Objekt an der Stelle des Mutter-Objekts erzeugt. Dann wird ein Offset von 300 Pixel selektiert, somit erscheint das Kind-Objekt auf der rechten Seite um 300 Pixel versetzt. Anschließend sind -300 Pixel als Offset eingestellt, dies hat zur Folge, dass das Kind-Objekt links vom Mutter-Objekt erscheint.

Fazit

Das Beispiel hat gezeigt, wie man durch Angabe eines Offsets die Stelle für das Erzeugen eines Kind-Objekts variieren kann. Dabei kann wahlweise eine Konstante oder ein Operand als Quelle angegeben werden.

Verwenden des Maßbands zum Ermitteln eines Offsets

Möchte man einen X/Y-Offset im Zeichenmodus ermitteln, dann kann man ab der Version 2.1.0.0 von PLC-Lab das sog. Maßband verwenden. Dazu betätigt man die Taste [STRG], betätigt am Startpunkt die rechte Maustaste und hält diese betätigt. Nun kann man die Maus verschieben, dabei wird eine gestrichelte Linie sichtbar und am Mauszeiger werden die X/Y-Offsets zum Startpunkt angezeigt. Damit ist es möglich, komfortabel einen Offset zu ermitteln oder auch die Abstände zwischen Objekten.

Beispiel 2

Im nächsten Beispiel fährt ein Schlitten immer zwischen seinen horizontalen Endlagen hin und her, sobald der Schalter "S1" betätigt ist. Über Create soll ein Kind-Objekt auf dem fahrenden Schlitten erzeugt werden. Dazu ist es notwendig den passenden X-Offset zu berechnen. Es kann sich immer nur ein Kind-Objekt auf dem Schlitten befinden. Dieses wird mit Hilfe des Tasters "Destroy" beseitigt. Anschließend ist es wieder möglich, ein neues Kind-Objekt zu erzeugen. Nachfolgend ist die Anordnung zu sehen:

Im folgenden Bild sind die für das Beispiel benötigten Symbole abgebildet:

Das Programm für die Anordnung ist in C# erstellt. Dabei wird zunächst die Bewegung des Schlittens programmiert, wenn der Schalter S1 betätigt ist. Sobald ein Endschalter betätigt wird, wechselt die Bewegungsrichtung des Schlittens. Um den Offset für die Kind-Objekte zu berechnen, wird zunächst die momentane Bewegungsrichtung ermittelt. Die Bewegungsrichtung bestimmt dann den genauen Offset, da das Kind-Objekt leicht oberhalb des Schlittens erzeugt wird und bis zum Auftreffen auf den Schlitten, dieser sich schon in die entsprechende Richtung weiter bewegt hat. Nachfolgend das C#-Script:

bool ToMaxActive=false;
bool ToMinActive=false;

/// <summary>
/// This method is called cyclically
/// </summary>
public void Loop() {
    //
    bool b2Min = Get_DebugB2M1Min();
    bool b3Max = Get_DebugB3M1Max();
    //
    if (Get_DebugS1On()){
        if (!b2Min){
            ToMaxActive=true;
            ToMinActive=false;
        }
        else if (!b3Max){
            ToMaxActive=false;
            ToMinActive=true;
        }
        else if (!ToMaxActive && !ToMinActive){
            ToMaxActive=true;
            ToMinActive=false;
        }
    }
    else {
        ToMaxActive=false;
        ToMinActive=false;
    }
    //
    Set_DebugM1ToMin(ToMinActive);
    Set_DebugM1ToMax(ToMaxActive);
    //Calculate the offset
    int pos = (int) Get_DebugB1M1Pos();
    if (ToMinActive){
        Set_IMXOffsetCreator(pos+100);
    }
    else if (ToMaxActive){
        Set_IMXOffsetCreator(pos+150);
    }
    else {
        Set_IMXOffsetCreator(pos+125);
    }

}

Im Creator wird das Symbol "Create" als Trigger-Operand angegeben. Des Weiteren ist das Symbol "XOffsetCreator" in der Eigenschaft "X-Offset Kind-Objekte" einzutragen. Bei der Eigenschaft "Max. Create Zyklen" wird die Zahl 1 angegeben, damit immer nur ein Kind-Objekt vorhanden sein kann.

Damit ist die Anordnung komplett und die Simulation kann gestartet werden.

Fazit

Das Beispiel hat gezeigt, wie bei laufender Simulation der Offset für das Erzeugen der Kind-Objekte berechnet werden kann. Ob die Berechnung im SPS-Programm, dem GRAFCET oder innerhalb des C#-Scripts vorgenommen wird, ist unerheblich. Es ist im Creator ein Operand an der Eigenschaft "X-Offset Kind-Objekte" bzw. "Y-Offset Kind-Objekte" anzugeben, dessen Inhalt die Offset-Position festlegt.