Einen Funktionsbaustein in eine benutzerdefinierte Funktion umwandeln, um die Anzahl der Programmschritte zu reduzieren
Der Hauptzweck dieser Funktionen besteht darin, das Ersetzen von Funktionsbausteinen (FB) durch Funktionen (FUN) zu erleichtern. Mehrere FB-Instanzen in separaten Unterprogrammen werden durch eine Funktion in einem Unterprogramm ersetzt.
Funktionsbaustein |
Umgewandelte Funktion |
![]() |
![]() |
Nicht alle Panasonic-Befehle können in einer gemeinsamen Funktion verwendet werden. Beispiele für Befehle, die nicht in einer gemeinsamen Funktion verwendet werden können:
Bestimmte schnelle Zählerbefehle wie F166_HighSpeedCounter_Set, F165_HighSpeedCounter_Cam
Bestimmte Positionierbefehle wie F166_PulseOutput_Set, F171_PulseOutput_Trapezoidal
Dies muss im Einzelnen geprüft werden.
Möglicherweise wesentlich weniger Programmcode erforderlich
Möglicherweise wesentlich weniger Relais (R) erforderlich
Verwendung in Schleifen mit Hilfe von Arrays der Speicher-SDTs möglich
Erfordert zusätzlichen Entwicklungs- und Wartungsaufwand
Die umgewandelte Funktion muss genau getestet werden
Erfordert mehr Aufwand seitens des Anwenders
Überwachung ist schwieriger, da es keine Instanz gibt, die überwacht werden kann, nur der letzte Aufruf wird überwacht
Erfordert möglicherweise mehr Datenregister (DT)
Die Leistungsfähigkeit der SPS ist vermindert, die Zykluszeit länger
Zeitgeberfunktionen verhalten sich möglicherweise etwas anders als die Zeitgeber-Funktionsbausteine
Testen Sie genau, ob das Verhalten der neuen Funktion dem Verhalten des Funktionsbausteins entspricht, insbesondere wenn die neue Funktion mehrfach aufgerufen wird.
Funktionen sollten nur anstelle von Funktionsbausteinen verwendet werden, wenn unbedingt notwendig.
Funktionen sollten nur so weit wie unbedingt notwendig anstelle von Funktionsbausteinen verwendet werden.
Prüfen Sie genau, welcher Funktionsbaustein umgewandelt werden soll, um den maximalen Nutzen bei minimalem Aufwand zu ziehen.
Die Entscheidung, ob ein Funktionsbaustein umgewandelt werden soll, sollte auf folgenden Hauptkriterien beruhen: Wie oft wird der Funktionsbaustein aufgerufen, wie viele Schritte erfordert der Funktionsbaustein?
Anhand folgender Formel wird berechnet, wie viele Programmcode-Schritte eingespart werden können.
Dies ist die aktuelle Situation:
Ein bestimmter Funktionsbaustein
wird X-mal aufgerufen
verwendet Y Schritte => Gesamtzahl der Schritte: X * Y Schritte
verwendet TON, SR, Pulsmerker
Der Funktionsbaustein kann durch eine Funktion ersetzt werden, die Folgendes erfordert:
Zusätzliche Schritte für X Aufrufe, um die Speicher-SDT-Daten zweimal zu kopieren, d.h. etwa X * 2 * 7 Schritte (z.B. für zwei FP10_BKMV)
Y * 2 Schritte für einen gemeinsamen Funktionsaufruf (es wird von einigen zusätzlichen Schritten ausgegangen)
Ein gemeinsamer Aufruf von:
TON_FUN mit xxx Schritten
SR_FUN mit xxx Schritten
R_TRIG_FUN mit xxx Schritten
Dieses Rechenbeispiel liefert nur ungefähre Werte.
Ein bestimmter Funktionsbaustein
wird 30-mal aufgerufen
verwendet 750 Schritte => Gesamtzahl der Schritte: 30 * 750 Schritte = 22500 Schritte
verwendet TON, SR, Pulsmerker
Der Funktionsbaustein kann durch eine Funktion ersetzt werden, die Folgendes erfordert:
Zusätzliche Schritte für 30 Aufrufe, um die Speicher-SDT-Daten zweimal zu kopieren, d.h. 30 * 2 * 7 Schritte = 420 Schritte (z.B. für zwei FP10_BKMV)
750 * 2 Schritte für einen gemeinsamen Funktionsaufruf = 1500 Schritte (es wird von einigen zusätzlichen Schritten ausgegangen)
Ein gemeinsamer Aufruf von:
TON_FUN mit 200 Schritten
SR_FUN mit 35 Schritten
R_TRIG_FUN mit 35 Schritten
Gesamtzahl der Schritte: 420 Schritte + 1500 Schritte + 200 Schritte + 35 Schritte + 35 Schritte = 2190 Schritte
Ergebnis: Mit dieser Funktion sparen Sie etwa 22500 Schritte - 2190 Schritte = 20310 Schritte ein.
Vorgehensweise zum Umwandeln eines Benutzerfunktionsbausteins XXX in eine Funktion XXX_FUN
Es wird empfohlen, die Namenskonventionen beizubehalten.
Annahme: Eine Funktion XXX mit einer VAR_IN_OUTdutXXX vom Datentyp XXX_FUN_INSTANCE_DUT wird in allen Beispielen verwendet.
Operation |
Ursprüngliches Programmierbeispiel |
Umgewandeltes Programmierbeispiel |
---|---|---|
Aufrufe ![]() |
![]() |
|
FB POE-Kopf ![]() |
FUN POE-Kopf ![]() |
|
SDT XXX_FUN_INSTANCE_DUT ![]() |
||
Setzen Rücksetzen |
![]() |
![]() |
KEEP |
![]() |
![]() |
Bedingte Zuweisung, Rechenoperation |
![]() |
![]() |
Variablenwerte erhöhen/verringern |
![]() |
![]() |
Pulsmerker |
![]() |
![]() |
Am Ende der Funktion: Gegebenenfalls einige Speichervariablen den entsprechenden Ausgangsvariablen zuweisen: |
![]() |
|
SR |
![]() |
![]() |
RS |
![]() |
![]() |
TON |
![]() |
![]() |
TM_100ms |
![]() |
![]() |
Annahme: Eine Funktion XXX mit einer VAR_IN_OUTdutXXX vom Datentyp XXX_FUN_INSTANCE_DUT wird in allen Beispielen verwendet.
Operation |
Ursprüngliches Programmierbeispiel |
Umgewandeltes Programmierbeispiel |
---|---|---|
Setzen Rücksetzen |
|
|
KEEP |
|
|
Bedingte Zuweisung, Rechenoperation |
|
|
Variablenwerte erhöhen/verringern |
|
|
Pulsmerker |
|
|
Am Ende der Funktion: Gegebenenfalls einige Speichervariablen den entsprechenden Ausgangsvariablen zuweisen: |
|
|
SR |
|
|
RS |
|
|
TON |
|
|
TM_100ms |
|
|