ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

西门子PLC生产测速与产量统计程序的设计实践

西门子PLC生产测速与产量统计程序的设计实践

车间主任问一句“这一班下来干出多少件”,很多人第一反应是——PLC里加个计数器不就行了。但等你真的用西门子PLC去做一套生产测速产量统计程序,你会发现难点从来不是“计数”,而是“口径”:当班生产量、生产总量、生产时间参数,这三个词背后各有一套统计逻辑、复位策略和数据保持要求。我前后在两个现场做过类似的程序,从最早“一个HSC数脉冲、一个变量做累加”的朴素版本,到后来能自动换班归档、掉电保持、带权限管理的完整版本,踩了不少坑,也把很多“看着简单、一用就出问题”的细节理顺了。这篇就把我完整的设计思路、程序结构和现场排查经验整理出来,给正在做或准备做产量统计的朋友一个参考。

1. 当班量、总量与时间参数:先弄清统计口径,再写程序

1.1 一个计数器解决不了的问题

直接加一个计数器,现场一定会遇到这四类问题:当班量和总量是不是同一个变量?换班时清零,会不会把总量也清了?操作工误碰清零按钮,这班产量找谁要?半夜设备掉电,好不容易累计的产量丢了一截?

我第一次做这套程序时,就犯过“一个变量走天下”的错误。当时图省事,把光电脉冲直接累加到一个双整数变量里,界面上一显示就算完事。结果白班和夜班交接,操作工要求“把当班量归零重新计”,我在触摸屏上加了个清零按钮,第二天就收到投诉——夜班师傅误点清零,连带把累计量也归了零。

这件事给我的教训很直接:产量统计的本质不是“怎么计数”,而是“数据如何存储、何时复位、谁能修改”。计数是PLC的强项,但统计口径和权限管理才是程序设计的重心。所以动笔写程序之前,第一件事永远是把“当班量”、“总量”、“时间参数”这三个概念的定义和边界跟车间管理方确认清楚。

1.2 三个统计口径的定义与复位策略

我把现场最常用的一套统计口径整理成了表格,这也是后续程序设计的直接依据:

数据项统计口径复位/归档策略掉电策略
当班生产量当前班次开始至当前时刻的产出换班时归档并清零必须保持
生产总量设备投用或设定基准日至今的累计产出只增不减,仅管理员可修正必须保持
班次开始时间本班起始时刻换班时更新必须保持
当班累计运行时间本班内设备有产出的累计时长换班时清零必须保持
累计运行总时间跨班次的长期累计只增不减必须保持
最近N个班次历史产量已完成的各班次产量环形覆盖写入必须保持

这里最容易出问题的是“总量只增不减”这条。很多工厂有审计要求,总量不仅不能让操作员随便清,连班长和工程师修正时也得留痕迹。我的做法是:触摸屏上总量区域纯只读,修正入口放在管理员密码登录后的隐藏页面,每次修正值写入一个单独的修正记录变量,连同修正时间一起保存。这样既满足灵活性,又经得起追溯。

1.3 生产时间参数要记哪几类

所谓“生产时间参数”,不是只记一个“开机到现在多久”,至少要覆盖四类信息:班次本身的时间(班次编号、班次开始时刻)、当班运行时间、当班非运行时间、累计运行总时间。有了这些,才能算班次效率、实际节拍这些管理指标。

“设备在运行”的判定逻辑是关键。我是用测速信号本身来判断:每秒内如果收到过脉冲,就认为这一秒设备在产出,运行时间加1秒;连续一段时间没有脉冲,就判定停线。这个“静默窗口”需要根据产线节拍来调——我一般先设5秒,设备节拍慢的产线要适当放宽到10到15秒,否则产品间距本身就大,会被误判成停机。

2. 测速与计数硬件选型:产品级脉冲为什么比编码器更务实

2.1 三种测速方式的原理与适用边界

做测速产量统计,常见的检测方案有三种:旋转编码器、光电/接近开关产品脉冲、变频器频率读取。它们的原理和适用场景差别很大:

检测方式原理精度成本与安装
旋转编码器轴每转发出固定数量的脉冲,换算速度/长度高,可测线速度和长度需要机械安装机构,怕冲击震动
光电/接近开关每个产品经过触发一个脉冲精确到一个产品便宜、安装灵活,现场首选
变频器频率读取读取运行频率间接推算速度间接估算,受负载和打滑影响不用加传感器,只能作参考

