Funktionen mit mehreren Rückgabewerten

JPO

Level-2
Beiträge
55
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Community

Ich stehe vor der Herausforderung, eine Programm in Wago e!COCKPIT zu optimieren. Das Programm enthält einige Zeilen Code, und mein Ziel ist es, diesen schlanker zu gestalten. Dabei bin ich auf das Problem gestossen, dass ich, wenn ich Teile des Codes in eine Funktion extrahiere, nur einen Wert als Rückgabewert definieren kann.

In anderen Programmiersprachen wie C könnte man dieses Problem mit Pointern lösen, aber in Wago e!COCKPIT scheint dies nicht so einfach zu sein. Gibt es eine Möglichkeit, mehrere Rückgabewerte zu haben, wenn ich Teile meines Codes in separate Funktionen auslagern möchte?

Ich freue mich über jede Hilfe und Anregung. Vielleicht gibt es eine spezifische Funktion oder Technik, die ich bisher übersehen habe. Vielen Dank im Voraus für eure Unterstützung!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Function kann mehrere Output-Parameter haben, wo man die Werte einzeln ausgibt.
Man kann auch mehrere Werte zu einer Struktur oder Datentyp zusammenfassen und diese Struktur zurückgeben.

Warum willst du die Werte als "Rückgabewert" ausgeben? Mir scheint, du willst die Function gar nicht als "Function" verwenden, sondern einfach nur als Programm-Struktureinheit? Der aufrufende Code muss genau den Datentyp der Function entgegennehmen und kann sich nicht aussuchen, welchen der Werte er direkt weiterverwenden kann.
 
Eine Function kann mehrere Output-Parameter haben, wo man die Werte einzeln ausgibt.
Man kann auch mehrere Werte zu einer Struktur oder Datentyp zusammenfassen und diese Struktur zurückgeben.

Warum willst du die Werte als "Rückgabewert" ausgeben? Mir scheint, du willst die Function gar nicht als "Function" verwenden, sondern einfach nur als Programm-Struktureinheit? Der aufrufende Code muss genau den Datentyp der Function entgegennehmen und kann sich nicht aussuchen, welchen der Werte er direkt weiterverwenden kann.

Das Programm, an dem ich arbeite, besteht aus etwa 9 Unterfunktionen, und die meisten definierten Variablen werden in allen Unterfunktionen benötigt. Ich möchte die Unterfunktionen gerne auslagern, damit der Code übersichtlicher wird.
 
Moin,

wie schon geschrieben kann man auch bei Funktionen weitere Output Variablen festlegen. Es gibt aber auch noch die VAR_IN_OUT Variablen. Die ähneln ein bißchen der Übergabe von Zeigern bzw. by Reference Übergabe von Variablen in anderen Sprachen.

Zusätzlich gibt es noch unter Codesys Reference to, auch eine Art Pointer, sowie auch Pointer.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn es nur um die Strukturierung geht, wären Aktionen die bessere Wahl, oder auch Methoden, wenn es moderner aussehen soll. Beide gehören im Gegensatz zu Functions zur POU, in der sie definiert sind, und haben deshalb Zugriff auf die POU-Variablen. Da brauchst Du nichts übergeben.
 
Eine Function kann mehrere Output-Parameter haben, wo man die Werte einzeln ausgibt.
Eine Funktion hat genau einen Rückgabewert: X:=MyFunction();

2.1.3 Funktion
Eine Funktion ist ein Baustein, der als Ergebnis der Ausführung genau ein Rückgabewert (das auch mehrelementig sein kann, wie z. B. Felder oder Strukturen) zurückliefert. Der Aufruf einer Funktion kann in textuellen Sprachen als ein Operator in Ausdrücken vorkommen.
Bei der Deklaration einer Funktion ist darauf zu achten, dass die Funktion einen Typ erhalten muss, d. h. nach dem Funktionsnamen muss ein Doppelpunkt gefolgt von einem Typ eingegeben werden.
Eine korrekte Funktionsdeklaration sieht z. B. so aus:
FUNCTION Fct: INT
Außerdem muss der Funktion ein Ergebnis zugewiesen werden, d. h. der Funktionsname wird verwendet wie eine Ausgabevariable.

Ein FB kann mehrere Rückgabewerte haben: My_FB(A=>A, B=>B, C=>C);

2.1.4 Funktionsbaustein (Funktionsblock)
Ein Funktionsbaustein - auch Funktionsblock genannt - ist ein Baustein der bei der Ausführung einen oder mehrere Werte liefert. Ein Funktionsblock liefert keinen Rückgabewert im Gegensatz zu einer Funktion.
 
Output-Parameter und Rückgabewert sind nicht das gleiche
Eine Funktion unterstützt keine Output-Parameter. Zumindest in CoDeSys V2, hat sich das in V3 geändert?

Edit: Gerade nachgesehen: Tatsächlich gibt es in V3 nun die Möglichkeit:
A function is a POU that supplies precisely one data element when executed and whose call in textual languages can occur as an operator in expressions. The data element can also be an array or a structure.

ccording to the IEC 61131-3 standard, functions can have additional outputs. You declare the additional outputs in the function between the keywords VAR_OUTPUT and END_VAR.

Wieder was gelernt...
 
Zurück
Oben