Beiträge von Baumfaust

    Hm Ok das ist wohl die Erklärung dafür.


    Ich habe ein Programm zum Teachen von Bases gemacht, dabei wird die Basenummer als Parameter übergeben und ich wollte dann die Nummer als Index zum Zugriff in das Array nutzen.

    Aber man kann das ganze auch "umdrehen" und wie in deinem Beispiel machen, gute Idee. :)

    Hallo Leute,

    momentan nutzen wir 2 verschiedene Feldbus Konfigurationen an der KRC4, welche jeweils in einem Projekt gespeichert sind.

    Je nach Bedarf wird dann am KUKA Pad

    das entsprechende Projekt ausgewählt und geladen. Alle Programme und Einstellungen in der sps.sub config.dat etc sind aber identisch.


    Wenn nun Änderungen in einem Projekt gemacht werden, dann müssen diese

    immer händisch in das andere Projekt nachgepflegt werden, da jedes Projekt seine eigene UNterstruktur hat. Das ganze ist ziemlich mühsam und fehleranfällig.


    Hat jemand eine Idee wie man das elegant lösen kann?

    Vielleicht Projektwechsel ohne Änderung der Programstrukturordner?

    Hallo,


    ich habe ein Problem mit der Genauigkeit des Triggerbefehls in Verbindung mit RSI. Der Roboter führt eine Sonde und fährt damit einen rechteckige Ebene von ca. 200 x 300 mm Zeile für Zeile ab mit einem Zeilenvorschub von 0.5 mm.
    Nun soll "während der Fahrt" ein Signal über RSI sowie über die IO Ebene per Feldbus gesetzt werden.


    Das Problem ist allerdings, dass der Schaltvorgang in jeder Zeile zu einem anderen Zeitpunkt kommt, die Abweichung sind nicht groß, aber doch problematisch. Geteached werden für den ganzen Prozess 5 Punkte, nämlich Start, TriggerOn, TriggerOff, End für eine Zeile und dann noch der Endpunkt für die letzte Zeile. Der Vorschub wird dann mittels Toolkorrektur realisiert.
    Die Ein und Ausschaltpunkte werden benötigt um den Roboter beschleunigen und abbremsen zu lassen, da zwischen TriggerOn und TriggerOff eine konstante Geschwindigkeit benötigt wird.


    Habt ihr eine Idee wie man das ganze genauer hinbekommen könnte?
    Anstatt das Tool zu korrigieren hab ich überlegt auch mit überschleifen zu arbeiten, aber dabei kann man wohl keine IOs schalten.


    Schaubild

    Code
    Start........................TriggerOn................TriggerOff...................End
    .
    .
    .
    .
    .
    .
    EndZeile



    Hier der Code dazu

    Hallo Leute,


    per BASE_CORR drehe ich meine Base um 30 Grad und fahre danach einige Punkte an.



    Ich würde das ganze aber gerne ohne Base Verschiebung realisieren, sondern diesen 30 Grad Wert direkt in alle LIN Befehle einrechnen. Wie kann ich das am einfachsten machen?

    Ich habe das Problem nun lösen können.


    Berechnungen mit Real-Werten führen immer zu leichten Fehlern. Hängt Dein Fehler definitiv nicht ab, wie oft Du An- Abkoppelst / Achse Nullst?


    Wie befürchtet ist genau das der Knackpunkt.
    Der Realwert wird immer "ungenauer" desto länger sich die Achse dreht. Umso größer der Wert vor dem Komma wird, umso weniger Nachkommastellen stehen zur Verfügung und somit wird die Position ungenauer, zumindest nach außen hin, intern wird wahrscheinlich der Wert anders behandelt. Durch mehrfaches an und abkoppeln hat sich der Fehler immer weiter summiert und die fehlerhafte Position wurde immer größer.


    Gelöst wurde das ganze nun, indem vor dem Abkoppeln auf einen glatten Wert ohne Nachkommastellen gefahren wurde.

    Code
    e6pAxisCurr   = $AXIS_ACT
    CORRWERT      = $AXIS_ACT.E1
    MOD1000  = CORRWERT / 1000.0
    CORRWERT = MOD1000 * 1000.0
    BAS( #PTP_PARAMS, 10 )
    e6pAxisCurr.E1 = CORRWERT
    PTP e6pAxisCurr


    In unserem Fall auf ein Vielfaches von 1000 ( wiegesagt 1000 mm enstprechen einer Umdrehung) und somit entfällt die Ungenauigkeit der wenigen Nachkommastellen. Interessant war dabei auch zu sehen, dass bei einer Zuweisung eines REAL Wertes an eine INT Variable automatisch gerundet und nicht "abgeschnitten" wird.


    Hier noch das komplette, bearbeite Programm zur Nullung der Achse.


    Die Abweichung betrug nach etwa 3 Stunden Laufzeit (kann dir jetzt nicht sagen wieviele Umdrehungen dabei gemacht wurden) 1.5 mm, 1000 mm sind eine Umdrehung, was schon sehr viel ist.
    Die Achse wird zum Positionieren von bestimmten Bauteilen benutzt, die anschließend mit einer Sonde geprüft werden.
    Die Achse ist über das KUKA EMD justierbar. Ich habe nach den 3 Stunden die Justage geprüft mittels des EMDs und bin odrt auf die 1.5 mm gekommen.
    Die Achse ist an solch einem Drehtisch EGD 250 mit Getriebe angeschlossen. Ich denke schon, dass man sich auf das angebene Übersetzungsverhältnis des Herstellers verlassen kann. Das Getriebe sollte kein Spiel/Schlupf haben.
    https://www.expert-tuenkers.de…uenkers_neun_7_drehen.pdf

    Hallo Leute,
    ich habe Probleme mit einer Zusatzachse an einer KR C4 Steuerung.
    Die Achse wird sowohl zur Positionierung als auch als Rundlaufachse betrieben. Um die Achse nach Beendigung eines Programms im Rundlaufmodus nicht wieder die gleiche Anzahl an Umdrehungen rückwärtslaufen zu lassen um HOME zu erreichen wird die Achse kurzzeitig abgekoppelt. Folgender Code wird zum Nullen verwendet. Eine Umdrehung der Achse entsprechen 1000 mm



    Mir ist aufgefallen, dass die Abweichung um so größer wird, desto länger die Achse rotiert, d.h. um so größer der Wert in $AXIS_ACT.E1 wird. Dieser Wert wird einer Variable vom Typ REAL zugewiesen. Auffallend ist hierbei, dass die Anzahl der Nachkommastellen immer kleiner wird und somit die Angabe der Position ungenauer, was auch den oben beschriebenen Effekt bei länger andauernder Rotation erklären würde.
    Daher nun die Frage, ist es möglich die Position der Achse auch nach längerer Rotation möglichst exakt zu erhalten? Idealerweise als Integer Wert (Encoder Daten)?

    Hallo Leute,
    ich habe ein altes Program auf eine aktuelle KRC4 Steuerung kopiert, bisher lief diese Funktion immer ohne Probleme.



    Nun kommt aber die Fehlermeldung ungültiger Feldindex beim Aufruf des Befehls: BAS(#FRAMES) und zwar erst beim zweiten Aufruf im Fold INIT MOVEMENT TO 300 mm/s
    Kann mir jemand erklären wieso und was der Befehl genau macht?
    Wäre super

    Hallo Leute,


    ich habe mir einige Punkte geteached, die ich dann manuell per LIN Befehl anfahren möchte. Die Punkte sind in einem Fold versteckt und deren Aufruf wird mittels goto übersprungen. Dies geschieht daher, dass die Zusatzachse nicht auf die geteachte Position gefahren werden soll, sondern ihre aktuelle Position beibehalten soll.
    Daher habe ich mir folgende Funktion geschrieben:

    Code
    DEF MoveRLinCont( epos :IN, offset : IN )
      DECL E6POS epos
      DECL REAL offset
    
      epos.e1 = $POS_ACT.E1
      epos.C  = epos.C + offset
      LIN epos C_VEL
    
    
    END


    das ganze Funktioniert auch soweit, allerdings wird meien eingestelle Geschwindigkeit nicht verwendet und es wird nicht überschliffen.
    Kann mir jemand erklären woran das liegt? Ich habe auch schon einiges probiert...setzen des Vorlaufzeigers etc.


    Hier der ganze Code:

    Hi
    ich möchte an verschiedenen Stellen eine Meldung absetzen, daher habe ich das ganze Erzeugen des Meldungsrumpfs in eine Funktion gepackt, die als Parameter einen Text und Real Werte bekommt.


    Das ganze sieht so aus:


    Beispiel Aufruf

    Code
    DECL REAL b,c
    InfoMessageIIR( "Angle B: %1 Anagle C: %2", b, c)



    Ein Problem ist nun bei emessage im Teil msg. Alle Beispiele, die ich bisher gefunden habe (auch im Handbuch) haben dort direkt eine Zeichenkette in "" stehen, aber keine Variable.
    Hat jemand eine Idee wie man das lösen kann?