很多工程师一听到“测速”就想上编码器,但对于纯粹的“产量统计”目标,我更推荐产品级脉冲方案。原因很简单:产量统计关心的是“过了多少个产品”,而不是“轴转了多少圈”。编码器能测出速度,可要从转速换算成产量,中间还得引入“每转对应几个产品”这种转换系数,一旦有打滑、空转,误差就来了。索性直接让每个产品发一个脉冲,数出来的就是真实产量,物理意义最直接。

变频器频率读取更适合“速度监视”,比如判断设备有没有在设定速度附近运行。拿它当产量依据,负载变化、皮带打滑、缺料空转都会把数据带偏,我不建议用在产量统计这种需要精确口径的场合。

2.2 产品级脉冲传感器的安装与信号接入要点

传感器选型上,我的习惯是:规则小件用槽型光电,结构稳定不怕震动;透光或者薄片类产品用对射光电,信号干净;金属件就用电感式接近开关。反射式光电虽然安装最方便,但对产品颜色、角度、表面反光都很敏感,现场调起来最费劲,能用前两种就不用它。

安装位置比传感器本身还重要。一定要选在产品稳定通过、没有堆叠和反弹的区域。我把传感器装在分道之前、产品刚脱离输送带的位置,就是因为那个位置产品间距稳定,不会出现两个产品靠太近导致传感器来不及复位,也不会因为反弹造成重复触发。

接线方面有两条硬经验:一是NPN和PNP必须先看清楚PLC输入是高电平有效还是低电平有效,接反的典型症状就是“传感器灯亮,但PLC输入点没反应”;二是信号线必须用屏蔽双绞线,屏蔽层单端接地。我遇到过一换变频器启动,计数就开始乱跳的案例,最后查下来就是信号线跟动力电缆在同一个线槽里走了十几米,屏蔽层两头都接地形成了地环路。

2.3 高速计数器配置与中断设计:为什么普通输入点不行

PLC普通数字量输入为什么不适合直接计数?因为PLC是循环扫描的,扫描周期几毫秒到几十毫秒。如果产品速度很快,脉冲宽度小于扫描周期,输入信号可能在两次扫描之间“一闪而过”,直接漏计。尤其是变频器干扰环境下,I/O映像刷新时读到抖动电平,还会造成多计。

高速计数器(HSC)是PLC固件层面的计数器,不占用扫描周期,信号来了硬件直接计数,程序只需要在特定时刻读取。S7-200 SMART上,HSC0对应I0.0,用HDEF指令定义模式、HSC指令激活;S7-1200/1500则是在设备组态里启用高速计数器功能,再通过指令读取或复位当前值。

这里我要重点分享一个设计思路:HSC只当一个“高速脉冲暂存器”,程序每隔固定周期(我用100毫秒到1秒)读取一次HSC当前值,跟上次读的值做差值,这个差值才是本周期内新增的产量。这样做最大的好处是:换班归档时根本不需要跟HSC清零较劲,当班量、归档、历史记录全部在统计程序内部闭环处理,边界干净得多。

3. 产量统计程序的软件核心:数据保持、换班归档与时钟判断

3.1 数据存储结构:哪些变量必须掉电保持

程序结构上,我建议把产量统计相关的数据集中放在一个数据块里,不要散落在M区或临时变量里。一方面是方便HMI批量读写,另一方面是掉电保持设置可以一次性搞定。

下面是一个参考的数据结构,用类似SCL的伪代码表示:

// 产量统计数据块(示意) ShiftNo: INT // 当前班次编号 ShiftStartDT: DTL // 班次开始时间 ShiftQty: DINT // 当班产量 TotalQty: DINT // 生产总量 ShiftRunTime: TIME // 当班累计运行时间 TotalRunTime: TIME // 累计运行时间 NoPulseCount: INT // 无脉冲计时(秒) HistoryQty: ARRAY[0..9] OF DINT // 最近10班历史产量 TargetQty: DINT // 班目标产量 ArchDone: BOOL // 换班归档完成标志

掉电保持是产量统计程序的生死线。变频器一断电,当班量数据全丢,这在现场是完全不能接受的。S7-200 SMART上,V区的断电保持范围要在系统块里手动设置,数据块变量并不默认保持;S7-1200/1500则是在DB属性里勾选“保持性”。保持区的取值原则就一条:凡是现场不希望丢失的,全部放进保持区,宁多勿少。

3.2 换班归档的核心逻辑与边界竞态处理

换班归档是整段程序里最容易出错的地方。我的设计思路是:程序每秒执行一次“读取HSC当前值、计算差值、累加到当班量”的动作,换班时刻到来时,把已经入账的当班量归档,而不是去操作HSC本身。

