Codesys Verständnisfragen

DerPaul

Level-2
Beiträge
45
Reaktionspunkte
0
Hallo,

ich komme eigentlich aus der Step7 Welt und arbeite mich jetzt in Codesys ein...

Ich habe da ein paar Fragen:

1.Frage wenn ich ein FB habe und im FB z.B. eine Mehtode aufrufe: starte_motor_verzoergert();
Und ja, der Code ist nur auf das nötigste reduziert ;)

Code:
Method starte_motor_verzoergert
TON.IN := TRUE;

IF TON.Q = TRUE THEN
     motor_EIN := TRUE;
END_IF

Das wird ja so wahrscheinlich nicht gehen oder? Weil die Methode ja nicht wie ein FB zyklisch aufgerufen wird, sondern nur einmal..!?

2. Wenn ich jetzt in der obigen Methode stattdessen eine WHILE TON.Q = FALSE DO rein schreibe... Was passiert mit dem Rest des FBs. der die Methode aufgerufen hat? Wartet der so lange bis die Zeit um ist?

3. Wie macht ihr das mit Timern in Methoden? Oder macht man das nicht?

Grüße,

DerPaul
 
Zuletzt bearbeitet:
Objekt: FunctionBlock (FB)
Methode: Zum Objekt zugehörig, d.h. logisches Element des FBs.

Aufruf der Methode über <Instanzname_des_FBs>.<Methodenname>(parameter.....). Nur wenn die Methode aufgerufen wird, wird der Code 1xmalig ausgeführt.
Du musst die Methode somit zyklisch aufrufen. In deinem Code wird aber z.B. auch die Instanz von TON nicht aufgerufen...

Prinzipiell würdest du wohl eine Methode "Starte_Motor_Verzögert desfinieren" den du solange aufrufst bis sein Rückgabeparameter (z.B. Bool) sagt das
a) die Zeit abgelaufen ist
b) deine Arbeitsschritt fertig ist.

Von dem was ich so vermute schlage ich dir vor mal mit CoDeSys ein paar zeilen Code reel zu schreiben und laufen zu lassen.

Guga
 
Da war also mein Denkfehler...
Klar, die Methode wird wir ja durch das FB auch zyklisch aufgerufen...
Mit Instanz meinst du in der Schnittstelle z.B. TON_Verzoegerung : TON; und im Programm dann
TON_Verzoegerung.IN:= TRUE; ?!

Deswegen meinte ich, der Code ist aufs Minimum beschränkt... ;)
 
nicht ganz. Die Methode musst du explizit aufrufen.
Entweder dediziert über FBInst.Methode() oder aber im Body des FBs.
Wenn du es im body des FBs machst muss dieser aber auch wieder zyklisch aufgerufen werden damit dann die Methode zyklisch angetriggert ist.

Mit Instanz meine ich das FBs "Hausnummern" haben. In der Deklaration also z.b
fbi_Ton : TON ; // instanz fbi_Ton vom Typ TON. im Code rufst du die Instanz auf.

Guga
 
Das habe ich jetzt so weit verstanden - nur eine Frage noch: Wie verhalten sich Timer in Methoden? Eigentlich sind alle Variablen in Methoden doch nur Temporär, von daher müsste doch auch jede Zeit theoretisch bei jedem Aufruf neu gestartet werden und daher nie ablaufen..?! Oder laufen Timer noch in einem eigenen Speicherbereich?
 
Eine Funktion hat keine Variablen mit speicherendem Verhalten.
Ein Funktions-Block sind die dort deklarierten Variablen speichernd (per default über die Laufzeit des Systems nicht über einen Kaltstart).
Der Timer ist ein 08/15 Funktionsblock und speichert speichert intern die Systemzeit wann er aufgerufen wurde (steigende Flanke) und überprüft dann bei jedem weiteren Aufruf das Delta zur aktuellen Zeit.
Soweit OK? Im Prinzip kannst du sagen das jeder Funktionsblock seinen eigenen kleinen DB mitbringt..

Guga
 
Mittlerweile kann man auch in Methoden mit "VAR_INST" statische Variablen anlegen, die nicht bei jedem Methodenaufruf neu initialisiert werden. Dort könntest Du den Timer unterbringen. Aber macht das Sinn? Ich gehe mal davon aus, dass Du die Methode nur solange zyklisch aufrufen willst, bis sie den Ablauf der Verzögerung und das Einschalten des Motors zurückmeldet. Danach bleibt der Timer der Methode gesetzt, weil sie nicht mehr aufgerufen wird. Bevor Du die Methode das nächste Mal zum Starten des Motors aufrufen kannst, musst Du sie alo erst einmal mit "TON_in:=False" aufrufen, um den Timer zurückzusetzen. FBs wie Timer, Trigger und dergleichen, deren interne Funktion einen zyklischen Aufruf erfordert, bedingt aufzurufen ist ein gefährliches Spiel, bei dem man gerne mal einen lebenswichtigen Aufruf vergisst.
 
Eine Methode ist doch immer einem FB zugeordnet, und hat Zugriff auf dort deklarierte Variablen. Daher kann man den Timer im entsprechenden FB definieren, und dort auch den zyklischen Aufruf sicherstellen.

Die Methode kann dann dazu genutzt werden, um die Eingänge des Timers entsprechend zu setzen. (Start/Stop)
 
Zurück
Oben