PLC在线宽度检测与分拣系统实战:从传感器选型到程序实现
2026/9/17 16:15:29 网站建设 项目流程

现场做过 PLC 在线检测项目的人都知道,所谓的“宽度对比”看起来不难——无非是把测得宽度和设定范围做一次比较,再给出合格或者不合格的信号。但真正落地时会发现,难的根本不是那条比较指令,而是你怎么把“宽度”这个物理量稳定、可靠、重复地读进 PLC。传送带速度波动、瓶体抖动、光电信号毛刺、模拟量零点漂移,任何一项处理不好,都会让判定结果来回跳。这篇文章就以我最近做的一条瓶子在线宽度检测与分拣线为例,把方案选型、IO 分配、测量算法、程序框架、现场调试和典型故障从头到尾梳理一遍,给正在做类似 PLC 项目的朋友一个可以直接抄作业的参考。

这套系统用西门子 S7-1200 做主控,配合对射传感器测位置、模拟量激光测距仪测宽度,通过气缸把超差品剔除,HMI 上实时显示当前宽度、统计合格率。整个项目最大的心得是:宽度对比不只是“比较”,本质上是“位置测量 + 时间窗滤波 + 行程转换 + 量程标定 + 分拣时序”的组合,任何一环松了,结果都不对。

1. 项目核心思路与测宽方案选型

1.1 应用场景与需求拆解

先交代一下现场条件。被检测的物体是直径 30~60mm、高度 80~120mm 的塑料瓶,产线速度 30m/min 左右,节拍约 1800 件/小时。要求对每个经过检测位的瓶体测量最大外径,与预设上限、下限比较,超出范围的瓶子由后段气缸踢出。

这个需求里有几个隐藏条件需要注意:一是瓶体在传送带上不是静止的,测量必须在动态中完成;二是瓶身可能有标签、把手等不规则特征,如果直接用对射信号边缘计算宽度,很容易把标签的凸起也当成瓶体宽度;三是产线启动、停止阶段传送带速度有波动,测量结果不能因为速度波动出现系统性偏差。也就是说,真正要设计的不是“宽度比较”本身,而是“动态宽度测量系统”。

1.2 测宽方案对比:为什么我选了模拟量激光测距

宽度测量常见有四种做法,我列个对比表:

方案测量方式精度响应速度抗干扰成本适用场景
接近开关/对射开关开关量边缘捕获低,受响应时间限制只判断有无、不测尺寸
编码器+对射开关位置差换算宽度中高,依赖编码器精度较好适合规则物体动态测宽
模拟量激光测距连续距离信号中快中高适合透明/异形/需要连续轮廓
视觉相机图像像素测量视相机和处理时间受光照影响需要同时测多个尺寸、形状判断

我们最终选了“对射开关 + 模拟量激光测距”的组合方案。先说为什么不用纯编码器方案:瓶体是塑料材质,部分瓶身半透明,对射传感器可能穿透,导致边缘触发不稳定;而且不同瓶子直径跨度太大,编码器方案要求物体边缘整齐、速度恒定,现场传送带频繁启停,误差难以控制。

模拟量激光测距的好处是能够直接读出一个连续的距离值,瓶体经过激光下方时,距离值先变小后变大,这就形成了一个类似“凹槽脉冲”的波形,PLC 采集这个波形的最小值,反推瓶体外径。这种方式不依赖传送带速度,因为读的是距离而不是时间,速度波动只影响采样点数,不影响测量结果本身。

1.3 系统总体架构

整套系统的硬件拓扑并不复杂:传送带由变频器驱动,瓶体从上游流入,经过激光测距传感器下方时完成扫描测量,接着到达分拣工位,不合格品被气缸横向推出,合格品继续流向下一工序。控制系统以 S7-1200 CPU 为核心,数字量输入接对射传感器、气缸磁性开关、启停按钮,模拟量输入接激光测距传感器的 4-20mA 信号,数字量输出接分拣电磁阀、报警灯和变频器启停信号,HMI 通过以太网与 PLC 通信,显示实时宽度曲线和统计数据。

这个架构里有个容易被忽略的点:激光测距传感器的光斑必须和瓶体中心线对齐,否则测出来的不是外径,而是某个弦长,数值会系统性偏小。安装时我用了一个可调支架,让激光光斑对准传送带中心线,并在水平方向做了刻度标记,方便快速标定。

2. 硬件选型与 IO 分配细节

2.1 PLC、传感器与执行元件选型

