Selbstgeschriebene Funktion mit optionalen Parametern aufrufen...

  • Hallo,


    ich komme gerade mit dem Handbuch von ABB leider nicht weiter...


    ich habe eine eigene Funktion geschrieben


    Code
    FUNC ROBTARGET PolarPunkt(NUM var1, NUM var2 \bool disable_bla)
      ....
      RETURN ...
    ENDFUNC


    Das funktioniert soweit (dass heißt, ich bekomme beim Laden des entsprechenden Moduls keine Fehlermeldung). Wenn ich die Funktion ohne den optionalen Parameter aufrufe funktioniert es auch wunderbar, also:


    Code
    PolarPunkt(1, 2);


    Nur, wie rufe ich jetzt die Funktion MIT dem optionalen Parameter auf?


    Wenn ich folgendes mache:

    Code
    PolarPunkt(1, 2, TRUE);


    dann bekomme ich die Fehlermeldung, dass ich zuviel Parameter angegeben habe.


    Folgendes hab ich auch probiert:

    Code
    PolarPunkt(1, 2 \disable_bla:=TRUE);


    Aber dann heißt es: "Zusätzlicher Parameter 'disable_bla' ist nicht vorhanden."


    Wie muss ich korrekt die Funktion mit dem zusätzlichem Parameter aufrufen, damit es funktioniert? Ich hab da leider noch nichts im Handbuch gefunden...

  • ANZEIGE
  • Hallo,


    versuche es einmal so.


    FUNC robtarget PolarPunkt(num Var1,num Var2\bool MyBool)
    VAR robtarget pCalc;
    !...
    RETURN pCalc;
    ENDFUNC


    Ergebnis


    PROC Routine2()
    p30 := PolarPunkt(nNum1,nNum2\MyBool:=bMyBool);
    ENDPROC

  • @ bifi:
    Dann wäre es ganz nett gewesen den workaround auch mitzuteilen, damit es dem nächsten vielleicht ebenfalls hilft. :roll: :mrgreen:


    @ all:
    ich habe genau das gleiche Problem. Im Handbuch ist leider nichts Aufschlussreiches dazu zu finden. Vermutlich wieder so eine "unwichtige" weggelassene Info wie bei den RECORDs, die zwingend vor den Variablendeklarationen stehen müssen, damit es keinen Fehler gibt. :angry:
    Mein Problem ist folgendes. Ich habe folgende Prozedur:




    In einer anderen Prozedur wird sie folgendermaßen aufgerufen:


    Code
    IF di_SignalName_old <> di_SignalName THEN
          writeSignalToLog cDate(), CTime(), di_SignalName;
          di_SignalName_old := di_SignalName;
        ENDIF


    Da bekomme ich für den Aufruf von writeSignalToLog allerdings "Wrong number of arguments to writeSignalToLog" angezeigt. Wenn ich die beiden optionalen strings am Anfang weglasse funktioniert aber alles einwandfrei.


    Ich hab auch schon verschiedenste Variationen probiert, z.B. die optionalen Parameter am Ende der Parameterliste, die optionalen Parameter mit und ohne führenden \ im Aufruf, das IF Present() THEN als erste Instruktion in der PROC, aber nichts half. :(


    Gruß
    Jörn

    In der Theorie sind Theorie und Praxis identisch. In der Praxis nicht.

  • Vermutlich hat die Frage zu formulieren ein weiteres Neuron aktiviert. So formuliert funktioniert der Aufruf:


    Code
    writeSignalToLog \sLogDate:=cDate(), \sLogTime:=CTime(), di_SignalName;


    Jetzt hab auch auch begriffen, wie er die Zuordnung bewerkstelligt, d.h. wie er entscheidet welcher String zu welchem Parameter gehört. :mrgreen:


    Gruß
    Jörn

    In der Theorie sind Theorie und Praxis identisch. In der Praxis nicht.

  • Da habt ihr ja einen antiken Thread aus Zeiten meiner Diplomarbeit ausgegraben.
    Bzgl. der Frage nach meinem Workaround: ich habe es ganz einfach so umgesetzt, dass ich keinen optionalen Funktionsparameter benutze.


      • Weil es saubere Programmierung ist, Funktionen in sich abgeschlossen zu haben

      • Weil Funktionen und Prozeduren dadurch wiederverwendbar werden

      • Weil Seiteneffekte vermieden werden

      • Weil man als Programmierer weniger Sucherei hat

      • Weil die Namensgebung effizienter ausfällt

      • Weil sich die Lesbarkeit des Codes verbessert

      • ...


    In vielen Fällen ist die Verwendung von globalen Variablen tatsächlich zuerst die pragmatisch-bequemere Lösung, insbesondere, wenn diese Variablen sowieso schon (vom System aus, schließlich geht es hier um Roboter) global vorliegen. Leider fällt einem diese Lösung bei späteren Anpassungen oft auf die Füße, und zwar (und das ist das Besondere!) exponentiell statt linear. Ein guter (-> fauler) Programmierer versucht dagegen stets, seinen eigenen Aufwand nach oben hin zu limitieren.


    Grüße,
    Michael

  • Guten Morgen,


    besser hätte nicht mal ich es erklären können. ;)


    Die Gründe, warum ich genau so machte, sind folgende:
    1. Man sieht bereits am Aufruf, was die Prozedur macht.
    2. Man kann das Datum und die Uhrzeit beim Aufruf optional speichern lassen.
    3. Wenn das Speichern innerhalb der Prozedur (z.B. aus Gründen des Timings) später erfolgt / erfolgen muss, sind Datum und/oder die Uhrzeit trotzdem die des Aufrufes.


    Gruß
    Jörn

    In der Theorie sind Theorie und Praxis identisch. In der Praxis nicht.

Hilfe und Support für ABB Roboter Programmierung, Konfiguration, Inbetriebnahme finden Sie hier im ABB Roboter Forum. ABB Rapid Programmierung ist einfach, die Roboterforum Community hilft sehr gerne.

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden