
现场做过 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有料为 ONI0.3分拣气缸伸出到位DI磁开关I0.4分拣气缸缩回到位DI磁开关AI0激光测距 4-20mAAI量程对应 30~90mmQ0.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.3mm90mm 量块显示 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 字节存状态两侧程序按这个约定解析即可。从我个人经验来说宽度对比这个功能本身没有什么高深数学真正决定项目成败的往往是一些“项目之外”的事传感器安装角度、屏蔽线接地、量程标定、剔除时序匹配、报警超限判断。程序逻辑写得再好信号源头不稳定一切都是白搭。所以如果你正准备做类似项目先把硬件和信号处理想清楚再动手写程序能少走很多弯路。