尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

西门子HMI柔性报警原理与博途WinCC落地实践

西门子HMI柔性报警原理与博途WinCC落地实践 写报警逻辑这几年我见过太多人在HMI报警上栽跟头。最典型的一种痛法一条产线30台设备、每台3个报警点老老实实一条一条配报警文本配到后半夜发现第2条和第26条文本差不多只是设备号不一样好不容易配完了业主说“再加5台设备”你又要从头把HMI报警文本改一遍。这种疲劳战打多了以后我接触到西门子HMI的柔性报警思路相当于把“每条报警单独写死”改成“一个模板动态生成”文本里能带设备名、带实时数值、带触发源新增设备时改数据就行几乎不用动画面。这篇文章就把西门子HMI柔性报警的原理拆开讲清楚它解决什么问题、内部机制是什么、在博途WinCC里怎么一步步落地以及我在现场踩过的坑。适合正在做S7-1200/1500 WinCC项目的工程师也适合刚入门、想搞懂报警到底怎么配才不返工的人。1. 柔性报警到底是什么先搞懂它解决了什么问题1.1 从“一条报警一条文本”到“一个模板全厂通用”传统HMI报警的配置方式大家都很熟建一个离散量报警触发变量选“电机1过载”报警文本写死“1号电机过载”再建另一条触发变量选“电机2过载”文本写“2号电机过载”。10台电机就建10条100个点位就建100条。这个模式下报警文本和触发变量是“一对一绑定”的文本是静态的、写死的。设备少还好说设备一多组态工作量成倍上涨而且极容易复制粘贴时改漏一个编号现场报警显示出来驴唇不对马嘴。柔性报警的做法完全不同一条报警模板触发源可以从PLC侧动态指定文本里可以用占位符引用运行时数据。电机过载这件事模板只建一条文本写成“设备名 电机过载当前电流 电流值 A”设备号、电流值全部来自PLC在报警触发时传递过来的实时数据。新加设备只需要扩展PLC侧的数据结构HMI侧一行组态都不改。这就是柔性报警原理最核心的一条把“报警文本”从静态字符串变成了“静态模板 动态数据填充”的组合。1.2 柔性报警的三种典型应用场景我实际用下来柔性报警最值得上的场景集中在三类。第一类是同类设备批量报警。水泵、风机、阀门、辊道电机往往是十几台甚至几十台同构设备。每台都有过载、超温、故障信号。用柔性报警设备号做成动态文本列表故障类型做成另一维动态文本一个报警模板覆盖整批设备。第二类是过程值需要嵌进报警信息的场景。单纯的“温度高”没有意义操作工要看到的是“3号反应釜温度85.6℃”。“当前值”是报警触发那一刻的实时量必须在文本里动态显示。第三类是配方或工艺切换频繁的产线。同一条报警配方A下叫“一次搅拌超时”配方B下叫“二次搅拌超时”甚至是不同物料名称。传统做法要按配方建多条报警柔性做法把名称做成变量或文本列表配方切换时自动变显示报警逻辑不用动。1.3 为什么叫“柔性”区分于“刚性”报警的四个维度“柔性”这个词我在刚开始研究时也觉得很玄。对照着用反而好理解刚性和柔性在四个维度上有明显区别。维度一是文本的柔性。刚性报警文本写死柔性报警文本可以嵌入动态值、文本列表、变量内容。维度二是触发源的柔性。刚性报警里触发变量固定柔性报警允许同一条报警由多个数据源触发或者由PLC指令带参数触发。维度三是配置量的柔性。刚性报警的条数等于设备数乘报警类型数柔性报警的条数约等于报警类型数设备规模变化不影响组态量。维度四是维护的柔性。刚性报警改一条文本要进HMI工程重新下载柔性报警里很多文本内容来自PLC数据PLC侧改完数据块HMI画面不用重新下载非常方便在线维护。2. 柔性报警的核心原理文本、触发与抗并发2.1 报警文本的组成静态模板、动态变量与文本列表要理解柔性报警原理先把一条报警文本在HMI内部是怎么组织的搞清楚。一条完整的报警文本在西门子WinCC体系里可以拆成三部分。第一部分是静态文本也就是固定不变的字比如“电机过载”“温度过高”“通讯故障”。这部分就是普通的字符串写什么显示什么。第二部分是动态过程值。组态报警文本时可以通过占位符把一个变量嵌进去运行时HMI会在报警触发的瞬间去读取这个变量的值然后填进文本。最常见的就是把当前温度、当前电流、当前压力这些模拟量嵌进去。报警显示出来就不是干巴巴的“温度高”而是“温度高当前值85.6℃”。第三部分是文本列表引用。文本列表本质上是一张“代码值 → 显示文本”的映射表。比如代码1显示“1号泵”代码2显示“2号泵”。报警触发时HMI从PLC的数据里取到一个整数拿这个整数去查文本列表把对应的文本显示出来。这三部分的组合就是柔性报警文本的底层原理。静态文本保证可读性动态过程值保证实时信息文本列表保证批量复用。2.2 触发机制PLC侧触发与HMI侧扫描柔性报警的触发方式决定了它的实时性和可靠性。西门子体系里主要有两条路线。一条是HMI侧变量触发。你在WinCC里建报警把触发变量指向CPU里的一个位地址HMI后台周期轮询这个位为1就触发报警。这种方式配置简单但每个报警占用HMI的一个扫描周期报警点特别多的时候刷新会变慢。模拟量报警如果直接在HMI里做上下限判断HMI要持续采集模拟量负担更重我不太推荐。另一条是PLC侧指令触发。S7-1200/1500从固件4.0以后支持程序报警也就是在PLC程序里调用专门的报警指令Program_Alarm这一类由PLC程序判断条件成立后主动向HMI丢一条报警消息。此时可以带上多个“关联值”这些关联值就是报警文本里的动态数据来源。PLC侧触发的优势非常明显判断逻辑灵活可以做成结构化、可带参数触发瞬间的数据和报警消息打包在一起发送避免HMI轮询的延迟批量生成报警时不会因为HMI扫描不过来丢消息。我做的项目里凡是报警点过百的统一用PLC侧触发。2.3 并发场景为什么只用HMI变量会串文本这里要重点说一个我在现场栽过跟头的点动态文本和报警触发不是绑定的小心并发时文本张冠李戴。最容易踩的坑是这样的有人在HMI里建了一个报警触发变量是“设备故障汇总位”文本里嵌了一个变量叫“当前故障设备名”。PLC侧在触发报警前先把设备名写好再把故障位置1。单台设备故障时一切正常两台设备同时故障时PLC前一秒写“2号泵”后一秒写“5号泵”而HMI扫描到故障位为1的那一瞬间取到的设备名可能是后写的“5号泵”但报警实际要反映的可能是先触发的2号泵。报警记录里两条消息都显示了“5号泵”操作工根本分不清哪个是哪个。这种“先写文本再置位”的做法在并发场景下必然串。所以真正可靠的柔性报警动态值必须跟着报警消息一起走。PLC侧触发指令把关联值和触发事件绑定每条报警消息自带一份数据互不干扰。这就是为什么我强调真正的柔性报警一定要用结构化触发而不是HMI侧变量轮询加共享文本变量。3. 实操落地在博途WinCC里配一套柔性报警3.1 PLC侧报警数据组织与触发程序先看PLC侧怎么做。我用S7-1500举例核心思路是建一个“报警描述数据块”。这个数据块里包含几类信息报警编号、设备编号、报警类型、实时值1、实时值2。设备编号和实时值会在触发时作为关联值传给HMI。报警编号用来区分是哪种故障设备编号让HMI去查文本列表实时值就是嵌进文本里的温度、电流这些数据。程序里做的判断逻辑也很直接比如每台泵都有一段“超温判断”当温度值大于阈值时调用报警触发指令把“报警编号1、设备编号泵号、实时值当前温度”打包发给HMI。这里有个重要细节我建议在PLC程序里做一个报警去抖计时器温度超限后延时1到2秒再触发。没有去抖的话现场一个信号抖动就能在一秒内刷出十几条报警HMI报警记录会被刷屏操作工很快就会把报警当噪音忽略掉。S7-1200要注意一点程序报警功能对固件版本有要求需要V4.0以上而且部分型号和部分功能受限。如果你手头是老的S7-1200建议先查固件不行就走HMI侧变量触发但并发量别做太大。3.2 HMI侧报警控件、动态文本与文本列表HMI侧这边的组态核心是三件事建报警、做文本列表、放报警视图。建报警时如果走PLC侧触发需要在WinCC里组态对应的程序报警并把报警文本写成一个模板。文本里插入动态值的位置在博途WinCC V17里是通过报警文本编辑器的插入过程值按钮完成的。版本不同这个按钮的位置和占位符格式会有差异以编辑器提示为准但逻辑都是“选择要嵌入的PLC变量或关联值索引”。文本列表的组态也在这个阶段一起做掉。比如设备列表0对应“未知设备”1对应“1号泵”2对应“2号泵”依次往下排。报警触发时PLC传过来的设备编号是2HMI自动显示“2号泵”。报警视图放在画面上后自己要有意识地设置过滤条件。生产画面里的报警视图可以只显示“当前报警”历史站显示“所有已确认和未确认报警”。不然报警视图会把几百条历史记录全部捞出来一页装不下操作工翻到崩溃。3.3 完整实例3号泵温度过高当前85.6℃拿一个最经典的例子把链路串起来我要实现报警显示“3号泵温度过高当前85.6℃”。PLC侧我已经有一个“泵运行数据块”里面有泵号、实际温度。当实际温度大于85℃且持续2秒程序触发报警指令报警编号指向“温度过高”模板关联值1填泵号3关联值2填当前温度85.6。HMI侧的报警模板文本写成“设备列表 温度过高当前 关联值2 ℃”。其中设备列表是文本列表引用HMI拿到关联值1也就是3之后去“设备列表”文本列表里查出“3号泵”。报警触发时操作工在HMI上看到的完整消息就是“3号泵温度过高当前85.6℃”。整条消息没有一处写死泵号来自文本列表温度来自报警触发瞬间的实际值。如果你要加第8号泵PLC数据块里加一台泵的数据文本列表里加一行“8号泵”HMI工程不用重新下载。这个就是柔性报警工程化最大的价值报警组态量不随设备数量线性增长。4. 柔性报警工程化的性能与可靠性4.1 报警风暴与去抖设计报警系统的稳定性很多时候不是挂在报警逻辑本身而是挂在报警风暴上。一个信号抖动或者一条通讯总线瞬断就可能一瞬间涌入大量报警消息。HMI要处理、要存储、要刷新画面CPU也要持续发送整个系统都会被拖慢。去抖是必须做的前置设计。前面提到的超温延时触发算一种还有一种常用的方法是报警变位次数统计同一个报警位在短时间内反复翻转只记录第一次后续翻转在这个时间窗内不再触发。S7-1500的PLC程序里做这个逻辑很方便用边沿检测加计时器就能完成。对HMI侧的报警控件也要限制单页加载数量。报警视图显示100条就够用不要设成加载全部历史。真要查全部历史放在专门的报警记录画面里用时间过滤不要让生产主画面扛这个负荷。4.2 报警存储、时间戳与心跳监控柔性报警把文本做活了以后很多人会忽略报警记录本身的可靠性。这里面有两个常犯的错误。一个是报警缓冲区没有设保持性。HMI掉电重启后报警记录全部清零。对需要追溯的项目来说这是不可接受的。WinCC运行系统里报警缓冲区的保持属性要去查确认掉电后记录仍在。实在记不住就在项目交付前做一次断电重启测试看记录还在不在。另一个是时间戳对齐。HMI显示报警触发时间这个时间如果是HMI本地时间而HMI和PLC时间不同步报警排查时会出现“先报的这个时间比后报的还晚”这种鬼情况。建议用统一的时钟源做时间同步PLC和HMI选一个做时钟主站另一个跟随。这里还绕不开一个词心跳点。HMI和PLC的通讯如果中断报警画面往往会保持最后的状态看起来好像是正常的。可靠的工程做法是PLC程序里做一节心跳逻辑把某个位周期性翻转HMI组态一个内部变量去监控这个位超时未翻转就弹“PLC通讯中断”。很多HMI画面上那个绿色/红色跳动的小图标就是这个心跳点。有了它报警系统才能区分“没有报警”和“通讯断了根本收不到报警”。4.3 与通讯负荷的耦合一个32台变频器的CPU为什么报警会慢柔性报警系统不是单独存在的。同一台PLC上往往又跑工艺逻辑、又跑Modbus通讯、还要发送报警消息。我曾遇到过一套系统S7-1200下面挂了32台变频器走Modbus主从通讯CPU每一轮要循环读变频器状态通讯周期被拉得很长。HMI侧报警点位一多扫描延迟就明显变大报警从现场发生到HMI显示能差出好几秒。这种情况下的调整思路不是靠HMI侧优化而是回PLC侧分优先级工艺连锁逻辑放在最快的中断里报警判断放在主程序里Modbus通讯轮询可以单独分配时间片每轮只刷一部分变频器把总周期压住。报警触发尽量用PLC侧指令主动上报不要让HMI一个一个点位轮询。如果你的项目也遇到HMI报警反应慢先别急着怪触摸屏。打开PLC程序的扫描周期监控看看是不是通讯轮询把OB1拖到几百毫秒了。这个问题排查顺序搞反很容易白白换一台更贵的HMI。5. 常见问题与排查技巧实录5.1 报警文本变成“????”或“#”柔性报警里文本列表映射不到时HMI会显示一些奇怪的占位符常见的是问号或井号。先检查文本列表的代码值类型和PLC传过来的值类型是否一致。PLC传过来的是整型文本列表里的代码值也是整型这个要对应上。再检查PLC传过来的代码值是否在列表范围内比如列表只配到10PLC传进来11HMI查不到就只能显示占位符。最后查语言如果项目启用了多语言报警文本和文本列表都要在对应语言下组态缺了某一种语言的翻译也会显示乱码或占位符。5.2 报警不触发或触发不显示报警不触发先分两层查。第一层是变量的值到底变了没有用HMI的变量监控或者PLC的监控表确认触发条件满足了。第二层是报警本身有没有被启用有些系统里报警有一个“使能”位PLC侧或者组态里没启用报警组态得再多也不会报出来。触发不显示则是另一个方向报警已经在报警记录里了但画面上的报警视图看不到。这种通常是视图的过滤条件没配对。报警级别、报警类别、确认状态都可能被过滤掉。比如报警视图只显示“错误”级别你组的报警是“警告”级别它就藏起来了。5.3 博途HMI仿真按钮无反应仿真时最容易产生的错觉是“HMI坏了”。实际上HMI仿真时如果没有同时激活PLC仿真或者没有配置真实的通讯连接HMI画面上那些按钮动作自然没有对象可以发。博途里做HMI仿真之前先确认两件事一是连接设置里的通讯参数和PLC侧一致二是如果要用按钮去置位PLC变量检查变量是否在HMI的访问权限里被设为“不可写”。很多按钮无反应不是仿真的问题是变量属性里写了只读。仿真运行起来后也可以先点一个简单的页面切换按钮试试HMI本体逻辑正不正常一测就知道。5.4 报警记录掉电丢失与smart700IE存储卡报错报警记录掉电丢失大概率是前面说的报警缓冲区保持属性没启用。WinCC的报警缓冲默认未必是保持型的项目交付前一定要做断电测试。另外注意到很多人问smart700IE每次开机提示USB或TF卡出现问题。这种老设备用的存储介质容易出现接触不良或文件系统损坏。排查时先备份工程格式化存储介质重新下载工程如果还报就要考虑换存储卡。这台老面板在报警存储能力上也比较有限如果报警量特别大不建议把历史全存在面板里应该通过上位的WinCC Runtime或者报表系统做历史归档。5.5 确认不了的报警与残留报警报警不能确认先看操作权限。很多HMI的报警确认按钮绑定了用户权限操作员级别不够确认按钮就是置灰的。还有一种是报警确认的实际动作在PLC侧需要PLC程序里配合复位确认位HMI只发了一个确认请求PLC不响应报警就一直挂在那儿。残留报警是指故障已经消失但报警记录里还有未确认的消息。其实这不是bug报警确认和故障恢复本来就是两回事——故障恢复表示报警条件没了确认表示操作工知道这件事并做了签认。一条报可以“恢复了但没确认”也可以“确认了但故障还没恢复”。把这个概念区分清楚现场很多所谓“怪毛病”就讲得通了。根据我这几年做报警方案的经验柔性报警值得在项目一开始就规划进去。别等到点位表堆到几百条再回来改那时候改的是组态量动的是整个报警体系成本完全不一样。我给自己定的习惯是凡是同类型设备超过三台的报警需求直接上柔性方案PLC侧先建报警数据块HMI侧先配模板宁可前期多花半天也不给后期留返工的坑。
返回列表