接受超长字符串数据(2000个数据)并存入数组

[复制链接]
查看147 | 回复0 | 2024-9-25 13:51:07 | 显示全部楼层 |阅读模式
大家一起支持原创,推动机器人使用和发展

本公众号对各类ABB机器人应用,仿真,毕业设计提供技术支持,详细后台留言

本公众号诚挚希望与各机器人培训机构,机器人使用单元合作,提供技术支持,详细后台留言


1. 例如相机需要一次性发送2000个数据,数据为浮点数(发送字符串类型),使用逗号分隔,如下。以下数据若使用字符串类型,大概有17KB。对于超大数据,建议使用每4个byte表示一个单精度浮点数方式发送,机器人接受按照此方式接受并解析,可以大大减小数据规模。

-1.98,-2.98,-3.98,-4.98,-5.98,-6.98,-7.98,-8.98,-9.98,-10.98,...-1996.98,-1997.98,-1998.98,-1999.98,-2000.98

2. 机器人可以一次性接受大量数据并存入内置buffer内。使用socketReceive指令时,每次最多从buffer提取1024字节。

可以使用SocketPeek函数获取buffer中未提取数据的大小

 PERS num a200{2000}:=[-1.98,-2.98,-3.98,-4.98,-5.98,-6.98,-7.98,-8.98,-9.98,-10.98,                        -11.98,-12.98,-13.98,-14.98,-15.98,-16.98,-17.98,-18.98,-19.98,-20.98,                        -21.98,-22.98,-23.98,-24.98,-25.98,-26.98,-27.98,-28.98,-29.98,-30.98,                        -31.98,-32.98,-33.98,-34.98,-35.98,-36.98,-37.98,-38.98,-39.98,-40.98,                        ...                        -1991.98,-1992.98,-1993.98,-1994.98,-1995.98,-1996.98,-1997.98,-1998.98,-1999.98,-2000.98];                         VAR rawbytes raw{100}; 
PROC recvBig3() CONST string sep:=","; VAR num RawDataCount:=1;    !rawbytes array count VAR string str1; VAR string str_result;    VAR bool flag1; VAR num count:=1;
rConnect; ! put all receive data into rawbytes SocketReceive sock1\RawData:=raw{RawDataCount}; WHILE SocketPeek(sock1)>0 DO RawDataCount:=RawDataCount+1; SocketReceive sock1\RawData:=raw{RawDataCount}; ENDWHILE
str_result:=""; count:=1;
FOR i FROM 1 TO RawDataCount DO FOR j FROM 1 TO RawBytesLen(raw{i}) DO UnpackRawBytes raw{i},j,str1\ASCII:=1; IF str1=sep THEN flag1:=StrToVal(str_result,a200{count}); incr count; str_result:=""; str1:=""; ENDIF str_result:=str_result+str1;        ENDFOR ENDFOR flag1:=StrToVal(str_result,a200{count}); TPWrite ""\Num:=RawDataCount;    ! 提示获取到多少字节数据ENDPROC
PROC rConnect() ! 如果和相机的socket没有连上, IF SocketGetStatus(sock1)<>SOCKET_CONNECTED THEN SocketClose sock1; SocketCreate sock1; SocketConnect sock1,CamIP,CamPort; ! IP和端口在最上方的变量CamIP和CamPort设置 ENDIFENDPROC

3. 如果服务器按照每4个字节发送一个单精度数,机器人可以按照以下代码解析

VAR num a199{2000};pers num a200{2000}; PROC recvBig4()    VAR num RawDataCount:=1;    !rawbytes array count     VAR num count:=1;    ! put all receive data into rawbytes    SocketReceive sock1\RawData:=raw{RawDataCount};    WHILE SocketPeek(sock1)>0 DO        RawDataCount:=RawDataCount+1;        SocketReceive sock1\RawData:=raw{RawDataCount};    ENDWHILE
count:=1;
FOR i FROM 1 TO RawDataCount DO FOR j FROM 1 TO RawBytesLen(raw{i}) step 4 DO UnpackRawBytes raw{i}\Network,j,a199{count}\Float4;            ! 如果服务器采用大端法,此处使用\Network参数            ! 如果服务器采用小端法,此处代码如下:            ! UnpackRawBytes raw{i},j,a199{count}\Float4; incr count; ENDFOR ENDFOR
FOR i FROM 1 TO 2000 DO a200{i}:=a199{i}; ENDFOR
TPWrite ""\Num:=RawDataCount;ENDPROC

服务器发送4字节浮点数python测试代码:

import socket  import struct    # 设置服务器地址和端口  HOST = 'localhost'  PORT = 4999    # 创建TCP套接字 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:      s.bind((HOST, PORT))      s.listen()      print(f'Server is listening on {HOST}:{PORT}')        # 等待客户端连接      conn, addr = s.accept()      conn.settimeout(120)    with conn:          print(f'Connected by {addr}')            # 假设这是我们要发送的数组          data_array = []        for i in range(1,2001):            data_array.append(i*(-1)-0.9)                for num in data_array:              # 使用'f'格式(小端表示浮点数)将浮点数打包为4字节的二进制字符串              # packed_data = struct.pack('f', num)              # 使用'>f'格式(大端表示浮点数)将浮点数打包为4字节的二进制字符串              packed_data = struct.pack('>f', num)              # 发送打包后的数据              conn.sendall(packed_data)            print('Data sent successfully')        conn.recv(1000)


********************************

如何获取更多经典文章?

关注公众号 ABB机器人实战技巧,点击页面底部的往期经典配置,查看更多经典内容 


点击阅读原文,学习robotstudio仿真,获取完整教学视频

更多内容

★ 如何搜索历史文章

基于pcsdk传输文件到HOME及加载

通过总线发送实数及负整数

★使用定时中断向PLC发送机器人位置

★信号的准确提早触发

★变位机校准

★ABB机器人零位校准的那些秘密

★创建UDP通讯

★旋转姿态的左乘与右乘

通过socket控制机器人启停

上位机仪表盘实时显示机器人速度

机器人画哆啦A梦

上位机实时控制机器人运动之EGM

Python控制ABB机器人运动

通过Excel批量修改EIO文件

带连杆的机器人正运动学计算

制作四连杆机构

机器人PROFINET同时做CONTROLLER和DEVICE

语音控制ABB机器人

★手机访问web控制机器人

★自定义伺服焊枪

★制作输送链抓取搬运码垛工作站

★随机物料产生与抓取

四轴机器人定义TCP

★自定义外部轴-变位机

示教四点完成码垛

★multimove之双机器人与变位机

Robotware6.08碰撞预测启用与关闭

SMB板针脚解释

四六关节耦合限制

求两点间距离

新I/O DSQC1030配置

ABB机器人配置伺服焊枪

转角路径故障不提示设置

外部PLC选择机器人程序

一键回HOME程序

机器人各轴上下限位修改

Wobjdata数据解释

输送链跟踪与视觉的联系

急停与自动停止接线


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则