车间主任问一句“这一班下来干出多少件”很多人第一反应是——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. 最后再分享三个现场心得第一写程序之前先花半天跟车间把统计口径对清楚这比多写一百行代码都值。当班量什么时候清零、总量谁能改、换班时间按考勤还是按实际交接这些不确认清楚程序注定返工。第二数据显示的“可读性”比功能本身更影响口碑。界面干干净净当班量一目了然操作工就会天天用反过来界面再花哨关键数字找不到再好的统计逻辑也没人买单。第三这套程序的价值不只是“记个数”而是通过当班量、运行时间、实际节拍这些数据的对比让车间能发现设备慢转、频繁启停、换料等待这些隐藏问题。产量统计做到最后其实是帮管理者把产线效率的账算清楚。我在实际项目里最大的体会就是把边界场景想周全、把现场的人性习惯考虑进去这套系统才能真正在车间里站住脚而不是变成一块“只有工程师看得懂”的屏幕。
阅读完成 · 觉得有帮助?