TC3: Funktion mit Optionalen Eingängen

Beiträge
6.483
Reaktionspunkte
1.534
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
weder Tante Google noch RTFM haben die Erleuchtung gebracht.
Bei FBs muss man ja nicht alle als VAR_INPUT deklarierten Variablen setzen. Gibt es bei Funktionen auch so etwas? Normalerweise kommt ja ein Übersetzungsfehler, wenn man einen Parameter weg lässt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Probiere es doch kurz aus, ich konnte im Beckhoff Information System auch keine Info dazu finden.
Habe ich ja, lässt man Eingänge weg kommt eine Fehlermeldung. Die Frage wäre jetzt, ob man die Variablen anders deklarieren kann/muss oder ein Pragma setzen kann.
 
Nein das geht nicht. Auch ein Überladen wie z.B. in C++ ist nicht möglich. Beim Aufruf von Funktionen muss du die Inputs auch nicht explizit zuweisen
Code:
anstatt
foo(a:=1, b:=2)
geht auch
foo(1,2)
Wie soll da der compiler wissen welche variable nicht belegt wurde?
 
Nein das geht nicht. Auch ein Überladen wie z.B. in C++ ist nicht möglich. Beim Aufruf von Funktionen muss du die Inputs auch nicht explizit zuweisen
Code:
anstatt
foo(a:=1, b:=2)
geht auch
foo(1,2)
Wie soll da der compiler wissen welche variable nicht belegt wurde?
Naja, das Problem der Zuweisung wäre ja noch lösbar.
Schade, da war ich dann etwas voreilig und hatte FBs und FCs verwechselt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kannst du deine Funktion nicht einfach in mehrere Funktionen splitten? Ich versuche Funktionen immer so knapp wie möglich zu halten, alles was komplexer wird wandert bei mir dann in einen FB.
 
@oliver.tonn
Nur für mein Verständnis, gemeint sind Übergabeparametern wie zum Beispiel int, float, etc...?

Könntest du nicht die Übergabeparameter in einem Struct zusammenstellen und das dann an die Funktion übergeben?
 
FUNCTION MyADD : INT VAR_INPUT IN1: INT; IN2: INT:= 1; // Einfach einen Initialwert angeben und schon ist der Eingang optional END_VAR VAR END_VAR

Ab welcher TC Version das funktioniert kann ich dir nicht sagen, aber in CODESYS geht das in SP17 und wenn ich mich recht erinnere auch schon in SP16
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ab welcher TC Version das funktioniert kann ich dir nicht sagen, aber in CODESYS geht das in SP17 und wenn ich mich recht erinnere auch schon in SP16
In TC3 4024.12 auf jeden Fall noch nicht und eine neuere darf der Kollege noch nicht nutzen.
Ich werd das heute abend mal an meiner VM testen, da ist die letzte Version drauf.
 
FUNCTION MyADD : INT VAR_INPUT IN1: INT; IN2: INT:= 1; // Einfach einen Initialwert angeben und schon ist der Eingang optional END_VAR VAR END_VAR

Ab welcher TC Version das funktioniert kann ich dir nicht sagen, aber in CODESYS geht das in SP17 und wenn ich mich recht erinnere auch schon in SP16
Das ist falsch. Ein Eingang lässt sich nicht optional setzen.
Es wird zwar vom Compiler nicht als Fehler angemerkt, das Ergebnis ist allerding falsch, da der FC nicht festellen kann welcher Eingang nicht beschaltet ist.
 

Anhänge

  • FC_1.jpg
    FC_1.jpg
    26,8 KB · Aufrufe: 8
  • FC_2.jpg
    FC_2.jpg
    22,1 KB · Aufrufe: 8
Zuletzt bearbeitet:
Das ist falsch. Ein Eingang lässt sich nicht optional setzen.
Es wird zwar vom Compiler nicht als Fehler angemerkt, das Ergebnis ist allerding falsch, da der FC nicht festellen kann welcher Eingang nicht beschaltet ist.
Und wie sieht das aus, wenn man die Eingänge mit Instanznamen nutzt, also
Code:
POU_Add_Mul(Summ1 := 5, Fakt1 := 7)
 
Also es gibt Beckhoff-FBs, die optionale Eingänge haben. Die sind z.B. in den Motion Bausteinen. Diese erwarten allerdings immer eine Struktur/Enum was wiederum bedeutet, es gibt vordefinierte Werte.
siehe hier

Edit sagt: Funktion != Funktionsbaustein
 
Zuletzt bearbeitet:
Zurück
Oben