TwinCat3 - Methoden mehrere Rückgabewerte

luci

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend,

evtl. könnt Ihr mir hier fix weiterhelfen :)
Ich würde gerne die Rückgabewerte der Methode gerne direkt in das Struct speichern. (Nicht über Hilfsvariablen beim Methodenaufruf)
Bekomme leider die Fehlermeldung, dass die Variablen (rot markiert) " no input of 'M_Messung' " sind.
Bin für Tipps sehr dankbar!

***********Methode**************
METHOD M_Messung : BOOL
VAR_INPUT
nSoll : UINT;
fToleranz : REAL;
END_VAR
VAR_OUTPUT
fMittelwTu : REAL;
fMittelwPcuPad : REAL;
fProzAbw : REAL;
bIo : BOOL;
END_VAR
*************************


***********Aufruf im FB**************
IF M_Messung( nSoll := nSoll1 , fToleranz := fToleranz ) THEN
stProtokoll.sTraegergasDurchflussTu_3_lm := TO_STRING( M_Messung.fMittelwTu );
stProtokoll.sTraegergasDurchflussPcuPad_3_lm:= TO_STRING( M_Messung.fMittelwPcuPad );
stProtokoll.sTraegergasDurchflussProz_3_lm := TO_STRING( M_Messung.fProzAbw );

IF M_Messung.bIo THEN
stProtokoll.sGasdurchflussmesser_3_lm := 'IO';
nTestschritt := nTestschritt + 10;
ELSE
stProtokoll.sGasdurchflussmesser_3_lm := 'NIO';
nFehlerschritt := nTestschritt;
nTestschritt := 920;
END_IF
*************************
 

Anhänge

  • Methode.png
    Methode.png
    6,3 KB · Aufrufe: 13
  • Fehler_Aufruf.png
    Fehler_Aufruf.png
    50,9 KB · Aufrufe: 13
Aber Du hast ja gar kein Struct definiert. Dein Rückgabewert ist als BOOL definiert: "METHOD M_Messung : BOOL"
Ich würde ein separates Struct definieren als Membervariable (im Rumpf des FBs definieren, nicht in der Methode), bestehend aus
fMittelwTu : REAL;
fMittelwPcuPad : REAL;
fProzAbw : REAL;
bIo : BOOL;

Dann die Methode definieren als "METHOD M_Messung : REFERENCE TO ST_RückgWertMessung"
In der Methode die Werte der definierten Membervariable zuweisen und ganz am Schluss schreiben:

M_Messung REF= NameMemberVariable;

Ich würde hier aus Performance Gründen mit Referenzen arbeiten.
 

Anhänge

  • 1670225466480.png
    1670225466480.png
    101,6 KB · Aufrufe: 4
Danke für die schnellen Antworten!
Evtl. ist es bei mir ein generelles Verständnisproblem, da ich bisher noch nicht mit Methoden gearbeitet habe.
Beim FB ist ja so, dass man mit dem Punktoperator direkt die Ausgänge des FBs erhält.
z.B. : fbTon : TON := (PT := T#5s);

fbTon( IN := TRUE);

IF fbTon.Q THEN
...


Wenn ich dasselbe bei der Methode versuche z.B.
M_Messung( nSoll := nSoll1 , fToleranz := fToleranz );

IF M_Messung.bIo THEN
...
Dann bekomme ich die Fehlermeldung, obwohl ich in der Methode bIo als Output deklariert habe:
bIo is no input of 'M_Messung'
 

Anhänge

  • 1670233348884.png
    1670233348884.png
    2,5 KB · Aufrufe: 5
Zuviel Werbung?
-> Hier kostenlos registrieren
Die VAR_OUTPUT von Methoden sind temporär, Du musst sie nach dem Methodenaufruf in Variablen der aufrufenden POU kopieren, etwa so:
Code:
IF M_Messung( nSoll := nSoll1 , fToleranz := fToleranz,
blo=>Speicher_fuer_blo) THEN
Das Ganze natürlich auch für die übrigen VAR_OUPUT der Methode.
 
Die VAR_OUTPUT von Methoden sind temporär, Du musst sie nach dem Methodenaufruf in Variablen der aufrufenden POU kopieren, etwa so:
Code:
IF M_Messung( nSoll := nSoll1 , fToleranz := fToleranz,
blo=>Speicher_fuer_blo) THEN
Das Ganze natürlich auch für die übrigen VAR_OUPUT der Methode.

Ahh okay! Danke für die Hilfe, werde ich direkt umsetzen :)
 
Zurück
Oben