Syntax für Beckhoff VAR_INPUT in Function Block

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

ich blicke anscheinend die Syntax nicht, wenn ich in TwinCAT einen Function Block mit Initialisierungsvariablen erstellen will. Was ich versuche:

FUNCTION_BLOCK FB_Test
VAR_INPUT
Testvar : INT;
END_VAR

-----------------
fbTest : FB_Test(Testvar:=1);

Dabei kriege ich die Fehlermeldung

Error No matching FB_init method found for instantiation of FB_Test

Ich meine eigentlich, diese Syntax bräuchte keine explizite FB_init, aber vielleicht habe ich das falsch verstanden. Ich habe schon versucht, mit Rechtsklick eine zu erstellen, die Fehlermeldung bleibt dann aber gleich. Erst wenn ich in FB_init reinschreibe

METHOD FB_init : BOOL
VAR_INPUT
bInitRetains : BOOL; // if TRUE, the retain variables are initialized (warm start / cold start)
bInCopyCode : BOOL; // if TRUE, the instance afterwards gets moved into the copy code (online change)
Testvar : INT;
END_VAR

THIS^.Testvar := Testvar;

kriege ich keine Fehlermeldung mehr. Das fühlt sich aber falsch an - Testvar als Input sowohl des FB als auch von FB_init? Soll das so? Oder gibt es eine elegantere Lösung?
 
Hallo zusammen,

ich blicke anscheinend die Syntax nicht, wenn ich in TwinCAT einen Function Block mit Initialisierungsvariablen erstellen will. Was ich versuche:

FUNCTION_BLOCK FB_Test
VAR_INPUT
Testvar : INT;
END_VAR

-----------------
fbTest : FB_Test(Testvar:=1);

Ich bin mir nicht sicher, ob ich dein Code richtig verstehe. Aber du möchtest hier in der Funktion die Funktion selbst aufrufen oder? Das sollte nicht gehen.

Warum möchten du eine Eingangsvariable im FB auf 1 setzen? Wenn dann würde eine Ausgangsvariable Sinn ergeben?


Erläutere mal was du machen möchtest.
 
Zuletzt bearbeitet:
Hallo zusammen,

ich blicke anscheinend die Syntax nicht, wenn ich in TwinCAT einen Function Block mit Initialisierungsvariablen erstellen will. Was ich versuche:

FUNCTION_BLOCK FB_Test
VAR_INPUT
Testvar : INT;
END_VAR

-----------------
fbTest : FB_Test(Testvar:=1);

Dabei kriege ich die Fehlermeldung

Error No matching FB_init method found for instantiation of FB_Test

Ich meine eigentlich, diese Syntax bräuchte keine explizite FB_init, aber vielleicht habe ich das falsch verstanden. Ich habe schon versucht, mit Rechtsklick eine zu erstellen, die Fehlermeldung bleibt dann aber gleich. Erst wenn ich in FB_init reinschreibe

METHOD FB_init : BOOL
VAR_INPUT
bInitRetains : BOOL; // if TRUE, the retain variables are initialized (warm start / cold start)
bInCopyCode : BOOL; // if TRUE, the instance afterwards gets moved into the copy code (online change)
Testvar : INT;
END_VAR

THIS^.Testvar := Testvar;

kriege ich keine Fehlermeldung mehr. Das fühlt sich aber falsch an - Testvar als Input sowohl des FB als auch von FB_init? Soll das so? Oder gibt es eine elegantere Lösung?
FB_INIT brauchst Du dafür auch nicht. Wenn es darum geht, dass Variablen beim ersten Start des Programms einen Wert erhalten machst Du das im Deklarationsteil. In Deinem Fall so:

Code:
Testvar    : INT := 1;

Wenn Du bei der Instanziierung Eingangsvariablen eines FB vorbelegen willst, wäre es so, wie @Thruser schrieb.
 
FB_INIT brauchst Du dafür auch nicht. Wenn es darum geht, dass Variablen beim ersten Start des Programms einen Wert erhalten machst Du das im Deklarationsteil. In Deinem Fall so:

Code:
Testvar : INT := 1;
Aber er verwendet doch die Variable, als Eingang! Das heißt er muss doch beim Funktionsaufruf immer eine Wert mit geben. Dann muss ich doch im FB den wer nicht nochmal belegen.

Oder?


Ich verstehe immer noch nicht was er mit dem Code machen möchte
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber er verwendet doch die Variable, als Eingang! Das heißt er muss doch beim Funktionsaufruf immer eine Wert mit geben. Dann muss ich doch im FB den wer nicht nochmal belegen.

Oder?


Ich verstehe immer noch nicht was er mit dem Code machen möchte
Er möchte (vermutlich), dass der Eingangswert bei der Instanziierung mit einem Wert vorbelegt ist. Bei TwinCAT und generell im CODESYS Universum müssen beim Aufruf eines FBs weder die Eingangsvariablen übergeben, noch die Ausgangsvariablen einer Variablen zugewiesen werden. Das kann alles außerhalb des Aufrufs erfolgen, was oft auch Sinn macht oder man kann einen Eingang auch gar nicht verwenden. Eingänge sind grundsätzlich optional, lediglich INOUT Variablen müssen zwingend beim Aufruf angegeben werden.
 
Hi,

Code:
fbTest : FB_Test := (Testvar:=1);
sollte funktionieren.

Gruß
Ja, das ist es!

Da wär ich nie drauf gekommen, weil ich es nicht wirklich logisch finde. Wenn ich schreibe

Code:
bFehler : BOOL := TRUE;

dann befindet sich links und rechts vom := jeweils ein BOOL-Objekt. Bei

Code:
fbTest : FB_Test := (Testvar:=1);

hingegen befindet sich links vom (linken, äußeren) := ein FB_Test-Objekt und rechts ein - ja was eigentlich? Inputwerte für das Objekt, was links der Zuweisung steht. Aber wenn ich es weiß, dann ist ja alles gut und ich kann weitermachen :)(y)

Danke!
 
Zurück
Oben