Grundlegendes zu FB's

Phil

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

ich hab mal eine grundlegende Frage zur Anwendung von FB's.
FB's kann man doch absolut und öfters in einem Programm aufrufen, ohne dass ein Konflikt entsteht.
Oder hab ich da was falsch verstanden?
Können da Probleme entstehen?

Vielen Dank
 
Hallo!

FB's kannst du so oft aufrufen wie du willst nur musst du jedem FB einen eigenen Instanz-DB zuordnen.
Aufpassen solltest du auch noch darauf das es in den FB keine absolute Operanden gibt (E,A,M,T...) sondern nur mit Variablen gearbeitet wird. Dann sollte es kein Problem geben.

godi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Normal ruf man FB's nicht direkt auf sondern bildet Instanzen DB's.

Du kannst also einen Grundfunktionalität in einen FB legen und einen DB aufrufen der diese Funktionalität hat und ihm (dem DB) zusätzliche Features geben.

z.B erstellst du einen FB "Motor" mit den Grunddaten. Diesen kannst du dann mehrfach als DB aufrufen und erhälst so Verschiedene Motoren mit diesen Eigenschaften denen du dann zusätzliche Parameter geben kannst (Leistung, Polpaare......).

Das ganze steht verständlicher mit Beispielen in der S7 Doku irgendwo in deinem SIEMENS Verzeichnis auf deiner Festplatte.
 
Hallo,

so weit klar, den Instanz DB einmalig zuweisen oder bei jedem Aufruf einen neuen?
Hab brav nur Variablen verwendt und nicht's weiteres

Vielen Dank für die Hilfe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
DU solltest dich mal über Instanzen, Vererbung insbesondere was das ist usw. informieren. Hier kann du dir auch infos von Programmiersprachen (z.B C++) einholen. Dann sollte dir die Thematik klarer werden und der Umgang mit FB's DB's erschließt sich von selbst.
 
Jetzt ist mir noch was eingefallen,
da ich in meinem Prg ziemlich viele Aufrufe von Fb's habe kommen da einige Instanz DB's zusammen.
Ich hab jetzt mal was über UDT's gelsesen aber leider nicht ganz vertanden.Kann man damit nich eine einmalige Definition des DB's erreichen und es kommt trotz öfteren Aufrufs von verschieden Stellen aus zu keinem Konflikt?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du hast die Möglichkeit für Multiinstanzen.
Du kannst in einem Multiinstanz FB alle anderen FB aufrufen indem du die untergeordneten FB's als Stat deklarierst.


Code:
FUNCTION_BLOCK FB 1
TITLE =
VERSION : 0.1
 
VAR
  Motor1 : FB 10; 
  Motor2 : FB 10; 
  Motor3 : FB 10; 
END_VAR
BEGIN
NETWORK
TITLE =Motor 1
      CALL #Motor1 ;
NETWORK
TITLE =Motor 2
      CALL #Motor2 ;
NETWORK
TITLE =Motor 3
      CALL #Motor3 ;
END_FUNCTION_BLOCK
 
Jetzt ist mir noch was eingefallen,
da ich in meinem Prg ziemlich viele Aufrufe von Fb's habe kommen da einige Instanz DB's zusammen.
Ich hab jetzt mal was über UDT's gelsesen aber leider nicht ganz vertanden.Kann man damit nich eine einmalige Definition des DB's erreichen und es kommt trotz öfteren Aufrufs von verschieden Stellen aus zu keinem Konflikt?

Hallo Phil,

ein UDT ist nichts anderes als ein selbstdefinierter Typ, in C sowas wie typedef und struct, in Pascal record.

Damit kann man zusammenfassen was Zusammen gehört und den Daten eine Baumstruktur verpassen, was die Sache in aller Regel übersichtlicher macht.
Z.B. Struktur Tank enthält dann: Füllmenge, Temperatur, Leitwert (alle Real), Leer, voll, Rührwerk (bool) oder was halt alles sinnvoll ist.
Man kann auch Strukturen verschachteln.

Die Datenstruktur legt man einmal an, hat man nun mehrere Tanks in einer Anlage, so lassen sich die Daten immer auf die gleiche Struktur abbilden.
Dazu legt man ein oder mehrer DB's aus diesem UDT an, alternativ kann man auch einen globalen DB anlegen, der in sich mehrere Daten dieses Typs beinhaltet.
Einziger Nachteil, Kommentar und Anfangswerte werden schon beim Typ festgelegt und können anschließend nicht mehr verändert werden.
( in C++ löst man dies teilweise mit übergabeparametern an den Konstruktor)

Bei der Abänderung von UDTs muss man vorsichtig sein, da Siemens die davon abgeleiteten Daten nicht automatisch aktualisiert. Wird dies vergessen, so erlebt man beim öffnen der entsprechenden Bausteine böse Überraschungen. Ich persönlich fasse den UDT am Anfang lieber etwas weiter und greife dann auf bestimmte Daten, die vielleicht grad nicht verfügbar sind weil (noch) kein Sensor vorhanden ist, einfach nicht zu (z.B. Leitwert).
Mit UDTs kann man natürlich auch die Ein/Ausgänge von Bausteinen aufbauen, lokale und Temporäre Variablen deklarieren, wie mit "normalen" Variablen auch



Gruss

Kiestumpe
 
Zuletzt bearbeitet:
Vorsicht bei Multiinstanzen

Du hast die Möglichkeit für Multiinstanzen.
Du kannst in einem Multiinstanz FB alle anderen FB aufrufen indem du die untergeordneten FB's als Stat deklarierst.


Code:
FUNCTION_BLOCK FB 1
TITLE =
VERSION : 0.1
 
VAR
  Motor1 : FB 10; 
  Motor2 : FB 10; 
  Motor3 : FB 10; 
END_VAR
BEGIN
NETWORK
TITLE =Motor 1
      CALL #Motor1 ;
NETWORK
TITLE =Motor 2
      CALL #Motor2 ;
NETWORK
TITLE =Motor 3
      CALL #Motor3 ;
END_FUNCTION_BLOCK


Nicht Vergessen wenn jemand Multiinstanzen verwendet., gibt es ein paar Sachen beim erstellen der FB's zu beachten.

- Beim Erstellen der FB's muss im Editor das Hackerl "Multiinstanzfähige FB's erzeugen" gesetzt sein.
- Im AR2 steht der Offset der Instanz innerhalb der Multiinstanz.
- Wer also mit AR1 auf den DI zugreift, muss den Offset im AR2 dazurechnen.
- Wer das AR2 verändert, muss vor dem nächsten symbolischen Zugriff auf den DI das AR2 wieder herstellen.

Wer die Punkte nicht beachtet, kann sich auf ein fast aussichtslosen debuggen freuen.

Viel Spaß
 
@winny-sps

Ja das geht und man darf das auch machen.
Schlechter Programmierstil ist immer eine Definitionssache.
Gut ist es immer, wenn man eine gewisse Ordnung in seinem Programmen einhält.

z.Bsp.

Jede Station einer Anlage bekommt einen FC.
Die einzelnen Stationen werden im OB1 aufgerufen, gleichfalls FC, die für
das gesammt Programm gelten sollen (Allgemeine Fehlermeldungen,
Impulserzeugung, evtl. vorh. Baustein für OP-Anbindung etc.)
Jeder Zylinder/Motor wird durch einen FC angesteuert (Hab da eigene Standard-FC).

Hier hast du schon FC-Aufrufe innerhalb von FC's.
 
Hallo winny-sps !!

Na klar kann man im FC wiederum einen oder mehrere FC´s aufrufen.

Beispiel: Analogwerte einlesen und nomieren

FC 1 Analogwerte nomieren
FC105 skale V_Linie
FC105 skale Tänzer



Per
 
Zuletzt bearbeitet:
Zurück
Oben