Hallo zusammen.
ich möchte in einem Paralelltask (submit-Interpreter) immer überprüfen, ob der Roboter auf bestimmten Positionen ist und die Information per Feldbus an die SPS senden.
Das sieht als Funktion so aus:
Code
Global DEFFCT BOOL IN_POS(CHECKPOS :IN, TolTrans :IN, TolRot:IN)
DECL E6POS CHECKPOS
DECL BOOL B_IN_POS
DECL real TolTrans
DECL real TolRot
B_IN_POS=TRUE
IF (CHECKPOS.X<($POS_ACT.X-TolTrans)) OR (CHECKPOS.X>($POS_ACT.X+TolTrans)) THEN
B_IN_POS=FALSE
ENDIF
IF (CHECKPOS.Y<($POS_ACT.Y-TolTrans)) OR (CHECKPOS.Y>($POS_ACT.Y+TolTrans)) THEN
B_IN_POS=FALSE
ENDIF
IF (CHECKPOS.Z<($POS_ACT.Z-TolTrans)) OR (CHECKPOS.Z>($POS_ACT.Z+TolTrans)) THEN
B_IN_POS=FALSE
ENDIF
IF (CHECKPOS.A<($POS_ACT.A-TolRot)) OR (CHECKPOS.A>($POS_ACT.A+TolRot)) THEN
B_IN_POS=FALSE
ENDIF
IF (CHECKPOS.B<($POS_ACT.B-TolRot)) OR (CHECKPOS.B>($POS_ACT.B+TolRot)) THEN
B_IN_POS=FALSE
ENDIF
IF (CHECKPOS.C<($POS_ACT.C-TolRot)) OR (CHECKPOS.C>($POS_ACT.C+TolRot)) THEN
B_IN_POS=FALSE
ENDIF
;IF (CHECKPOS.E1<($POS_ACT.E1-TolRot)) OR (CHECKPOS.E1>($POS_ACT.E1+TolRot)) THEN
;B_IN_POS=FALSE
;
;ENDIF
;IF (CHECKPOS.E2<($POS_ACT.E2-TolRot)) OR (CHECKPOS.E2>($POS_ACT.E2+TolRot)) THEN
;B_IN_POS=FALSE
;
;ENDIF
RETURN (B_IN_POS)
ENDFCT ;Function IN_POS
Display More
Und im Aufruf so:
Code
;*****************************************
;***** Grundstellung ******
;*****************************************
INgrundstellung = IN_AxPOS(XHOME,5.0)
;*****************************************
;***** Zuführung ******
;*****************************************
INAbholPosZuf = IN_POS(gXAbholPosZuf,5.0,5.0)
;*****************************************
;***** Richten ******
;*****************************************
INAbgabePosRichten = IN_POS(gXAbgabePosRichten,5.0,5.0)
INAbholPosRichten = IN_POS(gXAbholPosRichten,5.0,5.0)
;*****************************************
;***** Abgabe ******
;*****************************************
INAbgabePos = IN_POS(gXAbgabePos,5.0,5.0)
Display More
Das hat auch gut funktioniert. Allerdings habe ich nun die Anlage in unterschiedliche BASE Koordinatensysteme unterteilt, und nun geht's nicht mehr. Ich wollte nun bei der Überprüfung folgendes machen:
Code
decl Frame TempBase
TempBase = $BASE
;*****************************************
;***** Grundstellung ******
;*****************************************
$BASE = SBASE(FHOME.BASE_NO)
INgrundstellung = IN_AxPOS(XHOME,5.0)
;*****************************************
;***** Zuführung Base1 ******
;*****************************************
$BASE = SBASE(gFAbholPosZuf.BASE_NO)
INAbholPosZuf = IN_POS(gXAbholPosZuf,5.0,5.0)
;*****************************************
;***** Richten base 4 ******
;*****************************************
$BASE = SBASE(gFAbgabePosRichten.BASE_NO)
INAbgabePosRichten = IN_POS(gXAbgabePosRichten,5.0,5.0)
INAbholPosRichten = IN_POS(gXAbholPosRichten,5.0,5.0)
;*****************************************
;***** Abgabe base 3 ******
;*****************************************
$BASE = SBASE(gFAbgabePos.BASE_NO)
INAbgabePos = IN_POS(gXAbgabePos,5.0,5.0)
$BASE = TempBase
Display More
Aber die Variable $BASE ist im Submit Interpreter schreibgeschützt. Mach ich das zu umständlich? Gibt es bessere / andere Möglichkeiten?
Vielen Dank und Gruß