PLC 选的是 S7-1200 CPU 1214C DC/DC/DC,主要看中它本体自带 14 路数字量输入、10 路数字量输出和 2 路模拟量输入,这种规模的小项目不用加扩展模块,接线少、故障点也少。AI 模块倒是没用本体集成的,因为我需要单独的 4-20mA 输入通道做激光测距信号,本体 AI 足够,但要注意输入范围通过硬件组态选择 0-20mA 还是 4-20mA,这一点很多人会漏,默认是 0-20mA 的话 4mA 会被当成 20% 量程,导致初始距离就是错的。

传感器方面:对射传感器用欧姆龙 E3Z-T61,检测距离 15m,响应时间 1ms,足够覆盖传送带宽度;激光测距用基恩士 IL-100 加上专用的模拟量输出单元,输出 4-20mA,量程 100mm,线性精度 ±0.1mm,采样周期约 1ms。这里提一句,IL 系列的模拟量输出默认是 4-20mA 还是 0-10V 取决于接线和设置,务必以实际量程标定后为准。

执行元件用 SMC 的薄型气缸配合电磁阀,气缸行程 50mm,推出力约 30N,对塑料瓶完全够用。气缸上装了磁性开关,用于确认气缸是否到位,避免电磁阀得电但气缸没动的隐性故障无法被程序感知。

2.2 IO 分配表与接线要点

这是我项目里的 IO 分配表,供参考:

PLC 地址信号说明类型备注
I0.0启动按钮DI常开
I0.1停止按钮DI常开
I0.2来料检测对射传感器DI有料为 ON
I0.3分拣气缸伸出到位DI磁开关
I0.4分拣气缸缩回到位DI磁开关
AI0激光测距 4-20mAAI量程对应 30~90mm
Q0.0传送带变频器启动DO继电器输出
Q0.1分拣电磁阀DO24V 驱动先导阀
Q0.2三色报警灯-绿灯DO正常
Q0.3三色报警灯-红灯DO超差/故障
Q0.4剔除计数输出DO可接计数器

接线方面有几个实操经验:所有 24V 传感器必须用同一路开关电源供电,不要和电磁阀共用电源,否则气缸动作瞬间电压跌落会让模拟量读数跳动;对射传感器的信号线建议使用双绞屏蔽线,屏蔽层单端接地;模拟量信号线尽量远离变频器输出线,至少保持 20cm 间距,不行的话走镀锌管。这些是老生常谈,但现场 90% 的信号不稳定问题都出在接线上。

2.3 速度变化对测量结果的影响分析

模拟量方案理论上不依赖速度,但实际操作中速度会影响采样密度和边缘触发质量。传送带 30m/min 时,瓶子经过 1ms 采样完成的移动距离约 0.5mm,也就是说激光测距在瓶身上能采到几十个点,足够还原宽度轮廓。但如果速度提到 60m/min,同样的 1ms 采样周期,空间分辨率就变成 1mm,对于一些窄瓶口或小凸起,可能恰好漏采,测量值偏小。

更隐蔽的问题是传送带启动瞬间的“打滑”。实测发现,变频器从 0Hz 加速到 30Hz 的过程中,瓶体与传送带之间存在微小滑动,如果这时候瓶子正好进入测量区,激光测距采到的轮廓会被拉长,最小值倒是还准,但前后沿位置会漂。我的处理办法是在组态里设定“速度稳定延时”,即变频器启动 2 秒后才允许进入检测状态,避免启停阶段测量。

3. 宽度测量算法与 PLC 程序实现

3.1 测量触发的上升沿处理与自保持

程序的第一步是判断瓶子是否进入测量区。我用了两个信号配合:来料对射传感器 I0.2 检测是否有瓶子到达等待区,同时激光测距 AI 值也参与判断。实际逻辑是:当 I0.2 从 0 变 1 时,触发一个上升沿,程序开始把激光测距值存入“当前宽度采集缓冲区”,并在一个 M 变量里置位“测量中”标志。

这里要特别注意上升沿的扫描周期问题。S7-1200 的扫描周期默认可能到 10ms 甚至更长,如果程序里只靠梯形图的上升沿指令捕捉 1ms 级的传感器变化,大概率会丢脉冲。我的处理方式是在 OB1 里调用一个“快速采集中断组织块”,把模拟量读数放到循环中断 OB30 中,设置中断周期为 5ms,这样即使主程序扫描比较慢,AI 采样也不会丢。

简单说,扫描周期与采样周期的关系:主循环负责逻辑处理和输出,中断块负责数据采集。你可以在 TIA Portal 的“程序块”下新建 OB30,设置循环时间 5ms,在 OB30 里读取 AI0 通道值并存储到共享 DB。这样宽度测量不依赖 OB1 扫描快慢,结果更稳定。

