Hallo zusammen
Es ist mir gelungen eine Kamera mit integrierter Bildverarbeitung (eine Cognex In-Sight 7905C) mit einer KRC 4 Steuerung zu verbinden. Die Kamera generiert Positionsdaten und schickt sie als XML über TCP/IP an die Steuerung. Auf der Steuerung läuft Ethernet KRL.
Funktionierender Beispielcode
Dies ist die Konfiguration in Config:\User\Common\EthernetKRL\CognexServer.xml:
<ETHERNETKRL>
<CONFIGURATION>
<EXTERNAL>
<TYPE>Client</TYPE>
</EXTERNAL>
<INTERNAL>
<IP>0.0.0.0</IP><!-- 0.0.0.0 bindet an alle zugewiesenen IPs -->
<PORT>54600</PORT><!-- Port muss offenbar nicht explizit in KLIConfig freigegeben werden -->
<ALIVE Set_Flag="1"/>
<BUFFERING Mode="LIFO" Limit="1"/>
<MESSAGES Logging="enabled" Display="disabled"/>
</INTERNAL>
</CONFIGURATION>
<RECEIVE>
<XML>
<ELEMENT Tag="Cognex/X" Type="REAL"/>
<ELEMENT Tag="Cognex/Y" Type="REAL"/>
<ELEMENT Tag="Cognex/A" Type="REAL"/>
<ELEMENT Tag="Cognex" Set_Flag="2"/>
</XML>
</RECEIVE>
</ETHERNETKRL>
Alles anzeigen
Hinweis: Wird o.g. Datei geändert, ist unter Umständen (mutmaßlich beim erstmaligen Inbetriebnehmen, Ändern des TYPE, des Ports oder der IP-Adresse) ein Kaltstart mit "Neueinlesen der Konfiguration" notwendig. Ein WorkVisual deploy reicht nicht aus.
Dies ist das KRL Programm:
&ACCESS RVP
&REL 3
&PARAM SensorITMASK = *
&PARAM TEMPLATE = C:\KRC\Roboter\Template\vorgabe
&PARAM DISKPATH = KRC:\R1\Program
DEF Cognex( )
;FOLD Declaration
DECL EKI_STATUS RET
DECL E6POS DefaultPos
DECL E6POS CognexPos
DECL REAL CognexX
DECL REAL CognexY
DECL REAL CognexA
DECL E6AXIS HOME
;ENDFOLD (Declaration)
;FOLD INI
;FOLD BASISTECH INI
BAS (#INITMOV,0 )
;ENDFOLD (BASISTECH INI)
;FOLD USER INI
;Make your modifications here
CognexX = 0; muss einmal gesetzt werden, sonst in EKI_GetReal nicht nutzbar
CognexY = 0; muss einmal gesetzt werden, sonst in EKI_GetReal nicht nutzbar
CognexA = 0; muss einmal gesetzt werden, sonst in EKI_GetReal nicht nutzbar
;ENDFOLD (USER INI)
;ENDFOLD (INI)
BAS(#TOOL,2) ; parallel gripper + distance for "pointing" to block center
BAS(#BASE,1) ; origin cognex image is origin base
RET = EKI_Init("CognexServer")
RET = EKI_Lock("CognexServer") ; discard any input by default (does not seem to help)
HOME = {A1 22, A2 -40, A3 127, A4 0, A5 -60, A6 90}
PTP HOME
DefaultPos = $POS_ACT
while True
RET = EKI_Open("CognexServer")
wait for $FLAG[1] ; wait until there is a connection
while $FLAG[1] ; repeat while connected
RET = EKI_Unlock("CognexServer") ; enable reciever
wait for $FLAG[3] ; wait until an event occurred
if $FLAG[2] then ; Cognex data received
RET = EKI_Lock("CognexServer") ; discard any input while moving
$FLAG[2] = FALSE ; reset "data received"
RET = EKI_GetReal("CognexServer", "Cognex/X", CognexX)
RET = EKI_GetReal("CognexServer", "Cognex/Y", CognexY)
RET = EKI_GetReal("CognexServer", "Cognex/A", CognexA)
; only move x,y,a but have rest defined
CognexPos = DefaultPos
CognexPos.X = CognexY
CognexPos.Y = CognexX
CognexPos.A = CognexA
RET = EKI_ClearBuffer("CognexServer", "Cognex") ; clear buffer before moving (does not seem to help)
LIN CognexPos
endif
endwhile ; while connected
endwhile ; while True
RET = EKI_Clear("CognexServer")
END
Alles anzeigen
Problembeschreibung
Die Kamera sendet Positionsdaten, sobald sie welche hat. Das tut sie alle 100ms und auch während der Roboter sich schon bewegt. Ich bin immer nur am aktuellsten Datum interessiert, weshalb ich den Puffer als LIFO der Größe 1 eingestellt habe. Leider hält das Programm mit dem Fehler CBuffer: Buffer limit! Max size 1 of buffer reached. Buffer expanded. an. Der Puffer wird mit jeder Meldung um 1 vergrößert.
Ich habe in der Dokumentation gelesen, dass man mit EKI_Lock den Empfangspuffer explizit sperren kann. Das führt jedoch bei mir nur zu der Fehlermeldung CConnection: Can't LOCK receive process!!!!.
Das Programm funktioniert ansonsten gut. Ich kann die Fahrt nach der Fehlermeldung wiederaufnehmen lassen und der Roboter tut seine Arbeit. Daher habe ich die Anzeige der EthernetKRL EKI Fehler abgeschaltet. Das hilft, fühlt sich aber falsch an. Es könnten andere Fehler auftreten, welche tatsächlich wichtig sind. Wie könnte der offizielle richtige Weg aussehen, das Programm ordentlich laufen zu lassen?
Viele Grüße
Hermann