Funktion mit variabler Variablenanzahl

ArthurDent

Level-2
Beiträge
11
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe SPSler,

kennt ihr eine Möglichkeit, wie ich eine Funktion erstellen kann, bei der die Anzahl der Eingangsvariablen beliebig groß ist?
Die Variablen sollen alle vom gleichen Typ sein.
Ein Beispiel wäre die Funktion "MAX(INT1, INT2, .., INTn)".

Ich frage speziell für Beckhoff, würde mich aber auch für Siemens interessieren.

Viele Grüße
ArthurDent
 
Moin ArthurDent,

ich spreche für SIEMENS:

1. Wozu sollte das gut sein?
2. Nein, wenn man einzelne Eingangsverknüfungen meint
3. Bedingt, wenn man Array[*] (bei InOut) oder Variant verwendet.

VG

MFreriberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Für Beckhoff gilt im Großen und Ganzen das von @MFreiberger für Siemens gesagte. Ich sehe solche dynamischen Konstrukte bei SPSen eher kritisch. Ist bei einem PC Programm kein Speicher mehr vorhanden läuft das eine Programm in teilen oder komplett nicht mehr, was nicht schön ist, aber nicht unbedingt tragisch. Bei einer SPS kann sowas aber fatale Folgen haben.
 
Danke für die Antworten.

Der Vorteil ist die Wiederverwendung des Bausteins als Bibliotheksbaustein.
Den Umweg über das Array bin ich ein paar mal gegangen, finde ich aber unschön.
Mich würde nur interessieren, wie diese Funktionen, wie MIN, MAX, ADD usw. intern aussehen. Die haben das ja auch irgendwie programmiert.
Dass man sich im Klaren sein muss, über den Speicher ist klar. Ich dachte aber an kleine Anzahlen.
 
Der Vorteil ist die Wiederverwendung des Bausteins als Bibliotheksbaustein.
Den Umweg über das Array bin ich ein paar mal gegangen, finde ich aber unschön.
Da gibt es, zumindest bei Beckhoff (und evtl. auch CODESYS generell), eine andere Lösung. Bei Bibliotheken kann man Parameterlisten anlegen und über diese dann bei jeder Nutzung der Bibliothek die Größe der Arrays festlegen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
1. Wozu sollte das gut sein?
Ein Beispiel wäre die Funktion "MAX(INT1, INT2, .., INTn)".
Moin Mario. Weil's ganz angenehm sein kann, eine einzige Funktion für eine variable Anzahl von EingangsGrössen verwenden zu können und MAX(...) ist ein wunderbar sinnvolles Beispiel dafür.
Soll ich mir wirklich für 2 Eingänge die Funktion MAX2(Var1, Var2) und für 3 Eingänge die Funktion MAX3(Var1, Var2, Var3) ... u.s.w. ... basteln müssen?
Und dann noch für jeden DatenTyp getrennt? MAX1INT(), ..., MAX10INT(), MAX1DINT(), ..., MAX10DINT(), MAX1REAL(), ..., MAXREAL10()?
Ich sehe solche dynamischen Konstrukte bei SPSen eher kritisch. Ist bei einem PC Programm kein Speicher mehr vorhanden läuft das eine Programm in teilen oder komplett nicht mehr, was nicht schön ist, aber nicht unbedingt tragisch. Bei einer SPS kann sowas aber fatale Folgen haben.
Ja, Oliver. Es ist (nicht nur) bei SPS-Programmen "gefährlich", wenn sich die Anzahl der SchleifenDurchläufe oder die SpeicherBelegung während der Laufzeit des Programms ändern kann.
Aber ist das wirklich damit vergleichbar, ob man ein und dieselbe Max-Funktion mal auf 2 und mal auf 5 Variablen anwenden möchte?
Die MAX-Funktion für 2 Variablen lässt sich problemlos so kaskadieren, dass man auch den MAX-Wert von 5 Variablen damit ermitteln kann.
Aber das Programm wird dadurch unübersichtlicher. Und die Anzahl der Variablen wird auch nicht zur Laufzeit des Programms festgelegt oder verändert, sondern vorab durch den Programmierer.
Das Vorhalten von zig MAX-Funktionen (für 2 Eingänge, für 3 Eingänge, u.s.w. ...) ist auch ganz schön Resourcen-fressend und fördert die Übersichtlichkeit in keinster Weise.
 
Soll ich mir wirklich für 2 Eingänge die Funktion MAX2(Var1, Var2) und für 3 Eingänge die Funktion MAX3(Var1, Var2, Var3) ... u.s.w. ... basteln müssen?
Warum nicht?
Wenn man es doch variabel umsetzen will, halte ich den Weg mit dem Array[*] of xy durchaus für gangbar.
Allerdings verstehe ich das Ansinnen, wenn eine unbestimmte Anzahl an Werten gleich behandelt bzw. miteinander verknüpft werden soll (ADD, MUL,...) und kann (also nicht SUB oder DIV,...). Oder, wenn man einen Wert gleich mehreren Variablen zuweisen will (MOVE).
Und dann noch für jeden DatenTyp getrennt? MAX1INT(), ..., MAX10INT(), MAX1DINT(), ..., MAX10DINT(), MAX1REAL(), ..., MAXREAL10()?
Da könnte man Variant einsetzen und intern im Baustein den Datatyp abfragen. Da bräuchte man tatsächlich keine separaten Bausteine für anlegen.
 
Zurück
Oben