Problem mit FB in SCL

broesel

Level-1
Beiträge
29
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
In einem FB1 rufe ich einen FB2 mit Instanz-DB2 auf,
jetzt meckert der Compiler bei den Übergabeparametern.

FB1:
Var

Stack_empty:BOOL;
Stack_full:BOOL;
Adr_Ziel :INT;

End_Var

FB2:
Var_Input
Adr_in : INT;
Adr_insert : BOOL;
Adr_remove : BOOL;
End_Var

VAR_OUTPUT
empty : BOOL;
full : BOOL;
END_VAR



Aufruf im FB1:

FB2.DB2(Adr_in:=Adr_Ziel,Adr_insert:=true,Adr_remove:=false,Stack_empty:=empty,Stack_full:=full);

Bekomme den Fehler: Ungültige zuweisung. Woran liegt das?
Die Ausgangsparameter des FB2(empty, full) möchte ich gerne im FB1 verwenden.

Danke!!
 
In einem FB1 rufe ich einen FB2 mit Instanz-DB2 auf,
jetzt meckert der Compiler bei den Übergabeparametern.

FB1:
Var

Stack_empty:BOOL;
Stack_full:BOOL;
Adr_Ziel :INT;

End_Var

FB2:
Var_Input
Adr_in : INT;
Adr_insert : BOOL;
Adr_remove : BOOL;
End_Var

VAR_OUTPUT
empty : BOOL;
full : BOOL;
END_VAR



Aufruf im FB1:

FB2.DB2(Adr_in:=Adr_Ziel,Adr_insert:=true,Adr_remove:=false,Stack_empty:=empty,Stack_full:=full);

Bekomme den Fehler: Ungültige zuweisung. Woran liegt das?
Die Ausgangsparameter des FB2(empty, full) möchte ich gerne im FB1 verwenden.

Danke!!


Also ohne jetzt alle Fehler gesehen haben zu wollen aber das ist schon mal einer.

Es ist zwar so das die Zuweisung vom Rechts nach Links geht also a:=b; a bekommt den Wert von b zugewiesen aber bei einem FB Aufruf werden den Ausgängen Variablen zugeordnet müsste also so:

FB2.DB2(Adr_in:=Adr_Ziel, Adr_insert:=true, Adr_remove:=false, empty:=Stack_empty, full:=Stack_full);

lauten.

--> also OutFB2:=VarFB1
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Entschuldige, ich habe es im Aufruf falsch eingetragen.
So wie Du es sagst, sollte es sein.

Trotzdem die Fehlermeldung: Ungültige Zuweisung


Danke für Deine Antwort.
 
Das hängt m.E. mit den beiden Output-Parametern vom FB2 zusammen. Kontrollier das doch bitte noch mal ...
 
Bei mir funktionier folgender Aufruf:

Code:
FUNCTION_BLOCK FB1
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
    Stack_empty : BOOL;
    Stack_full  : BOOL;
    Adr_Ziel    : INT;
END_VAR
BEGIN  
FB2.DB2(Adr_in      := Adr_Ziel, // IN: INT
        Adr_insert  := TRUE,     // IN: BOOL
        Adr_remove  := FALSE     // IN: BOOL
        ); 
    Stack_empty  := DB2.empty;   // OUT: BOOL
    Stack_full   := DB2.full;    // OUT: BOOL
END_FUNCTION_BLOCK

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja danke Kai, so geht es bei mir auch.
Ich hatte es vorher auch schon einmal so.

Mich wundert es nur, das ich die Rückgabeparameter vom FB2
nicht gleich mit in den Aufruf schreiben kann.

Na ja Danke an alle nochmal!

Gruß broesel
 
Wenn Du das aber in einer Zeile machen willst geh doch hin und mache aus dem
Code:
VAR_OUTPUT
  empty : BOOL;
  full : BOOL;                 
END_VAR
ein
Code:
VAR_IN_OUT
  empty : BOOL;
  full : BOOL;                 
END_VAR
und teste den Aufruf noch mal.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi


Code:
FB2.DB2(Adr_in:=Adr_Ziel,Adr_insert:=true,Adr_remo ve:=false,Stack_empty:=empty,Stack_full:=full);

Hast du den DB2 nochmals von Hand gelöscht ?

Er sollte bei geänderer Parameterzahl / neuer Ableitung "Neu Generiert" werden.
 
Ist so auch übersichtlicher, wenn man gleich nach dem Aufruf des FB2
die Rückgabewerte in eine Variable des FB1 schiebt.
Meine ich jedenfalls.
 
Hast du den DB2 nochmals von Hand gelöscht ?

Er sollte bei geänderer Parameterzahl / neuer Ableitung "Neu Generiert" werden.

Der DB2 wird zwar neu angelegt, der Aufruf funktioniert aber trotzdem nicht.

Code:
UNCTION_BLOCK FB1
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
    Stack_empty : BOOL;
    Stack_full  : BOOL;
    Adr_Ziel    : INT;
END_VAR
BEGIN  
FB2.DB2(Adr_in := Adr_Ziel, Adr_insert := true, Adr_remove := false,
        empty := Stack_empty, full := Stack_full);
END_FUNCTION_BLOCK

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist so auch übersichtlicher, wenn man gleich nach dem Aufruf des FB2
die Rückgabewerte in eine Variable des FB1 schiebt.
Meine ich jedenfalls.

Das es mit VAR_OUTPUT so nicht klappt kann ich ja noch verstehen das man da von der Instanz den Variablen Wert beziehen muss. Aber das die VAR_IN_OUT Variante nicht funktioniert irritiert mich.


Ich der das Du es so versucht hast:

Code:
FB1:
Var
     Stack_empty:BOOL;
     Stack_full:BOOL;
     Adr_Ziel  :INT;
 
End_Var
 
FB2:
Var_Input
     Adr_in : INT;
     Adr_insert : BOOL;
     Adr_remove : BOOL;
End_Var
 
VAR_IN_OUT
    empty : BOOL;
    full : BOOL;                 
END_VAR

FB2.DB2(Adr_in:=Adr_Ziel, Adr_insert:=true, Adr_remove:=false, [COLOR=Blue]empty:=Stack_empty, full:=Stack_full[/COLOR]);
 
Zurück
Oben