In einem früheren Artikel haben wir besprochen, was ein Funktionsblock (FB) ist, wie er in einem SPS-Programm funktioniert und wie man ihn erstellt und verwendet. In diesem Artikel sprechen wir über Datenblockinstanzen verschiedener Funktionsblocktypen im Siemens Tia Portal und wann welcher Typ verwendet wird.
Inhalt:
- Was ist ein Funktionsblock (FB)?
- Verschiedene Optionen für Dateninstanzen.
- Einzelinstanz.
- Parameterinstanz.
- Mehrfachinstanz.
Was ist ein Funktionsblock?
Ein Funktionsblock oder FB ist einfach ein Block, der Codelogik enthält. Sie verwenden diesen FB, um durch die darin geschriebenen Codeteile bestimmte Funktionen zu erreichen.
Wenn Sie einen Funktionsblock in Ihren Code aufrufen, werden Sie aufgefordert, einen Datenblock (auch Dateninstanz genannt) zuzuweisen, der diesem FB zugeordnet werden soll, um die Werte der FB-Parameter zu speichern. Nicht alle Parameter innerhalb eines FB werden in der Dateninstanz gespeichert, aber darauf kommen wir später zurück.
Beim Aufrufen eines Funktionsblocks haben Sie 3 verschiedene Optionen, um diesem Funktionsaufruf eine Datenblockinstanz zuzuordnen. Diese verschiedenen Optionen hängen davon ab, wo Sie Ihren FB aufrufen.
Kurz gesagt: Ein Funktionsblock-FB ist im Grunde ein Funktions-FC mit einem dedizierten Datenblock-DB. Dieser Datenblock wird zum Speichern der Werte der Funktionsblockparameter verwendet.
Verschiedene Optionen für Dateninstanzen
Wir haben 3 verschiedene Optionen für eine Dateninstanz eines Funktionsblocks, und zwar:
- Einzelinstanz.
- Parameterinstanz.
- Mehrfachinstanz.
Die drei verschiedenen Aufrufdateninstanzen stammen aus den 3 verschiedenen Aufrufmethoden:
- Sie können einen Funktionsblock-FB innerhalb des Haupt-OB1 aufrufen, wodurch Sie die folgenden Optionen haben:
- Einzelinstanz.
- Sie können den Funktionsblock FB innerhalb einer Funktion FC aufrufen, wodurch Sie zwei Optionen haben:
- Einzelinstanz
- Parameterinstanz
- Sie können den Funktionsblock innerhalb eines anderen Funktionsblocks aufrufen, wodurch Sie die drei verfügbaren Optionen zum Erstellen einer Dateninstanz haben:
- Einzelinstanz
- Parameterinstanz
- Mehrere Instanzen
Einzelne Dateninstanz
Beginnen wir zunächst mit der Erstellung eines Funktionsblocks FB. Wie bereits erwähnt, erstellen wir einen Funktionsblock, indem wir auf „Neuen Block hinzufügen“ klicken und den gewünschten Blocktyp auswählen. Siehe Abbildung 1.
Abbildung 1 – Erstellen eines Funktionsblocks FB
Rufen wir nun den wiederverwendbaren FB auf, den wir in unserem Haupt-OB1 erstellt haben. Siehe Abbildung 2.
Abbildung 2 – Aufrufen des FB innerhalb des Haupt-OB1
Wie Sie im vorherigen Bild sehen, werden Sie beim Aufrufen eines FB innerhalb des Haupt-OB1 aufgefordert, eine Dateninstanz zuzuweisen, die diesem FB-Aufruf zugeordnet werden soll. In diesem Fall gibt es nur eine Option, nämlich die Einzelinstanz.
Nach Auswahl der Einzelinstanzoption wird ein Datenblock erstellt und mit dem FB-Aufruf verknüpft. Siehe Abbildung 3.
Abbildung 3 – Einzelinstanz erstellt
Die erstellte Einzelinstanz wird verwendet, um die Werte einiger FB-Parameter zu speichern. Wie die Eingänge, Ausgänge, In Out und statischen Parameter.
Andere Parameter des FB werden nicht gespeichert, wie Temperatur und Konstanten. Siehe Abbildungen 4 und 5.
Abbildung 4 – Daten werden in der Dateninstanz gespeichert
Abbildung 5 – Daten werden vom FB in der Dateninstanz gespeichert.
Erstellen wir nun eine einfache Logik innerhalb des FB, um die Dateninstanzen besser zu verstehen. Diese Logik fügt einer statischen Variable einen konstanten Wert von 15 hinzu und verschiebt das Ergebnis dann zum Ausgang. Siehe Bild 6.
Bild 6 – Erstellen Sie eine einfache Logik
Gehen Sie nun zurück zum Haupt-OB1 und sehen Sie sich an, wie Ihr FB-Aufruf jetzt aussieht. Siehe Bild 7.
Bild 7 – Aktualisieren Sie den FB-Aufruf nach jeder Änderung
Jede Änderung, die Sie an der Logik innerhalb des FB vornehmen, führt dazu, dass der Funktionsblockaufruf aktualisiert werden muss, damit die vorgenommenen Änderungen angewendet werden können.
Sie können den Blockaufruf aktualisieren, indem Sie mit der rechten Maustaste auf den FB-Aufruf klicken und die Option „Blockaufruf aktualisieren“ drücken oder indem Sie Ihren SPS-Code neu kompilieren. Siehe Bild 8.
Bild 8 – Aktualisieren des FB-Aufrufs
Nach der Aktualisierung des Blockaufrufs werden die im FB-Code vorgenommenen Änderungen angewendet und im Blockaufruf verwendet. Wie Sie in Bild 9 sehen.
Der FB erwartet nun ein Eingangssignal vom Typ bool und gibt einen Ausgang vom Typ int aus.
Bild 9 – Eingänge und Ausgänge sind nun mit dem FB-Aufruf verknüpft
Lassen Sie uns unseren Code simulieren und sehen, wie sich die SPS verhält. Sehen Sie sich die nächste Animation an, die eine einfache Simulation der bisherigen SPS-Logik zeigt.
Wie Sie in der Animation sehen, wird die Funktion immer dann ausgeführt, wenn das Startsignal TRUE ist, und der Ausgang ändert sich weiter. Und sobald das Startsignal nicht mehr verfügbar ist, bleibt der Ausgang auf dem zuletzt aufgezeichneten Wert.
Die Verwendung der Dateninstanz besteht hier darin, dass die Werte der statischen Variablen und der Ausgangsvariablen in der einzelnen Instanz gespeichert werden, sodass die Funktion bei erneutem Startsignal mit den zuletzt aufgezeichneten Werten fortgesetzt wird.
Sehr wichtiger Hinweis
Sie sollten niemals dieselbe einzelne Instanz für zwei verschiedene Aufrufe eines FBs verwenden. Siehe die nächste Animation.
Wie Sie in der Animation sehen, haben wir zwei verschiedene FB-Aufrufe, aber beide Aufrufe sind mit derselben einzelnen Instanz verknüpft, weshalb sich der Output2-Wert mit Output1 änderte, selbst wenn das Start2-Signal FALSE war.
Wie zu erwarten, wird die Änderung der Dateninstanz des 1. Aufrufs auch im 2. Aufruf beeinflusst, da sie denselben Speicherblock haben. Siehe Abbildung 10.
Abbildung 10 – Verwenden Sie niemals dieselbe Dateninstanz mit verschiedenen FB-Aufrufen
Wenn Sie dieselbe Dateninstanz mit verschiedenen FB-Aufrufen verwendet haben, ist Ihr Funktionsblock nicht mehr wiederverwendbar. Auch wenn die Ein-/Ausgabeparameter für jeden einzelnen FB-Aufruf unterschiedlich sind. Wie Sie im letzten Video (Animation) gesehen haben, hatten beide Aufrufe dieselben Ergebnisse, obwohl der 2. Aufruf nicht einmal ein Aktivierungseingangssignal hat.
Ein weiterer sehr wichtiger Hinweis
Wir haben bereits erwähnt, dass Sie, wenn Sie Ihren FB von einem übergeordneten FC aus aufrufen, zwei Optionen für die zugehörige Dateninstanz haben: die Einzelinstanz und die Parameterinstanz. Siehe Abbildung 11.
Abbildung 11 – Verwenden einer Einzelinstanz mit einem von einem FC aus aufgerufenen FB
Wenn dies passiert und Sie einen FB innerhalb eines FC aufrufen, sollten Sie für Ihre FBs niemals eine Einzelinstanz verwenden. Um zu erfahren, warum das so ist, siehe Abbildung 12
Abbildung 12 – Mehrmaliges Aufrufen des übergeordneten FC
Wie Sie in Abbildung 12 sehen, werden Sie nicht aufgefordert, einen Datenblock zuzuweisen, wenn Sie den übergeordneten FC in Ihrer Logik mehr als einmal aufrufen, da FCs keinen benötigen.
Sie wissen jedoch, dass sich innerhalb des FC ein aufgerufener FB befindet, diesem FB ist eine Einzelinstanz zugeordnet. Die 3 FC-Aufrufe haben jetzt also dieselbe Dateninstanz für den FB-Aufruf. Ihre Funktion FC ist also nicht mehr wiederverwendbar.
Was tun? Wenn Sie einen FB innerhalb eines FC aufrufen müssen, ist die beste Option die Verwendung der Parameterinstanz.
Parameterinstanz
Wie bereits erwähnt, sollten Sie, wenn Sie einen FB innerhalb eines FC aufrufen, nicht die einzelne Instanz wählen, sondern die Parameterinstanz ist für Ihre Wiederverwendbarkeit besser.
Eine Parameterinstanz speichert die Dateninstanz des aufgerufenen FB im In-Out-Bereich der FC-Blockschnittstelle. So können Sie für jeden FC-Aufruf eine neue Dateninstanz eingeben. Siehe Bilder 13 und 14.
Bild 13 – Zuweisen einer Parameterinstanz beim Aufrufen eines FB innerhalb eines FC
Bild 14 – Jeder FC-Aufruf erfordert eine neue Dateninstanz
Wie Sie im vorherigen Bild sehen, wird jedes Mal, wenn Sie den FC innerhalb Ihres Programms aufrufen, eine Dateninstanz für den wiederverwendbaren FB innerhalb des FC angefordert.
Auf diese Weise müssen Sie die Dateninstanz jedoch selbst erstellen. Siehe Bild 15.
Bild 15 – Erstellen einer neuen Dateninstanz
Um eine neue Dateninstanz zu erstellen, gehen Sie genauso vor wie beim Erstellen eines FC oder eines FB, wählen dieses Mal jedoch die DB-Option. Und stellen Sie sicher, dass Sie den DB-Typ so auswählen, dass er mit dem des aufgerufenen FB übereinstimmt.
Jetzt kann Ihr FC beliebig oft wiederverwendet werden, Sie müssen lediglich für jeden Aufruf eine Instanz erstellen. Siehe Abbildung 16.
Abbildung 16 – Weisen Sie den DB dem FC-Aufruf zu
Multiinstanzdatenbank
Eine Multiinstanzdatenbank bedeutet einfach, dass der DB des aufgerufenen FB im DB des aufrufenden FBs höherer Ebene gespeichert wird. Diese Option ist nur verfügbar, wenn Sie einen FB von einem anderen FB aus aufrufen.
Lassen Sie uns einen weiteren FB erstellen, um ihn als FB höherer Ebene zu verwenden.
Rufen Sie diesen HigherLevelFB nach dem Erstellen vom Haupt-OB1 aus auf. Natürlich ist die einzige Aufrufoption eine einzelne Instanz, wie zuvor gezeigt. Siehe Abbildung 17.
Abbildung 17 – Rufen Sie den HigherLevelFB vom Haupt-OB1 aus auf
Rufen Sie nun den ReusableFB vom HigherLevelFB aus auf. Und wählen Sie die Option Multiinstanz. Siehe Abbildung 18.
Abbildung 18 – Mehrfachinstanz-DB zuweisen
Wenn Sie die Option Mehrfachinstanz wählen, wird die erstellte DB in den statischen Parametern des aufrufenden FB gespeichert. Siehe Abbildung 19.
Abbildung 19 – Instanzen werden in statischen Parametern gespeichert
Sie können den wiederverwendbaren FB viele Male aufrufen, bei jedem Aufruf wird die Mehrfachinstanz im statischen Parameter gespeichert. Siehe Abbildung 20.
Abbildung 20 – Wiederverwendbaren FB viele Male aufrufen
Wie Sie sehen, wird die Dateninstanz des FB auf niedrigerer Ebene in der Dateninstanz des FB auf höherer Ebene gespeichert. Dies ist am besten für eine bessere Programmstruktur und eine leicht lesbare Logik.
Fazit
Wenn Sie Funktionsblöcke in Ihrem Code erstellen, müssen Sie jedem FB-Aufruf, den Sie in Ihrer Logik vornehmen, einen Datenblock zuordnen. Dieser Datenblock oder auch Dateninstanz genannt, hat je nach Art des Blocks, der Ihren FB aufruft, unterschiedliche Optionen.
Seien Sie bei der Auswahl des Dateninstanztyps vorsichtig, da einige Optionen für Ihren Fall möglicherweise nicht geeignet sind, wie wir zuvor gezeigt haben. Und manchmal kann dies zu Problemen in Ihrer Logik führen und Ihre Funktion kann nicht mehr wiederverwendet werden.
Die Verwendung mehrerer Instanzen kann Ihnen dabei helfen, Ihre Programmstruktur besser zu organisieren, da alle aufgerufenen FBs ihre DBs im aufrufenden Haupt-FB speichern.