Aktuelle Position an Ausgang übertragen

  • Hallo Zusammen,
    ich stehe gerade vor einem Problem, bei dem ich nicht weiter komme: Ich möchte von $pos_act die X-, Y- und Z-Werte per Ethercat übertragen. Die Signale/Variablen sind soweit angelegt und funktionieren auch, jedoch schaffe ich es nicht die Werte zu zuordnen. Ich versuche in der sps.sub die Werte den Variablen per PositionX = $pos_act.x zu zuweisen, das sorgt aber nur dafür, dass der Submitinterpreter abschmiert.
    Habt Ihr evtl. eine Lösung dazu?

  • Schritt für Schritt zum Roboterprofi!
  • Hab meinen Fehler gefunden: $pos_act wird scheinbar erst beschrieben, wenn eine SAK-Fahrt gemacht wurde. Bis dahin meckert der Submitinterperter dann. Jetzt werden die Variablen erst zugewiesen, wenn die SAK-Fahrt gemacht wurde und alles läuft.

  • Hallo


    Dein eigentliches Problem hat wahrscheinlich nichts mit der SAK-Fahrt zu tun, sondern, dass $BASE und $TOOL noch ungültig sind und damit auch $POS_ACT. Daher würde ich im Submit immer auf Gültigkeit (siehe VARSTATE Funktion) der beiden prüfen.


    Fubini

  • IF ( ($ACT_TOOL>=0) AND ($ACT_BASE>=0)) THEN


    ACT_POSITION = $POS_ACT

    ; XXXX
    IF( (ACT_POSITION.x <= XXXXXXX.x + 20) AND (ACT_POSITION.x >= XXXXXXX.x - 20) ) ) THEN
    $OUT[137] = TRUE
    ELSE
    $OUT[137] = FALSE
    ENDIF

  • Also wenn Du $POS_ACT.x/.y/.z auf eine Signalvereinbarung schreibst, dann hast Du immer das Problem, dass die Signalvereinbarungen immer vom Typ Unsigned (Byte/Word/DWord) sind.
    Ich mach das meistens so


    Code
    SIGNAL POSX $OUT[1] TO $OUT[16]
    ;Jetzt hast Du ein 16Bit Signal, Wertebereich 0...65535


    Jetzt musst Du den Positionswert in den Wertebereich schieben. Am besten indem Du


    Code
    INT POSX_INT
    
    
    ;$POS_ACT nur lesen, wenn die Werte auch Initialisiert (ALSO $TOOL und $BASE nicht ? sind)
    IF(VARSTATE("POS_ACT.X") == #INITIALIZED) THEN
      POSX_INT = $POS_ACT.X *10
    ENDIF


    65535 entsprechen dann also 6553.5mm was eigentlich genügen sollte. Eine Nachkommastelle sollte auch reichen
    Damit Du keinen Überlauf durch negative Positionswerte verursachst, muss Du dann noch einen Offset von 32767 (=Wertebereich bei Signed Word) dazugeben


    Code
    POSX_INT = POSX_INT +32767


    Und dann wenn alles passt auf das Signal schreiben


    Code
    IF POSX_INT <= 65535 THEN
      POSX = POSX_INT
    ELSE
      POSX = 0
    ENDIF


    Auf der SPS muss Du dann das Signal mit einem Offset von -32767 versehen und danach noch durch 10 dividieren und das war's auch schon.
    Im Beispiel hab ich das nur mit X gemacht. Für die anderen Koordinaten musst Du das natürlich auch programmieren.
    Es kann gut sein, dass ich im Code irgendwas vergessen habe, da ich das gerade aus dem Kopf zusammengeschrieben hab.

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