3.2 最小值滤波与异常点剔除

激光测距读出来的是一个 0~27648 的整数(12 位分辨率)。我做了两层处理:第一层是 4mA 到 20mA 对应的工程量转换,公式很简单:

实际距离 = (通道值 – 偏移量) × 量程跨度 / 27648 + 量程下限

其中偏移量是 4mA 在 0~20mA 模式下对应的 5530。量程下限对应 30mm,量程上限对应 90mm。这里要注意,计算建议用双整数转浮点(LDI / DTR),否则整数相除直接丢尾数。

第二层是采集窗口内的最小值判断。瓶子通过激光下方时,激光到传送带台面的距离是一个“背景值”,例如 110mm;瓶体经过时距离变小,最小值大约在 50mm 左右。把“背景值减去最小值”就得到了瓶体宽度。为了防止瞬时干扰造成误判,我在 OB30 里做了一个“滑动最小值”逻辑:连续读 5 个值,取最小,如果下一个值比当前最小值小 10 以上,则强制认为该值是干扰,丢弃。这个 10mm 的阈值我调了多次,太小平常震动也能触发,太大又滤不掉真正的毛刺。

3.3 工程单位换算与量程标定

量程标定是最容易出问题的地方,因为激光测距仪出厂标定好的 4-20mA 对应 30-90mm,但实际安装高度、角度会改变零点。我现场的做法是:把标准量块(30mm、45mm、60mm、75mm、90mm 共 5 块)分别放到激光正下方,记录对应的 AI 原始值,然后在 HMI 里做两点线性标定,走一遍最小二乘法拟合。实际发现标定后的最大误差在 ±0.3mm 以内,这对于外径公差 ±1mm 的应用足够了。

直线标定的好处是:你不需要知道传感器内部零点的具体位置,只需要记录“实测标准值”和“PLC 读取值”的对应关系,PLC 内部按比例换算即可。公式我写在 SCL 里,大致逻辑如下:

#rawValue := INT_TO_REAL(#aiChannelValue); #distance := #rawValue / 27648.0 * (#spanMax - #spanMin) + #spanMin; #bottleWidth := #backgroundRef - #distance;

其中#spanMax#spanMin是标定后的距离量程,#backgroundRef是空带状态下测量的背景距离值。注意背景值不是固定常量,应该每隔一段时间自动刷新一次,因为传送带表面如果有水渍或磨损,背景距离会缓慢变化。我写了一个定时刷新逻辑,每 10 分钟在没有瓶子经过时重新读一次背景值。

3.4 范围比较与分拣剔除时序

测得宽度之后,把它与设定上下限进行比较。这一步本身没有难度,难点在于“什么时候判定、什么时候剔除”。如果瓶子还没完全离开测量区就判定,宽度值可能是中间某一个截面,不是最大外径;如果气缸动作太早,可能瓶子还没走到剔除位就复位了。

程序里我用了三段时间窗配合:测量窗、延时定位窗、剔除窗。瓶子中心离开激光位置后,程序记录“测量完成标志”;瓶子继续前进,经过一个固定延时,到达剔除气缸前方时,程序判断该瓶是否不合格;不合格则置位剔除指令,气缸伸出 300ms 再缩回,之后复位剔除指令。这个延时是通过传送带速度标定出来的,单位是毫秒,实际上就是在模拟“瓶子从激光到气缸的行走时间”。

建议把剔除延时做成一等份可调参数放在 HMI 上,因为传送带速度在长时间运行后会因皮带打滑而略有变化,固定的延时早晚会偏。给操作人员一个可调旋钮,比每次拿电脑改程序方便得多。

3.5 用状态机组织程序,顺带聊聊 AI 辅助写 PLC 代码

程序框架我用的是典型的三段式状态机:空闲、测量、剔除。每个状态里处理各自的任务,状态切换条件写清楚,逻辑层次比一个大网络里的堆叠式梯形图清晰得多。

现在网上关于“AI 生成 PLC 代码”的讨论很多,我也试过用自然语言描述需求让 AI 生成 SCL 框架,确实能减少一部分重复工作,特别是模拟量转换、数组轮转、比较排序这类功能。但 AI 生成代码最大的问题是它不了解你现场的 IO 映射和传感器特性,生成出来的逻辑只能做骨架参考,直接下装到 PLC 前必须人工逐行审。我的经验是:让 AI 先生成逻辑伪代码,你再把它翻译成梯形图或 SCL,同时补上互锁、超时、报警这些现场必须的“工业安全感”内容,这样效率最高也不会翻车。

4. 实操过程与调试记录

