RX160 + CS8 - Geschwindigkeitssignal auslesen/ausgeben

  • Hallo,


    meine Recherchen habe bisher kein Ergebnis geliefert und auch die Suche hat zu keinem Erfolg geführt. Folgende Problemstellung beschäftigt mich:


    Wir benutzen den RX160 zum Führen einen Manipulators. Ich möchte gerne die Aktion des Manipulators mit der tatsächlichen Geschwindigkeit des Roboters (am TCP) verknüpfen. Ich übergebe dem System in der Programmierung zwar einen Geschwindigkeitswert, aber bereits kleinste Abweichungen können zu Fehlern in der Aktion des Manipulators führen. Deshalb ist es für mich wichtig, dass ich die genaue Geschwindigkeit des Roboters auslesen und an den Manipulator übergeben kann.


    Gibt es demnach eine Möglichkeit das Geschwindigkeitssignal/den TCP-Speed auszulesen bzw. kann ich das über einen entsprechenden Ausgang ausgeben?

  • ANZEIGE
  • Moin,


    da gibt es folgenden Befehl in der Val3-Doku:


    num getSpeed(tool tTool)

    Funktion

    Diese Anweisung liefert die aktuelle kartesische Geschwindigkeit am TCPtTool des spezifizierten Werkzeugs

    tTool. Die Geschwindigkeit wird aus den Sollgeschwindigkeiten und nicht aus den Istgeschwindigkeiten der

    Achsen berechnet.


    Aber benutzt habe ich es noch nie.

  • Vielen Dank für deine Rückmeldung.


    Mit der Sollgeschwindigkeit ist mit leider nicht geholfen. Diese weicht ja doch in gewissen Punkten und Situationen von der Istgeschwindigkeit ab.

    Hat eventuell jemand Erfahrung diesen Wert über die Fast IOs auszulesen?

  • Du könntest in einem parallelen, synchronen Task (4 ms) dir immer mit dem Hilfe des distance()-Befehl ausgeben lassen, wie weit du zur letzten bekannten Position gekommen bist. Über v=s/t kannst du dir dann die Geschwindigkeit sehr leicht berechnen.
    Über Fast-IOs wird das nicht funktionieren, da diese nur digitale IOs sind. Du müsstest den Geschwindigkeitswert mit aioset() auf eine analoge Variable mappen und dann über Feldbus etc. abschicken. Wenn es nicht echtzeitfähig sein muss, dann kannst du es auch über TCP-IP ausgeben.

    Wenn du einen funktionstüchtigen VAL3-Code benötigst, dann kann ich diese gern zur Verfügung stellen.

    Einmal editiert, zuletzt von Johnsenfr ()

  • Danke für deine Hilfestellung. Ich glaube, vor allem der distance()-Befehl wird bei nicht linearen Bewegungen schwierig und führt zu Ungenauigkeiten.

    Die zweite Lösungsvariante hört sich sehr interessant an. Eine Echtzeitfähigkeit wäre natürlich wünschenswert, ist aber nicht unbedingt zwingend erforderlich.

    Wenn du einen funktionstüchtigen VAL3-Code benötigst, dann kann ich diese gern zur Verfügung stellen.

    Wenn du da schon etwas entsprechendes vorliegen hast, wäre ich natürlich sehr dankbar, wenn du mir da was zur Verfügung stellen könntest.

  • Ich habe noch eine bessere Variante gefunden, denn mit Hilfe des Expansion-AddOns kann man sich (mit 4 ms Verzögerung, aber das wird verkraftbar sein), die Ist-Geschwindigkeit ausgeben lassen, dann sieht dein paralleler Task (alle 4 ms) so aus:


    do


    nVelTCP=$getSpeedFbk(tTool)

    aioSet(aoVel, nVelTCP)


    delay(0)

    until false


    Damit schreibst du alle 4 ms auf dem analogen Ausgang aoVel die aktuelle Ist-Geschwindigkeit. Wenn du das Expansion-AddOn nicht hast, dann müssen wir auf die distance() Variante zurückgreifen. Die AddOns können von der technischen Datenbank geladen werden und sind spezifisch für die verwendete SRC Version zu installieren.

  • Vielleicht zur Info, da es zum Beitrag passt:


    Bei der CS9 Steuerung ist es ab S8.9.2 möglich in Verbindung mit dem Add-On "Expansion"


    Originaltext aus den damaligen Release Notes:

    ---------------------------------------------------------------------------------------------------------------


    void $setCyclicHereToAout(tool& tTool, frame& fFrame, num nNbSamplePerCycle, aio& aoOutputs[])


    void $setCyclicHereJToAout(num nNbSamplePerCycle, aio& aoOutputs[])


    void $setCyclicHereToSio(tool& tTool, frame& fFrame, num nNbSamplePerCycle, sio& soOutputs)


    void $setCyclicHereJToSio(num nNbSamplePerCycle, aio& aoOutputs[])


    void $resetCyclicHereX()

    ---------------------------------------------------------------------------------------------------------------

    This set of VAL3 functions allowing real-time robot position streaming on analogue or serial output.


    Joint or Cartesian robot position can be stream in real-time up to 16 floating point values each 1 ms (16KHz).


    Theses floating point values can be send to analogues outputs, typically on a filed bus like EhterCAT or PROFINET.


    It is also possible to use a socket or serial line as an output depending on the need.


    This is a high CPU load demanding feature, therefore some limitation can be found especially with CPT9.2


    • After the call to one of the function $setCyclicHere... function, at each CS9 cycle time the system writes


      • on the first Aout a byte working counter (incremented by one at each cycle)
      • a status byte (255 means no error, other value reflect the axis number in error)
      • an on the next 6 Aout the first sample of the current Joint or Cartesian robot position (referenced with tTool and fFrame)
      • an on the next 6 Aout the second sample of the current Joint or Cartesian robot position (referenced with tTool and fFrame)
      • ...


    Aout[0] = working counter

    Aout[1] = status

    Aout[6*n+2] = X (sample n)

    Aout[6*n+3] = Y (sample n)

    Aout[6*n+4] = Z (sample n)

    Aout[6*n+5] = RX (sample n)

    Aout[6*n+6] = RY (sample n)

    Aout[6*n+7] = RZ (sample n)


    For a 4 axis robot, the 6 here before must be replaced by a 4.


    nNbSamplePerCycle=0 then the function is disabled.

    nNbSamplePerCycle=1 then 1 sample is written at each cycle time (2+ 6 Aout).

    nNbSamplePerCycle=2 then 2 samples are written at each cycle time (2 + 12 Aout).

    nNbSamplePerCycle=4 then 4 samples are written at each cycle time (2 + 24 Aout).

    nNbSamplePerCycle=8 then 8 samples are written at each cycle time (2 + 48 Aout).

    nNbSamplePerCycle=16 then 16 samples are written at each cycle time (2 + 96 Aout).

    other values of nNbSamplePerCycle are not allowed


    For sio, samples but written to the sio instead of the array of aio.


    • A call to $resetCyclicHereX will stop the copy.

    Einmal editiert, zuletzt von AndreH ()

  • Hallo Brutze,


    die Geschwindigkeit am TCP kannst du in einem parallelen Task mittels des getSpeed Befehls herausfinden, als Parameter übergibst du deine Tool Variable. Den ausgelesenen num Wert kannst du dann schließend mit aioSet an einen analogen Ausgang in mm/s rausmelden.

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