KRC1 Schweißanwendung

  • Ich arbeite gerade das erste Mal mit einem KUKA Roboter und einer KRC1-Steuerung und hab gleich einmal zwei Fragen.
    Ich soll einen Schweißprozess mit fünf oder mehr Schweißnähten programmieren.
    Soweit so gut: Ich hab also ein Hauptprogramm geschrieben und einmal 6 Unterprogramme, benannt Naht_1 bis Naht_6.


    Jetzt meine Fragen: Wenn ich die aufrufe der Unterprogramme so mach

    Code
    Naht_1 () 
    ... 
    Naht_6()


    ist es ja schwer für mich die Reihenfolge der Schweißnähte zu veränder. Aber gerade das soll von mir gewährleistet werden.


    Die zweite Frage ist mehr theoretischer Natur, hab dazu aber leider nichts in meiner Doku gefunden: müssen Funktionen bei der KRC1 immer einen Rückgabewert haben, oder gibt es wie in C auch void-Funktionen die nichts zurückliefern müssen.

  • Schritt für Schritt zum Roboterprofi!
  • deine freie Auswahl geht per "switch / case" und einen gruppierten Eingang (Stichwort "SIGNAL") oder eine Variable.
    Siehe Schulungshandbücher etc.
    Ein Unterprogramm muss nichts zurückliefern.

    Wolfram (Cat) Henkel

    never forget Asimov's Laws at the programming of robots...

    "Safety is an integral part of function. No safety, no production. I don't buy a car without brakes."


    Messages und Mails mit Anfragen wie "Wie geht das..." werden nicht beantwortet.

    Diese Fragen und die Antworten interessieren jeden hier im Forum.


    Messages and Mails with questions like "how to do..." will not be answered.

    These questions and the answers are interesting for everyone here in the forum.

  • An eine Variable hab ich auch schon gedacht.
    Quasi, im ersten Durchgang:
    Variable=123456


    und im zweiten: Variable=234561


    Aber wie lasse ich so die einzelnen Unterprogramme abarbeiten?


    bezüglich der zweiten Frage waren nicht Unterprogramme gemeint, sondern Funktionen. Diese muss ich ja mit DEFFCT Typ Name definieren. Als typ gibt es dann ja REAL, INT ... . Aber gibt es auch den Typ void?

  • Hab gerade mal im Quickguide (für die KRC2) geschaut. Auf Seite 21 steht dort zu Funktionen unter anderem folgendes:


    "-Eine Funktion liefert einen bestimmten Funktionswert an das Hauptprogramm zurück. Deshalb muss eine Funktion immer mit Return beendet werden."
    "-Die Funktion besitzt zusätzlich einen Datentyp. Dieser muss immer mit dem des Funktionswerts übereinstimmten."


    Da der KUKA den Typ Void nicht kennt (Quickguid Seite 3), sag ich mal nein. Die Funktion muss dir immer einen Wert liefern. Ob du nen festen Wert übergibst und was du dann mit diesem Wert machst ist was anderes. :zwink:


    Also, du könntest für jede Naht einen Case machen und über eine Loop schleifer dir nach jeder Fertigmeldung von der SPS die nächste Naht geben lassen, dann könntest du dir aber auch gleich für jede Naht ein Hauptprogramm geben lassen.
    Oder, wenn es nicht ganz so flexibel sein muss weil es nur eine Hand voll verschiedener Abarbeitungsfolgen gibt, könntest du diese in jeweils einen Case Packen. Also Case 1 (Naht 1,Naht 2,Naht 3,Naht 4,Naht 5,Naht 6) Case 2 (Naht 1,Naht 3,Naht 5,Naht 2,Naht 4,Naht 6) etc.
    Oder, du kannst einen Mix aus den vorherigen Vorschlägen machen, wenn z.B. immer Naht 3 und Naht 5 hintereinander geschweißt werden die in einen Case dann Naht 4 alleine in einen Case etc.

  • Und so haben alle recht:


    -ein Unterprogramm (auch Prozedur) kann nichts zurückgeben (Beginnt in KRL mit DEF)
    -eine Funktion hat ja den Zweck aus Eingabeparametern ein Ergebnis zu produzieren (Beginntg in KRL mit DEFFCT)


    Grüße
    noheton

  • Hallo. Erstmal danke für die Hilfe beim Thema Unterprogramm/Funktion.


    Bezüglich der Switch-Case variante hätte ich noch eine Frage. Ich hab einmal in OrangeEdit ein grobes Programm geschrieben. Vielleicht kann mir ja jemand ein feddback geben ob das so auf einer KRC1 Steueurung machbar ist.


    Am Anfang schreibt der Benutzer, da das Programm nur für einen Testaufbau genutzt wird wahrscheinlich ich, die Reihenfolge der Schweißnähte in die entsprechende Variable. Diese soll gemeinsam mit einem Array an die CALCULATE-Funktion übergeben werden. In dieser werden die einzelnen Ziffern der Zahl herausgelöst und in das Array geschrieben. Dann liefert die Funktion das Array zurück. Im Hauptprogramm wird das Array in der For-Schleife abgearbeitet und an die Switch-Case Konstruktion übergeben, die die Unterprogramme für die Schweißnähte aufruft. Meine Frage ist nun, funktioniert das? Besonders bei der Switch-Case Konstruktion in der For-Schleife bin ich mir unsicher :hilfe:.


    Ich danke euch nochmal :merci:

  • Ich hab gerade mal eben schnell drüber geschaut.


    Der Switch sieht soweit gut aus, bis auf, dass das Endswitch fehlt. Ich würde noch nen Default Zweig mit nem "Wait for False", einfach zur Sicherheit, rein machen.


    Das ;Fold am Ende sieht komisch aus.


    Da die Funktion einen Wert zurück gibt muss man diesen Wert auch einer Variablen zuweisen. Also B[]=Calculate(Reihenfolge), wobei ich mir gerade nicht sicher bin, ob man ganze Felder übergeben kann. Der Datentyp der Funktion fehlt, muss in deinem Fall Deffct Int Calculate(X1:Out) Und wie bereits oben beschrieben "muss" ein Return ans Ende der Funktion. Sowas wie Return (X2[]).


    Das wars was mir so aufgefallen ist.

  • Danke für das Feedback.


    Meines Verständinis nach könnte ich die Calculate Funktion doch auch als Subprogramm ausführen und mit einer Call-by-reference auf meine Eingabevariabel und auf das Array zugreifen. Dann würde ich mir das Return ersparen, das Subprogramm würde aber immer noch mein array im Hauptprogramm auffüllen.


    Bezüglich der switch-Anweisung: Das Default hab ich jetzt eingefügt, aber gibt es in KRL, bzw. bei der KRC1 eine Brake Anweisung wie in C. Ich weiß Brake darf ich nicth verwenden, da hier die Antriebe gestoppt werden. Oder ist diese Wait For False eine Brake Anweisung mit der ich aus der Switch Anweisung hinausgehe. Bzw. könnte ich bei Default ja das Programm beenden und eine Fehlermeldung ausgeben, (in meinem Fall müsste ich nur einen Ausgang schalten), aber wie beende ich eine Switch-Case-Anweisung und die übergeordnete For-Schleife? :hilfe: Ginge vielleicht über etwas wie einen Interrupt, aber kann man einen Interrupt auslösen durch das eintreten einer bestimmten Softwaremäßigen Bedingung. In C schon gesehen, aber normalerweise werden Interrupts doch durch Hardwareereignisse ausgelöst, bsp. Schweißbrennerkollision, Fehlermeldung der Schweißsteuerung... .
    Hat jemand damit erfahrung. :danke:

  • Ja, du kannst es auch mit einem Unterprogramm statt der Funktion machen.


    Ich weiß zwar jetzt nicht was ein Brake in C auslöst, aber mit Wait for Fals, wartest du darauf, dass die Bedingung, in diesem Fall False, True wird. Also bleibt der Robbi in Wait for False hängen bis du ihn von Hand, mittels Satzanwahl, befreist. Mach ich gerne so, weil wenn er in den Default Zweig spring ist irgend etwas schief gelaufen, das kontroliert werden muss.
    Alternativ kannst du auch nur ein Halt nehmen. Nach erneutem Startsignal läuft er dann einfach weiter.


    Wenn du nur einen Ausgang setzen willst kannst du das natürlich auch tun statt dem Wait for False und den Zähler deiner Schleife hochsetzen. Damit solltest du dann auch aus der If-Schleife raus kommen.

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