Instanz Baustein immer ein kompletter DB ??

peter(R)

Level-1
Beiträge
1.061
Reaktionspunkte
132
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich muss einen kleineren FB ( ca. 20 Zeilen ) über 50 mal in meinem Programm aufrufen. Muss ich jetzt wirklich 50 DBs dafür opfern oder lässt sich das irgendwie in einem DB block zB. mit UDTs bündeln ??

peter(R)
 
Hallo,

wenn du deinen FB innerhalb eines Bausteins öfter aufrufst kannst du das über eine Multiinstanz machen. Dafür muss aber der aufrufende Baustein ein FB sein. Im Deklarationsteil unter Stat kannst du dann deinen FB als Variable anlegen Datentyp FB<Nr>. Musst aber vorher checken ob dein Baustein multiinstanzfähig ist, d.h. AR2 muss nach verlassen des Bausteins den gleichen Wert wie beim Aufruf haben und auch das DB Register 2 (DI) muss wieder den gleichen Wert haben. Wenn du innerhalb deines FB's auf die Adressen deiner Parameter (Pointer) zugreifst musst du den Offset aus AR2 dazu addieren. Ein FB als Multiinstanz weiß ja nicht das er nicht unbedingt bei DI Adresse 0.0 anfängt. Der Versatz steht dann im AR2.
 
wo simatiker grad von AR2 anfängt

wenn du die FBs in FCs aufrufst:

- bastel dir in deinem FB das AR2 für den Zugriff auf einen globalen DB als IDB selber. brauchste eigentlich nur einen index als aufrufnummer um die richtige stelle im DB zu finden. den aufruf machste dann wie oben schon mal angedeutet per UC (wobei ich oben auf den aufruf aus einem FB eingehen wollte)

[edit] blödsinn ... mit UC bekommste ja keine daten rüber ... gott, ist das früh heut
hat der baustein überhaupt ne schnittstelle? ;)

wenn er eine hat, dann wird das ganze unterfangen ein wenig aufwendiger, denn die müßteste vorher in den IDB (IN) kopieren, damit du damit arbeiten kannst und nachher aus dem IDB (OUT) kopieren[/edit]
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
mit UDT's lässt sich das ganze dann aber auch als FC realisieren, ne UDT anlegen die in einen DB packen und an die FC als IN_OUT. Und dann den Pointer auf den Anfang der jeweiligen UDT im DB am IN_OUT Parameter deiner FC beim Aufruf.
 
Hallo,
also ich finde den Vorschlag von Simatiker (alle FB-Aufrufe als Multiinstanz in einen neuen FB packen) wesentlich professioneller. Durch die Sache mit den UC-Aufrufen blickt doch irgendwann keiner mehr durch - ist aber Ansichtssache ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Beispiel:
Code:
FUNCTION_BLOCK "Beispiel_FB"
TITLE =
VERSION : 0.1

VAR_INPUT
  Befehl_setze : BOOL ; 
  Befehl_ruecksetze : BOOL ; 
END_VAR
VAR_OUTPUT
  Signalzustand : BOOL ; 
END_VAR
BEGIN
NETWORK
TITLE =
      U     #Befehl_setze; 
      S     #Signalzustand; 
      U     #Befehl_ruecksetze; 
      R     #Signalzustand; 
END_FUNCTION_BLOCK
FUNCTION_BLOCK "Aufruf-FB"
TITLE =
VERSION : 0.1

VAR
  Instanz1 : "Beispiel_FB"; 
  Instanz2 : "Beispiel_FB"; 
END_VAR
BEGIN
NETWORK
TITLE =
      CALL #Instanz1 ;
      CALL #Instanz2 ;
END_FUNCTION_BLOCK
DATA_BLOCK "Aufruf_Instanz"
TITLE =
VERSION : 0.0
"Aufruf-FB"
BEGIN
   Instanz1.Befehl_setze := FALSE; 
   Instanz1.Befehl_ruecksetze := FALSE; 
   Instanz1.Signalzustand := FALSE; 
   Instanz2.Befehl_setze := FALSE; 
   Instanz2.Befehl_ruecksetze := FALSE; 
   Instanz2.Signalzustand := FALSE; 
END_DATA_BLOCK
ORGANIZATION_BLOCK OB 1
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1

VAR_TEMP
  OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
  OB1_PRIORITY : BYTE ; //Priority of OB Execution
  OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
  OB1_RESERVED_1 : BYTE ; //Reserved for system
  OB1_RESERVED_2 : BYTE ; //Reserved for system
  OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
  OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
  OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
  OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =
      CALL "Aufruf-FB" , "Aufruf_Instanz" ;
END_ORGANIZATION_BLOCK
 
Zurück
Oben