Ja, in dem Programm wird nur der FB aufgerufen.Ich wollte noch fragen wie groß der Lokaldatenspeicher ist
Ziemlich groß, gemessen in Bits. Bin nicht sicher, aber ich habe so 2kB im Kopf..
...und ob man die Adresse frei wählen kann z.B. L20.0.
Ja, kann man. Aber dabei gibt es die Gefahr, daß es mit automatisch erzeugten Lokalvariablen kollidiert. Die Parameter an einen FC werden über den Lokaldatenstack übergeben. Die Definition von Temp-Variablen benutzt ihn ebenfalls. Wenn keine starken Argumente dagegen sprechen, sollte man TEMP-Variablen reservieren. Vorteil: step7 paßt ihre Lage an, wenn man Parameter oder weitere TEMP-Variablen einfügt.
Gehe ich recht von der Annahme aus, das der FB nur parametisiert einen Vorteil gegenüber dem FC hat, sonst kann man ja einfach Merker verwenden.
Man kann einfach Merker verwenden. Man hat das zu S5-Zeiten immer getan. Vorteil von FB und Instanzdatenbaustein:
- Du entwirfst eine Baustein zur Motorsteuerung. Der muß irgendwas über Aufrufgrenzen hinweg speichern.
- Du hast mehr als einen gleichartigen Motor, den du mit diesem Baustein steuern willst.
- Nun kannst du einen Instanz-DB pro Motor erzeugen und der speichert die jeweiligen Dinge für Motor 1,2,3..
Zu S5-Zeiten wäre das nicht gegangen, du hättest es so machen müssen:
- Du gibst alle Merker einzeln als Parameter beim Bausteinaufruf an. Die entsprechenden Befehle zum Zugriff auf Parameter sind auf der S5 erheblich langsamer und du hast bei jedem Aufruf eine eventuell lange Parameterliste.
- Du machst Kopien von dem Baustein und paßt die Merker mit der Hand an.
- Du kopierst aus einem DB auf die immer gleichen Merker, rufst den Baustein auf und kopierst alles zurück. Ziemlich viel Code und Handarbeit.
- Du öffnest einen DB vor dem Aufruf und arbeitest im Baustein mit Bits aus dem DB statt Merkern. Das kommt dem Instanz-DB ziemlich nahe. Nachteil: Du kannst im Baustein keine weiteren DBs benutzen, sonst kannst du nicht zurück zum Daten-DB, denn du hast keine Information, welcher DB offen war.
- Du gibst dem Baustein die DB-Nummer als Parameter mit. Das ist ziemlich genau das, was beim Instanz-DB auch passiert. Allerdings bist du selbst dafür verantwortlich, daß der DB die passende Größe und Struktur hat. Darum kümmert sich Step7 beim Erstellen.
Temporäre Lokalvariablen haben noch einen anderen Zweck: Sie sind nützlich, wenn du innerhalb eines Bausteins Zwischenergebnisse bilden wilst. Bei Bit-Logik ist das manchmal nützlich, um die Programmlänge zu verkürzen und oft, um das Verständnis zu erleichtern:
Code:
U E0.0 // Sicherheitslichtvorhang frei
U E0.1 // Tuer zu
U E0.2 // Schleuse zu
= #Sicherheit gegeben // Zwischenergebnis in Lokalvariable
Danach können alle Ausgänge mit "Sicherheit gegeben" und-verknüpft werden.
Noch drastischer nützen Lokalvariablen bei Rechnungen, z.B. Analogwertverarbeitung:
Code:
L PEW 0 // Potistellung
ITD
DTR
L 26748.0
/R
L 100.0
*R
T #Potistellung //Potistellung in Prozent
L PEW 2 // Drehzahl
... // verschiedene Rechenschritte
T #Drehzahl //Drehzahl in UpM
L #Potistellung
L #Drehzahl
*R
T #DrehzahlAbhängigerAntrieb //Drehzahl in UpM
... // verschiedene Rechenschritte
T PAW0 // Ausgabe an Antrieb
Hier dienen die Zwischeergebnisse dazu, den Programmablauf zu strukturieren und sie ermöglichen es, die Werte in technischen Einheiten zu beobachten (Prozent, UpM). Ferner muß, wenn z.B. ein anderer Drehzahlgeber eingesetzt wird, nur der Teil bis zur Errechnung der UpM angepaßt werden.
In beiden Beispielen haben die Zwischenergebnisse #Sicherheit gegeben bzw. #Potistellung und #Drehzahl nur während der Ausführung des Bausteins Bedeutung.