以下文章來(lái)源于不知名網(wǎng)友i,作者不知名網(wǎng)友i
軟件支持
庫(kù)卡軟件包支持:
需要KUKA.Ethernet KRL,具體小版本根據(jù)系統(tǒng)而定。
測(cè)試環(huán)境:
虛擬機(jī):VM17Pro
示教器:Officelite v8.6.7
編程:Workvisual v6.3.0
電腦:w11 python(測(cè)試) socketTool(測(cè)試)
配置方法
庫(kù)卡 socket 一切關(guān)于 socket 配置的操作,都基于一個(gè)或多個(gè) xml 文件。

軟件安裝后自帶的一些 demo 和文檔,本文不過(guò)多概述。
關(guān)于 xml 文件的參數(shù)解析:
基于VST_Ethernet_KRL_31_zh,文中未提及的皆為可選參數(shù),具體請(qǐng)參閱手冊(cè)
連接

Server 192.1.10.20 54600 TCP
接收數(shù)據(jù)
發(fā)送數(shù)據(jù)
實(shí)戰(zhàn)起!
我的 xml 文件,作用:接收位置數(shù)據(jù)并只回復(fù)狀態(tài)。
192.168.0.1 59152

關(guān)于EKI的一些函數(shù)
程序說(shuō)明:
1、接收上位機(jī)發(fā)送的 xyz 位置變量,歐拉角使用當(dāng)前自身位置,得到后賦值到位置變量數(shù)組。DECL FRAME POS_DATA[1000]位置變量聲明于 config 中。

SRC