4.1 TIA Portal 环境下的硬件组态与仿真验证

项目用的软件是 TIA Portal V17。新建设备时选择 CPU 1214C DC/DC/DC,固件版本 V4.5。硬件组态里重点检查的是 AI 通道配置:右键 AI0 通道,在属性里把测量类型改为“电流”,测量范围改为“4-20mA”,积分时间按默认。如果不改这一项,PLC 读到的值会很离谱,这是新手踩坑率极高的地方。

程序写完后,我用 PLCSIM 做了一轮仿真。仿真时给 AI 通道赋一个模拟值,比如 13824(对应 12mA),检查工程量转换结果是否正确;再用一个定时器模拟来料信号,观察状态机是否正常切换。这里说句实话,仿真验证不了现场干扰和机械抖动,但能把程序层面的逻辑漏洞揪出来,比如状态卡死、延时参数遗落、互锁缺失。建议至少跑 30 分钟连续仿真再上真机。

4.2 现场调试步骤与参数整定记录

现场调试我按四条线展开:传感器标定、测量值验证、剔除逻辑联调、整线稳定性测试。

传感器标定先做。把激光测距仪装上支架,调整高度和角度,让激光垂直打在传送带中心线上,用水平尺确认。然后放 60mm 标准量块,在 PLC 监控表里看 AI 通道原始值是否稳定。我最初遇到的问题是数值波动有 ±15 个 LSB,换算成距离约 ±0.5mm,明显偏大。排查后确认是开关电源和电磁阀共地造成的干扰,把传感器供电改为独立 24V 电源后,波动降到 ±3 个 LSB。

测量值验证环节,我把 5 个标准量块分别连续测 20 次,记录 PLC 显示的宽度值与实际量块的差值,做了一组简单统计。结果显示 45mm 量块显示 45.1~45.3mm,90mm 量块显示 89.7~90.2mm,偏差都在公差范围内。有一个量块固定纵向放置时显示偏小 0.8mm,后来发现是瓶子倾斜导致的激光反射路径偏移,属于安装问题,把定位导条调紧后恢复正常。

剔除逻辑联调时遇到一个有意思的问题:气缸有时推空,有时推迟。用高速计数器采集瓶子经过激光传感器的时刻和气缸磁性开关的动作时刻,发现气缸从电磁阀得电到完全伸出需要大约 260ms,而我在程序里用固定延时 220ms 就触发了剔除,等于动作做了一半瓶子还没到。解决方法是把气缸动作时间 260ms 也纳入剔除延时公式里,并且给电磁阀输出加了 400ms 最小保持时间,避免气缸动作中途断电反弹。

4.3 模拟量信号抖动与数字滤波参数选择

模拟量信号抖动是这种项目里最磨人的问题。我最后用了复合滤波策略:中断块里做 5 点滑动最小滤波,主程序里再做一阶惯性滤波,惯性时间常数 α 设为 0.3。所谓一阶惯性滤波公式是:

当前滤波值 = 上一次滤波值 × (1 - α) + 本次测量值 × α

α 太小则响应慢,瓶子快速经过时测出来的最小值会被“拉高”;α 太大则滤波不干净。0.3 是在 60mm 量块实测下来选了比较折中的值。关键是滤波不能太激进,否则真实的最小值被平滑掉,宽度测量结果会系统性偏小。

数字滤波参数需要现场配合验证,不能照搬。调试时可以先用很小的 α 跑一遍,记录宽度值;再逐步加大,观察稳定性变化。两者同样稳定时优先选响应快的参数。

5. 常见问题与排查技巧实录

5.1 测量值跳变问题

故障现象:瓶子宽度偶尔显示 80mm,正常应该是 60mm,出现频率不高但很随机。

排查过程:先看传感器原始 AI 值,发现跳变的瞬间 AI 值确实有一个异常的尖峰,说明不是 PLC 程序问题,而是信号源本身受干扰。用示波器观察激光测距仪输出端,发现真空电磁阀动作时线上有毛刺。最终处理:模拟量信号线换成双绞屏蔽线并单端接地,传感器电源独立,跳变彻底消失。

这类问题在自动化现场非常典型,排查顺序应该是:源头传感器 → 信号线缆 → PLC 通道 → 程序逻辑,不能一上来就怀疑程序。

5.2 计数偏差问题

故障现象:实际剔除 10 个瓶子,PLC 里计数只有 8 个。

排查过程:一开始觉得是计数器指令写错,后来发现是气缸剔除把瓶子推落到收集箱时,瓶子反弹回传送带,又被来料对射传感器检测一次,计入了下一次计数。解决方法是把剔除完成信号作为计数使能,并且在剔除后加 500ms 的封锁时间,防止计数翻倍。

