20. März 2019, 18:34:06
Roboterforum.de - Die Industrieroboter- Anwender und Experten Community

[gelöst] robtargets in RECORD nicht teachbar?!


normal_post Autor Thema: [gelöst] robtargets in RECORD nicht teachbar?!  (Gelesen 1015 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

04. Dezember 2018, 14:14:55
Gelesen 1015 mal
Offline

Joern_E

ROBTEC Mitarbeiter
Moin,

ich hab da ein kleines Problem mit einem RECORD. In dem RECORD stehen strings, robtargets und nums:

RECORD rTypes
  string    sName;
  robtarget rPosition;
  num       nWinkel;
  ...
ENDRECORD


Jetzt mach ich ein array davon, weil ich 32 rTypes habe:

CONST rTypes housingTypes{3} :=
[
  [
    "Gehaeusetyp 1",
    [[0,0,0],[1,0,0,0],[0,0,0,0],[9E9,9E9,9E9,9E9,9E9,9E9]],
    0.0
  ], [
    "Gehaeusetyp 2",
    [[0,0,0],[1,0,0,0],[0,0,0,0],[9E9,9E9,9E9,9E9,9E9,9E9]],
    0.0
  ], [
    ...
  ]
];


Im Programm sollen nun rPosition und nWinkel geändert werden.

  VAR num nTypeToTeach;
 
  PROC TeachPos()
   
    TPReadNum nTypToTeach, "Welcher Typ?";
   
    moveJ housingTypes{nTypeToTeach}.rPosition, v100, fine, tGripper, \WObj:=wBST;
    housingTypes{nTypeToTeach}.nWinkel := giWinkel;
   
  ENDPROC


Dann meckert RobotStudio aber (berechtigterweise), daß housingTypes{...}.nWinkel schreibgeschützt ist. Also hab ich die Instanz von CONST auf PERS geändert, d.h.

PERS rTypes housingTypes{3} :=
[
  ...
];

Wenn ich in der PROC TeachPos nun die Position housingTypes{nTypeToTeach}.rPosition markiere und korrigieren will, bekomme ich ein Auswahlfenster:

Datenfeldname: housingTypes{3}

Auf das Element tippen, das bearbeitet werden soll.

------------------------------------------------------------
Element     Wert
{1}         ["Gehaeusetyp 1", [...], 0.0]
{2}         ["Gehaeusetyp 2", [...], 0.0]
{3}         ...
------------------------------------------------------------
                                                 Schließen

Ich tippe auf das Element, aber Bearbeiten lässt sich da nichts. Es gibt nur "Schließen" als Auswahl. Zuletzt hab ich es 'unschön' probiert:

  VAR  num       nTypeToTeach;
  PERS robtarget rTargetToTeach;
 
  PROC TeachPos()
   
    TPReadNum nTypToTeach, "Welcher Typ?";
   
    rTargetToTeach := housingTypes{nTypeToTeach}.rPosition;
    moveJ rTargetToTeach, v100, fine, tGripper, \WObj:=wBST;
    housingTypes{nTypeToTeach}.rPosition := rTargetToTeach;
    housingTypes{nTypeToTeach}.nWinkel := giWinkel;
 
  ENDPROC

Die Position wird (korrekt) aus dem RECORD geladen. Wenn ich sie dann das robtarget in der moveJ-Zeile per "Position korrigieren" ändern möchte (unabhängig davon, ob im Programmfenster oder über die Programmdaten) poppt ein Fenster auf:

Fehler beim Ändern der Position
Position kann nicht geändert werden.

Ähhh ... Hilfe?! :D

Gruß
Jörn
« Letzte Änderung: 17. Dezember 2018, 13:34:00 von Joern_E »
  • gefällt mir    Danke
In der Theorie sind Theorie und Praxis identisch. In der Praxis nicht.

Heute um 18:34:06
Antwort #1

Werbung

Gast

04. Dezember 2018, 15:12:41
Antwort #1
Offline

Joern_E

ROBTEC Mitarbeiter
So funktioniert es, aber auch nur so! Man braucht ein PERS robtarget als Zwischenspeicher und muss es initialisieren (wohl, damit der persistente Zahlenwert irgendwo gespeichert werden kann).

 VAR  num       nTypeToTeach;
  PERS robtarget rTargetToTeach := [[0,0,0],[1,0,0,0],[9E9,9E9,9E9,9E9,9E9,9E9]];
  
  PROC TeachPos()
    
    TPReadNum nTypeToTeach, "Welcher Typ?";
    
    rTargetToTeach := housingTypes{nTypeToTeach}.rPosition;
    moveJ rTargetToTeach, v100, fine, tGripper, \WObj:=wBST;
    housingTypes{nTypeToTeach}.rPosition := rTargetToTeach;
    housingTypes{nTypeToTeach}.nWinkel := giWinkel;
    
  ENDPROC


Das ist insgesamt "eher umständlich" und sieht außerdem "nicht so schön" aus. Falls es jemand eleganter kann, d.h. ohne Umweg über einen Zwischenspeicher, dann immer her damit. :)