DAT
&ACCESS RVP DEF RECE_MAIN ( ) ;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 HOME Vel=100 % DEFAULT ;%{PE} ;FOLD Parameters ;%{h} ;Params IlfProvider=kukaroboter.basistech.inlineforms.movement.spline; Kuka.IsGlobalPoint=False; Kuka.PointName=HOME; Kuka.BlendingEnabled=False; Kuka.MoveDataPtpName=DEFAULT; Kuka.VelocityPtp=100; Kuka.VelocityFieldEnabled=True; Kuka.CurrentCDSetIndex=0; Kuka.MovementParameterFieldEnabled=True; IlfCommand=SPTP ;ENDFOLD SPTP XHOME WITH $VEL_AXIS[1] = SVEL_JOINT(100.0), $TOOL = STOOL2(FHOME), $BASE = SBASE(FHOME.BASE_NO), $IPO_MODE = SIPO_MODE(FHOME.IPO_FRAME), $LOAD = SLOAD(FHOME.TOOL_NO), $ACC_AXIS[1] = SACC_JOINT(PDEFAULT), $APO = SAPO_PTP(PDEFAULT), $GEAR_JERK[1] = SGEAR_JERK(PDEFAULT), $COLLMON_TOL_PRO[1] = USE_CM_PRO_VALUES(0) ;ENDFOLD ACT_POS = $POS_ACT INIT_DATA() GET_DATA() ;wait until data read RET=EKI_Close("XmlCallBack") RET=EKI_Clear("XmlCallBack") RUN_ROBOT() END DEF INIT_DATA() RET=EKI_Init("XmlCallBack") RET=EKI_Open("XmlCallBack") RET = EKI_SEND("XmlCallBack", "Status 200") ; INIT save_index = 1 FOR i=1 TO (1000) POS_DATA[i]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0} ENDFOR valueFrame={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0} END DEF GET_DATA() LOOP Wait for $Flag[1] ;SET_VALUE RET=EKI_GetFrame("XmlCallBack","Sensor/Read/xyzabc",valueFrame) IF (valueFrame.X <> 666.666) and (valueFrame.Y <> 666.666) THEN POS_DATA[save_index] = valueFrame POS_DATA[save_index].A = ACT_POS.A POS_DATA[save_index].B = ACT_POS.B POS_DATA[save_index].C = ACT_POS.C save_index = save_index + 1 $Flag[1]=False ELSE EXIT ENDIF RET = EKI_SEND("XmlCallBack", "Status 200") ENDLOOP END DEF RUN_ROBOT() DECL FRAME XMOVE_POS LOOP FOR i=1 TO (1000) XMOVE_POS = POS_DATA[i] ;FOLD SLIN MOVE_POS Vel=2 m/s CPDAT1 Tool[1] Base[0] ;%{PE} ;FOLD Parameters ;%{h} ;Params IlfProvider=kukaroboter.basistech.inlineforms.movement.spline; Kuka.IsGlobalPoint=False; Kuka.PointName=MOVE_POS; Kuka.BlendingEnabled=False; Kuka.MoveDataName=CPDAT1; Kuka.VelocityPath=2; Kuka.VelocityFieldEnabled=True; Kuka.ColDetectFieldEnabled=True; Kuka.CurrentCDSetIndex=0; Kuka.MovementParameterFieldEnabled=True; IlfCommand=SLIN ;ENDFOLD SLIN XMOVE_POS WITH $VEL = SVEL_CP(2.0, , LCPDAT1), $TOOL = STOOL2(FMOVE_POS), $BASE = SBASE(FMOVE_POS.BASE_NO), $IPO_MODE = SIPO_MODE(FMOVE_POS.IPO_FRAME), $LOAD = SLOAD(FMOVE_POS.TOOL_NO), $ACC = SACC_CP(LCPDAT1), $ORI_TYPE = SORI_TYP(LCPDAT1), $APO = SAPO(LCPDAT1), $JERK = SJERK(LCPDAT1), $COLLMON_TOL_PRO[1] = USE_CM_PRO_VALUES(0) ;ENDFOLD IF (POS_DATA[i + 1].X == 0) AND (POS_DATA[i + 1].Y == 0) THEN EXIT ENDIF ENDFOR ENDLOOP END
&ACCESS RVP
DEFDAT rece_main
;FOLD EXTERNAL DECLARATIONS;%{PE}%MKUKATPBASIS,%CEXT,%VCOMMON,%P
;FOLD BASISTECH EXT;%{PE}%MKUKATPBASIS,%CEXT,%VEXT,%P
EXT BAS (BAS_COMMAND :IN,REAL :IN )
DECL INT SUCCESS
;ENDFOLD (BASISTECH EXT)
;FOLD USER EXT;%{E}%MKUKATPUSER,%CEXT,%VEXT,%P
;Make your modifications here
;ENDFOLD (USER EXT)
;ENDFOLD (EXTERNAL DECLARATIONS)
INT i, save_index
DECL EKI_STATUS RET
FRAME ValueFrame
DECL E6POS ACT_POS
DECL MODULEPARAM_T LAST_TP_PARAMS = {PARAMS[] "Kuka.VelocityFieldEnabled=False; Kuka.ColDetectFieldEnabled=False; Kuka.MovementParameterFieldEnabled=False; Kuka.IsAngleEnabled=False; Kuka.PointName=MOVE_POS; Kuka.FrameData.base_no=0; Kuka.FrameData.tool_no=1; Kuka.FrameData.ipo_frame=#BASE; Kuka.isglobalpoint=False; Kuka.MoveDataName=CPDAT1; Kuka.MovementData.cb={AUX_PT {ORI #CONSIDER,E1 #CONSIDER,E2 #CONSIDER,E3 #CONSIDER,E4 #CONSIDER,E5 #CONSIDER,E6 #CONSIDER},TARGET_PT {ORI #INTERPOLATE,E1 #INTERPOLATE,E2 #INTERPOLATE,E3 #INTERPOLATE,E4 #INTERPOLATE,E5 #INTERPOLATE,E6 #INTERPOLATE}}; Kuka.MovementData.apo_fac=50; Kuka.MovementData.apo_dist=500; Kuka.MovementData.axis_acc=100; Kuka.MovementData.axis_vel=100; Kuka.MovementData.circ_typ=#BASE; Kuka.MovementData.jerk_fac=50; Kuka.MovementData.ori_typ=#VAR; Kuka.MovementData.vel=2; Kuka.MovementData.acc=100; Kuka.MovementData.exax_ign=0; Kuka.VelocityPath=2; Kuka.BlendingEnabled=False; Kuka.APXEnabled=False; Kuka.CurrentCDSetIndex=0"}
DECL LDAT LCPDAT1 = {CB {AUX_PT {ORI #CONSIDER,E1 #CONSIDER,E2 #CONSIDER,E3 #CONSIDER,E4 #CONSIDER,E5 #CONSIDER,E6 #CONSIDER},TARGET_PT {ORI #INTERPOLATE,E1 #INTERPOLATE,E2 #INTERPOLATE,E3 #INTERPOLATE,E4 #INTERPOLATE,E5 #INTERPOLATE,E6 #INTERPOLATE}},APO_FAC 50.0,APO_DIST 500,AXIS_ACC 100.0,AXIS_VEL 100.0,CIRC_TYP #BASE,JERK_FAC 50.0,ORI_TYP #VAR,VEL 2,ACC 100,GEAR_JERK 100.0,EXAX_IGN 0}
DECL FDAT FMOVE_POS = {BASE_NO 0,TOOL_NO 1,IPO_FRAME #BASE,POINT2[] " "}
ENDDAT
程序關(guān)鍵點(diǎn)說(shuō)明
1、xml 文件編輯完成后必須放置在C:KRCROBOTERConfigUserCommonEthernetKRL中

并且程序中EKI函數(shù)傳參時(shí)傳入的為 xml 文件名。
2、必須聲明EKI函數(shù) DECL EKI_STATUS RET

在正確的位置使用相關(guān)函數(shù),初始化、連接、發(fā)送等
3、使用正確的 GETSET 函數(shù)

例如我是需要獲取位置變量,那么我直接是使用了GetFrame函數(shù),如果是字符串則是GETSTRING,整數(shù)、實(shí)數(shù)、布爾等同理。
4、如果你是接收或發(fā)送的字符串,注意庫(kù)卡中并沒(méi)有 String 類型變量,需要使用的字符數(shù)組char[],并且字符數(shù)組下標(biāo)從 1 開(kāi)始。
DECLCHARTEST_STR[20]聲明了長(zhǎng)度為20的字符數(shù)組 DECLCHARTEST_STR1[1] TEST_STR="ABC" TEST_STR1[1]=TEST_STR[2] 這樣賦值到,TEST_STR1[1]值為B
5、合理使用 flag 標(biāo)志,像我的代碼中我只使用了接收到信息的標(biāo)志,這是不對(duì)的,現(xiàn)在代碼在創(chuàng)建連接后會(huì)直接發(fā)送信息,但是可能會(huì)出現(xiàn)上位機(jī)并未運(yùn)行等情況,所以需要正確的使用標(biāo)志位

192.168.0.1 59152
6、更多信息請(qǐng)參閱文檔。
python 發(fā)送 xml 完成通訊
importsocket importtime #創(chuàng)建Socket服務(wù)器 defstart_server(): #創(chuàng)建一個(gè)IPv4(AF_INET)和TCP(SOCK_STREAM)的socket對(duì)象 server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #綁定服務(wù)器地址和端口 server_address=('0.0.0.0',59152) print(f"啟動(dòng)服務(wù)器,監(jiān)聽(tīng)地址:{server_address[0]}:{server_address[1]}") server_socket.bind(server_address) #監(jiān)聽(tīng)客戶端連接,最大連接數(shù)為1 server_socket.listen(1) print("等待客戶端連接...") #接受客戶端連接 client_socket,client_address=server_socket.accept() try: print(f"客戶端連接成功:{client_address}") foriinrange(1000): send_data(client_socket,i+1,i-1) print(client_socket.recv(1024),i) #time.sleep(3) send_data(client_socket,666.666,666.666) finally: #關(guān)閉客戶端連接 client_socket.close() print(f"已斷開(kāi)客戶端:{client_address}") defsend_data(socket_client,x,y): #定義XML數(shù)據(jù) xml_data=f'''''' #發(fā)送XML數(shù)據(jù)到客戶端 socket_client.sendall(xml_data.encode('utf-8')) print(f"已發(fā)送數(shù)據(jù): {xml_data}") #啟動(dòng)服務(wù)器 if__name__=="__main__": start_time=time.time() start_server() end_time=time.time() print(f'耗時(shí):{end_time-start_time}')
發(fā)送 xml 格式,注意格式,否則無(wú)法解析。
測(cè)試





這種寫(xiě)法肯定不是最優(yōu)解,但是在 50 秒內(nèi)解析并保存完成了 1000 組位置數(shù)據(jù),歡迎大佬們有更好的方案一起討論,不喜勿噴。
-
機(jī)器人
+關(guān)注
關(guān)注
213文章
30549瀏覽量
219290 -
電腦
+關(guān)注
關(guān)注
16文章
1810瀏覽量
71548 -
虛擬機(jī)
+關(guān)注
關(guān)注
1文章
968瀏覽量
30152 -
KUKA
+關(guān)注
關(guān)注
3文章
218瀏覽量
17349
原文標(biāo)題:KUKA機(jī)器人socket通訊配置方法
文章出處:【微信號(hào):指南車(chē)機(jī)器人科技,微信公眾號(hào):指南車(chē)機(jī)器人科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
KUKA重型機(jī)器人
求KUKA機(jī)器人控制柜三維模型
KUKA機(jī)器人問(wèn)題解答
庫(kù)卡KUKA機(jī)器人四種啟動(dòng)方式介紹
KUKA庫(kù)卡機(jī)器人伺服驅(qū)動(dòng)器相關(guān)型號(hào)舉例
KUKA焊接機(jī)器人伺服電機(jī)常見(jiàn)故障及維修處理
工業(yè)機(jī)器人組成結(jié)構(gòu)相關(guān)資料分享
庫(kù)卡機(jī)器人MGV電源模塊維修
KUKA機(jī)器人伺服驅(qū)動(dòng)模塊維修
沒(méi)有有前輩用LabVIEW控制kuka機(jī)器人c2的經(jīng)驗(yàn)?通訊是怎么做到的?
ABB機(jī)器人如何與相機(jī)詳細(xì)方法通訊圖文講解
KUKA機(jī)器人PN系統(tǒng)網(wǎng)絡(luò)故障的判斷方法
KUKA工業(yè)機(jī)器人與S7-1200PLC實(shí)現(xiàn)Profinet通訊的步驟

KUKA機(jī)器人socket通訊配置方法
評(píng)論