Step 7 FB und FC Erläuterung

Le Penseur

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

Ich bringe mir SPS selbst bei und bin jetzt auf Hilfe angewiesen. Ich habe das Buch " Automatisieren mit SPS, Therorie und Praxis " von Wellenreuther und Zastrow gekauft. Ich übe mit den Übungen dort stoße auf paar Sachen, die ich nicht ganz verstehe.
Es gibt eine Übung von 3 Behälter mit jeweils 2 Sensoren für die Leermeldung und die Vollmeldung. und die 3 Behälter dürfen bei Leermeldung nicht gleichzeitig gefüllt werden.
Ich habe die Aufgabe lösen können per Hand. damit meine ich die jeweilige Verknüpfungen für jedes Ventil.
Jetzt meine Frage: Im Buch steht: " Da keine stationären Lokalvariablen auftreten, kann wieder eine Function FC für das Steuerungsprogramm verwendet werden".

Wann benutzt man eine FB? und wann benutzt man eine FC ? Ausserdem habe ich gesehen, dass ich beim FC nicht die gleiche Darstellung wie beim FB habe. Damit meine ich, wenn ich die variablen im FB lokal deklariere und den FB aufrufe, steht je nachdem wie ich es gemacht habe den Platz für die Eingänge und die Ausgänge aber beim FC zeigt er mir nur den Enable Eingang. Dann frage ich mich, warum es überhaupt die Möglichkeit gibt, die Variablen Lokal in einem FC zu deklarieren ??

Wie gesagt, ich bin Anfänger und bitte um Verständnis, wenn meine Fragen doof sind.

Danke im Voraus.
 
Hallo, ein FC ist eine Funktion, der übergibt man normalerweise etwas, und bekommt dafür etwas zurück. Z.B Gebe ich der Funktion
4 zahlen und bekomme einen Mittelwert zurück. Allerdings kann sich der FC nix "merken" soll heissen die Ergebnisse sind immer nur einen Zyklus gültig. Muss man sich aus irgendeinem Grund was speichern was auch einem späterem Zyklus gültig ist nimmt man normalerweise einen FB (Funktionsbaustein). Dieser FB hat immer eine dazugehörigen DB (Datenbaustein) der die Sachen speichert. Diesen DB nennt man dann Instanz-DB. Von aussen sehen sie allerdings gleich aus. Soll heissen man kann auch beim FC IN, OUT usw. Erstellen. Vlt kannst du dein letztes Problem genauer erläutern....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ein FC macht da mehr Sinn wo Beispielsweis Parameter von einem IO-Device verwendet wird. So werden z.B. die Inputs vom Device verwendet und daraus ein Mittelwert gebildet der wiederum auf den Output geschrieben wird. Für diese einfache Funktion wird nicht extra ein Datenbaustein verwendet und somit bleibt das Programm kompakter, was auch die Zyklus Zeit geringer hält. Aber ansonsten sind im FC auch die ganzen fertigen zur Verfügung gestellten Bausteine verfügbar...
Viel Erfolg noch...
 
So sieht meine Variablendeklaration und Netzwerke:
Bild1.jpg
so sieht meinen Aufruf
Bild2.jpg

Was ich nicht verstehe ist:
Bei einem FB würde ich schon die verschiedenen Eingänge und Ausgänge, die ih als lokalvariablen deklariert hatte sehen, damit ich die Eingänge und Ausgänge, die auf der Steuerung sind zuweise. Spricht zum Beispiel E1.x bis E1.y .....
Warum werden diese in FC nicht dargestellt??? Deswegen meine Frage, Wenn sie nicht dargetsellt sind, warum sind sie also vorhanden???
 
Bei einem FB würde ich schon die verschiedenen Eingänge und Ausgänge, die ih als lokalvariablen deklariert hatte sehen,
Zuerst musst du dein Begrifflichkeiten ein wenig verbessern sonst wird's unverständlich.
Die in IN/OUT/INOUT deklarierten (Formal-)Parameter gehören zur Bausteinschnittstelle und dienen lediglich der Wertübergabe zwischen der Funktion und dem Aufrufer-Programm. Diese als "Lokale Variablen" zu bezeichnen und zu behandeln ist schlichtweg falsch. Im Falle eines FCs existieren diese gar nicht im Speicher und der Zugriff auf die außen angelegten Variablen erfolgt über Pointer (CallByReference). Eine Sache wäre zum Beispiel dass es bei IN kein Draufschreiben und bei OUT kein Rücklesen in einem Baustein geben kann/sollte.

Als "Lokal" kann man nur TEMP-Variablen oder STAT-Variablen (bei FB) bezeichnen.

Warum werden diese in FC nicht dargestellt??? Deswegen meine Frage, Wenn sie nicht dargetsellt sind, warum sind sie also vorhanden???
Es gibt diesen Unterschied nicht. Wenn du bei FC oder FB in IN, OUT oder INOUT einen Formalparameter deklarierst, dann steht dieser in beiden Fällen beim Funktionsaufruf zur Verfügung.

In deinem gezeigten Versuch hast du vermutlich den FC zuerst ohne Parameter erstellt und aufgerufen. Dann hast du den FC um Parameter ergänzt und nur den FC gespeichert. Der Aufruf im Aufrufer-FB aktualisiert sich nicht von selbst. Das kannst du machen durch...
  • Aufrufbaustein - Datei / Zugriffe prüfen und Aktualisieren
  • oder Aufrufbaustein - Baustein einmal speichern reicht normal auch.
  • oder Aufrufbaustein - Schließen und neu öffnen
  • oder Aufrufbaustein - Betroffene Funktion löschen und neu einfügen
  • oder Gesamtübersetzen
