FalcoCV:视觉算法接上 PLC 之后,真正的工程才刚开始

FalcoCV:视觉算法接上 PLC 之后,真正的工程才刚开始:封面概念示意图
配图为概念示意。

工业视觉演示可以很顺畅:相机拍到零件,算法画出孔位,界面显示绿色 OK。生产线上还要回答别的问题。图像属于哪一件产品?检测结果是否过期?PLC 收到的是本次测量,还是断线前缓存的数值?一次写入超时之后,重新写入会不会让同一件产品被重复处理?

FalcoCV 将视觉工作流、测量、三维分析、HMI 和工业通信放在一个项目中。当前仓库文档给出了形状匹配、夹具坐标、孔洞统计和孔距测量的合成示例,以及多种 PLC 驱动和 Modbus TCP、OPC UA 通信能力。[1] 它适合作为视觉工位软件架构的观察样本,尤其适合研究算法与控制系统之间的接口。

从图像坐标走向零件坐标

假设一个支架在相机画面中发生平移和旋转,固定像素区域的测量工具就容易失效。常见处理方式是先定位零件,再把检测区域放进零件自身的坐标系。二维刚体变换可写为 (\mathbf x=R(\theta)\mathbf q+\mathbf t),其中 (\mathbf q) 是局部坐标,(\mathbf x) 是图像坐标。

这种结构能将“零件在哪里”和“零件是否合格”分开处理。形状匹配估计位置,后续工具在相对稳定的局部区域寻找孔洞、边缘或缺口。FalcoCV 示例采用的 fixture 思路,与这一工程组织方式相符。[1]

但像素孔距要变成毫米孔距,还需要标定。对于近平面工件,应结合畸变校正、成像几何和必要的平面变换;若高度变化明显,则要检查透视误差或使用适合的三维测量方案。一次定位成功并不会自动提供计量溯源。真实工位还应通过标准件、重复测量和不同位置测试建立测量不确定度。

FalcoCV:视觉算法接上 PLC 之后,真正的工程才刚开始:正文技术概念示意图
配图为概念示意。

视觉工作流必须有清楚的数据契约

DAG 的优势是把处理步骤组织成可观察的依赖关系。每个节点除输入和输出外,还应该明确坐标系、量纲、时间戳、有效性和异常语义。例如孔距节点输出的不应只是浮点数,还应能说明结果是否来自本次图像、单位是什么、定位置信度是否满足门限。

有些错误不适合硬塞进 OK/NG。未收到图像、定位失败和零件尺寸超差对应完全不同的处置。前两者可能需要重拍或人工确认,后者才属于完成检测后的质量判定。若把所有异常都转换成 NG,产线虽然能继续运行,却失去了诊断能力;若异常沿用上一次 OK,风险更大。

PLC 握手比写一个布尔量更重要

以下是一个建议的工位接口设计,并非 FalcoCV 的默认协议。由 PLC 发出检测请求及序号,视觉端受理后进入忙碌状态,完成计算后先提交测量值和结果序号,最后置结果有效;PLC 确认读取后再清理本次事务。

字段 方向 含义
request_id PLC → 视觉 本次检测序号
busy 视觉 → PLC 正在处理请求
result_id 视觉 → PLC 结果对应的请求
verdict 视觉 → PLC 合格、不合格或检测异常
distance_mm 视觉 → PLC 已标定孔距
result_valid 视觉 → PLC 本组结果完整且可使用
ack_id PLC → 视觉 已消费结果的序号

如果底层通信无法保证这些字段原子更新,可通过双缓冲、版本号或“先写内容、最后提交有效标记”的方式减少半更新读取。序号还应配合启动会话标识,避免进程重启后序号复用。

FalcoCV 的通信文档将标签质量分为 good、stale、bad 和 disabled。[2] 这一设计值得延伸到业务判断:值为 12.5 且质量为 stale,与一条新的有效测量值有完全不同的意义。PLC 接口、HMI 展示和日志系统都应保留这个差别。

用故障注入检验工位,而不只是用好图检验算法

仓库示例包含 14 张合成图片,可以帮助理解工作流,但不足以估计真实产线的误检漏检率。[1] 技术验证应继续加入曝光变化、反光、污渍、姿态扰动、运动模糊和真实缺陷样本,并按零件批次进行独立测试。

系统验证则需要故意制造断线、超时、重复触发、相机空帧、服务重启和 PLC 暂停。重点观察是否出现旧结果被重新判为有效、未完成请求丢失或同一请求被重复消费。性能指标也应记录从触发到结果可用的端到端延迟分布,而非只报告算法平均耗时。

部署前还应固定 Python、原生库、相机驱动和模型文件版本。当前文档对 Python 3.13 及平台依赖有明确要求,离线环境需要预置模型资源;协议服务的认证能力也要按当前文档核对。[1] 这些条件应进入部署清单,成为可重复交付的一部分。

这类项目可以先用于搭建可测量、可注入故障的参考工位。把图像、测量、协议和日志连成可追溯链条之后,才有条件判断哪些模块可以保留,哪些需要替换成企业已经验证过的组件。

参考资料

[1] FalcoCV 当前主分支说明:https://github.com/jaesc/falcocv
[2] 通信运行时文档:https://github.com/jaesc/falcocv/blob/main/docs/COMMS.md
[3] 用户提供的版本入口:https://github.com/jaesc/falcocv/releases/tag/v1.1.0
本文依据主分支文档讨论架构,不将其中全部细节追溯为 v1.1.0 的确定能力。

分享到