多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

西门子S7-1200与FANUC机器人Profinet通讯配置与联调实战

西门子S7-1200与FANUC机器人Profinet通讯配置与联调实战 做自动化集成这么多年西门子S7-1200和FANUC机器人之间走Profinet通讯几乎是我接手最多的组合。一个抓取工位、一条上下料线、一台码垛机全都是这个套路PLC管逻辑和顺序机器人管轨迹和工艺两者通过Profinet交换启动、停止、程序编号、运行状态这几个信号。但就是这套“开胃菜”我见过太多项目在联调阶段卡住。卡点往往不是协议本身多高深而是三个字不一致。设备名称不一致、IO长度不一致、映射方向不一致。任何一处没对上TIA Portal里设备状态显示在线PLC程序里却一个有用的位都读不到。这篇文章把调试过程中反复验证过的配置流程整理出来按实际操作顺序来写FANUC机器人侧怎么配、TIA Portal侧怎么组态、联调时怎么快速定位问题最后再扩展一个几乎每个项目都会碰到的需求——用C#上位机直连S7-1200拿设备状态做追溯。无论你是第一次接触Profinet的电气工程师还是已经调试过几个项目的机器人工程师这篇文章里每一节都能直接落地没有虚的。1. 为什么“PLC指挥机器人”看着简单却总在联调时翻车1.1 通讯到底要传哪些数据把需求拆到“位”和“字”接触这个组合之前先把通讯内容想清楚。S7-1200和FANUC机器人之间的Profinet通讯最终传递的只有两类数据位和字。位就是启动、暂停、复位、运行中、故障这种布尔量字就是程序号、速度倍率这种整数。项目做得再大通讯内容不外乎这些。我习惯把整个链路分成三层理解。第一层是物理层S7-1200本体X1口就是Profinet IO接口FANUC机器人需要开通Profinet选件功能两边用网线直连或者通过工业交换机汇到一个网络里。第二层是组态层S7-1200在TIA Portal中把FANUC机器人识别为一个Profinet IO设备分配设备名称和IO地址FANUC机器人把自己配置成Profinet设备设置设备名称、IP地址、IO数据区长度。第三层是应用层PLC把控制字写到Q区机器人从自己的输入区读到机器人把状态字写到自己的输出区PLC从I区读到。大多数翻车都发生在第二层的“不一致”和第三层的“映射反了”。不是协议难是细节多。1.2 动手之前必须确认的三个前提做Profinet通讯最怕一上来就开TIA Portal拖设备。我到现场的头十分钟永远是核对三件事这件事做完能省掉一整天瞎折腾。第一FANUC机器人有没有激活Profinet选件。这不是插个普通网口就能干活的必须在系统软件里开通Profinet功能。没开通的话教示器菜单里根本找不到Profinet配置入口TIA那边就算装了GSDML、分配了设备名称也搜不到设备。第二S7-1200的型号和固件版本。基本所有S7-1200都能当Profinet IO控制器但固件版本会影响组态里的功能选项比如对GSDML文件的兼容性。我自己习惯选1214C或1215C固件V4.x以上项目里最常见功能也最稳。第三IP网段。Profinet通讯虽然以设备名称为主但设备IP必须和PLC同网段否则在线的搜索工具根本找不到它。比如PLC是192.168.0.1FANUC机器人就必须是192.168.0.x。不要想着跨网段Profinet地址分配里虽然能做但现场排障成本会翻倍没必要。这三个前提任何一条不满足后面的组态全部白搭。1.3 设备名称和IP地址Profinet的“两把钥匙”很多人第一次配Profinet都会被“设备名称”这个概念卡住。IP地址大家熟但Profinet IO通讯是靠设备名称Device Name来寻址的IP地址更像是运行时由控制器分配的一个参数。你在TIA Portal里配好FANUC设备的名称再通过“分配设备名称”这个动作把这个名字写进FANUC设备的接口里。机器人侧配置里的设备名称必须和这个名字完全一致——注意是完全一致一个字母都不能差。这里还有一个容易被忽略的规则Profinet设备名称的命名规范要求用小写字母、数字和连字符不建议用大写字母、下划线、空格和中文字符。名字也不要太长最好一眼能看出是哪个工位、哪个机器人。我在项目里的命名风格是这样的pn-line1-robot01、fanuc-cell3。短、清晰、不出边界。设备和IP这两把钥匙缺一把或者两把不匹配TIA Portal网络视图里的连接线就会一直是虚线设备状态显示离线通讯完全建立不起来。2. FANUC机器人侧选件确认、PNET配置与UI/UO映射2.1 怎么确认控制柜带没带Profinet选件在FANUC机器人上启用Profinet第一步是确认选件。这里说的不是看包装箱而是看系统软件。以常见的老一代R-30iB或者R-30iB Plus控制柜为例在教示器上按MENU → SYSTEM → Config界面里会列出当前系统的很多配置项。找“Profinet”或“PNET”相关的条目如果能看到并且状态是已启用说明这个功能包已经开通。如果压根没有这一项或者状态显示未安装那就别急着继续配置先去跟商务确认这台机器人当初有没有订Profinet选件。硬件上有这个选件往往会配一块Profinet接口板板上有一个单独的以太网口。部分新机型使用了内置Profinet接口的型号外观上不一定一眼能分辨。所以最靠谱的方法还是看Config菜单别只看外观。这里多说一句采购阶段的经验合同清单里一定要写明“Profinet通讯选件”机器人到货后第一时间在Config里确认。我遇到过到货半年后才调试才发现当初没订这个功能包临时加装耽误了两个月货期的项目。这个教训不算技术但比任何技术都值得记住。2.2 PNET配置菜单设备名称、IP地址、IO数据区长度确认选件没问题后在FANUC教示器上进入Profinet配置界面。不同系统版本的菜单位置略有差别一般在MENU → SYSTEM → Profinet或者MENU → IO → Profinet下面。我的经验是老版本的R-30iB放在System里新版本可能挪到了IO菜单找不到就两个地方都翻一下。打开配置界面后核心设置就四项和绝大多数现场总线一样设备名称Station Name / Device Name填之前定好的名称比如fanuc-line1小写、无中文、无空格。IP地址和子网掩码和S7-1200同网段比如192.168.0.10/255.255.255.0具体值按项目规划表来。IO区大小按实际点位数来定。16字节输入加16字节输出对绝大多数项目够用。不要开太大数据区越大刷新周期和排障复杂度都跟着涨。IO刷新周期默认值就可以不需要为了追求实时性去调IRT硬实时。S7-1200上做IRT本身也麻烦普通Profinet RT足够满足现场要求。这里要特别强调一个方向问题。机器人侧显示“输入”指的是机器人从网络上收到的数据也就是PLC发送过来的数据机器人侧显示“输出”指的是机器人发送到网络上的数据也就是PLC那边要接收的数据。很多现场信号对不上就是把这两个方向搞反了。我习惯做配置表时统一用箭头标明方向不写“输入”“输出”这种容易产生歧义的词。2.3 把UI/UO信号挂到Profinet数据区Profinet数据区建好之后机器人还不知道哪一个位对应哪一个逻辑信号。接下来这个动作是把机器人最常用的远程IO信号——UOP信号——映射到Profinet数据区上。在FANUC机器人里UOP信号是远程控制的标准配置一共16个输入、16个输出含义固定。UI是输入机器人的信号代表PLC发过来的命令UO是机器人输出的信号代表机器人回报的状态。我把最常用的一组列成对照表位号UI机器人收到的控制命令UO机器人回报的状态1遥控启动遥控启动确认2暂停保持中3停止停止状态4复位/清除复位完成5~12程序号选择二进制程序号确认13自动启动自动模式14循环模式选择循环模式状态15刀具切换请求在线状态16程序测试故障映射的方法一般在FANUC的Profinet配置菜单里会有一个信号映射或IO Assign页面把Profinet输入缓冲区和输出缓冲区的某一位分别和UI/UO对应起来。最省事的方案是把整个第一个字全部映射给UI[1]到UI[16]再拿第二个字映射UO[1]到UO[16]。如果项目还需要自定义DI/DO信号比如夹爪到位、工件检测就再往后扩展用后续的字节。把这个映射表写清楚同步给做PLC的同事是联调成功的一半。我见过很多项目出问题根源就是机器人工程师和电气工程师各做各的映射两边表格对不上。2.4 R-30iB/R-30iB Plus上容易踩的三个坑第一个坑是配置改了不生效。Profinet相关配置很多是启动时才加载的改完之后必须重启机器人控制器或者至少做一次冷启动。如果你改完IO区大小和映射发现PLC那边看到的还是旧长度、旧数据第一反应就应该是重启不要怀疑设备坏了。第二个坑是和其他现场总线选件冲突。一台机器人如果同时配了DeviceNet、EtherNet/IP和ProfinetIO地址空间会被不同协议瓜分。新增Profinet映射后有时候会提示地址冲突或者覆盖需要去IO配置页面调整各协议的IO地址范围。这个坑在老R-30iB上尤其明显新固件好一些但也要检查一遍。第三个坑是设备名称命名不规范。前面说了Profinet设备名称只接受小写字母、数字和连字符大写字母、下划线、空格都可能让周边搜索找不到设备。现场如果搜不到设备先把设备名称改成规范的短名再试这一步能解决不少“诡异”的离线问题。3. 西门子TIA Portal侧GSDML、组态与地址分配3.1 GSDML文件就是给TIA的“设备说明书”顺序理清楚之后回到PLC这一侧。你如果不给TIA Portal装FANUC的GSDML文件它就不知道FANUC机器人是个什么样的IO设备、支持多长的数据区。GSDML是XML格式的设备描述文件里面写清楚了设备名称、厂商ID、支持的模块、诊断参数等相当于一张设备名片。文件从哪来最靠谱的渠道是机器人出厂时附带的光盘或者U盘也可以上FANUC技术支持渠道下载注意找对应控制器型号和Profinet选件版本的GSDML文件。不同控制器版本对应的GSDML可能不同别拿一台老设备的GSDML去配新设备有时候能用但遇到怪问题就不好排查了。在TIA Portal里安装GSDML的路径是菜单栏“选项”→“管理GSD文件”。弹窗左上角选择GSDML文件所在目录软件会列出所有识别的GSDML文件勾选要装的那个点击安装即可。装完之后右侧硬件目录里刷新一下就能看到FANUC设备了通常归类在“其他现场设备”→“PROFINET IO”→“机器人”下面。提示装GSDML之前确保TIA Portal处于离线状态。如果你的TIA版本较旧注意GSDML文件对版本有最低要求。一般V15以上处理R-30iB Plus的GSDML文件基本没障碍。3.2 添加FANUC设备、建立Profinet连接打开TIA Portal先添加S7-1200 CPU。切到网络视图从硬件目录里把FANUC机器人拖到空白区域。然后按住鼠标从S7-1200的PROFINET接口拖到FANUC设备的PROFINET接口上松开鼠标TIA会自动画出一条连接线并且在左下角生成一个Profinet IO系统。接下来在FANUC设备属性里找到“PROFINET接口”下面的“以太网地址”页。这里要做两件事一是设置设备名称。可以勾选“自动生成PROFINET设备名称”也可以手动输入。这里输入的名称必须和FANUC机器人侧配置的站名完全一致比如fanuc-line1。如果你不填或者填错后面分配名称一定出问题。二是设置IP地址。可以选择“在IO系统中设置该IO设备的IP地址”即运行时由PLC自动给机器人分配IP也可以手动指定一个和PLC同网段的固定IP。因为FANUC机器人侧已经手写了IP我建议在TIA这边也固定填同一个IP两边都明确排查故障时少一层悬念。网络连接建立后在网络视图里选中FANUC设备执行“分配设备名称”操作。这个动作在菜单栏“在线”里或者右键设备也能看到。点击后会弹出窗口选择你写的设备名称点分配TIA就会通过DCP协议把名称写进FANUC设备的Profinet接口里。这一步执行的前提是调试电脑的网卡已经连到PLC和机器人所在的同一网段并且临时设置成同网段IP。分配成功后设备状态从“未分配”变成“已分配”通讯链路就算打通了一半。3.3 IO地址分配PLC的I区和Q区机器人的数据缓冲区设备添加并连接后在FANUC设备的设备视图里能看到设备下面挂着一些槽位和子模块每个槽对应一段数据区。把数据区映射到PLC地址范围就在这一步完成。以16字节输入加16字节输出为例输入区机器人发送给PLC分配地址I 64开始输出区PLC发送给机器人分配地址Q 64开始。I/Q地址可以自己定义但要注意不能和PLC程序里已用的地址重叠。分配完成后对应关系就是机器人侧Profinet输出缓冲区的第1到第16字节 → PLC的QW64Q64.0到Q79.7机器人侧Profinet输入缓冲区的第1到第16字节 → PLC的IW64I64.0到I79.7回看前面FANUC侧的映射方案PLC这边QW64的第0位就是遥控启动第1位是暂停第2位是停止第3位是复位IW64的第0位是遥控启动确认第5位是自动模式第6位是运行中第7位是故障。一张表对下来PLC程序里直接按位操作完全不用关心Profinet内部发生了什么。3.4 PLC程序里的握手逻辑怎么组织配置搭好路真正干活靠程序。PLC侧的程序逻辑我个人建议不要在OB1里到处散着Q位操作而是先建一个“机器人控制”DB把所有控制字和状态字按位拆好程序逻辑只读写这个DB最后再统一做一次数据搬运。为什么要绕这一下因为现场PLC程序后期一定会改。你今天直接在QW64.0上写启动明天同事加暂停逻辑可能就把QW64.1和QW64.0搞混。用DB集中管理哪怕后面把这个控制字拖到触摸屏、拖到上位机都方便得多。用SCL写一段启停控制逻辑示意如下// 机器人控制DBRobotDB // RobotDB.CtlStart : Bool; // 启动 // RobotDB.CtlHold : Bool; // 暂停 // RobotDB.CtlStop : Bool; // 停止 // RobotDB.CtlReset : Bool; // 复位 // RobotDB.CtlProgNo : Int; // 程序号 // 组帧 QW64.%X0 : RobotDB.CtlStart; QW64.%X1 : RobotDB.CtlHold; QW64.%X2 : RobotDB.CtlStop; QW64.%X3 : RobotDB.CtlReset; QW64.%X4 : RobotDB.CtlProgNo.0;读状态方向同理把IW64读回来写进DBHMI和上位机直接访问DB变量。这样的好处是联调时在监控表里看QW64还是看RobotDB效果是一样的但程序结构清爽太多后期维护的人看着也舒服。4. 联调排障从设备离线到IO全0的一线排查思路4.1 联调前先把这张核对清单过一遍Profinet联调不能靠瞎试。我每次到现场做联调先把下面这张清单过一遍不到十分钟能避开八成以上的“假故障”。机器人Profinet选件是否激活改完配置后有没有重启。FANUC设备名称和TIA里分配的设备名称是否完全一致是否全部小写、无下划线。IP地址是否同网段调试电脑、PLC、机器人三者都要有同网段IP。IO数据区长度是否一致。FANUC侧配输入输出各16字节TIA侧也要对应配16字节多一截少一截都会导致数据错位。PLC的I/Q地址区间和程序里有没有重叠。网线口是不是插对了。Profinet口要用机器人选件板上的网口别插到普通以太网口上。4.2 常见故障现象与对应的排查路径下面整理几个我在现场真实碰到过的故障现象和处理思路遇到可以直接按顺序查。现象一TIA“可访问设备”搜不到FANUC设备。先确认电脑网卡IP是否设成了同网段比如192.168.0.100。再看网线有没有插好网口指示灯亮不亮。然后确认FANUC机器人的Profinet功能是否真的启用设备名称是否已经配置。如果以上全没问题还是搜不到把电脑杀毒软件或防火墙临时关掉某些防火墙会拦掉DCP广播包导致搜索工具“看不见”设备。现象二TIA里设备已经在线但PLC读到的状态全是0或者写出去的信号机器人没反应。这是典型的“配置通了映射不对”。先确认IO地址对应关系对不对再确认映射方向有没有搞反。很多人在这里栽跟头把PLC的Q区写到了机器人认为的“输出”上于是机器人的状态寄存器里什么都没有。排查手段很直接在TIA监控表里强制一个Q地址为1比如Q64.0置1然后去教示器上看对应的UI[1]有没有亮。没亮说明Profinet数据是通的但UI映射没对亮了说明整条链路没问题问题在PLC程序逻辑。现象三通讯断断续续运行中偶尔掉线复位后又能恢复。这类问题多半不是配置问题而是物理链路问题。常见原因有网线质量差现场电磁干扰大Profinet对网线的屏蔽要求比较高建议用带屏蔽层的工业级超五类或六类网线RJ45头压接不牢给Profinet设备供电的24V电源电压跌落或者现场大功率设备启停时电压波动。如果物理环节都干净还偶尔掉线检查一下是不是用了不支持Profinet的民用交换机或者交换机端口被强制成了半双工、百兆模式。Profinet RT默认跑百兆全双工交换机端口模式和速率要匹配。4.3 用“分配设备名称”这个动作做最小验证分享一个我反复在用的最小验证方法它能快速把问题范围拉小。在TIA Portal网络视图里选中FANUC设备点击“在线”→“分配设备名称”。如果这一步能成功分配说明下面的条件同时成立电脑到FANUC设备的网络物理链路通、FANUC设备Profinet接口工作正常、设备名称规范没问题、IP网段一致。分配成功之后后续就算有问题也只会出现在组态或程序层面和物理层无关。如果分配不成功就把精力放在物理链路和设备名称上不要在PLC程序上浪费时间。这个技巧特别适合那种“PLC程序没问题机器人配置没问题但设备就是离线”的场景。它把“通讯通没通”和“程序对不对”两个问题彻底分开别让两边的工程师互相甩锅先花一分钟做一个明确的物理层验证比开两小时会都有用。5. 数据再利用C#直连S7-1200做追溯的落地写法5.1 为什么要把数据从这套系统里“取出来”Profinet通讯本身把信号交换通了项目主体就算完成。但实际产线往往不止于逻辑控制车间要和MES对接设备状态要进数据库做OEE统计产品追溯要记录每台工件对应的机器人程序号和时间戳。这些数据在PLC里全都有总不能靠人盯着屏幕抄数吧于是C#上位机直连S7-1200就成了很常见的扩展需求。有人会问为什么不直接从FANUC机器人那边抓数据也可以机器人有自己的SDK和以太网接口但集成商通常还是统一从PLC取。因为PLC已经通过Profinet汇总了机器人状态C#程序只对接PLC一个设备既拿得到PLC自身的逻辑状态也拿得到机器人工作状态链路简单数据也集中。5.2 库选型与让PLC“放行”PUT/GETC#连S7-1200常用两个库S7netplus和Sharp7。S7netplus的API更贴近C#的习惯写起来舒服Sharp7更快、底层、资料多适合做高频轮询。我自己用Sharp7多一些它的读取速度很理想而且社区里例子多遇到问题好查。不管用哪个库都有个前提S7-1200必须允许来自上位机的PUT/GET通讯。在TIA Portal的PLC属性里有一个“防护与安全”或者“连接机制”页面勾选“允许来自远程伙伴的PUT/GET访问”设置完重新下载硬件组态才生效。如果这个没开C#程序连上几秒钟就会被断开或者干脆连不上。另外S7-1200的DB块默认是“优化的块访问”这种DB没有固定字节偏移外部程序很难直接读写。要在DB属性里把“优化的块访问”关掉或者干脆把关键数据放到一个“标准DB”里C#那边才能按地址读取。这个细节不起眼但它卡住了太多想用C#对接S7-1200的人。5.3 Sharp7基础读写示例假设S7-1200的IP是192.168.0.1PLC里有一个标准的DB块叫RobotDBDBW0是状态字通过Profinet拿到的IW64内容DBW2是控制字对应QW64内容。用Sharp7读取的代码思路如下using Sharp7; S7Client client new S7Client(); int result client.ConnectTo(192.168.0.1, 0, 1); if (result ! 0) { Console.WriteLine(连接失败错误码: client.LastError); return; } byte[] statusBuffer new byte[2]; // 读取状态字 result client.ReadArea(S7Area.DB, 1, 0, 2, S7WordLen.Byte, statusBuffer); if (result 0) { ushort statusWord (ushort)(statusBuffer[1] 8 | statusBuffer[0]); bool running (statusWord 0x0020) ! 0; // 对应UO[6]运行中 bool autoMode (statusWord 0x0010) ! 0; // 对应UO[5]自动模式 } client.Disconnect();写控制字的方法类似把ReadArea换成WriteArea将要写的字节数组放到缓冲区里。有一点需要注意S7-1200的数据字节序在不同固件下可能略有差异Sharp7读出来的字节数组拼成ushort时要注意高低字节顺序。调试时用PLC监控表里已知的值和C#读出来的值对比一下马上就能判断出字节序对不对。5.4 轮询频率要克制数据一致性要想清楚C#上位机轮询S7-1200切忌用一个不设防的死循环去高频读。PLC到上位机的链路通常没压力但上位机程序如果每次轮询都写数据库很快就可能变成瓶颈。建议轮询周期设在100毫秒到500毫秒之间数据有变化时才落库对CPU、网卡、数据库都友好。还有一个容易忽略的问题Profinet通讯本身已有刷新周期C#这边轮询读到的是PLC缓存里的最新值你不需要也没办法做到机器人信号和C#显示100%同步。只要保证在业务需求的时间粒度内比如500毫秒内数据一致就够了。这是工业数据采集的通识也是做追溯系统时和业务方沟通需求时最常见的分歧点。最后关于这套配置我的个人体会是Profinet通讯在技术层面不复杂但特别讲究“规矩”。GSDML找对版本设备名称严格按规范命名IO映射表两边统一联调前花十分钟过一遍核对清单——做到这几点90%的通讯问题根本不会出现。要是真遇到对不上的情况就用“分配设备名称”做最小验证先把物理层问题排除干净再回头查组态。这套思路不管是西门子1200配FANUC还是以后遇到其他品牌、其他机型逻辑都是一样的。
返回列表