ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ABB机器人Profinet浮点数传输:从信号配置到RAPID转换实战

ABB机器人Profinet浮点数传输:从信号配置到RAPID转换实战 不用多想产线上这类需求其实特别常见。做ABB机器人集成的人早晚会遇到这么一档子事PLC那边有一堆温度、压力、流量、力矩或者视觉系统给的坐标值想直接发给你机器人用你一看哎Profinet通了Bool和Int都读得挺正常结果PLC工程师丢过来一个32位浮点数你直接懵了——信号里全是乱码一样的大数或者干脆是分裂成两个没法拼回去的整数。我之前接过一个汽车零部件项目机器人要按视觉系统输出的X、Y坐标和角度去抓件PLC做中转视觉数据是三个32位浮点数。当时就是踩了一串字节序、字序、设备名的坑最后才把一个完全可靠、可复现的浮点数自动流程给捋顺了。这篇就把整个思路和现场操作整理出来从ABB侧信号怎么建、RAPID程序怎么写到西门子PLC侧怎么对接、怎么拆包再到出问题时怎么查一次性讲清楚。先说一下这篇文章适合谁。你如果是刚接触ABB机器人Profinet通讯的调试工程师或者被PLC同事要求“传个实数过来”但不知道怎么下手的这篇文章可以直接按顺序抄作业。你如果是有经验的集成商主要看第3节和第5节就行字节序处理和问题排查那部分能帮你省不少现场时间。1. ABB机器人Profinet浮点数传输的整体设计拆解1.1 为什么浮点传输是个“真需求”很多人觉得Profinet传数据不就是读写几个Word嘛但实际上工业过程量绝大多数都是实数。你想想温度25.6摄氏度、速度1.35米每秒、视觉坐标x123.456毫米这些都带小数。PLC和机器人交换这类数据如果只用整数传输分辨率根本不够你得放大十倍、百倍再缩回来还容易溢出出BUG。用32位IEEE 754浮点数才是标准做法。它一个数占4个字节、两个Word能表达很大的数值范围同时保持7位有效数字精度。对机器人场景来说坐标、角度、速度、力这些量用浮点数传输是最合理的。但问题也跟着来了Profinet在ABB机器人这一侧默认的IO信号最小单位是按位Bit和按字Word处理的。你按16位去读永远只能读到半个浮点数。哪怕有些高级控制器支持32位组信号你直接把读出来的整数值拎出来用它也只是一个整数位模式不是真实的浮点数值需要程序再转换一次。1.2 通信方案选型别一上来就选最复杂的说一句我很主观但很实在的经验在现场做ABB机器人和PLC的Profinet通讯能简单就别复杂。浮点传输的根本方案就两种一种是把机器人当Profinet从站挂在PLC下面另一种是机器人做主站去读PLC的数据。绝大多数项目用的是第一种也就是PLC作为IO控制器ABB机器人作为IO Device。方案选型时你需要考虑三个层面。第一是硬件层面IRC5控制器时代通常用DSQC688板卡这是Profinet从站接口板OmniCore控制器则把Profinet从站做进了主计算机不需要额外板卡直接在系统选项里启用就行。第二是组态层面必须在RobotStudio中配置好Profinet设备再把信号映射到IO系统。第三是程序层面RAPID程序负责把收到的原始整型数据转换成浮点数或者把浮点数拆成整型数据发出去。还有一种情况是PLC侧不想动或者机器人需要主动去读PLC里的数据块那会用到机器人做IO Controller去连接PLC从站。但这种情况配置复杂度明显上升一般真没必要。我的建议是能作为从站就尽量做从站把设备名、IP、信号映射三个东西配齐后面所有问题基本都集中在数据转换上排查面小得多。2. 实操准备ABB机器人侧IO配置与信号映射2.1 硬件前提和系统选项动手配Profinet之前先确认控制器支持什么。如果是IRC5控制器最常见的是DSQC688板它自带两个RJ45口其中一个标注为Profinet插这个口。安装位置一般在控制柜右侧或者主板扩展槽里具体Sequence号在RobotStudio里能看到。如果是OmniCore系统选项里勾选“PROFINET IO Engine”相关选项即可。这里有个很关键的提醒控制器里必须安装Profinet相关的授权和选项否则后面在RobotStudio里根本找不到Profinet的主网参数页。我碰过几次在现场过去配置时发现根本没法添加Profinet设备最后查出来是系统选项缺少“PROFINET Device”功能只能重新安装系统或者让厂家远程把选项补上。另外要确认的是机器人系统的DeviceNet总线是否占用。DSQC688板卡在ABB内部是通过DeviceNet和主计算机通信的如果你同时挂了一圈DeviceNet执行器注意地址别冲突。我们项目的经验是DSQC688在DeviceNet上的地址单独占用一个不能跟其他DeviceNet设备撞车。2.2 在RobotStudio里配置Profinet从站设备打开RobotStudio连上控制器之后双击“控制器”标签下的“配置”图标进入配置编辑器。左侧找到“I/O System”右键点击“Industrial Network”选择“新建”类型选“Profinet”。这里要填几个东西名称Name比如“PNIO”这个名称是ABB内部的网络实例名随便起自己能看懂就行。设备名称Device Name这个最重要是Profinet总线上PLC用来识别机器人的设备名必须记准例如“ABB_ROBOT_PN”。IP地址例如192.168.0.5子网掩码等。传输速率一般是自动协商不用动。保存之后系统会提示重启控制器先别急着重启接着建信号。在刚才建好的“PNIO”网络下面右键“Signal”新建信号。ABB机器人Profinet信号类型最常用的是GroupInput、GroupOutput用来做16位或32位的数据交换。举一个标准例子假设PLC要给机器人发一个32位浮点数“目标X坐标”那就在机器人侧建一个GroupInput信号类型选GroupInput映射地址根据实际数据格式分配。这里我强烈建议用两个16位信号来拆而不是直接建32位组信号原因后面详细讲。信号配置示例信号名类型映射地址说明FROM_PLC_X_HIGroupInput0-1浮点数高16位FROM_PLC_X_LOGroupInput2-3浮点数低16位TO_PLC_POS_OKGroupOutput0-0到位标志位TO_PLC_READYGroupOutput1-1机器人就绪位TO_PLC_FORCE_HIGroupOutput2-3发给PLC的浮点高16位TO_PLC_FORCE_LOGroupOutput4-5发给PLC的浮点低16位我当时实际用的就是类似这样一套命名。为什么用HI和LO拆开你看看上面这几行就明白地址是连续的两个Word机器人侧读出来就是两个INT一个指向高位字一个指向低位字。这个模型在任何ABB控制器上都稳定而且PLC工程师那边一看就懂。2.3 建32位信号和拆16位信号到底怎么选如果你用的是新一些的RobotStudio版本里面是支持把信号类型设成32位的比如选“GroupInput”之后在下方属性里把数据长度改成32位这样就得到一个直接对应4字节连续地址的信号例如FROM_PLC_X_DINT。读出来是一个整数还得在RAPID里转。那到底拆好还是不拆好我的实际感受是如果有平台后续维护性要求拆成两个INT信号最保险无论哪一代控制器、哪一版RobotStudio行为都可预期RAPID里再用PackRawBytes、UnpackRawBytes组合逻辑一目了然。如果信号多比如一次传8个浮点数拆成16个INT信号会刷屏信号列表长到想骂人。这时候直接建32位信号更省事程序循环处理也快。但32位信号有个坑就是它返回给RAPID的值是无符号32位整数的“数值”如果最高位为1被当作负数还是大正数不同版本之间行为有差异容易让不熟悉的人云里雾里。所以我的结论是信号少于10个浮点就用两个INT多于10个建32位DINT并用程序统一转换。如果你拿不准就全拆稳。3. 核心环节RAPID里如何把32位数据变回浮点数3.1 浮点数在内存里到底是什么样子先花两分钟搞清楚浮点数格式这个搞不懂后面全白搭。32位浮点数是IEEE 754标准里的单精度它由三部分组成符号位1位指数位8位尾数位23位。比如一个32位十六进制数0x3F800000对应浮点数是1.0。你不必自己写转换公式但你要知道一点一个32位浮点数的位模式恰好就是一个32位整数的位模式。这就是为什么我们可以用整数IO信号去搬运浮点数。只要把浮点数的位模式原封不动搬运过去再在接收端把同样的位模式解释成浮点数数据就通了。坏消息是每个字节的先后顺序每个字的先后顺序在不同系统里可能不一样。PLC和机器人只要字节序、字序任何一个不一致读出来的浮点数就完全不是那个数。3.2 常见翻车现场高低字你真的放对了吗举个例子PLC侧发送1.0这个浮点数32位数据是0x3F800000。如果你在机器人侧两个INT信号的分配是低字在前、高字在后但PLC发的时候把高字放在低字的位置那机器人读出来就是0x00003F80两个字组合出来的数字大概率是一个极其小的浮点值甚至直接为0。这个极其小还是0取决于具体位模式。所以传浮点数第一个要确认的问题就是高字在哪、低字在哪。我自己的定义习惯是信号名带HI的就是高位字映射到4个字节中的前两个字节带LO的就是低位字映射到后两个字节。PLC工程师那边我要求他也按同样的逻辑去理解地址区。第二个要确认的是字节序。如果PLC把0x3F80放到第一个字但ABB信号按小端读那也可能乱。不过ABB的Profinet从站在组态时通常保持Profinet协议的Big-Endian字节序你就按高位在前理解就行真出了乱子先做交换AB测试后面排查章节我再说。3.3 RAPID标准写法读两个INT拼出REAL假设你已经建好两个GroupInput信号FROM_PLC_X_HI和FROM_PLC_X_LO。RAPID里写一个函数接收这两个信号值返回一个numFUNC num GetFloatFromPlc(signal siHi, signal siLo) VAR rawbytes rb; VAR int intHi; VAR int intLo; VAR num result; intHi : GetValue(siHi); intLo : GetValue(siLo); Clear rb; PackRawBytes intHi, rb, 1\Int; PackRawBytes intLo, rb, 3\Int; UnpackRawBytes rb, 1, result\Float; RETURN result; ENDFUNC这段代码就是所有浮点数传输的核心了。PackRawBytes把intHi按16位整数放到rawbytes第1字节开始intLo放到第3字节开始合起来正好4个字节然后UnpackRawBytes按Float解析返回num。稍微解释一下为什么不是直接用dnum或者按16位加。因为一个浮点数的两个16位字是独立的位模式它们之间不是数值上的高低位相加关系不能简单用intHi乘以65536加intLo。你要是对浮点格式熟会发现0x3F800000的“数值”很大但两个INT相加的小数部分没有任何数学意义。必须按位组合再按浮点解释。3.4 发送方向机器人把浮点数发给PLC如果机器人要把当前末端力传感器的力值发回PLC反向逻辑一样只是信号方向换成GroupOutputPROC SendNumToPlc(num value, signal siHi, signal siLo) VAR rawbytes rb; VAR int intHi; VAR int intLo; Clear rb; PackRawBytes value, rb, 1\Float; UnpackRawBytes rb, 1, intHi\Int; UnpackRawBytes rb, 3, intLo\Int; SetGO siHi, intHi; SetGO siLo, intLo; ENDPROC先用PackRawBytes把浮点数value按Float写入rawbytes再用UnpackRawBytes把第1个字节开始的2字节读成intHi第3字节开始的2字节读成intLo最后SetGO写到Profinet输出信号。这个函数我在很多项目里都塞进了公共模块叫它FCSendRealToPLC。后续只要涉及发浮点直接调用不用重复写。4. PLC对接细节与联调流程4.1 西门子PLC侧如何安装GSDML并组态ABB机器人把这台ABB机器人作为Profinet从站接入西门子S7-1200或S7-1500第一步就是安装GSDML文件。ABB官网下载的GSDML文件通常是一个XML文件有些还带图片文件夹。在博途TIA Portal里选择“选项-管理GSD文件”找到这个XML文件安装即可。注意版本匹配不同RobotStudio版本生成的GSDML描述会有差异PLC侧安装错了可能会识别不出设备或模块。装好之后在博途的设备树里按目录“其他现场设备-PROFINET IO-ABB”找到对应的机器人设备拖到网络视图连接在PLC的Profinet子网下。这时要分配设备名称必须和RobotStudio里Device Name完全一致而且区分大小写。西门子这里有个习惯设备名会全小写你如果RobotStudio里用了大写在博途里就会匹配失败报“设备名称不匹配”。组态IO模块时博途里会显示机器人侧暴露出来的输入输出区域。这个区域大小和内容跟你在RobotStudio里分配的映射地址有关因为Profinet的设备描述里包含了Slot/Subslot的配置。我建议在博途里按照机器人的实际IO长度去组一个标准的“Device”模块比如输入输出各8个字节。然后在博途里把Q地址、I地址记下来。4.2 地址规划与PLC程序里的Real处理博途侧数据传递逻辑很简单例如PLC往机器人发一个浮点数“目标X”如果博途组态里机器人从站的输出地址从QB100开始那直接MOVE 目标X TO %QD100;因为QB100开始连续4个字节为一个DWordS7-1500里允许你用%QD100访问一个双字把Real写进去PLC会自动按Profinet网络的字节序发出去。这是最省事的方式。如果因为IO地址按字对齐的原因你只能从QW100和QW102分别发两个Word那就需要先把Real变量给一个DB里的AT覆盖变量或者通过字拆分。在博途DB块里可以这么写DB_Comm RealVal : Real : 25.6; AT RealVal: WordArr : Array[0..1] of Word;这种AT覆盖的方法在S7-1200和S7-1500里都支持。WordArr[0]是低字WordArr[1]是高字。然后分别MOVE到QW100和QW102按低字和高字发出去。需要注意的是博途里这个AT覆盖变量的字节序默认跟CPU保持一致S7-1500默认大端直接拿数组元素用问题不大。4.3 联调前一定要做的静态测试我强烈建议正式跑流程之前别让机器人动先做一次静态打点测试。第一步在PLC侧写死一个已知浮点数比如1.0、-2.5、3.14159发给ABB侧然后在RobotStudio的“I/O System”信号监控里看两个INT的原始值。第二步打开机器人手动模式在示教器上运行上面那个GetFloatFromPlc函数看返回结果是不是1.0、-2.5、3.14159。第三步如果不对先把两个INT的原始值和全字模式抄下来用计算器换算一下基本上能判断出是高低字反了还是高低的字节反了。不要一上来就怀疑设备没通。第四步反向发送机器人把一个已知浮点数发PLC在PLC侧监控%QD或QW值确认PLC程序最终解析出来的一致。这一步和第一步要分开做避免两边都有问题的时候互相干扰。这套静态联调法看起来没什么技术含量但真的能让我少加两个小时的班。有一次项目里调了快一天最后发现是PLC侧程序DB里的AT覆盖数组没有设置“保持性”CPU重启后整个DB被刷掉机器人收到的是清零后的数据。这个靠查网络是查不出来的只能靠静态测试一步步定位。5. 现场高频故障与排查方法5.1 收到的浮点数看起来“离谱地大”或“离谱地小”收到像3.687e37这种压根不合理的大数或者一个极小的非零数基本都是字节序字序错位。排查思路如下先把当前收到的两个INT原始值记下来再算一下理论值。例如发了1.0期望原始位模式是0x3F800000。如果机器人侧读出的两个INT分别是0x0000和0x3F80说明高低字应该换一下。如果读出的两个INT是0x003F和0x8000那就是字内字节反了。如果读出的组合是0x8000和0x3F00之类可能是字节序和字序同时反。修复方式优先改RobotStudio侧的信号映射顺序或RAPID函数里的PackRawBytes顺序。我建议在RAPID里再写个参数比如SwapWord开关方便调试。但千万别直接在PLC侧乱调发送顺序因为PLC工程师可能还有别的设备用同一套规则改了会影响别人。5.2 博途报“IO设备故障”或“找不到设备”这类问题八成出在设备名称上。博途里组态的Profinet设备名必须和ABB机器人侧配置的Device Name完全一致包括大小写。还有一点容易漏就是博途里设备名末尾如果带了扩展名或者项目名像“abb_robot_1”中间不能用下划线开头或者结尾Profinet协议对设备名字符集有要求。最好只使用字母、数字、下划线并且以字母开头。排查方法在博途里打开在线访问看设备列表里实际存在的Profinet设备名称。再用网线直连机器人控制器的网口通过RobotStudio监控Profinet网络状态确认链路通且IP在同一网段。注意Profinet通讯本身不依赖ICMP Ping但IP配置错误会影响设备识别。5.3 偶发数据跳变或者“中间某一次数不对”偶发问题比持续性问题恶心多了。最常见的原因是PLC侧程序在写输出地址时和IO刷新不同步。比如PLC程序分两行先写了高字后写了低字中间正好被Profinet周期IO读到一次机器人就抓到半个新数、半个旧数组成一个莫名其妙的浮点数。解决这个问题有两种思路。一种是在PLC侧把高低字安排在同一个中断OB里顺序写入减少被IO刷新插入的概率另一种是加“数据有效位”机制PLC先写数据再写一个“Valid”置位信号机器人端先读Valid为1时才去读取数据并解析读完后给PLC一个“已接收”信号PLC再清零Valid。这种方法虽然多两个Bool信号但能从根本上杜绝不一致数据。尤其机器人项目里这种偶发跳变最危险因为你不知道它哪次抓取就用了异常值让人不得不重视。5.4 老排查技巧用机器人直接读PLC模拟量做混淆测试如果两边都查不出问题还可以做个交叉验证。在PLC侧建一个常量比如1000.0把它映射到发给机器人的同一组地址上同时在PLC监控程序里再加一个变量比如“MOVE 1000.0 TO %QD100”。如果机器人侧读出来的完全正常说明Profinet链路和浮点解析都没问题出问题的就只能是PLC程序里实际赋值的源变量类型或源数据了。类似地反过来在机器人侧发一个常量比如88.88PLC监控读出来不对就去查机器人侧GroupOutput地址和PLC组态里的I区地址对应关系。这套交叉验证法操作很快又不需要专门工具在实际现场非常实用。最后我再分享一个自己的习惯凡是和PLC通讯的数据都会在程序里留一个现成的“发送当前真实值”的手动触发按钮方便维护人员随时通过信号解析验证通讯链路是否正常。这样下次再遇到“数据有时候对有时候不对”的报修第一个能排除的就是通讯链路本身。
返回列表