ARTICLE DETAIL

资讯详情

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

西门子AF框架通信与驱动控制实战:从变频器到跨网段联调

西门子AF框架通信与驱动控制实战:从变频器到跨网段联调 我拿到这本西门子AF框架手册的第十三章时前后翻了不下十遍。这一章不像前面章节那样讲硬件组态或者基础逻辑而是把整条自动化线的“神经脉络”——通信与驱动控制——集中摊开来讲。无论是S7-1500做为主站还是S7-200 SMART通过RS485挂变频器又或者是MCGS触摸屏跨网段访问1500AF框架给出的都不是“单点能通就行”的野路子而是一套能复制到下一个项目、再下一个项目的标准套路。这篇文章我就以第十三章为主线把自己实际照着做、踩坑、改参数的过程全部记录下来希望能帮到正在啃框架、或者正在现场被通信问题折磨的人。1. 第十三章的内容定位通信控制才是框架的骨架1.1 AF框架的章节脉络与这一章的位置AF框架Automation Framework往大了说是西门子面向TIA Portal的一套标准化工程模板往小了说就是一套“别人已经替你踩过坑”的项目结构。前面章节通常涉及硬件配置、变量表规范、基础FB封装到了第十三章主题会明显转向系统级联调也就是PLC与变频器、HMI、机器人、上级SCADA之间的数据交换以及围绕这些交换建立的驱动控制逻辑。我在实际项目中体会最深的一点是很多工程师单点调试没问题一旦把PLC、变频器、触摸屏、机器人全部串起来问题就冒出来了。第十三章恰恰就是解决这个“串起来”的过程包括如何规划通信数据块、如何用一个统一的FB去管理多台变频器的启停和频率给定以及如何在不同网段之间建立可靠的访问路径。这一章的受众很明确已经能做基本TIA Portal编程、但还没形成标准化通信思维的工程师。如果你刚接触西门子建议先把变量表和基本FC/FB搞清楚再来啃这一章否则里面的DB结构和间接寻址会让你晕。1.2 为什么说这只是“翻译”不是“照抄”标题里的“翻译”两个字我觉得得两说。一方面是把英文原版手册翻译成中文方便团队内部分享和培训另一方面真正有价值的翻译是把框架的“思想”翻译成你所在现场能落地的东西。比如手册里用S7-1500加ET200SP做演示但你现场全是S7-200 SMART加森兰SB200变频器那数据映射、通信指令都不能照搬得“翻译”成西门子S7协议或MODBUS RTU的写法。第十三章很聪明的一点是它没有替你做选型而是给了你一套“选型后的组织方式”。也就是说无论你用1500的PN口走PROFINET还是用200 SMART配485口走MODBUS框架层面的DB结构、FB接口、HMI画面结构都是通用的变的只有底层的通信指令。这个“隔离变化”的思路是整章最值钱的干货。2. 深入解析第十三章的核心设计思路2.1 从“通讯指令”到“通信框架”的思维转变很多人在做PLC与变频器通信时脑子里只有一件事情把指令发出去把数据收回来。所以程序里会出现好几处单独的MOV、CRC校验、自由口收发代码每个地方风格都不一样出问题只能一个个看。第十三章强调的是建立一个围绕通信的“框架层”包含以下固定成员通信参数配置块存放站号、波特率、数据位、停止位、校验方式数据映射区把变频器的运行频率、电流、状态字、故障码统一映射到结构体通信管理FB负责轮询、超时处理、错误计数和状态上报操作接口独立于具体通信协议HMI只跟这个接口打交道以森兰SB200变频器和S7-200 SMART走MODBUS RTU为例传统做法是在主程序中直接写一段发送和接收。放进AF框架后程序段变为“点名要频率-框架自动打包请求-等待响应-更新状态字-通知主逻辑”。这样一来上层逻辑永远不知道底层是MODBUS还是PROFINET下次换变频器品牌只需要替换通信驱动FB上层纹丝不动。2.2 报文格式、数据块规划与编址规范第十三章对数据块规划有一套明确约定。它建议为每台驱动设备单独建一个背景DBDB里复用一种标准结构。我实际参照过的结构大致长这样TYPE Type_DriveTelegram VERSION : 0.1 STRUCT DriveState : Word; // 状态字0x04F2等 DriveSpeed : Real; // 实际转速 DriveCurrent : Real; // 实际电流 DriveFaultCode : Word; // 故障代码 SetpointSpeed : Real; // 设定转速 CtrlCommand : Word; // 控制字启停、复位 ErrorCount : Int; // 通信错误累计 END_STRUCT END_TYPE为什么单独建“类型”而不直接用单个变量因为当你有6台变频器时你可以把这些结构体放到一个数组里Drives : Array[1..6] of Type_DriveTelegram再用一个循环FB去轮询管理程序量不会随着设备数量线性膨胀。这就是框架的意义用结构化定义换取维护效率。编址规范方面第十三章花了不小篇幅讲“符号名优先”和“禁止散点编址”。这一点我强烈共鸣。实际项目中如果直接给变频器地址写%MW100到了后期加一台设备整个地址表都要挪而用符号寻址后在DB里加一行、插入一个数组元素即可TIA Portal会自动重算地址。2.3 协议选型背后的权衡逻辑这一章关于协议选型的内容不算多但几句话都很关键。我用实际项目经验展开说一下S7-1500与S7-1200之间走PN通信最推荐是直接建立S7连接用PUT/GET或基于TSEND_C/TRCV_C的数据传输。优点是实时性好、诊断方便适合PLC到PLC的数据交换。S7-200 SMART加森兰SB200这类通用变频器几乎都是走MODBUS RTU。优点是通用性强、几乎任何变频器都支持缺点是速率和距离有限轮询周期长站点多了需要合理分配刷新时间。与KUKA机器人交互时如果机器人侧支持PROFINET建议直接用IO设备方式PLC侧不需要任何通信指令只做IO映射。如果机器人侧只支持以太网TCP那就用TSEND_C/TRCV_C组态。我的建议是不要追求“一协议吃遍天下”结合你现场已有的设备接口、响应时间要求、工程调试成本来做决定。第十三章给的价值不是告诉你选哪个而是告诉你选完以后如何用同一种框架容纳不同的协议把协议差异局部化。3. 实操演练从零配置一套标准通信与驱动控制3.1 搭建测试环境的硬件组态与网络规划我这边搭建测试环境用的是一台S7-1500CPU 1511C-1 PN、一台S7-200 SMARTSR20、一台森兰SB200变频器、一台MCGS触摸屏通过以太网跨网段访问S7-1500外加一台KUKA机器人仿真器用于验证TCP通信。网络规划如果没有提前做后面会乱成一锅粥建议按我这个思路自动化网段192.168.10.x里面放S7-1500、ET200SP、KUKA现场设备网段192.168.20.x放S7-200 SMART和现场IOHMI网段192.168.30.xMCGS触摸屏S7-1500上装了两块网卡或者用CPU自带双口就能同时连通三个网段。你用MCGS触摸屏跨网段访问1500时需要在1500侧设置路由同时MCGS的驱动要写成访问网关设备的IP而不是直接访问10网段的PLC IP。如果MCGS没有路由选项最简单的方式是用一个带静态路由功能的交换机或者通过S7-1500的PN接口做中转。3.2 编写通信管理FB以S7-200 SMART和森兰SB200为例核心是轮询驱动的思想。我用S7-200 SMART连接3台森兰SB200变频器采用RS485接口走MODBUS RTU。具体参数如下变频器站点站号波特率数据格式控制字地址频率地址SB200-1196008E10x00010x0002SB200-2296008E10x00010x0002SB200-3396008E10x00010x0002注意地址通常是16位寄存器地址在MODBUS报文里用的是0x0001这一类但实际功能码加偏移后地址会变成40001别搞混。我用MB_MASTER指令块按站号依次轮询。FUNCTION_BLOCK FB_DriveModbusPoll VAR_INPUT Execute : Bool; // 轮询启动 PollInterval : Time; // 轮询间隔 RequestID : Int; // 当前请求索引 END_VAR VAR_IN_OUT Drive : Type_DriveTelegram; CommState : Word; END_VAR轮询逻辑在SCL里并不复杂核心是每次轮询一台设备发完控制字请求后等响应然后再请求状态字、频率、电流。每台设备四个请求组成一个周期。轮询间隔建议设置为100毫秒如果现场RS485总线设备多间隔要适当加大否则总线冲突和从站响应超时会让你怀疑人生。IF Execute AND NOT Busy THEN CASE RequestID OF 0: // 发送控制字与设定频率 MB_MASTER_Req : TRUE; MB_MASTER_Addr : 16#0001; // 把化好的数据写入保持寄存器 1: // 读取状态字 MB_MASTER_Req : TRUE; MB_MASTER_Addr : 16#0001; 2: // 读取实际频率 MB_MASTER_Req : TRUE; MB_MASTER_Addr : 16#0002; 3: // 读取电流和故障代码 MB_MASTER_Req : TRUE; MB_MASTER_Addr : 16#0003; END_CASE; END_IF;这段代码的意义在于将原本在主程序里反复出现的通信指令收敛到一个FB内部HMI和过程逻辑只需要设置Drive.SetpointSpeed和Drive.CtrlCommand剩下的交还给框架。3.3 驱动控制库的建立与复用通信FB解决“数据怎么回来”驱动控制库解决“数据怎么用”。第十三章建议把驱动控制逻辑抽成两个层次驱动接口层负责与通信层交互比如把设定转速换算成变频器频率对应的数字量或者把读回来的原始寄存器值换算成工程单位。驱动功能层负责实现工艺逻辑比如加速斜坡、减速斜坡、点动、急停、故障复位。以森兰SB200为例它的频率设定范围是0到50Hz寄存器里存的是百分比数值0到10000对应千分之一的百分比。把工程频率转成寄存器值时用RegisterValue : SetpointFrequency * 10000 / 50.0。但如果你不通过框架换算直接在HMI里输入百分比操作人员容易错后期换变频器更麻烦。驱动功能层我一般用SCL写。IF (Drive.CtrlCommand AND 1) 1 THEN // 启动先给使能再给运行 Drive.SetpointSpeed : SetpointHz; ELSIF (Drive.CtrlCommand AND 2) 2 THEN // 停止斜坡停 Drive.SetpointSpeed : 0.0; END_IF;这个层次分离带来的好处是如果某天老板说换ABB变频器你只需要改底层驱动接口层和通信FB驱动功能层和HMI画面完全不用动。真正经历过全厂换变频器的朋友一定会理解这种幸福。3.4 HMI联动与跨网段通讯配置实操MCGS触摸屏跟S7-1500跨网段通讯这个需求我在现场踩了比较久。问题根源在于MCGS通常位于单独网段而S7-1500在自动化网段两边通过三层交换机连接。MCGS本身不带路由功能直接填1500的IP地址是连不上的。解决办法有几种给MCGS所在网段设置静态路由下一跳指向S7-1500的网关地址在S7-1500侧设置允许多协议访问同时开放PUT/GET通信权限把MCGS的IP地址设置到与S7-1500同一网段如都放在192.168.10.x跨网段就不再存在但这种方式限制较多。实际经验是能通过交换机静态路由解决就尽量用路由不做ARP代理。调试时用MCGS的“通讯测试”窗口直接发送读取请求看返回的错误码。如果返回超时先ping通网关再ping通S7-1500最后检查PLC侧是否启用了“允许来自远程对象的PUT/GET通信访问”。在S7-1500侧我一般这样配置CPU属性 - 防护与安全 - 连接机制 - 勾选“允许来自远程对象的PUT/GET通信访问”如果使用TIA Portal V15及以上还需确认“仅支持安全通信”未被强制勾选否则MCGS这种第三方驱动可能无法建立连接。3.5 与KUKA机器人交互的配置过程这一节我单独列出来因为机器人通信和变频器通信的套路不太一样。KUKA机器人通常支持PROFINET或者EtherNet/IP用PROFINET时PLC侧不需要写任何通信指令关键是IO映射。你在TIA Portal里组态一个PROFINET IO设备然后在KUKA侧配置好设备名称和IPPLC侧就能把机器人的状态字、位置、节拍信号映射到输入字和输出字里。实际操作中要注意设备名称必须完全一致PROFINET对设备名称的大小写和符号很敏感。我曾经因为KUKA侧设备名填成了“kuka_robot_1”而PLC侧填的是“KUKA_ROBOT_1”导致IO一直断断续续掉线排查了很久。这个坑写在这里希望你们绕过去。在TIA Portal里新建PROFINET IO系统分配设备名然后创建“GSD文件”导入KUKA的GSDML描述文件完成后就可以在下挂IO设备下看到KUKA传送的输入输出模块了。通信周期默认是8ms对大多数机器人同步信号够用对节拍特别快的产线可以考虑把通信周期压到4ms但CPU负载也会同步上升。4. 常见问题与排查技巧实录4.1 通讯超时与掉线这一类问题占了我调试时间的七成。先说现象MODBUS RTU轮询偶尔返回错误严重的每隔几十分钟就掉一次线。排查顺序建议是检查接线RS485的A/B千万别接反屏蔽层要单端接地检查终端电阻总线两端各接一个120欧电阻如果就两台设备每台内部终端电阻打开也有效检查波特率与数据格式9600 8E1要两边完全一致有的变频器默认是8N1用串口抓包工具看报文确认从站到底有没有响应我遇到过一个诡异问题S7-200 SMART发请求后森兰SB200偶尔响应偶尔不响应。后来发现是变频器的“通信超时时间”设得太短PLC每隔100ms轮询一次变频器觉得通信中断自动跳了故障。把变频器的通信超时时间从0.5秒改到2秒问题就消失了。这个细节变频器手册写得不明显但调试中很致命。4.2 报文错位与字节序MODBUS RTU读回来的寄存器是16位无符号整数如果你在PLC里读回频率后强行转换为REAL数值大概率是错的。实际工作中我犯过一个错把寄存器值直接乘0.01当频率用结果发现数值对不上最后才发现森兰SB200返回的是放大100倍的百分比整数0到10000而错误在于我没有先把寄存器值除以10000再乘以50Hz。字节序问题主要出现在PROFINET或以太网通信中大小端不统一会导致数据变成乱码。S7-1500默认是大端模式而很多第三方设备默认是小端在做TSEND_C/TRCV_C通信时要在PLC里做字节交换。TIA Portal里可以使用“SWAP”指令对WORD、DWORD进行字节序转换也可以用MOVE_BLK配合移位做批量处理。4.3 跨网段通讯的典型错误前面提到MCGS跨网段访问S7-1500我再说一个细节MCGS驱动的“目标设备IP”通常填1500的IP但如果MCGS本机地址和1500不在同一子网且没有配置网关TCP握手是发不出去的。排查时先用网线直连MCGS和一台普通电脑确认网络地址配置正确后再接入现场交换机。逐步缩小范围是排查通信问题最笨也最有效的方法。4.4 驱动控制FB间数据不同步当我从200 SMART的MODBUS轮询FB向1500的驱动控制FB传数据时遇到过数据不同步的问题。数据是一个字一个字传的在传输过程中有短暂的不一致窗口如果驱动控制FB正好在读取就可能读到错误的频率值。AF框架的建议是把通信数据和工艺数据分别存放在不同DB通信层把原始值写入“通信缓冲区”再用一个同步指令整体复制到“工艺缓冲区”确保驱动功能层永远只读取一致的数据快照。我用TIA Portal的全局DB读写机制配合一个DONE信号完成这种双缓冲区切换。写代码时注意缓冲区的更新代码要放在OB1末尾或循环中断里避免在一个扫描周期内被多次访问。4.5 排查工具与思路分享我自己常用的排查工具分为三类TIA Portal自带的在线诊断视图、第三方串口调试助手用于MODBUS RTU抓包、以及Wireshark做以太网帧分析。TIA Portal在线诊断视图能显示CPU和PN接口的通信错误统计比如丢包数和CRC错误计数这两个数值如果持续增长基本可以锁定物理层问题。串口调试助手能直接看到RS485总线上的报文流发什么收什么一目了然比自己对着程序猜快得多。经验是不要在程序里加一堆临时变量来“观察”通信数据直接旁路抓包最直观。如果抓包发现在规定时间内没有响应帧问题大概率出在从站配置或物理链路如果响应帧存在但是在PLC里没拿到数据那问题在PLC侧寻址或数据转换。5. 第十三章之外的补充实践5.1 从AF框架到自己的项目如何裁剪和扩展框架不是拿来直接跑的而是拿来裁剪的。我参照第十三章建标准通信层时实际项目只有6台变频器和2台机器人不需要框架里完整的诊断与冗余机制所以我把通信管理FB简化成了“轮询状态机错误计数心跳超时”保留了框架的层次划分但是删掉了与现场无关的多余功能。这样做的好处是程序仍然规范但代码量少了维护成本也低了。反过来如果项目规模大要扩展到几十台驱动设备那么第十三章里的“分组轮询”和“优先级调度”就能派上用场。把不同的驱动设备分配到不同的轮询组通过调整组间的调度权重让关键设备获得更快的刷新周期非关键设备则放低优先级。这种设计在面对大型产线时特别有价值。5.2 版本管理与文档沉淀翻译第十三章的过程中我同步做了一件重要的事把项目里所有的通信参数整理成一份统一的配置表包括设备名、站号、IP地址、通信协议、寄存器地址、换算系数、超时时间。这个表格放到团队共享盘里并纳入公司项目交付文档的附录。谁在调试时碰到问题第一件事就去查这张表而不是打开电脑翻程序找。版本管理也是重点。AF框架更新后底层的库文件和功能块都会变如果你把框架代码直接复制到项目中后期升级会非常痛苦。我的习惯是用TIA Portal的库功能把通信FB和驱动控制FB保存到“全局库”并给库加版本号。项目组从全局库调用时统一引用一个版本避免不同项目各改各的最后库和项目分道扬镳。5.3 对未来自动化工程师的一点建议第十三章写的是通信框架但真正难的不是通信本身而是建立一种“所有设备都能被统一管理”的全局视角。我见过很多工程师写PLC逻辑时用一套思路配HMI时用另一套思路调通信时又换了一种风格最后整个系统像拼凑出来的出了问题谁也说不清。AF框架最大的价值是逼着你用一种结构化的方式去面对整条线。如果你刚接触这部分内容我的建议是别急着写代码先把手册里的数据结构、命名规范、通信分层图看明白再对照现场设备一步步搭建。等你亲手完成一套变频器、触摸屏、机器人联调再回头翻第十三章你会发现自己已经能读懂字里行间的设计意图了。
返回列表