早上调完曝光和增益,图是干净了。可东西在流水线上跑,什么时候按快门又是另一门学问。
前年接手一个别人做了一半的项目,皮带线上检测瓶盖。原来的做法是光电传感器接 PLC,PLC 收到信号后走网络通讯告诉工控机,工控机软件再调相机拍一张。线速 1 m/s 左右,拍出来的瓶盖一会儿在视野左边,一会儿在右边,偶尔半个出了画面。算法那边一直在扩大搜索区域,越扩越慢。我拿时间戳一统计,从传感器动作到真正曝光,中间的时间在几毫秒到二十多毫秒之间乱跳。1 m/s 的速度,20 ms 就是 20 mm,视野一共才 60 mm。
后来把光电传感器的信号直接接到相机的触发输入上,当天就好了。这篇就聊触发:几种触发方式差在哪,时序怎么排,线怎么接,跟 PLC 怎么分工。
软触发、硬触发、编码器触发,差的是抖动
软触发就是软件发一条命令让相机拍。命令要经过 PLC 扫描、通讯、操作系统调度、驱动,每一环都有不确定的延时。工控机上跑的通用操作系统不是实时系统,偶尔卡个十几毫秒很正常。所以软触发适合东西停稳了再拍的场合,比如机械手把工件送到位、气缸夹紧之后再拍,晚几毫秒无所谓。
硬触发是传感器或者 PLC 的电信号直接进相机的 IO 口,由相机内部硬件响应,延时固定,抖动一般在微秒级。按 10 微秒的抖动算,1 m/s 下工件只差 0.01 mm,可以忽略。运动中拍照,硬触发是底线。
编码器触发是拿编码器的脉冲来触发,按位置拍而不是按时间拍。线扫相机基本都靠它,面阵相机做飞拍、长工件分段拍也常用。速度一波动,它的优势就出来了,后面单独算。
一次触发,相机里按这个顺序走
硬触发信号进来之后,相机内部大概是这么走的:先过光耦和输入滤波,再等一段触发延时,开始曝光,曝光结束后读出,然后通过接口往外传。
工件在图里的位置,看的是曝光中点那一刻。从传感器动作到曝光中点,工件走过的距离是:
Δx=v(tin+tdelay+texp2) \Delta x = v\left(t_{\mathrm{in}} + t_{\mathrm{delay}} + \frac{t_{\mathrm{exp}}}{2}\right)Δx=v(tin+tdelay+2texp)
tint_{\mathrm{in}}tin是光耦加滤波的延时。举个例子:光电传感器装在视野中心上游 30 mm,线速 500 mm/s,曝光 100 微秒,光耦加滤波按 20 微秒估。工件走到视野中心要 60 ms,触发延时就设成:
tdelay=30 mm500 mm/s−20 μs−50 μs=59930 μs t_{\mathrm{delay}} = \frac{30\ \mathrm{mm}}{500\ \mathrm{mm/s}} - 20\ \mu\mathrm{s} - 50\ \mu\mathrm{s} = 59930\ \mu\mathrm{s}tdelay=500mm/s30mm−20μs−50μs=59930μs
问题在于线速要是波动 ±5%,这 60 ms 里工件位置就会差出 ±1.5 mm。经验一:传感器离视野越近越好,延时越短,速度波动带来的位置误差越小。真要装得远,或者速度变化大,就该上编码器了。
另一个要盯的是读出。全局快门 CMOS 多数支持曝光和读出重叠,上一帧还在读出,下一帧就能开始曝光。假设读出要 20 ms、曝光 5 ms:不重叠的话一帧周期 25 ms,最多每秒 40 次;能重叠的话周期取两者里大的那个,20 ms,能到每秒 50 次。触发来得比这个快,相机就丢触发,而且往往不报错。大部分相机都有触发丢失的计数或事件,调试时打开看一眼。
编码器这边,线扫相机的行频要跟速度对上,每走一个像素拍一行。皮带 600 mm/s,物方像素 0.05 mm,行频就是 12 kHz,单行曝光不能超过 83.3 微秒。编码器装在周长 100 mm 的辊上,2000 线,四倍频后一圈 8000 个计数,每个计数 0.0125 mm,每 0.05 mm 拍一行就是 4 分频。这时编码器计数频率是 48 kHz,得确认相机或者中间的分频模块吃得下。
光耦输入:先分清 NPN 和 PNP
相机的触发输入几乎都是光耦隔离的,里面就是一颗发光二极管,电流从 Line+ 流进、Line− 流出,管子亮了就算一个有效电平。接线只要保证传感器导通时有电流按这个方向流过就行。
PNP 型传感器输出高电平:传感器输出接 Line+,Line− 接 0V。NPN 型传感器输出拉低:Line+ 接 +24V,传感器输出接 Line−。PLC 的晶体管输出口也一样,有 NPN 也有 PNP,接之前看清楚。我见得最多的错误就是型号搞反,二极管不亮,相机一张不拍,大家还以为相机坏了。
还有个电压问题。有些相机的输入口标的是 5V,现场全是 24V。假设内部限流电阻 470 Ω,二极管压降 1.2 V,5V 下电流约 8.1 mA;直接接 24V:
I=Vcc−VFRint+Rext=24−1.2470+0≈48.5 mA I = \frac{V_{cc} - V_F}{R_{\mathrm{int}} + R_{\mathrm{ext}}} = \frac{24 - 1.2}{470 + 0} \approx 48.5\ \mathrm{mA}I=Rint+RextVcc−VF=470+024−1.2≈48.5mA
是正常值的 6 倍,光耦扛不了多久。想把电流拉回 8 mA 左右,总电阻要 2.8 kΩ 上下,外面串一个 2.4 kΩ,电流约 7.9 mA,电阻上功耗 0.15 W,选 0.5 W 的留余量。这里只是演示怎么算,具体数以相机手册为准,现在不少相机的输入口本身就是宽压的,直接支持 24V。
经验二:触发线用屏蔽线,别跟伺服动力线、变频器线捆一起走,相机里的输入滤波时间开到几十微秒,能挡掉大部分毛刺。我碰到过一回误触发,传感器明明没信号,相机自己乱拍,查到头是触发线跟电机线走的同一个线槽。
跟 PLC 怎么配合
我常用的分工有这么几种。
传感器信号直接进相机触发,同时并一路给 PLC 计数。拍照不经过 PLC,时间最准;PLC 只管剔除和节拍。光耦输入电流不大,一个传感器带两路一般没问题,带不动可以加中间继电器隔一下,不过继电器有几毫秒的动作时间,只能给 PLC 那路用,不能给相机。
PLC 输出点去触发相机。这种接法 PLC 的扫描周期就是抖动,扫描周期 5 ms、线速 200 mm/s,位置会差出 1 mm。静止拍照没问题,运动拍照要用 PLC 的高速输出、中断或者位置比较输出。
飞拍和编码器场合,让 PLC 的高速计数器做位置比较,到点输出一个脉冲,同时触发相机和频闪光源。相机的曝光输出信号也可以直接接光源控制器,让光只在曝光那一下亮。早上说的加光不加增益,就是这么落地的。
结果回给 PLC 走 IO 也行、走通讯也行。经验三:一定要带帧号或者工件计数。触发、拍照、处理、剔除是四个异步的环节,中间丢一个触发、多拍一张,后面所有结果整体错一位,踢掉的全是好件。我现在每个项目都让相机帧计数、软件结果序号、PLC 计数三边对账,对不上直接报警,比事后翻图找原因省事太多。
触发和时序捋顺,相机这一段就差不多聊完了,接下来进镜头。
下篇聊工业镜头焦距怎么选:焦距、视场角和工作距离是什么关系,定焦和变焦在工业现场怎么取舍。