ARTICLE DETAIL

资讯详情

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

西门子AF框架第十六章:安全屏蔽Muting与S7-1500通信集成实战

西门子AF框架第十六章:安全屏蔽Muting与S7-1500通信集成实战 1. 第十六章到底在讲什么从AF全框架看这一章的位置AF框架在西门子PLC生态里并不是一个官方词但它确实在工控圈里被反复提起——不管是Automation Framework还是Application Framework在大多数工程师的语境下它都指向同一件事一套把面向对象编程思想落到S7-1200/1500、S7-300/400项目里的标准代码结构。搞过多个项目的朋友应该都有体会项目做多了以后程序里最值钱的往往不是某个具体逻辑而是那些可以反复复用的功能块和数据结构的组合方式。AF框架解决的就是这个问题把常用的控制逻辑、报警处理、诊断机制、通信接口全部抽象成标准组件新项目来了直接拖进博途改改参数就能用。翻译到第十六章的时候我发现这一章和前面章节有明显差别。前面章节更多是搭骨架——UDT怎么定义、FB怎么封装、DB怎么规划、程序循环怎么组织属于房子打地基的阶段。而到了第十六章AF框架已经把基础组件都铺好了开始处理那些跨模块、跨设备、跨通信的整合问题。简单说这一章讲的是收口安全功能如何接入标准框架、PLC如何和变频器机器人对话、数据如何通过OPC UA送到上位机。如果你是从零开始学这套框架前十五章决定了你能不能把程序写整齐而第十六章决定了你的程序能不能在真实车间里跑得稳。这一章适合谁读我觉得三类人最需要一是正在用S7-1500做产线级项目、被通信和安全功能搞到头大的工程师二是想把手头零散程序整理成标准框架、提升开发效率的PLC程序员三是刚接触AF框架、想知道这套东西到底能干什么的初学者。第十六章的内容并不难但它要求你脑子里有整体的画面感知道每个功能块在框架里处于什么位置、和谁交换数据、出问题时诊断信号从哪里看。下面我把这一章涉及的核心概念、实操方法和现场排障经验逐一拆开讲。2. 核心概念解析UDT、功能块与Muting的底层逻辑2.1 UDT是骨架FB是器官先把数据模型立起来很多人在AF框架里绕不过去的第一道坎就是UDT和FB的关系没理顺。打个比方UDT就像一张标准的人事档案表规定了每个人的字段——姓名、工号、部门、入职时间而FB是处理档案的业务流程比如入职办理、转岗审批。PLC程序里UDT定义数据结构FB操作这些结构DB则是每一条具体的档案记录。AF框架把这三者组合起来形成了一套类型→逻辑→实例的开发模式。在第十六章里大量设计都依赖这种模式。比如后面要讲的Muting功能块它的输入参数里就包含了两个屏蔽传感器信号、安全光栅信号、复位信号输出参数包括屏蔽状态、故障码、诊断字而在动手写FB之前你得先定义一个结构完整的UDT把所有这些信号装进去。这样做的好处有两个第一调用功能块时接口规范统一不同的项目里同样的逻辑不需要重写第二诊断信息可以标准化无论你是谁写的程序报警文本、状态字含义、故障码定义都是同一套语言。我在实际项目里见过太多反面案例——每个工程师按自己的习惯定义布尔量和中间变量程序交接的时候根本没法看更别提形成框架了。第十六章里的一个关键提醒是AF框架在定义UDT时会把数据和状态分开存储。数据字段存放工艺参数比如输送速度、屏蔽时间上限、传感器编号状态字段存放运行信息比如当前是否处于屏蔽状态、上次屏蔽是什么时候、故障码是多少。这个分法非常实用因为工艺参数需要HMI可写、配方可下载而状态字段更多是给诊断面板和上位机看的两者混在一起容易造成误写。2.2 Muting功能块是怎么聪明地绕过安全光栅的Muting这个词中文叫屏蔽英文技术文档里也常写作muting功能块是安全回路设计里非常典型的一个功能。最经典的场景是AGV小车穿过安全光栅光栅检测到AGV进入保护区域时如果直接触发停机那产线就没法干活了。所以需要一套逻辑在特定条件下暂时忽略光栅信号让AGV通过后又立即恢复保护。听起来简单但安全功能不是随便把信号短接一下就行它得满足一系列时序和互锁条件这就是Muting功能块存在的意义。第十六章里对这个功能块的描述基本上遵循了国际标准里常见的安全屏蔽要求。首先需要使用两个屏蔽传感器muting sensor通常按安装位置分为前传感器和后传感器AGV的运动方向让这两个传感器按照先后顺序被触发。光栅被屏蔽的前提是两个屏蔽传感器在限定时间内都被激活且激活顺序符合预期——比如说必须先触发入口侧传感器再触发出口侧传感器这个先后顺序错了屏蔽逻辑立刻判定为故障拒绝进入屏蔽状态。这样做是为了防止有人推着一块木板或者一个托盘从侧面进入误打误撞把两个传感器同时挡上。除了传感器顺序限时条件也很关键。两个屏蔽传感器的激活信号之间不能相隔太久这个交叉时间crossover time通常设置在几百毫秒到一两秒具体数值取决于AGV的车速和传感器间距。还有一个限制是最大屏蔽时间maximum muting time作用是防止屏蔽传感器被卡住——如果屏蔽时间超过了预设上限比如30秒功能块会强行退出屏蔽并触发报警。理解这个设计思路很重要屏蔽不是关了安全光栅而是在严格限定的条件下向安全回路提供一个经过验证的旁路信号。Muting功能块的输出侧同样值得研究。除了控制屏蔽状态功能块还会输出一个屏蔽指示灯信号接在操作面板上提醒现场人员当前正处于屏蔽状态。我见过有的调试现场为了省事把指示灯信号忽略不接这其实是不推荐的做法。指示灯不亮操作工不知道系统正在屏蔽一旦光栅被遮挡却没有触发停机会造成极大的安全隐患。第十六章的文档里专门强调了这一点我自己调试时也养成了一个习惯所有安全相关的状态在HMI上必须做独立的、高亮的状态显示绝不依赖通用报警列表覆盖。2.3 参数设计和时序要求的工程含义Muting功能块在AF框架里被设计成参数可配置的通用组件参数包括屏蔽传感器类型常开还是常闭、交叉时间上限、最大屏蔽时间、复位模式手动还是自动。这些参数在项目调试阶段几乎肯定要反复修改所以设计UDT时一定要给它们留出HMI访问接口。这里分享一个我踩过的坑最初我在AF框架里把屏蔽时间上限设成了常量想着反正项目固定结果设备换了一台更快的AGV后屏蔽时间上限不够频繁触发报警。改成HMI可写参数后现场只需要在触摸屏上调整数值就能匹配新车型不用重下程序。这就是AF框架里把参数提升到数据层的价值——逻辑FB不需要改改数据就行。如果你也在用Muting功能块建议从一开始就把时间参数全部做成HMI可调然后通过HMI的用户权限管理限制修改范围调试效率会高很多。时序逻辑上还有一个容易忽略的细节屏蔽功能块处理的是安全信号所以在程序扫描周期的安排上它不能放在普通的OB1轮询里随便执行应当确保在固定时间间隔的任务中运行或者至少在功能块的内部逻辑里对信号变化做严格的时间戳比较。第十六章中提到的方法是把Muting功能块挂在一个定时中断OB里保证每次扫描间隔恒定这样才能准确计算交叉时间和最大屏蔽时间。如果你把功能块放在普通OB1里扫描周期随程序大小波动时间计算就会出现偏差这种问题排查起来非常隐蔽。3. 实操拆解把第十六章的内容落到S7-1500博途项目里3.1 第一步把AF库移植进博途项目第十六章的示例程序是基于S7-1500的博途环境写的所以第一步是把AF库导入到你的项目里。从我实际操作来看AF框架一般是给你一个现成的库文件里面包含若干个UDT、FB、FC和已经做好的全局DB。在博途V13及以上版本里从库面板打开库文件找到需要的组件拖到项目树里即可。不过这里有个容易被忽略的点从库拖出来的FB它内部会引用一些全局DB或者PLC数据类型。如果你只把一个单独的Muting FB拖进项目而它的依赖项没跟着过来编译时就会报数据类型未找到之类的大串错误。正确做法是先把整个AF框架的库完整添加到项目中然后找到对应的UDT和全局DB一并复制到你的程序文件夹下。千万不要只挑自己看中的功能块图省事后面会花更多时间去追依赖关系。导入成功后我建议先做一次全项目编译。如果编译报错集中在找不到数据类型或者地址区超出范围多半是库版本和你的PLC固件版本不匹配。S7-1500从较老固件升级到较新版本后有些库里的系统数据类型和工艺对象需要重新关联这点在项目移植时几乎必然会遇到。我一般处理办法是先在空项目里把库编译通过再把编译好的对象复制到实际项目里可以避开很多隐形问题。3.2 配置Muting功能块的输入输出与联动移植完成后开始配置具体的Muting功能块。打开FB的实例DB你会看到生成好的一组输入输出参数。按照第十六章的示例输入的分配逻辑大致是这样的Muting_Sensor_1和Muting_Sensor_2接两个屏蔽传感器的反馈信号硬件上对应数字量输入点。Light_Curtain接安全光栅的常闭反馈信号。安全回路里一般用常闭信号做安全评估所以光栅正常未遮挡时这个输入为真被遮挡时为假。Reset接复位按钮或者来自HMI的复位命令。Enable屏蔽功能的使能开关在工艺需要时由上位机置位不需要时关闭。输出侧的关键信号包括Muting_Active正在屏蔽中、Muting_Request请求进入屏蔽状态但条件尚未满足、Fault故障输出、DiagCode带编号的诊断信息。接线和地址分配都好办真正的难度在于把Muting功能块和被屏蔽的下游设备逻辑串联起来。举个例子如果Muting光栅下面是一台输送电机那么电机的运行允许条件里不能只写光栅信号未遮挡而是应该写光栅未遮挡 或 Muting_Active为真。用逻辑表达式表示就是电机允许运行 光栅安全信号 AND (光栅正常 OR Muting_Active)。这里注意Muting_Active是功能块内部经过时序验证后的结果直接用它去旁路安全信号是正确的但绝不能直接用两个屏蔽传感器的原始信号去旁路。曾经有工程师图省事把两个传感器信号先与一下再或到安全回路上看着逻辑差不多实际等于屏蔽条件完全不受时序约束这在安全评估时是过不了关的。3.3 报警和诊断HMI侧如何接收AF框架的事件AF框架十六掌里还有一个贯穿始终的主题诊断信息的标准化。在AF框架中每一个FB都会输出一个DiagCode输出故障时它给出一个整数编号对应一条标准的故障文本。HMI侧的推荐做法是把文本列表做成一个独立的报警文本数据块涵盖所有AF框架功能块可能产生的故障码然后在WinCC画面里建立变量关联让系统自动根据DiagCode查表显示文本。这种方法比在HMI里一条一条写报警条件要高效得多。比如Muting功能块内部判断出屏蔽时间超上限它会把DiagCode置成某个预设值HMI那边只需要一个触发变量为真的条件就能弹出文本整个配置过程不需要逐个布尔量点选。如果你在用WinCC Unified或者博途WinCC建议直接在报警表里用用户自定义的方式引用DiagCode变量把故障文本表做全调试初期就会看到一个规律的现象所有AF框架内的功能块报警文本风格统一、编号连续、查询方便现场维护人员用起来非常顺手。诊断数据除了给HMI看还应当记录到PLC的连续缓冲区里。我在实际项目中会在全局DB里做一个环形缓冲区把每次Muting功能块进入屏蔽和退出屏蔽的时间戳、传感器状态快照都存下来。这样如果现场反馈AGV过光栅时偶尔停一下事后翻缓冲区就能看出是哪一次屏蔽条件没满足、持续时间多长定位效率会高很多。4. 向外走S7-1500与变频器、机器人和上位机的通信集成4.1 西门子1500连接ABB变频器从选件到组态第十六章在讲完安全功能之后很快转入设备通信的内容。产线级项目里PLC基本不可能只靠自己站点的IO干活变频器、伺服、机器人和上位机都是绕不开的邻居。这里先说说西门子1500连接ABB变频器的做法。S7-1500和ABB变频器通信的主流方案是PROFINET。ABB变频器如ACS580、ACS880系列在选型时需要确认是否带以太网通信模块通常叫FENA-01或FENA-11这个模块支持PROFINET IO、EtherNet/IP和Modbus TCP多种协议。硬件接好网线、分配IP之后在博途里需要安装ABB提供的GSDML文件然后在设备组态里把变频器作为PROFINET IO设备挂到PLC的IO控制器下面。这里有个容易出问题的地方西门子的IO控制器的设备名Device Name和IP地址是分开管理的现场如果改了PLC程序但没下载设备名到变频器通信就起不来。每次改完组态记得右键IO设备选择分配设备名称这个步骤经常被忽略。ABB变频器和S7-1500的通信数据通常是固定的输入输出映射。ABB的PROFINET IO模块一般支持几个标准的映射模块比如控制字/状态字加两个过程值、加四个过程值等。你在博途里选完模块后对应地会在IO地址区留出输入输出字节区域。程序里怎么用这些区域我习惯的做法是建两个UDT——一个叫变频器控制字集合另一个叫变频器状态字集合然后通过FB封装启停/调速/读实际频率/读电流这些操作。操作人员用HMI操作电机时不需要关心PROFINET报文结构只需要按下启动按钮FB会把控制字和给定转速打包发送给ABB变频器同时把返回的状态字解析成启动完成、故障、运行中这些Bool信号。这种封装方式在AF框架里是非常自然的延续——上层操作者面对的是有意义的工艺信号而不是一堆Word里抠出来的Bit位。如果项目工期紧或者变频器不带以太网选件Modbus RTU走RS485也仍然常用。S7-1500通过CM1241 RS485模块或者ET200SP的RS485接口用Modbus RTU主站功能块轮询ABB变频器本质上就是按Modbus地址表读写保持寄存器。每台变频器的地址要独立设定轮询周期要根据实际需要调整——数据量不大时100毫秒一轮足够了轮询太频繁会浪费总线时间。另外一个提醒ABB变频器的Modbus地址和寄存器映射表要从具体手册里查不同系列并不完全一致特别是读运行电流这类常用参数ACS580和ACS880的手册编号可能完全不同方法熟练不等于快速翻资料别偷懒。4.2 与库卡机器人做PROFINET交互IO交换区的设计产线上S7-1500和库卡机器人交互几乎已经成为标配场景。库卡机器人控制系统KR C4通常作为PROFINET IO设备和西门子PLC通过IO区域交换数据。和变频器通信最大的不同是机器人和PLC之间的数据交换往往不是变频器那种固定的控制字状态字而是需要根据工艺需求自定义一个数字握手协议。第十六章里给了一个很实用的设计思路PLC和KUKA机器人之间划分两个区一个是16字的安全握手区一个是若干字的应用数据区。安全握手区里只传允许运行故障复位机器人就绪急停生效任务进行中等关键状态位应用数据区才传递工件型号、节拍请求、计数结果这些工艺数据。为什么要把安全握手和应用数据分开因为现场调试时其他问题可以慢慢排查但安全握手如果被无关数据干扰轻则停机重则安全事故。分开后应用数据怎么折腾都不会影响安全链的单向传递。组态细节方面库卡侧需要在WorkVisual软件里导入GSD文件、配置IO从站模块定义输入输出字节长度而博途侧在设备组态里挂载库卡设备。通信建立起来后我建议在PLC侧做一次心跳超时检测机器人程序循环里把某个字周期性加一PLC检测到这个字超过比如500毫秒没有变化就判定通信故障置位急停和报警。这个做法比单纯依赖PROFINET的诊断还要直接因为PROFINET链路有时是通的但机器人侧程序卡死或者没有正常周期性刷新链路层根本不会报错只有应用层心跳能发现。4.3 OPC UA与KepServer把PLC数据送给MES如果项目里涉及MES或者上位机组态软件S7-1500的OPC UA功能是非常好用的工具。从固件版本V2.0开始S7-1500本身自带OPC UA服务器不需要额外硬件只要在博途的PLC属性里启用OPC UA服务器配置好服务器接口、端口和访问权限上位机就可以通过OPC UA客户端读取PLC数据。这种方案最大的优势是安全、直接、免费不需要中间网关。但是有些旧的上位机软件只支持OPC DA标准或者现场数据来源不止西门子一家PLC这时候KepServerEX这类OPC网关软件就派上用场了。KepServerEX支持连接西门子S7-1500它通过西门子自己的通信协议读取数据再以OPC UA或OPC DA的方式转发给上位机。在KepServerEX里你需要配置通道、设备、驱动和标签地址。比如S7-1500的DB块里的某个地址在KepServer里引用为N|DB号|DBW起始地址|数据类型之类的格式具体语法和驱动版本有关。这里有个典型的坑DB块如果启用了优化块访问KepServer里用绝对地址是读不到数据的。要么在PLC侧取消该DB块的优化访问要么在KepServer里按符号名访问但后者对驱动版本要求较高。我实际项目里倾向于把给上位机的数据单独放到一个非优化的DB块里然后通过符号地址或者绝对地址映射好这样各设备读起来都稳定。使用OPC UA和MES对接时数据模型的组织方式也值得多花点心思。规划好节点层级把设备状态、工艺参数、报警信息分别归组后续维护就轻松——比如MES要读产品计数直接从设备区/计数/完工数节点读就行不用每次翻地址。AF框架里已有的DB结构可以很好地映射到OPC UA节点树避免为通信再建一套冗余数据区。5. 别踩坑S7-200 SMART、时间锁、组态软件读串口数据的坑5.1 S7-200 SMART做子站时常见的坑虽然第十六章主场景是S7-1500但很多产线现场还保留着S7-200 SMART这样的老型PLC需要和1500配合使用。S7-200 SMART支持做PROFINET IO设备的只有部分型号和固件版本选型之前一定要确认是否支持这一点在项目采购阶段就该看好。如果型号不支持PROFINET最常见的做法是用S7-200 SMART的以太网口走S7协议S7-1500通过PUT/GET通信指令读写。不过PUT/GET在现代项目里并不推荐——它占CPU资源、容易干扰工艺程序扫描周期而且安全性和诊断能力都弱。如果能换方案尽量换成PROFINET IO或者Modbus TCP。如果必须用PUT/GET也有几条经验可以减少痛苦第一S7-1500侧需要在指令属性里勾选PUT/GET通信允许默认是禁止的不勾选读写一定失败第二S7-200 SMART的地址映射到S7-1500的PUT/GET指令参数时要小心对应关系比如S7-200 SMART的V区地址在通信数据指针里要正确计算偏移第三通信错误处理要做得健壮不能因为一次读写失败就让整条产线停机应该设计超时重试和连续失败计数。调试中常见的时好时坏问题很多是通信区域没对齐、数据长度设置错误或者PLC扫描周期和通信周期相互干扰。5.2 时间锁程序与项目保护的边界关于PLC时间锁程序这其实应该更准确地理解成程序保护机制。正规渠道下西门子博途从V13开始支持对程序块进行Know-How保护用密码对块源码加密用户只能调用无法查看内部逻辑如果你想把整个项目锁定到期日那是很危险也很容易被绕过的做法不建议也不应该追求这种方向。我在项目交付中更推荐的做法是把核心工艺逻辑编译成受保护的块配上详细的接口说明文档交给最终用户的调用接口是开放的但具体实现是封闭的。这样做既保护了知识产权又不妨碍现场正常运维。无论采用什么保护方式密码管理都要纳入项目文档——很多项目三年后设备要改造原工程师离职了密码也没留下只能找原厂家甚至通过非常规手段处理这是所有工程人的噩梦。从今天开始养成习惯所有加密块的密码统一登记到项目交接表中并指定两个人掌握不要等出了问题再翻箱子底。5.3 串口数据组态软件读不到的真实原因有个热搜词描述的场景很有意思ModScan能读到串口数据但西门子组态软件读不到。这个问题的根子几乎总是协议不一致。ModScan相当于赤裸裸的Modbus主站只要你设备串口参数波特率、数据位、停止位、校验位和从站地址、寄存器地址对得上就能读到数据。而西门子组态软件比如经典WinCC或者博途WinCC在串口通信这一块默认支持的是西门子自家的协议或者通过S7协议、PROFINET等方式连接PLC它压根就不会直接从串口以Modbus RTU模式去轮询一个第三方设备。想在组态软件里显示第三方串口仪表的数据正确路径是串口仪表→PLC的串口通信模块→PLC程序解析→组态软件从PLC读取。比如S7-1200/1500通过CM1241 RS485模块读取Modbus RTU仪表程序里解析完毕把数据放到DB块然后WinCC再从PLC的DB块里读出来显示。跳过PLC直接串接组态软件和仪表从架构上就是错的。这个思路理顺以后很多组态读不到数据的排查就会变得很快先查PLC侧读没读到仪表数据如果PLC侧也读不到就查串口参数和站地址如果PLC侧读到了WinCC读不到那就是PLC与WinCC的连接问题和串口仪表已经无关了。6. 排查实录与现场经验补充6.1 通信连不上的第一查法设备通信调试的时候我最常碰到的故障是PLC组态里设备在线但通信就是起不来。按照第十六章以及我自己的项目经验排查顺序应该是先查物理链路再查IP和设备名最后查组态地址映射。物理链路包括网线通断、交换机端口指示灯、两台设备的IP是否在同一网段。确认物理层没问题后在博途在线模式里看IO设备是否报设备不可用如果设备名没有正确分配在线诊断里能看到明显的提示分配设备名称后通信一般就能恢复。如果通信状态正常但数据不刷新比如变频器的状态字一直是零或者机器人应用数据不变化就要去检查组态时选择的模块类型是否和现场设备实际配置一致。ABB变频器的PROFINET模块支持多套映射方案博途里选择的数据长度与实际变频器侧设置不一致数据区会错位或者不更新。这种情况下在线监控通讯区西门子1500诊断缓冲区的报文会给出详细的模块版本和标识信息对着设备手册核对一遍基本都能定位。6.2 Muting误动作的排查逻辑Muting功能块现场调试时最让人头疼的是该屏蔽的时候没屏蔽和不该屏蔽的时候莫名其妙屏蔽了。排这类问题我建议用诊断字倒着查。先看功能块输出的DiagCode它会告诉你当前处于什么状态然后把两个屏蔽传感器的原始信号、光栅信号、使能信号全部拉进监控表同时观察看时序对不对。最容易忽视的一个原因是屏蔽传感器的安装位置和触发顺序。理论上传感器间距要根据AGV车身长度和光栅位置精确计算如果传感器装得太近AGV还没完全进入光栅区域两个传感器就已经同时激活了造成顺序无法区分如果装得太远交叉时间就会超限。这类机械安装问题靠改程序是治不好的必须回现场重新调整传感器位置和角度。还有一个常见原因是传感器选型错误——传感器响应时间太慢会导信号抖动影响时序判断。总之Muting功能块的调试要PLC和机械配合推进纯盯程序的效率很低。6.3 博途V13授权与EDZ部件下载的实践经验关于博途V13授权的问题我只强调一点博途软件必须使用正版授权同时在使用前先连接授权管理器检查授权状态是否正常。授权文件这类东西项目开工前搞定不要在客户现场调试到一半发现需要重新激活授权那种局面极其被动。另一个实用技能是从西门子官网下载EDZ部件描述文件。做PROFINET通信组态时经常会遇到现场设备的GSDML文件官方没有直接提供需要自己生成或者从官网部件库下载的情况。在西门子工业在线支持网站的产品支持栏目里可以通过订单号或产品名搜索设备描述文件下载后直接解压为EDZ然后在博途里选项→管理设备描述文件导入即可。导入完成后设备组态的硬件目录里就会列出对应型号的模块可以直接挂载网络中。这一步看似不起眼却是很多通信组态卡壳的起始点——因为没装GSDML硬件目录里根本找不到设备后面什么都是空的。我的最后几点体会AF框架翻译到第十六章我的感受是这套东西的价值不在某一条指令、某一个功能块而在它逼着你把整个项目当成一个系统去设计。安全功能不是孤立的光栅接线通信集成不是简单的IP配置诊断不是用一堆散落的布尔量在报警列表里堆砌。UDT、FB、DB、全局注释、标准接口、统一诊断这些基础功夫做到位之后后面的集成工作会顺畅得超乎你想象。我翻译和落地这套框架时最受益的一个习惯是每个功能块在设计阶段就先想好如果这里出问题了监控画面应该看到什么然后预留诊断输出。这样做虽然前期要多写几行代码但到了调试阶段会帮你节省数倍的排查时间。如果你正在学习或者准备引入AF框架第十六章不要急着跳过去把前面章节的数据结构和这里的应用场景串起来看你会对整个框架的理解上一个台阶。
返回列表