Gruß
Jörn
« Letzte Änderung: 04. Dezember 2018, 15:16:41 von Joern_E »
  • gefällt mir    Danke
In der Theorie sind Theorie und Praxis identisch. In der Praxis nicht.

14. März 2019, 15:52:40
Antwort #2
Offline

Joern_E

ROBTEC Mitarbeiter
Sooo ... an meiner Station wird gerade eine Ausrichteinheit versetzt, deswegen hatte ich ein bissl Zeit. Derweil hab ich mir das Teachen von robtargets in Arrays und Records angeschaut.

Gruß
Jörn



<snip>
  RECORD recTestRobtargets
    robtarget numberOne;
    robtarget numberTwo;
  ENDRECORD
 
  PERS recTestRobtargets robtargetRecordTest{2} :=
  [
    [
      [[0,0,0],[1,0,0,0],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]],
      [[0,0,0],[1,0,0,0],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]]
    ], [
      [[0,0,0],[1,0,0,0],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]],
      [[0,0,0],[1,0,0,0],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]]
    ]
  ];
 
  PERS robtarget robtargetArrayTest{2} :=
  [
     [[0,0,0],[1,0,0,0],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]],
     [[0,0,0],[1,0,0,0],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]]
  ];
 
  PERS robtarget rBuffer := [[0,0,0],[1,0,0,0],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
<snap>

<snip>
  ! So kann das robtarget geteached werden, indem man das komplette MoveL oder
  ! auch nur das robtargetArrayTest{1} markiert und "Position korrigieren"
  ! antippt.

  MoveL robtargetArrayTest{1}, v10, fine, tGripper;
 
  ! Mit dieser Schreibweise kann das robtarget dann geteached werden, wenn man
  ! nur das robtargetArrayTest{nTypeToTeach} markiert und "Position korrigieren"
  ! antippt. Das Panel fragt dann nach dem Index des Array-Elementes, das
  ! geändert werden soll.

  nTypeToTeach := 2;
  MoveL robtargetArrayTest{nTypeToTeach}, v10, fine, tGripper;
 
  ! So kann das robtarget nicht geändert werden. Wenn man nur das
  ! robtargetArrayTest{nTypeToTeach}.numberOne markiert und "Position
  ! korrigieren" antippt fragt das Panel zwar nach dem Index, es wird aber
  ! nur die Schaltfläche "Schließen" angezeigt. Einen Index kann man nicht
  ! auswählen.

  MoveL robtargetRecordTest{1}.numberOne , v10, fine, tGripper;
 
  ! Genau wie zuvor. Ein robtarget in einem RECORD kann man weder direkt noch
  ! indirekt teachen ...

  nTypeToTeach := 2;
  MoveL robtargetRecordTest{nTypeToTeach}.numberOne , v10, fine, tGripper;
   
  ! ... man muss den Umweg über einen Puffer gehen. Hier funktioniert es dann aber
  ! wieder wie im ersten Fall. Das komplette MoveL oder nur rBuffer markieren, usw..
  ! Man darf nur nicht vergessen die nächste Zeile mit der Zuweisung auszuführen,
  ! sonst steht die geänderte Position anschließend nicht in robtargetRecordTest{nTypeToTeach}.numberTwo
  ! Zudem muss der Puffer als PERS deklariert und mit Wertzuweisung vorhanden sein.
  ! Siehe dazu auch voriges Posting.

  nTypeToTeach := 2;
  rBuffer := robtargetRecordTest{nTypeToTeach}.numberTwo;
  MoveL rBuffer, v10, fine, tGripper;
  robtargetRecordTest{nTypeToTeach}.numberTwo := rBuffer;
<snap>
  • gefällt mir    Danke
In der Theorie sind Theorie und Praxis identisch. In der Praxis nicht.


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