Worin liegen die Unterschiede zum FB und FC

plc_tippser

Level-1
Beiträge
2.500
Reaktionspunkte
308
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Funktion-Block hat Gegensatz zu einer Funktion Speicherbereiche die länger als einen Zyklus gültig sind. Dazu müssen für jeden Aufruf des FBs eine eigene Instanzen gebildet werden die den Speicherbereich bereitstellen. Die Logik ist im eigentlichen FB und die Lokalen Variablen sind in der Instanz.

Bei Siemens sind dazu lästige Instanz DBs nötig. Bei anderen Systemen funktioniert die Instanzbildung wie eine Variablen Deklaration und verhindert den Quer zugriff auf die Daten.

Die IEC 61131-3 beschreibt das auch als Datenkapselung:
Zitat:
Was sind Funktionsblöcke?
Die Aufgabe von einem Funktionsblock ist die Kapselung der Daten und der Algorithmen.
Der Algorithmus definiert wie die Eingangsdaten zu den Ausgangsdaten unter
Berücksichtigung der lokalen Daten verarbeitet werden sollen.


_________________
Gruß
ZoToS
 
Man kann FB´s auch multiinstanzfähig auslegen.
Somit können mehrere FB´s in einem FB aufgerufen werden um den gleichen Instanzdatenbaustein zu nutzen.

Gruß, pt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
von Doc Funfrock:

Ich habe in der FAQ etwas zu FBs gesehen und will mal ein Bsp liefern. Alles in ST:

Oftmals benötigt man Automaten die über eine Zustandsvariable und eine Case-Verzeigung gebildet werden. Bsp eines Blinklichtes:

Code:
Code:
VAR 
  state : INT := 1; 
  timer1  : TON; 
  timer2  : TON; 
END_VAR 

timer1(PT:=t#500ms); 
timer2(PT:=t#100ms); 

CASE state OF 
 1: 
  Red_Light := TRUE; 
  timer1.IN := NOT timer1.Q; 
  IF timer1.Q THEN 
   state := 2; 
  END_IF; 


 2: 
  Red_Light := FALSE; 
  timer2.IN := NOT timer2.Q; 
  IF timer2.Q THEN 
   state := 1; 
  END_IF 
END_CASE;



Diese Art der Konstruktion wiederholt sich oft im Alltag. Nun aber zum Kern. Oft hat man Stationen, die sich in manchen Grundfunktionen gleichen, wie z.B. eine Start-Taster oder die Anzeige von Zuständen. Wenn man diese Stationen als FB implementiert, so spricht nichts dagen innerhalb dieser FB wiederum einen FB zu instanzieren, der diese gemeinsamen Funktionalitäten abbildet, denn der Automat von oben kann geteilt werden:

Code:
Code:
VAR 
  state : INT := 1; 
  timer1  : TON; 
  timer2  : TON; 
END_VAR 

timer1(PT:=t#500ms); 
timer2(PT:=t#100ms); 

CASE state OF 
 1: 
  Red_Light := TRUE; 
  timer1.IN := NOT timer1.Q; 
  IF timer1.Q THEN 
   state := 2; 
  END_IF; 
END_CASE; 

CASE state OF 
 2: 
  Red_Light := FALSE; 
  timer2.IN := NOT timer2.Q; 
  IF timer2.Q THEN 
   state := 1; 
  END_IF 
END_CASE;


Somit kann ein Teil des Automaten in dem FB programmiert werden, der von allen Stationen instanziert wird während der spzielle Teil im FB der Station implementiert wird. Als Bsp sei die Montrac-Bahn genannt. Diese Bahn ermöglicht den Transport des Produktes zu den Bearbeitungsstationen. Der SPS-Code für die Verwaltung der Wagen (Start, Stop, Anstossen des Prozesses) ist allen Stationen gemeinsam und muss nicht kopiert werden, sondern wird als FB in jeder Station instanziiert Dieser Code ist nichts weiter als der 1. Teil des Automaten für eine Station mit den Zuständen:

- Wagen ist in der Station
- Ist ein Prozess passend für das Produkt auf der Station vorhanden?
- Station führe Prozess Nr. x aus
- Schick Wagen weiter


Der Vorteil ist leicht zu sehen, umgeht man doch das Kopieren von Code und die gemeinsame Codebasis, verhindert, dass man eine Station bei der Fehlerkorrektur vergisst.

Um das zu realisieren benötigt man noch ein globales Array mit allen Stationsdaten, in dem auch die Zustandvariable instanziiert wird.

Doc Funfrock
 
Hinweis: Ich bin für jede Info bzgl. der Themen aufgeschlossen und werde sie gerne ins FAQ übernehmen. Also, schickt mir Nachrichten im Forum oder per PN.

Gruß, pt
 
Zurück
Oben