ARTICLE DETAIL

资讯详情

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

PLC流量累计功能块库设计:基于TIA Portal V15的工程实践

PLC流量累计功能块库设计:基于TIA Portal V15的工程实践 简介西门子TIA Portal V15专用流量累计功能块库面向水处理、化工、能源等需要连续计量流体总量的工业场景为PLC工程师提供可直接调用的FB功能块解决方案。压缩包共26个文件大小约1003KB内含AL15项目文件、backup工程备份、时间戳明确的版本快照如2021-12-24等多版、XML配置、PNG示意图、Markdown说明及系统配置、交叉引用、用户文件等结构化内容目录保留原始中文命名便于快速定位。功能块支持S7-1200/1500系列PLC兼容IEC 61131-3标准可通过FB块调用、参数化配置实现脉冲/模拟量输入的实时累计并绑定DB数据块使用已在TIA Portal V15环境验证无需额外适配即可开箱即用。目前已有46人学习下载可显著缩短流量累计功能的开发与调试周期适合自动化项目现场快速部署。 前阵子给一家水处理厂做改造现场装了不少电磁流量计中控要求把每台流量计的瞬时流量换算成累计流量每天交接班对一次数月底还要统计总用水量。一开始图省事直接在OB1里写了个累加设备跑了两天问题接踵而至——断电丢数、累计值跳动、和现场仪表对不上账。后来狠下心把这块逻辑整个重构做成了一个专用于TIA Portal V15的流量累计功能块库顺带把工程文件和备份也整理齐整。这篇就把整个设计思路、实现细节和踩过的坑一并写出来给正在做同类项目的朋友参考。这个功能块库解决的就是工业现场最常见的瞬时流量转化为累计流量的需求覆盖了信号采集、工程量换算、时间片积分、断电保持、批量复位这些环节。无论是S7-1200还是S7-1500只要是TIA Portal V15环境拷贝进去就能用特别适合水处理、化工配料、能源计量这类对累计量有明确要求的项目。1. 项目概述与功能块库的整体设计思路1.1 为什么要把流量累计做成功能块库很多新手工程师的习惯是哪里有流量计就在哪里写一段累加逻辑十几台流量计就写十几段差不多的程序。这种做法表面上看很快实际上后患无穷——修改单位换算系数时要挨个找排查故障时每段逻辑还不完全一样后期维护成本非常高。功能块库的思路完全不同。把瞬时流量采集、累计计算、复位、报警输出这些逻辑全部封装到一个FB里面外部只需要传入瞬时流量值拿出来就是累计量。现场有十台流量计就调用十个实例每个实例独立累计互不干扰。修改计算逻辑只改FB本体所有实例自动生效这种收益在项目交付后的维护阶段特别明显。我在这个项目里把功能块库设计成三层结构最底层是AI信号处理负责把4-20mA模拟量原始值换算成工程量中间层是流量累计核心FB负责积分计算、掉电保持、复位和控制输出最上层是HMI联动变量区把累计值、瞬时值、复位按钮这些变量统一规划到全局DB中方便触摸屏和WinCC直接绑定。1.2 功能块库的组成边界与兼容性规划做功能块库不能贪多求全边界划清楚比功能堆砌更重要。我这个库的组成模块分为四部分AI标准化处理块、线性流量累计FB、批量控制辅助块和单位换算工具块。前两个是核心绝大多数项目用到这两块就够了后面两个是按需附加的扩展组件。设计时还考虑了一类特殊场景——有些流量计本身带RS485通讯接口通过Modbus RTU把瞬时流量传给PLC。这时候AI模拟量通道就不用了需要在PLC侧先做Modbus通讯解析把瞬时流量值放到一个全局变量里再直接传给累计功能块的输入引脚。所以功能块的输入参数设计成标准的REAL类型不管来源是模拟量通道、通讯报文还是HMI手输只要把工程值送进来就能完成累计。兼容性方面还有个大前提要注意TIA Portal V15的项目文件在V16、V17、V18里能直接打开并升级反过来就不行了。做项目交付时我一般会把源文件导出成V15版本的归档包同时在文档里写清楚升级路径避免客户换了软件版本打不开文件的尴尬。1.3 硬件选型与信号接入规划硬件选型直接决定功能块的信号质量。AI模块的选择上S7-1200系列常用SM1231 8x13位模块S7-1500系列常用SM1231 8x16位模块。预算允许的话优先选16位模块采集分辨率高一档对微小流量变化的反映更灵敏。流量场景我一般不建议用热电偶专用模块那些模块的冷端补偿和滤波逻辑反而会影响模拟量的实时性。信号接入规划有个容易被忽略的细节——流量计和变频器在同一个电柜里时变频器输出侧的电磁干扰会耦合到模拟量信号线上。这个项目里变频器是ABB的品牌和PLC控制柜挨得比较近电磁流量计的4-20mA信号线走了独立桥架屏蔽层单端接地进PLC柜后还加了信号隔离器。这套方案实测下来信号纹波控制在很小的范围内累计曲线非常平滑。2. 流量累计的核心原理与关键细节2.1 瞬时流量采集与工程量换算流量累计的口诀是先把瞬时值算准再去谈累计。瞬时流量采集这块TIA Portal里最常用的组合是NORM_X和SCALE_X两条指令。假设现场电磁流量计量程是0到100立方米每小时输出4到20毫安信号PLC AI模块原始值范围是0到27648。4毫安对应的原始值是553020毫安对应27648中间这段就是有效测量区间。换算的逻辑拆开看就三步。第一步NORM_X把原始值整型转成0到1之间的实数百分比需要注意把下限值设置为5530除以27648约等于0.2这样4毫安对应的是0而不是负值。第二步SCALE_X把百分比映射到0到100的工程量范围内。第三步在功能块内部进行单位归一化处理因为现场的流量单位可能有立方米每小时、升每分钟、吨每小时统一换算成每秒的流量值方便后面的积分计算。有了这个基准每周期的累计增量就是一个简单的乘法。举个具体例子当瞬时流量稳定在每小时60立方米时每秒流量是60除以3600约等于0.0167立方米。如果PLC循环中断周期设为100毫秒那么每个中断周期的累计增量就是0.0167乘以0.1等于0.00167立方米。PLC累加的就是这种以秒为基础的时间片而不是直接用每小时的值去乘这是很多初学者容易算错的地方。2.2 积分计算与采样周期设计流量累计本质上是对瞬时流量做时间积分这个积分精度完全取决于采样周期的稳定性。如果直接在OB1里做累加OB1的执行时间会随着程序逻辑的复杂程度不断变化采样周期自然不稳定累计结果的误差就会越来越大。正确做法是把累计逻辑放到循环中断组织块里比如OB30默认100毫秒触发一次或者OB32按需配置。我在这套库里用的是OB30加100毫秒默认周期同时读取程序扫描的实时时间戳来计算实际时间差。之所以不直接拿100毫秒当固定值是因为循环中断虽然优先级高但碰到CPU停机、通讯繁忙、启动瞬间这些情况实际执行周期会有偏移。用时间戳算真实差值哪怕中间丢了一两个周期累计量也不会错。单位换算得先说清楚。功能块内部统一用每秒流量作为中间单位以立方米每小时为例换算系数是除以3600。假如工程单位是升每分钟先除以60换算成升每秒再除以1000换算成立方米每秒。有温度和压力补偿需求的介质比如蒸汽瞬时流量还得先做温压补偿修正再送去累计这个功能块就留了补偿值输入接口。2.3 掉电保持与数据可靠性掉电保持是流量累计项目里最容易翻车的环节。S7-1200和S7-1500的DB块默认是非保持型PLC断电重启后所有变量全部清零辛辛苦苦累计了两个月的总量一夜回到解放前。解决办法是给存放累计量的DB块勾选保持性属性具体操作是在DB块属性中把保持性设置为保持或者在变量表中单独给累计量变量勾选保持选项。保持机制也有讲究。S7-1200的保持存储区是有限资源默认一般是10KB1500稍大一些。流量累计量这种REAL类型变量一个占4字节LREAL占8字节几十个实例算下来也就几百字节完全够用。但要注意别把一大堆临时变量也设为保持那纯属浪费保持区资源。针对批量控制和交接班清零的场景功能块里设计了可选择的归档策略。一种是不清零继续累加保留原始累计值另一种是到达设定批量值后输出控制信号并自动清零重新累计。两种模式在话需要在HMI上做清楚的选择按钮防止操作员误触发清零把总账弄丢了。我一般还习惯把关键累计值在每天的固定时间点写入另一个归档DB形成无法被误操作覆盖的历史备份。2.4 浮点精度与数值溢出防护浮点数精度问题在流量累计这种长时间运行的场景下特别值得重视。S7-1200和1500都支持REAL单精度浮点它有效数字只有7位左右。当累计值从小到零增长到几十万立方米时单精度浮点已经无法分辨每小时百分之几立方米的微小增量累加结果会出现台阶状跳变最后一位始终加不上去的状况。解决办法是累计量使用LREAL双精度浮点类型。LREAL有效数字达到15到16位长期累计下精度完全够用。在功能块内部所有累加和积分计算统一用LREAL只在输入输出边界上做REAL和LREAL的类型转换。这个方法在S7-1200和1500上都支持指令执行周期增加可忽略不计但数值精度提升明显。数值溢出防护我用的手段是上限钳位加滚动清零。功能块设置了累计量上限默认设为一个足够大的值比如9999999.9立方米。达到上限后输出报警信号同时自动把累计值减去上限值保留超出部分继续累计这样累计值永远在可控范围内滚动不会出现溢出导致数据异常的极端情况。3. 基于TIA Portal V15的完整实操流程3.1 创建项目与硬件组态整个项目的落地从TIA Portal V15的基本操作开始。新建项目后第一步添加设备CPU型号根据现场I/O点数选择。这个水处理项目用了CPU 1214C DC/DC/DC外加一块SM1231 AI模块、一块SM1223数字量混合模块硬件组态里添加好之后分配好IP地址这部分不复杂关键是把模块版本选对V15对G2版本之后的模块支持很完整。硬件组态完不要急着写程序先做一件重要的事——在PLC属性里关闭未用脉冲源的诊断中断把模拟量模块的积分时间设置成与工频一致50Hz对应20毫秒滤波器强度按需调整。这些细节直接影响模拟量采样的实时性和稳定性尤其是滤波强度设置太强信号平了但响应慢了设置太弱信号毛刺多需要在实际工况里找平衡点。3.2 编写FlowTotalizer功能块功能块库的核心是名为FB_FlowTotalizer的块用SCL语言编写。为什么选SCL而不是LAD因为积分计算、逻辑分支、类型转换这些操作用SCL表达效率高得多可读性也好一个FB里能完成整个计算流程。FB的接口设计并不复杂。输入侧是瞬时流量、工程单位选择、累计上限、复位使能输出侧是累计量、累计时间、上限报警。内部用静态变量保存上次执行的时间戳和首扫描标志这些静态变量在不同扫描周期之间保持数值是多实例运行的关键。以下是核心框架代码FUNCTION_BLOCK FB_FlowTotalizer { S7_Optimized_Access : TRUE } VERSION : 0.1 VAR_INPUT bEnable : BOOL; // 累计使能 rFlowRate : REAL; // 瞬时流量(工程值) iEngUnit : INT; // 单位: 0m3/h, 1L/min rUpperLimit : LREAL; // 累计上限 bReset : BOOL; // 手动复位 END_VAR VAR_OUTPUT rTotal : LREAL; // 累计量 rTotalTime : LREAL; // 累计时间(h) bAlarmOver : BOOL; // 上限报警 END_VAR VAR bFirstRun : BOOL : TRUE; tLastTime : TIME; END_VAR逻辑部分的核心是每秒流量换算和积分累加。以立方米每小时为例每秒流量等于瞬时值除以3600再乘以实际时间差得到周期增量和。时间差通过读取当前系统时间与上次记录时间的差值来获得首扫描周期时只记录时间不累加防止PLC启动瞬间出现跳变。整个逻辑写在循环中断OB30里每个100毫秒周期执行一次。3.3 循环中断配置与周期调用FB写好后最重要的步骤是建立循环中断OB30把功能块的调用放在OB30里。在OB30的属性里设置时间间隔为100毫秒优先级保持默认20左右然后在这个组织块的程序段里写调用指令。这里有个关键点功能块的背景DB如果是多实例方式每次调用需要一个独立的背景DB但所有实例共用同一个FB的算法逻辑。实际项目中如果流量计数量多我一般会建立一个全局数据块专门管理所有实例的接口变量。每个实例的背景DB只负责存放该流道的累计值、时间戳等静态数据而上位机操作和显示变量统一放到全局DB里这样触摸屏组态时只需要面对一个结构清晰的变量表。3.4 项目归档与版本备份项目文件的备份问题很多工程师不重视直到交付前发现项目文件损坏才后悔。TIA Portal V15自带的归档功能可以生成一个压缩包归档后建议一定做一次恢复测试确认压缩包能正常解压打开再交付。如果项目文件大、改得多我的习惯是每天的版本归档一次按日期命名用U盘单独存放。除了整体归档程序块级别的备份也有技巧。右键选中某个FB或DB使用从块生成源把程序块导出成文本格式的源文件。这相当于给单个功能块做了版本控制就算整个项目文件损坏也能在新建项目中通过导入源文件的方式快速重建功能块。我在这个项目里把整个流量累计功能块库都导出了源文件和归档包一并交付。4. 常见问题与现场排查技巧4.1 现场最常见问题速查表做流量累计项目以下问题出现频率非常高整理成一个速查表方便现场调试时对着查。故障现象可能原因排查方法解决办法累计量比现场仪表多/少工程量换算量程设置错误对比4mA、20mA对应的显示值校准NORM_X/SCALE_X上下限断电重启后累计量归零DB块未勾选保持性查看DB变量保持属性勾选保持并重新下载累计量随时间漂移采样周期不稳定检查是否在OB1中执行累计改到循环中断OB30中执行累计量台阶状跳变REAL精度不足查看累计量数值位数改用LREAL类型HMI复位后总账也丢了复位逻辑误清归档值查看复位权限设置分权限管理复位按钮4.2 信号干扰与断线处理心得流量信号漂移是现场排查最耗时的问题。有次发现某台流量计的累计量和就地显示偏差越来越大观察瞬时曲线能看到规律的毛刺波动。排查了一圈最后发现是信号电缆和变频器输出电缆在桥架里平行走了十几米变频器高频分量耦合到了模拟量信号上。处理方案是在进PLC前加装隔离配电器同时把信号电缆换成屏蔽双绞线屏蔽层单端接地。断线检测也必须处理。模拟量断线时信号会掉到0毫安或者跳到最大值如果直接把这个值送去累计累计量会瞬间冲到很大。常规做法是在功能块里对瞬时流量做范围判断超出设定量程上限一定比例就认为信号异常此时累计逻辑暂停同时输出断线报警。这个阈值要根据实际工况留足冗余不能把正常的最大流量误判成断线。4.3 周期与性能权衡循环中断周期设置需要在精度和CPU负载之间做权衡。周期越短累计精度越高但CPU负担也重。我测试下来的经验是流量累计场景100毫秒周期已经能保证0.1%以内的计算误差200毫秒也可以接受。如果项目里有几十个流量累计实例建议用200毫秒因为每个实例还要消耗一定的处理时间实例多了某个周期内执行不完下一个周期就会堆积。S7-1200的循环中断优先级高于普通OB1OB30里编写的逻辑要短小精悍避免放通讯请求、文件读写这类耗时操作。如果同一个高速周期的OB里做了太多运算会造成OB1的扫描周期波动严重时影响整个PLC的响应速度。我通常把报警判断、趋势记录这类操作放到OB1里循环中断里只保留积分计算和保持值更新。4.4 时间戳补偿的特殊情况前面提到用时间戳做采样周期差值补偿是最稳的方案但还有一种特殊情况要注意——PLC系统时间被手动修改。比如操作员把触摸屏时间从下午三点改到两点时间差变成负值累计量会瞬间被扣减一大截。功能块里专门加了时间差合理性判断差值大于2秒或者小于0时本周期不累加只重新记录当前时间。经验不足的工程师容易忽略这个细节一旦现场改过时间累计数据对不上账排查半天也找不到原因。5. 写在最后的实际体会这套流量累计功能块库我从TIA Portal V13时代就开始用一路改到V15前后在七八个水处理和化工配料项目里复用累计误差基本控制在0.5%以内断电重启也不丢数。现在新项目只要设计阶段确认了流量计信号类型我都是直接把功能块库拉进去用几十分钟就能把十几个流量通道的累计功能全部配好。最后再分享一个小技巧HMI上显示瞬时流量和累计量时最好把累计量显示的小数位数和精确度设置一致避免操作员因为显示位数差异产生误会。同时在一级画面里把复位累计按钮设置成操作员权限和工程师权限分开既能满足生产需求又不会出现误触碰把月度总账清掉的重大事故。流量累计看似简单真正要做到准确、稳定、可追溯里面的细节比想象中多得多。本文还有配套的精品资源点击获取
返回列表