这种问题属于机械与逻辑的耦合,程序上能解决一部分,但治本还是要靠机械挡板。

5.3 透明瓶测量异常

故障现象:透明瓶经过时,激光测距偶尔读不到距离,宽度显示为 0 或突然变成背景值。

原因分析:透明瓶体对激光是透射而不是反射,激光打到瓶身上很可能直接穿透,传感器收到的是背景台面的回波,测量自然失效。这对所有基于光学反射原理的传感器都一样。

处理方案:一是改用对射式测量或超声波传感器,二是调整角度让激光倾斜照射瓶体边缘,三是给瓶体后端加一块浅色背板,让透射的激光被背板漫反射回来一部分。我们现场用第三种方案简单有效,成本也低,但要注意背板的脏污会直接影响精度,需要定期清洁。

5.4 模拟量超限与传感器故障报警

我在 HMI 画面上做了三色灯和报警列表。当 AI 值小于 3.6mA 或大于 20.5mA 时,判断回路断线或短路,触发“传感器异常”报警,程序自动把分拣气缸禁止动作,避免在测量无效时误判。这是很多小项目容易漏掉的一点——传感器故障时,PLC 会读到固定低值或高值,如果程序不判断超限,就会把所有瓶子都判定为不合格,整线瘫痪。

5.5 快速故障排查速查表

现象可能原因检查顺序
宽度跳动电源干扰、接线不良、滤波不足电源/线缆 → AI原始值 → 滤波参数
宽度偏小激光未对准中心、瓶子倾斜、滤波过度机械安装 → 标定块验证 → 滤波参数
宽度偏大背景值未刷新、测量窗含下一瓶背景值校准 → 时序参数
计数偏少计数使能错误、剔除反弹程序逻辑 → 机械防反弹
透明瓶无法测量光学透射背板/测距方式
气缸偶发呆滞气源压力不足、电磁阀响应慢气路压力 → 电磁阀动作时间

6. 防呆设计与项目扩展方向

6.1 互锁与安全逻辑

防呆设计上我加了几个关键互锁:气缸未缩回到位不允许进料,防止推杆把下一个瓶子撞飞;传送带变频器未运行时不进行宽度测量,避免瓶堆堵料时的误测量;剔除指令与人工复位互锁,报警未消除前不允许自动重启。这些互锁多写不了几行程序,但对产线稳定性的提升非常明显。

另外,程序里所有关键延时参数都放在独立 DB 里,并加了默认值初始化逻辑。就算 HMI 上被误操作改了参数,重启后也能自动恢复,这个细节是以前被现场工人改坏过参数后才想到的。

6.2 从单工位扩展到多工位宽度对比

如果后续要做多工位并行检测,比如同一台 PLC 控制两条传送带,每个工位都要测宽和剔除,我建议不要把当前程序复制两份,而是把测量、判定、剔除封装成一个 FC,配合多重背景或全局 DB 数据块,实现代码复用。西门子的多重实例功能就是干这个的:在不同背景里分别存放传感器地址、气缸输出地址和测量结果,FC 内部逻辑可以原样复用。

每新增一个工位,只需要实例化一个 FC 背景,再分配对应的 IO 地址和 HMI 画面,不用改动核心算法。这样维护起来干净很多,也符合 PLC 工程模块化的基本思路。

6.3 与变频器、视觉、机器人等设备的通信扩展

有朋友问我这套系统能不能接变频器或机器人。完全可以。宽度测量结果如果作为后续工艺的输入条件,可以通过 Profinet 把数据块同步给变频器,实现根据瓶子宽度自动调节传送带速度;也可以把合格/不合格信号通过总线发给机器人,让机器人做分拣而不是气缸。

我建议在项目规划阶段就把通信接口预留出来。S7-1200 单机运行和走 Profinet 通信差别不大,只是需要额外组态 GSD 文件或设置智能从站。如果对接的是 ABB 或三菱机器人,一般走总线协议或者简单 IO 硬接线都能实现,关键是定义好字节含义,比如第 0 字节存宽度,第 1 字节存状态,两侧程序按这个约定解析即可。

从我个人经验来说,宽度对比这个功能本身没有什么高深数学,真正决定项目成败的往往是一些“项目之外”的事:传感器安装角度、屏蔽线接地、量程标定、剔除时序匹配、报警超限判断。程序逻辑写得再好,信号源头不稳定,一切都是白搭。所以如果你正准备做类似项目,先把硬件和信号处理想清楚,再动手写程序,能少走很多弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询