// 每秒调用一次的核心统计逻辑 ReadHSC(CurrentPulse); // 读取HSC当前值 DeltaPulse := CurrentPulse - LastPulse; // 本秒新增脉冲数 LastPulse := CurrentPulse; ShiftQty := ShiftQty + DeltaPulse; // 累加到当班产量 IF DeltaPulse > 0 THEN NoPulseCount := 0; ShiftRunTime := ShiftRunTime + 1; // 有脉冲认为本秒在运行 ELSE NoPulseCount := NoPulseCount + 1; END_IF; // 班次切换时刻的归档处理 IF NowMinutes = ShiftChangeMinutes AND NOT ArchDone THEN HistoryQty[0] := ShiftQty; // 当班量写入历史 FOR i := 9 DOWNTO 1 DO // 历史数组左移 HistoryQty[i] := HistoryQty[i-1]; END_FOR; TotalQty := TotalQty + ShiftQty; // 总量累加 ShiftQty := 0; // 当班量清零 ShiftNo := ShiftNo + 1; // 班次编号自增 ShiftStartDT := NowDT; // 更新班次开始时间 ArchDone := TRUE; // 标记本次归档完成 END_IF; IF NowMinutes <> ShiftChangeMinutes THEN ArchDone := FALSE; // 离开切换时刻后复位 END_IF;

我特意用了一个ArchDone标志来保证“同一个切换时刻只归档一次”,否则程序每个扫描周期都判断到“当前分钟数等于切换分钟数”,会把同一个班次的产量反复归档,总量直接翻几倍。这是新手特别容易踩的坑。

还有一个边界问题:换班瞬间刚好有产品通过,这个产量算旧班还是新班?我的规则是:本秒内已经读进HSC差值并累加进当班量的部分,全部算旧班;下一秒开始计入的,算新班。这个规则只要固定下来,跟车间管理口径达成一致,就不算bug。真正要禁止的是在HSC中断服务程序里直接累加当班量——中断和换班归档一旦发生竞态,数据错乱会非常难排查。

3.3 系统时钟读取与班次自动判断

班次判断依赖PLC的系统时钟。S7-200 SMART用READ_RTC指令读取实时时钟,S7-1200/1500用RD_LOC_T或RD_SYS_T。我通常是先把班次切换时刻做成HMI可配置的参数,比如白班06:00、夜班18:00,程序只需要把当前时间换算成“从0点开始的分钟数”(小时×60+分钟),再跟切换时刻的分钟数比较即可。

这里要提醒一句:PLC时钟长时间运行会有漂移,现场维护人员又经常忽略校准。我的做法是在HMI的管理员页面放一个“时间校准”入口,直接修改PLC系统时间。否则班次切换点越来越偏,生产数据跟考勤记录对不上,早晚会有人来找你。

4. HMI交互设计:数据显示、权限管理与报警提示

4.1 画面布局:当班量放最大,总量放辅助

触摸屏画面的布局不能想当然。我在第一个版本里把“生产总量”做成了大数字居中,结果车间主任看了一圈说“我要的是当班量,总量一个月才看一次”。后来重新设计:顶部用特大字号显示当班产量,这是操作工最关心的实时数字;中部是生产总量、班目标产量和达成率;下方才是运行时间、停线时间这些时间参数。

这个布局逻辑来自现场使用习惯——操作工和管理人员盯屏幕的时间很短,要保证他们扫一眼就能回答“现在干了多少、离目标还差多少”。速度参数也放这里,方便他们判断当前产线状态是否正常。

4.2 防止操作员误清零的权限设计

权限管理是拿教训换来的。我见过有人把清零按钮直接放在主画面上,结果一次误触让整个车间当班产量作废。现在的做法是三层权限:操作员登录后只能看数据;班长可以手动触发换班归档、修正当班量;管理员才能清零或修正总量。清零操作必须二次确认,我习惯做成“按住3秒才生效”的按钮,比弹窗确认更能防止误触。

另外,产量修正值我会单独记录。触摸屏上每一次对总量或当班量的修改,都写入修正记录变量,包含修改时间、修正前后的数值、操作者账号。有了这层记录,任何数据争议都能回溯,省去很多扯皮。

4.3 停线超时与低效报警

