提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
发那科机器人USM通讯及数据解析存入位置寄存器
提示:这里可以添加本文要记录的大概内容:
所谓的USM就是user socket message,要使用该功能与上位机通讯必须要具备两个插件,在仿真软件的机器人选项里勾选。如下图所示

因为该通讯程序是用KAREL语言编写的,需要对KAREL的指令和格式稍微熟悉一下就行了,编程跟川崎的AS语言类似。
提示:以下是本篇文章正文内容,下面案例可供参考
一、机器人设置
1:示教器点击菜单,设置,主机通讯。

2:点击TCP/IP选项。

3:设置IP地址,当前使用的是仿真软件,必须要用一个可以PING得通的IP地址,否则通讯不上。

4:在菜单点击系统,变量。

5:找到下图的变量,HOSTC_CFG是客户端,HOSTS_CFG是服务器,而该测试使用的是服务器。

6:这里有8个选项,该测试选用的是4号,可以根据自己喜好选择。

7:按照下图设置参数,IP地址要设对,对应的是主机通讯的IP。

8:按照下图设置参数,端口号自行设置,范围不确定,当前测试设置的是502.

9:如果无法启动KL程序,需要将以下变量设置成1。

二、导入KL程序并生成PC程序。
1:新建txt文档,复制以下socket程序,将后缀改成kl格式。
-- TCP-Socket socket连接与断开
PROGRAM SOCKET_SET
%COMMENT = 'socket连接与断开'
%NOPAUSESHFT --忽略SHFT
%INCLUDE klevtpe
VAR
status :INTEGER
-- socket 使用的变量
tag:STRING[254]
socket_file :FILE --端口绑定文件
n_bytes :INTEGER --缓存区的字节数
rec_data:STRING[1] --逐字节读取
con_data:STRING[254] --连接收到的数据
id:STRING[254]
-- 寄存器
type_int, value_int, set_type:INTEGER
value_real : REAL
channel_str: STRING[128]
--ROUTINE check_err
--功能:检查status状态,报警严重度终止
ROUTINE check_err
BEGIN
IF (status <> 0) THEN
POST_ERR(status,'',0,2)
ENDIF
END check_err
--ROUTINE: SM_CONNEC
--功能: 连接Socket
--参数:tag:STRING - 传入标号
ROUTINE SM_CONNEC(tag:STRING)
BEGIN
WRITE TPDISPLAY('socket连接信息:',tag,CR)
MSG_DISCO(tag,status)
WRITE TPDISPLAY('CLOSE STATUS = ',status,CR)
MSG_CONNECT(tag,status)
WRITE TPDISPLAY('CONNECT STATUS = ',status,CR)
CHECK_ERR
WRITE TPDISPLAY('使用:',tag ,' 连接成功',CR)
END SM_CONNEC
--ROUTINE: SM_DISCONNEC
--功能: 断开Socket
--参数:tag:STRING - 传入标号
ROUTINE SM_DISCONNEC(tag:STRING)
BEGIN
MSG_DISCO(tag,status)
WRITE TPDISPLAY('CLOSE STATUS = ',status,CR)
CHECK_ERR
WRITE TPDISPLAY('使用:',tag ,' 断开成功',CR)
END SM_DISCONNEC
BEGIN
WRITE TPDISPLAY(CHR(128),CHR(137))
WRITE TPPROMPT(CHR(128),CHR(137))
-- 获取首位自变量,为socket连接名,如 S3,获取类型为字符串
GET_TPE_PRM(1,3 ,value_int,value_real,channel_str,status)
id = channel_str + ':'
-- 获取第二个自变量,为操作类型,1为连接0为断开
GET_TPE_PRM(2,1 ,set_type,value_real,channel_str,status)
IF (set_type = 0) THEN
SM_DISCONNEC(id)
ELSE
SM_CONNEC(id)
ENDIF
FORCE_SPMENU(TP_PANEL,SPI_TPUSER,1)
END SOCKET_SET
2:新建txt文档,复制以下send程序,将后缀改成kl格式。
-- TCP-Socket 发送数据
PROGRAM SOCKET_SEND
%COMMENT = '发送数据'
%NOPAUSESHFT --忽略SHFT
%INCLUDE klevtpe
VAR
status :INTEGER
socket_file :FILE --端口绑定文件
-- 寄存器
value_int:INTEGER
value_real : REAL
id, send_str: STRING[128] -- socket连接标号和发送的字符串
BEGIN
-- 获取首位自变量,为socket连接名,如 S3,获取类型为字符串
GET_TPE_PRM(1,3 ,value_int,value_real,id,status)
id = id + ':'
-- 获取第二个自变量,为发送的字符串
GET_TPE_PRM(2,3 ,value_int,value_real,send_str,status)
--设定文件属性
SET_FILE_ATR(socket_file,ATR_IA) --交互式
SET_FILE_ATR(socket_file,ATR_READAHD,2) --256Byte 缓存区
--文件与端口绑定
OPEN FILE socket_file('RW',id)
status = IO_STATUS(socket_file) --文件状态查看
IF (status <> 0) THEN --文件打开错误
CLOSE FILE socket_file --关闭文件
CLR_IO_STAT(socket_file) --清除文件状态
OPEN FILE socket_file('RW',id) --再次打开文件
ENDIF
WRITE socket_file(send_str) --向上位机发送
WRITE TPDISPLAY('向',id,'发送数据: ',send_str,'成功',CR)
CLOSE FILE socket_file
END SOCKET_SEND
3:新建txt文档,复制以下rece程序,将后缀改成kl格式。
-- TCP-Socket 接收数据
PROGRAM SOCKET_RECE
%COMMENT = '接收数据'
%NOPAUSESHFT --忽略SHFT
%INCLUDE klevtpe
VAR
status :INTEGER
socket_file :FILE --端口绑定文件
n_bytes :INTEGER --缓存区的字节数
rec_data:STRING[1] --逐字节读取
con_data:STRING[254] --连接收到的数据
-- 寄存器
value_int:INTEGER
value_real : REAL
id: STRING[128] -- socket连接标号和发送的字符串
--解析程序的变量定义
startbit1:INTEGER
startbit2:INTEGER
startbit3:INTEGER
startbit4:INTEGER
startbit5:INTEGER
startbit6:INTEGER
--
endbit1:INTEGER
endbit2:INTEGER
endbit3:INTEGER
endbit4:INTEGER
endbit5:INTEGER
endbit6:INTEGER
--
total_lenth:INTEGER
second_lenth:INTEGER
thirdly_lenth:INTEGER
fourthly_lenth:INTEGER
fifth_lenth:INTEGER
sixth_lenth:INTEGER
--
lenbit1:INTEGER
lenbit2:INTEGER
lenbit3:INTEGER
lenbit4:INTEGER
lenbit5:INTEGER
lenbit6:INTEGER
--
tmp_str:STRING[254]
tmp_str2:STRING[254]
tmp_str3:STRING[254]
tmp_str4:STRING[254]
tmp_str5:STRING[254]
tmp_str6:STRING[254]
--
x_str:STRING[254]
y_str:STRING[254]
z_str:STRING[254]
w_str:STRING[254]
p_str:STRING[254]
r_str:STRING[254]
--
x_int:REAL
y_int:REAL
z_int:REAL
w_int:REAL
p_int:REAL
r_int:REAL
--
pos1:XYZWPR
BEGIN
-- 获取首位自变量,为socket连接名,如 S3,获取类型为字符串
GET_TPE_PRM(1,3 ,value_int,value_real,id,status)
id = id + ':'
--设定文件属性
SET_FILE_ATR(socket_file,ATR_IA) --交互式
SET_FILE_ATR(socket_file,ATR_READAHD,2) --256Byte 缓存区
--文件与端口绑定
OPEN FILE socket_file('RW',id)
status = IO_STATUS(socket_file) --文件状态查看
IF (status <> 0) THEN --文件打开错误
CLOSE FILE socket_file --关闭文件
CLR_IO_STAT(socket_file) --清除文件状态
OPEN FILE socket_file('RW',id) --再次打开文件
ENDIF
WRITE TPDISPLAY('wait message ...: ',CR)
LABEL_1::
BYTES_AHEAD(socket_file,n_bytes,status)
--WRITE my_file('bytes: ',n_bytes,CR)
IF (UNINIT(n_bytes)=FALSE) THEN
IF (n_bytes > 0)AND (status = 0) THEN
rec_data =''
con_data =''
REPEAT
READ socket_file(rec_data::1) --读取单个字符
n_bytes = n_bytes - 1 --字节数减一
con_data = con_data + rec_data --连接
UNTIL (n_bytes = 0) --读取完毕
FORCE_SPMENU(TP_PANEL,SPI_TPUSER,1)
--SET_STR_REG(1,con_data,status)
WRITE TPDISPLAY('收到数据: ',con_data,CR)
GOTO LABEL_2
ENDIF
ENDIF
DELAY 100
GOTO LABEL_1
LABEL_2::
CLOSE FILE socket_file --关闭文件
--解析程序
tmp_str=con_data
startbit1=1
total_lenth=STR_LEN(tmp_str)
endbit1=INDEX(tmp_str,',')
lenbit1=endbit1-startbit1
--WRITE TPDISPLAY(tmp_str,CR)
startbit2=endbit1+1
second_lenth=total_lenth-endbit1
tmp_str2=SUB_STR(tmp_str,startbit2,second_lenth)
endbit2=INDEX(tmp_str2,',')+endbit1
lenbit2=endbit2-startbit2
--WRITE TPDISPLAY(tmp_str2,CR)
startbit3=endbit2+1
thirdly_lenth=total_lenth-endbit2
tmp_str3=SUB_STR(tmp_str,startbit3,thirdly_lenth)
endbit3=INDEX(tmp_str3,',')+endbit2
lenbit3=endbit3-startbit3
--WRITE TPDISPLAY(tmp_str3,CR)
startbit4=endbit3+1
fourthly_lenth=total_lenth-endbit3
tmp_str4=SUB_STR(tmp_str,startbit4,fourthly_lenth)
endbit4=INDEX(tmp_str4,',')+endbit3
lenbit4=endbit4-startbit4
--WRITE TPDISPLAY(tmp_str4,CR)
startbit5=endbit4+1
fifth_lenth=total_lenth-endbit4
tmp_str5=SUB_STR(tmp_str,startbit5,fifth_lenth)
endbit5=INDEX(tmp_str5,',')+endbit4
lenbit5=endbit5-startbit5
--WRITE TPDISPLAY(tmp_str5,CR)
startbit6=endbit5+1
sixth_lenth=total_lenth-endbit5
tmp_str6=SUB_STR(tmp_str,startbit6,sixth_lenth)
endbit6=INDEX(tmp_str6,',')+endbit5
lenbit6=endbit6-startbit6
--WRITE TPDISPLAY(tmp_str6,CR)
--提取6组数据的字符串
x_str=SUB_STR(tmp_str,startbit1,lenbit1)
y_str=SUB_STR(tmp_str,startbit2,lenbit2)
z_str=SUB_STR(tmp_str,startbit3,lenbit3)
w_str=SUB_STR(tmp_str,startbit4,lenbit4)
p_str=SUB_STR(tmp_str,startbit5,lenbit5)
r_str=SUB_STR(tmp_str,startbit6,lenbit6)
--将数据的字符串转换成REAL格式
CNV_STR_REAL(x_str,x_int)
CNV_STR_REAL(y_str,y_int)
CNV_STR_REAL(z_str,z_int)
CNV_STR_REAL(w_str,w_int)
CNV_STR_REAL(p_str,p_int)
CNV_STR_REAL(r_str,r_int)
--将数据写到PR1位置寄存器
pos1=CURPOS(0,0)
pos1.x=x_int
pos1.y=y_int
pos1.z=z_int
pos1.w=w_int
pos1.p=p_int
pos1.r=r_int
SET_POS_REG(1,pos1,status)
IF 0<>status THEN
WRITE('数据写入失败',status,CR)
ELSE
WRITE('数据写入成功',status,CR)
WRITE('PR[1]:',pos1,CR)
ENDIF
END SOCKET_RECE
三、编写TP程序,调用以上的通讯程序。
1:使用CALL调用通讯程序。

2:运行程序,并在打开通讯助手连接,一切设置正常,示教器用户界面会弹出以下消息。

3:接收信息的格式必须是(1,2,3,4,5,6,),格式不对会报错。最终存放位置的寄存器为第一个。

四、总结
机器人必须安装插件,IP和端口设置正确。KL程序需要编译成PC程序才能被机器人执行。
3479




被折叠的 条评论
为什么被折叠?



