Hallo,
Ich habe das Softwarepaket Ethernet-KRL und möchte Daten von meinem PC an den Roboter senden und dann die Koordinaten anfahren. Wie kann ich es erreichen, dass der Roboter so lange wartet mit dem Auslesen des Empfangsspeichers, bis ich ihm tatsächlich etwas gesendet habe? Da die Auswertung im externen System nicht immer gleich lange dauert kommt auch kein wait sec x Befehl in Frage.
Zur Info: mein Roboter ist Client und der PC ist als Server konfiguriert.
Ethernet-KRL, Roboter wartet bis Daten angekommen sind
- Dennisprog
- Erledigt
-
-
Welche Softwareversion (KSS und Ethernet.XML) hast du eigentlich? Häng doch bitte mal den Programmauszug und die XML-Konfiguration an.
-
Die Softwareversion des Ethernetpakets ist 2.5 und der KSS 8.3
Hier das momentane Roboterprogramm zum Testen:
Code
Alles anzeigen&ACCESS RVP &REL 11 &PARAM EDITMASK = * &PARAM TEMPLATE = C:\KRC\Roboter\Template\vorgabe &PARAM DISKPATH = KRC:\R1\Program DEF SERVER( ) DECL EKI_STATUS EKI_Status ;FOLD INI;%{PE} ;FOLD BASISTECH INI GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( ) INTERRUPT ON 3 BAS (#INITMOV,0 ) ;ENDFOLD (BASISTECH INI) ;FOLD USER INI ;Make your modifications here ;ENDFOLD (USER INI) ;ENDFOLD (INI) ;FOLD SPTP P1 Vel=100 % PDAT1 Tool[1] Base[0];%{PE}%R 8.3.43,%MKUKATPBASIS,%CSPLINE,%VSPTP_SB,%P 1:SPTP_SB, 2:P1, 3:, 5:100, 7:PDAT1 SPTP XP1 WITH $VEL_AXIS[1]= SVEL_JOINT( 100), $TOOL= STOOL2( FP1), $BASE= SBASE( FP1.BASE_NO),$IPO_MODE= SIPO_MODE( FP1.IPO_FRAME), $LOAD= SLOAD( FP1.TOOL_NO), $ACC_AXIS[1]= SACC_JOINT( PPDAT1), $GEAR_JERK[1]= SGEAR_JERK( PPDAT1) ;ENDFOLD valuex=0 valuey=0 ;FOLD PTP HOME Vel=100 % DEFAULT;%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:HOME, 3:, 5:100, 7:DEFAULT $BWDSTART=FALSE PDAT_ACT=PDEFAULT FDAT_ACT=FHOME BAS(#PTP_PARAMS,100) $H_POS=XHOME PTP XHOME ;ENDFOLD EKI_STATUS=EKI_Init("Hallo") EKI_STATUS=EKI_Open("Hallo") ;FOLD Write data to connection ; Write bool to <AUfPosition></AufPosition> EKI_STATUS=EKI_SetBool("Hallo","AufPosition",true) ;ENDFOLD ;FOLD Send data to external program EKI_STATUS = EKI_Send("Hallo","AufPosition") WAIT SEC 1 ;ENDFOLD EKI_Status=EKI_GetInt("Hallo","Position/Position1/x-Koordinate",valuex) EKI_Status=EKI_GetInt("Hallo","Position/Position1/y-Koordinate",valuey) EKI_Status=Eki_Clear("Hallo") XP1.X=valuex XP1.Y=valuey sptp XP1 ;FOLD PTP HOME Vel=100 % DEFAULT;%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:HOME, 3:, 5:100, 7:DEFAULT $BWDSTART=FALSE PDAT_ACT=PDEFAULT FDAT_ACT=FHOME BAS(#PTP_PARAMS,100) $H_POS=XHOME PTP XHOME ;ENDFOLD END
Und hier die XML- Konfiguration:
XML
Alles anzeigen<ETHERNETKRL> <CONFIGURATION> <EXTERNAL> <IP>172.31.10.152</IP> <PORT>49152</PORT> <ALIVE>SET_OUT="1" PING="4"</ALIVE> </EXTERNAL> </CONFIGURATION> <RECEIVE> <XML> <ELEMENT Tag="Position/Position1/x-Koordinate" Type="INT"/> <ELEMENT Tag="Position/Position1/y-Koordinate" Type="INT"/> </XML> </RECEIVE> <SEND> <XML> <ELEMENT Tag="AufPosition"/> </XML> </SEND> </ETHERNETKRL>
-
Ich habe gerade die Funktion EKI_CheckBuffer gefunden. Mit dieser müsste es doch realisierbar sein oder geht das nicht?
Wenn ja, was muss hier als Position des Speichers eingetragen werden? -
Du hast doch die Flags, mit denen wird indiziert, wann und wo was kommt. Musst Du nur konfigurieren und abfragen.
Grüße,
Michael -
Ich habe in meiner Konfiguration ja des Ausgang 1 konfiguriert. Dieser wird jedoch nie gesetzt.
Oder wie meinst du das? -
Ich habe in meiner Konfiguration ja des Ausgang 1 konfiguriert. Dieser wird jedoch nie gesetzt.
..Das ist das Keepalive-Signal, das ist nicht gemeint.
Dazu muss im Abschnitt <ELEMENT> das Attribut Set_Flag="2" oder Set_Out="2" vorhanden sein, dann wird das Flag 2/der Ausgang 2 gsetzt, wenn Daten angekommen sind.Das Element <ALIVE> gehört in den Abschnitt <INTERNAL>, dann sollte auch der Ausgang 1 bei aktiver Verbindung gesetzt werden.
Bei dem Ethernetpaket sind so schöne Beispiele dabei, die braucht man doch nur zu kopieren und entsprechend anzupassen.
-
Okay, vielen Dank.
Aber es funktioniert auch über die Abfrage EKI_CheckBuffer:
EKI_Status=EKI_CheckBuffer("Config","Position/Position1/x-Koordinate")WHILE (EKI_Status.Buff==0)
wait sec 1
EKI_Status=EKI_CheckBuffer("Config","Position/Position1/x-Koordinate")
ENDWHILE
Abfrage wird erst verlassen wenn etwas im Buffer ankommt. -
Abfrage wird erst verlassen wenn etwas im Buffer ankommt.
Du willst aber normalerweise nicht wissen, ob etwas im Puffer ankommt, sondern du willst wissen, ob es vollständig im Puffer angekommen ist. Das ist, wenn es schlecht läuft, etwas anderes....Grüße,
Michael -
Möchte auch noch meinen Senf dazugeben:
Wenn Du das Ganze mit Flag/Ausgang realisierst, dann könntest Du die Daten auch in einem Interrupt auslesen und Dein Robi kann in der Zeit noch was anderes machen.
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