Beiträge von bf
-
-
Danke! socat schneidet nach einer gewissen länge scheinbar den String einfach ab!
-
Hallo!
Mein Konfiguration für den Channel "fs" sieht wiefolgt aus
Code
Alles anzeigen<ETHERNETKRL> <CONFIGURATION> <EXTERNAL> <TYPE>CLIENT</TYPE> </EXTERNAL> <INTERNAL> <ENVIRONMENT>Program</ENVIRONMENT> <IP>10.70.10.40</IP> <PORT>54600</PORT> <PROTOCOL>TCP</PROTOCOL> <MESSAGES Logging="warning" Display="error"/> <ALIVE Set_Flag="1" Ping="5"/> <BUFFSIZE Limit="65534"/> <BUFFERING Limit="512"/> </INTERNAL> </CONFIGURATION> <RECEIVE> <XML> <!-- settings - samplingrate --> <!--<ELEMENT Tag="robot/data/settings/samplingrate/@samplingrate" Type="REAL"/>--> <!-- settings - tool --> <ELEMENT Tag="robot/custompoint/@mode" Type="INT"/> <ELEMENT Tag="robot/custompoint/@komponenten" Type="INT"/> <ELEMENT Tag="robot/custompoint/@verschleifen" Type="BOOL"/> <ELEMENT Tag="robot/custompoint/@pause" Type="BOOL"/> <ELEMENT Tag="robot/custompoint/pos/@tool" Type="INT"/> <ELEMENT Tag="robot/custompoint/pos/@base" Type="INT"/> <ELEMENT Tag="robot/custompoint/pos/@Z" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/@Y" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/@Z" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/@A" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/@B" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/@C" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/@E1" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/@E2" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/@E3" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/@E4" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/@E5" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/@velCP" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/@velOri1" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/@velOri2" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/tool/@X" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/tool/@Y" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/tool/@Z" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/tool/@A" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/tool/@B" Type="REAL"/> <ELEMENT Tag="robot/custompoint/pos/tool/@C" Type="REAL"/> <ELEMENT Tag="robot/custompoint/axis/@A1" Type="REAL"/> <ELEMENT Tag="robot/custompoint/axis/@A2" Type="REAL"/> <ELEMENT Tag="robot/custompoint/axis/@A3" Type="REAL"/> <ELEMENT Tag="robot/custompoint/axis/@A4" Type="REAL"/> <ELEMENT Tag="robot/custompoint/axis/@A5" Type="REAL"/> <ELEMENT Tag="robot/custompoint/axis/@A6" Type="REAL"/> <ELEMENT Tag="robot/custompoint/axis/@E1" Type="REAL"/> <ELEMENT Tag="robot/custompoint/axis/@E2" Type="REAL"/> <ELEMENT Tag="robot/custompoint/axis/@E3" Type="REAL"/> <ELEMENT Tag="robot/custompoint/axis/@E4" Type="REAL"/> <ELEMENT Tag="robot/custompoint/axis/@E5" Type="REAL"/> <ELEMENT Tag="robot/custompoint/axis/@E6" Type="REAL"/> <ELEMENT Tag="robot/custompoint/axis/@vel" Type="REAL"/> <!-- Flags --> <ELEMENT Tag="robot/custompoint" Set_Flag="900"/> </XML> </RECEIVE> <SEND> <XML> </XML> </SEND> </ETHERNETKRL>
Daten sehen z.B wiefolgt aus
Code<robot> <custompoint mode="6" komponenten="32" verschleifen="true" pause="false"> <pos X="0" Y="0" Z="500" A="0" B="0" C="0" tool="-2" base="-2" velCP="0.2" velOri1="180" velOri2="180" /> </custompoint> </robot>
dies funktioniert auch, wenn ich nun z.B 20 "custompoint" in einem XML sende funktioniert es auch noch, wenn ich aber 40 sende bleibt mein code bei
stehen.
Es wird keine Fehlermeldung angezeigt und im Diagnosemonitor sehe ich das die Verbindung bestehen bleibt und sich der Wert in "Verbrauchter Speicher" ändert.
Ich habe Buffering bzw Buffersize beides auf das Maximale Limit gesetzt um auszuschließen das es ein Speicherproblem wäre(da sollte aber auch eine Fehlermeldung kommen)
Irgendeine Idee was hier noch falsch laufen kann?
Verbindungs code sieht momentan in etwa so aus
-
was auch immer hilft das VRC Interface zu Deinstallieren und wieder Installieren, warum das so ist kann ich dir nicht sagen aber es Hilft! Meistens passiert das beim einspielen eines neuen Projektes in Office Lite.
Das wars, danke!
-
Hallo!
Die Verbindung zwischen SimPro und Office Lite steht.
Ich habe in SimPro eine einfache Positionierung "geteacht". Wenn ich mich nun mit office lite verbinde und auf "Job generieren und laden" klicke, startet er das Programm und in der Ist Positionsanzeige im Office Lite sehe ich auch das sich der Roboter bewegen sollte, in SimPro bleibt der Roboter aber stehen.
Irgendeine Idee an was das liegen könnte?
Danke
-
Danke! Aber normalerweise gewinnt doch auch immer die Einstellungen im geteachten Punkt(z.B Geschwindigkeit)?
wenn ich dies nun ändern will kann ich einfach in der LDAT-Struktur GEAR_JERK überschreiben?
Bin da eher vorsichtig geteachte punkte manuell abzuändern
-
Hallo!
in den geteachten punkte finde ich ja das attribut "GEAR_JERK" dieser ist überall standardmäßig auf 100.
Kann ich dieses irgendwie Global überschreiben?
falls nein, wie passe ich den jerk an? im inline-formular finde ich keine option dazu.
-
Dein Problem ist wirklich noch tricky.
dass in einer Variable, wo Du was reingeschrieben hast, plötzlich nichts mehr drinsteht,....
Du solltest diesen Effekt aber erreichen können über eine lokale Definition in einem Unterprogramm. Bei jedem Aufruf wird diese neu deklariert (eröffnet).
Übergeben und Initialisieren tust Du nur das Aggregat, was Du fahren willst. Mal so als vereinfachtes Bsp.
Evtl. könnte man auch so eine Pos zurückgeben.
Ist ungetestet.
Code
Alles anzeigenDEF bf_Test ( ) DECL INT nX_VALUE, nZ_VALUE nX_VALUE = IN_PositionsvorgabeX nZ_VALUE = IN_PositionsvorgabeZ MOVE_DIRECTION(nX_VALUE,,,,,) MOVE_DIRECTION(,,nZ_VALUE,,,) END DEF MOVE_DIRECTION( nX:IN, nY:IN, nZ:IN, nA:IN, nB:IN, nC:IN ) DECL INT nX, nY, nZ, nA, nB, nC, DECL POS pDUMMY ON_ERROR_PROCEED pDUMMY.X = nX ON_ERROR_PROCEED pDUMMY.Y = nY ON_ERROR_PROCEED pDUMMY.Z = nZ ON_ERROR_PROCEED pDUMMY.A = nA ON_ERROR_PROCEED pDUMMY.B = nB ON_ERROR_PROCEED pDUMMY.C = nC SLIN pDUMMY END
Danke!
Ich übergebe jetzt via profinet noch bits welche mir sagen welche komponenten überhaupt angesteuert werden sollen.
dann mach ich im prinzip
anschließend überschreibe ich die einfach mit IN_PositionsvorgabeX,...
-
position=$NULLFRAME
in $NULLFRAME steht aber {X 0, Y 0, Z 0, A 0, B 0, C 0}
-
In zeile 0 Steht in der variable position {E6POS:}
In zeile 1 Steht in der variable position {E6POS: Z -2000}
In zeile 3 Steht in der variable position {E6POS: X-300, Z -2000}
kann ich die variable "position" irgendwie neu initialisieren damit nichtsmehr drinnensteht? (wie in zeile 0?)
-
Die geteachte Position ist in Meinepos...
Trans ist ein Frame für X Y Z A B C der dann mit der Pos verrechnet wird
ok!
Ich habe aber keinen geteachten punkt mit dem ich rechnen kann, ich will einfach auch einzelne Komponenten anfahren können
-
SLIN Trans(IN_PositionsvorgabeX,0,0,0,0):Meinepos
Danke!
Was macht Trans(..) bzw. was steht in Meinepos?
-
Hallo!
ich beschreibe via ProfiNet eine E6Pos
Direkt programmiert kann ich ja einfach schreiben
aber wenn ich folgendes schreibe sind ja alle anderen komponenten Y,Z,A,B,C gleich 0 und er fährt ganz anders als gewünscht
Gibt es eine Möglichkeit das zu umgehen?
Ich hätte auch überlegt
etc zu schreiben, allerdings hab ich beim überschleifen das problem das in $POS_ACT noch nicht die richtige position steht da der vorlauf ja schon abfragt wenn die endposition noch gar nicht erreicht wurde.
Danke
-
Danke! das probier ich dann gleich aus!
was mir gerade aufgefallen ist:
sagen wir ich führe folgendes Programm aus:
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? -
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?
Code
Alles anzeigenDEF 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. -
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?
-
Ich steuere den Roboter ausschließlich über EthernetKRL.
Nehmen wir an ich hab eine Methode A welche eine Bewegung ausführt, dann läuft diese Methode auch in einem Interrupt.
Jetzt würde ich in der Methode A einen weiteren Interrupt Deffinieren fürs Abbrechen.Ich habe eine weitere Methode B welche zyklisch über EthernetKRL die IstPosition sendet, diese Interruptroutine ist also quasi in einer Endlosschleife.
Mir ist nun wichtig das ich die Interruptroutine A abbrechen kann aber B weiterläuft.
Ich hätte mir das dann eben so vorgestellt
da ja RESUME alle Interruptroutinen in der selben Ebene abbricht, hab ich den STOP Interrupt eben eine Ebene tiefer deklariert.Code
Alles anzeigenDEF main INTERRUPT DECL 1 WHEN $FLAG[1]==TRUE DO A() INTERRUPT ON 1 INTERRUPT DECL 2 WHEN $FLAG[2]==TRUE DO B() INTERRUPT ON 2 ;EthernetKRL code... END DEF A() INTERRUPT DECL 3 WHEN $FLAG[3]==TRUE do STOP() INTERRUPT ON 3 LIN_REL {Z -100} $FLAG[1]=FALSE END DEF STOP() INTERRUPT OFF 3 BRAKE RESUME END DEF B() ;sende zyklisch in endlosschleife Istposition über EthernetKRL END
Sinn dahinter: Roboter soll auf eine Palette auffahren und Wenn der Sensor auf dem Werkzeug schaltet wird ein Befehl über Ethernet KRL gesendet welches dann die STOP-Funktion aufrufen soll.
Ich weiß - man kann Sensoren auch direkt an den Roboter anhängen, wir wollen das aber mal über eine Zentrale SPS regeln.
-
Code
Alles anzeigenINTERRUPT DECL 1 WHEN FLAG[0] DO A() INTERRUPT DECL 3 WHEN FLAG[3] DO B() INTERRUPT 1 ON INTERRUPT 3 ON DEF A() INTERRUPT DECL 2 WHEN FLAG[2] DO STOP_A() INTERRUPT 2 ON PTP_REL{Z -100} INTERRUPT 2 OFF END DEF STOP_A() RESUME END DEF B() ;ethernetkrl code END
würde in diesem Fall mit RESUME auch B() abgebrochen werden falls diese Interruptroutine gerade läuft?
Ich will nämlich wirklich nur gezielt A() abbrechen lassen -
Hallo!
Ist es möglich, mit dem Werkzeug in Stoßrichtung zu fahren bis ein Flag auf TRUE Gesetzt wird?
Also z.B.:Die Idee dahinter ist das auf dem Werkzeug ein Sensor ist, und wenn dieser anschlägt soll die Bewegung abgebrochen werden.
Ich hätte mal an sowas gedacht, wüsste aber gerne ob es da eine andere(bessere) Möglichkeit gibt?