Wenn aktualisiert wurde wird der Baustein rot, weil sich was geändert hat. Dann Rechtsklick und "Aufruf aktualisieren".
 
Hallo!

Mir ist heute etwas aufgefallen, und ich denke hier passt es am besten rein..

Habe einen FC geschrieben und OUT Variablen verwendet.
Jetzt bin ich an einem Punkt, wo ich jedoch eine STAT Variable benötige. -> neuen FB angelegt und Copy/Paste.

Sollte ja theoretisch das selbe machen... ABER!!

Mit meinem FC wurden OUT Variablen nicht angerührt, wenn sie im FC nicht bearbeitet wurden. (also wenn die Variable 1 war, bleibt sie auch 1)
Mit meinem FB werden OUT Variablen immer auf 0 gesetzt, wenn sie nicht im FB auf 1 gesetzt wurden. (mein Test: BEA am Anfang, damit der FB absolut nichts macht).

Mit ein bisschen Nachdenken bin ich draufgekommen, dass die Arbeitsweise vom FB richtig ist.
Da es nur eine OUT Variable ist und keine IN/OUT, kann der vorherige Zustand ja nicht gelesen worden sein.

Warum macht das ein FC anders?

LG
Michael
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das stimmt so nicht ganz. Wie ein FC mit an OUT angeschlossenen Variablen umgeht hängt davon ab, ob die Variable "per Reference" oder "per value" übergeben wird, und das hängt davon ab
- Welche CPU hast Du?
- Ist das ein "optimierter" FC?
- Welche Adresse hast Du außen angeschlossen?

Beispiel S7-300/400:
- außen ein E/A/M/PAx angeschlossen, dann wird der nur verändert, wenn der FC drauf schreibt (und der FC kann den sogar vorher lesen - "Gedächtnis")
- außen eine DB- oder TEMP-Variable angeschlossen, dann erhält die einen "zufälligen" Wert (oft 0, doch nicht immer)
siehe hier

Bei FB wird immer der momentane Wert der OUT-Instanzvariable (aus dem IDB) in die außen angeschlossene Variable kopiert. Wenn in einem FB-Instanz-Durchlauf der OUT auf 1 gesetzt wurde und in den nächsten Durchläufen nicht mehr angefasst wird, dann wird danach immer 1 in die außen angeschlossene Variable kopiert.


PS: "Das stimmt so nicht ganz" bezieht sich auf
Mit meinem FC wurden OUT Variablen nicht angerührt, wenn sie im FC nicht bearbeitet wurden. (also wenn die Variable 1 war, bleibt sie auch 1)
[...]
Warum macht das ein FC anders?

Harald
 
Zuletzt bearbeitet:
Wie sieht es aus, wenn ich eine OUT Variable mit "per value" übergebe? Dann schreibe ich doch nur einen fixen Wert auf den Ausgang...
Per Reference schreibe ich einen Wert auf eine Adresse, also A,M,PAx...

Bei mir handelt es sich um eine 315-2PN/DP ohne optimerte Bausteine (Ist das in Step7 schon möglich? Kenne ich nur aus TIA..)
Habe Ventil einer Ventilinsel angeschlossen (A4.0)


Warum es beim FB funktioniert ist mir schon klar, aber warum kann ein FC eine OUT Variable vorher lesen?? Das ist doch der Sinn einer IN/OUT Variable..

LG
Michael
 
Wie sieht es aus, wenn ich eine OUT Variable mit "per value" übergebe?
Das sieht nicht anders aus als ein Aufruf "per Reference" - der FUP/KOP/AWL-Compiler entscheidet das automatisch beim FC-Aufruf anhand der Art des verschalteten Aktualoperanden. Gehe nochmal zu meinem Beitrag #9 und schau Dir die dort verlinkte Erklärung an:
Beispiel S7-300/400:
- außen ein E/A/M/PAx angeschlossen, dann wird der nur verändert, wenn der FC drauf schreibt (und der FC kann den sogar vorher lesen - "Gedächtnis")
- außen eine DB- oder TEMP-Variable angeschlossen, dann erhält die einen "zufälligen" Wert (oft 0, doch nicht immer)
siehe hier


Habe Ventil einer Ventilinsel angeschlossen (A4.0)
[...] aber warum kann ein FC eine OUT Variable vorher lesen??
"A4.0" wird "per Reference" übergeben - also nicht der Wert (value) sondern die Adresse (reference) wird übergeben. Deshalb kann der FC den Wert des A4.0 auch lesen (weil er die Adresse mitgeteilt bekommt), und wenn der FC auf den OUT-Parameter schreibt, dann schreibt er direkt und sofort auf die Adresse "A4.0". Nach Ende des FC wird NICHT der Wert des OUT in A4.0 kopiert - deshalb behält der A4.0 seinen Wert, wenn im FC nicht auf ihn geschrieben wird.

Man sollte dieses Spezial-Verhalten aber nicht im FC ausnutzen, weil der FC nicht weiß, ob er mit einem E/A/M/P aufgerufen wird und es kann auch noch Unterschiede geben, wenn der FC in FUP oder KOP anstatt in AWL aufgerufen wird. Bei FUP/KOP kann es sein, daß die Übergabe des A4.0 über eine Zwischenvariable in TEMP läuft und dann geht die Übergabe "per value".

Harald
 
Zurück
Oben