22. April 2019, 10:11:33
Roboterforum.de - Die Industrieroboter- Anwender und Experten Community

 Steuerung des Roboters via Ethernet KRL


normal_post Autor Thema:  Steuerung des Roboters via Ethernet KRL  (Gelesen 813 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

11. Februar 2019, 07:44:33
Gelesen 813 mal
Offline

bf


Hallo!

Ich habe fixe Bewegungsprogramme hinterlegt die via Ethernet KRL gestartet werden können. Das funktioniert auch so weit. Nun hätte ich gerne das während der Bewegung alle ~200 ms die aktuelle Ist Position über Ethernet KRL gesendet wird.
Ich hätte nun die Bewegung an sich und das zyklische abfragen und senden der Ist-Position in zwei separate Interrupt Routinen gegeben. Durch einen kurzen Test hat sich ergeben das die 2 Interrupts nicht parallel laufen, sobald ich den einen stoppe wird erst der andere ausgeführt.

Gibt des da eine Lösung das ich Während einer Bewegung des Roboters zyklische die Ist-Position abfragen kann?


  • gefällt mir    Danke

Heute um 10:11:33
Antwort #1

Werbung

Gast

11. Februar 2019, 11:52:23
Antwort #1
Offline

SJX

Global Moderator
Hallo bf

Da Du Dein Code nicht postest, und keine Hintergrundinfo gibst, was das werden soll,ist es schwer zu Erkennen, was Du zusammen gebastelt hast.

Bewegung generell in Interrupt zu Handeln kann man, aber sicher nicht sinnvoll.
Für das haben wir ja den Roboterinterpreter. Z.B. Überschleifen von Positionen ist nicht möglich im Interrupt, da Du kein Vorlauf hast.

Wenn Du aber Dein Gerippe stehen lassen willst, kannst auch über die sps.sub die Position senden.

Wäre nicht RSI für Dich die geeignetere Option?


Gruss SJX

  • gefällt mir    Danke
Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

11. Februar 2019, 14:36:54
Antwort #2
Offline

bf


Hallo!
Ich hab nun die bewegungen (die in call() implementiert sind - einfache PTP/LIN Bewegungen ) aus der Interuptroutine herausgegeben.
Allerdings fällt mir hier jetzt auf wenn ich set_state(1) set_state(0) schreibe, tut er das ganz schnell hintereinander und wartet nicht bis call() fertig ist, wenn ich das ganze in eine Interrupt Routine gebe funktioniert es schon!

Ich will damit meinem Programm signalisieren 1=jetzt läuft ein programm 0=roboter steht und ist bereit

Wie könnte ich jetzt bewerkstelligen das ich separat in einer interruptroutine die istposition sende? oder geht das wirklich nur über die sps.sub?

DEF fs()
    BAS(#TOOL,0)
    BAS(#BASE,0)
    $FLAG[907]=FALSE
    samplingrate=0;
    INTERRUPT DECL 100 WHEN samplingrate>0 DO sample()
    INTERRUPT ON 100   
    ;INTERRUPT DECL 101 WHEN $FLAG[1]==TRUE DO main()
    ;INTERRUPT ON 101   
    RET=EKI_Init("fs")
    RET=EKI_Open("fs")
    ; wait until server is conntected
    wait for $FLAG[1]
    ; wait until server is disconnected
    main()
    ;wait for $FLAG[1]==FALSE

    RET=EKI_Clear("fs")
END
DEF main()
   init();SAK Fahrt, Geschwindigkeiten festlegen,...
   samplingrate=500;
   WHILE $FLAG[1] == TRUE
      WAIT FOR $FLAG[907]
      IF $FLAG[907]==TRUE THEN
        start_program()
      ENDIF
   ENDWHILE
END
DEF start_program()
  RET=EKI_GetInt("fs", "robot/data/startprog/@progid", method)
  set_state(1)
  call(method)
  set_state(0)
  $FLAG[907]=FALSE
END
DEF set_state(state:IN)
  INT status
  RET=EKI_SetInt("fs","robot/data/status/@state",status)
  RET=EKI_Send("fs", "robot/data/status")
END
DEF sample()
  WHILE samplingrate>0
    wait SEC samplingrate/1000.0
    RET=EKI_SetReal("fs","robot/data/istpos/pos/@x",$POS_ACT.X)
    RET=EKI_SetReal("fs","robot/data/istpos/pos/@y",$POS_ACT.Y)
    RET=EKI_SetReal("fs","robot/data/istpos/pos/@z",$POS_ACT.Z)
    RET=EKI_SetReal("fs","robot/data/istpos/pos/@a",$POS_ACT.A)
    RET=EKI_SetReal("fs","robot/data/istpos/pos/@b",$POS_ACT.B)
    RET=EKI_SetReal("fs","robot/data/istpos/pos/@c",$POS_ACT.C)
    RET=EKI_SetInt("fs","robot/data/istpos/pos/@s",$POS_ACT.S)
    RET=EKI_SetInt("fs","robot/data/istpos/pos/@t",$POS_ACT.T)   
    RET=EKI_Send("fs", "robot/data/istpos")
  ENDWHILE
END

Nochmals zusammengefasst:

1. Möchte ich über eine ProgrammID einfache Programme starten, während ein Programm läuft soll STATE=1 sein.
2. Während ein Programm läuft möchte ich zyklisch die Ist Position senden.
« Letzte Änderung: 11. Februar 2019, 14:38:58 von bf »
  • gefällt mir    Danke

11. Februar 2019, 17:03:39
Antwort #3
Offline

SJX

Global Moderator
Hallo bf,

wird vermutlich der Vorlauf sein des Roboterinterpreters. (Werden wohl nicht viele Positionen im Call... drin sein)

mach mal ein wait sec 0.01 vor die beiden set_state's ().

Gruss SJX
  • gefällt mir    Danke
Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

12. Februar 2019, 08:44:38
Antwort #4
Offline

bf


Danke! das probier ich dann gleich aus!

was mir gerade aufgefallen ist:

sagen wir ich führe folgendes Programm aus:

PTP p1
PTP p2
PTP p3

wenn ich das Programm gestartet habe, und während der Roboter p1 anfährt das sampling starte, bekomme ich erfolgreich die Ist Position zurück, wenn p1 erreicht ist steht der Roboter und ich bekomme weiterhin die Ist Position gesendet, wenn ich dann kurz das sampling stoppe, setzt der Roboter seine Bewegung zu p2 fort.


Gibt es irgendein Flag das ich abfragen kann welches mir sagt "Roboter ist in Bewegung?", dann könnte ich versuchen die Interrupt Routine an das zu knüpfen?
Oder gibt es eine andere Möglichkeit das zu lösen?
  • gefällt mir    Danke

Heute um 10:11:33
Antwort #5

Werbung

Gast


Teile per facebook Teile per linkedin Teile per pinterest Teile per reddit Teile per twitter
 

über das Roboterforum

Nutzungsbedingungen Impressum Datenschutzerklärung

Sponsoren des Roboterforums

ROBTEC GmbH