产量统计程序不该只是“默默记数”,它应该能主动暴露问题。我加了两个实用报警:一是停线超时报警,无脉冲信号累计超过设定时间(比如10分钟)就触发,提示现场人员处理;二是低效报警,单位时间内的产量增量低于设定下限时提醒,这种情况通常是设备慢转、频繁启停或者前道工序缺料造成的。

班次切换提醒也很实用。我一般在切换前5分钟在HMI上弹提示,让车间提前做好交接准备。到点后程序自动归档,班长不需要任何操作,既省事又避免人为遗忘。

5. 现场调试实录:五个常见的坑与完整排查链路

5.1 计数多计漏计的排查顺序

现场最常见的故障是“产量数字不对”。我把它拆成一张排查表,按顺序检查,能省大量时间:

现象常见原因排查步骤
多计传感器反射、产品抖动、信号干扰先看屏蔽接地点,再观察I/O点闪烁频率是否与实物一致
漏计脉冲过窄、传感器响应时间太长确认是否接到HSC通道,检查传感器响应频率
数字跳变供电电压波动、接地不良单独供电,检查24V电源稳定性
完全没有计数接线错误、NPN/PNP不匹配用万用表量传感器输出端,确认信号有无

排查的核心思路是先分“硬件问题”还是“软件问题”。我会先把PLC在线监控打开,盯着输入点的闪烁——如果输入点闪烁跟实际产品过料完全对不上,那问题就在传感器、接线或干扰,不用急着改程序。只有输入点信号是对的、而统计数字还是不对,才需要回头看HSC和程序的逻辑。

5.2 换班瞬间产量归属:一个容易被忽略的竞态

有次现场反馈“换班后总产量少了一件”,查了半天,根因是旧版程序在HSC中断里直接累加当班量,而换班归档恰好在中断触发间隙执行,那一个脉冲就“消失”了。后来我把统计逻辑改成“周期读差值、换班时归档已入账部分”之后,这个竞态就彻底消失了。

如果你的程序已经写好了,想检查有没有类似隐患,一个简单的办法是:人为把产品速度放慢到很低,在换班切点附近连续过几个产品,对比触摸屏上旧班产量、新班产量和总量三者之和是否等于实际过料数。三组数能对平,说明边界逻辑是可靠的。

5.3 下载程序把产量清空:保持区的两个禁忌

这个坑我印象最深。有一次改了触摸屏画面后在线下载组态,结果保持性数据全部被初始化,当班产量和总量一夜归零,而那天已经是月底结算的时候了。

TIA博途里,下载硬件组态通常会复位保持性数据;下载软件程序时,如果勾选了“初始化保持性数据”的选项,同样会把保持区清掉。S7-200 SMART也一样,系统块里断电保持范围的修改、程序下载过程中都可能影响V区保持值。我的习惯是:改动程序前先把手头数据抄下来或者导出,下载时看清楚选项,尽量选择“不初始化保持性数据”的模式。程序固化量产之后,就不要再频繁在线下载了,尤其是硬件组态部分。

5.4 现场干扰导致的脉冲异常处理

还有一个典型的现场场景:设备一启动变频器,产量计数就开始偶尔多几个、偶尔漏几个。这种干扰问题的排查链路是——先看信号电缆是否跟变频器输出线并行走线,是的话先分开;再确认屏蔽层是否单端接地,严禁两头都接地;然后看传感器供电是不是跟变频器共用一个开关电源,是的话就给传感器单独配一路24V。大多数情况下,这三步做完,干扰问题就解决了。

如果还不行,可以在PLC输入侧加光电隔离器或者RC吸收电路,但我建议先把前三个步骤做扎实,越简单的处理越可靠,不要在布线都没理顺的情况下急着上复杂硬件。

6. 最后再分享三个现场心得

第一,写程序之前先花半天跟车间把统计口径对清楚,这比多写一百行代码都值。当班量什么时候清零、总量谁能改、换班时间按考勤还是按实际交接,这些不确认清楚,程序注定返工。

第二,数据显示的“可读性”比功能本身更影响口碑。界面干干净净,当班量一目了然,操作工就会天天用;反过来,界面再花哨,关键数字找不到,再好的统计逻辑也没人买单。

第三,这套程序的价值不只是“记个数”,而是通过当班量、运行时间、实际节拍这些数据的对比,让车间能发现设备慢转、频繁启停、换料等待这些隐藏问题。产量统计做到最后,其实是帮管理者把产线效率的账算清楚。我在实际项目里最大的体会就是:把边界场景想周全、把现场的人性习惯考虑进去,这套系统才能真正在车间里站住脚,而不是变成一块“只有工程师看得懂”的屏幕。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进