干机器视觉集成的朋友,几乎都会遇到同一个问题:视觉系统怎么跟产线上的 PLC 对接?更准确地说,从相机、镜头、光源,到一台嵌入式工控机,再到西门子、三菱或者汇川的 PLC,这条链路到底怎么选型、怎么配通信、怎么调通?我这两年经手了好几个非标项目,从光伏检测到 3C 装配都有,基本套路是相通的。这篇文章就把我踩过的坑和验证过的做法完整梳理一遍,给准备上手或者正在被现场问题折磨的同行一个参考。
先说结论:这条链路的核心节点就四个——相机负责取像,嵌入式工控机负责跑视觉算法和通信转换,PLC 负责逻辑控制和机构执行,中间靠网线和协议把数据串联起来。整体看起来不复杂,但真正落地的时候,光一个触发时序就能让人在现场耗掉一整天。下面我按实际部署的顺序,把每一步的选型、连接、调试讲清楚。
1. 先理清楚整条链路:相机、工控机与 PLC 各干各的什么活
1.1 这套系统解决什么问题
产线视觉检测的本质,是把"人眼判断"变成"算法判断"。比如一个零件上有无划痕、尺寸是否超差、二维码能不能读到、装配方向对不对,这些任务交给视觉系统后,需要有一个明确的输出:合格还是不合格,偏差量是多少,或者一个坐标偏移值。而这个输出必须能被 PLC 读走,PLC 再决定让不让下一道工序继续。如果视觉系统只是自己看看、存个图,不跟 PLC 打通,那它在产线上就没有实际意义。
所以整套链路的设计目标很明确:相机采集图像 → 工控机处理 → 结果写给 PLC → PLC 执行动作。这个闭环里,每一环的响应时间都要卡在节拍以内。比如产线节拍是 2 秒一件,那么从触发相机到 PLC 收到结果,整个过程最好控制在 300 毫秒以内,剩下 1.7 秒留给机构动作。这是我做方案时首先要跟机械和电气同事对齐的指标,因为这个时间决定了相机帧率、工控机性能和通信方式的选择。
1.2 链路里每个节点的角色
把这条链路拆开看,每个节点都有自己的"本职工作",不能混为一谈。
相机端:负责把物理世界的光信号转成数字图像。它本身不带算法,只是输出图像数据。常见的接口有 GigE Vision(网口)、USB3 Vision、Camera Link 等。产线上用的最多的还是 GigE,因为线缆可以做到 20 米甚至更长,而且工业相机普遍支持硬件触发,能跟传感器和 PLC 的输出信号精确对齐。
嵌入式工控机:这是整套系统的"大脑"。它跑视觉软件(比如 Halcon、VisionPro、OpenCV,或者用 LabVIEW 配合视觉模块做检测),把图像分析成结果,同时充当通信桥梁,把结果转换成 PLC 能读的协议数据。之所以强调"嵌入式"而不是普通台式机,是因为产线环境往往有震动、高温、粉尘,而且空间有限,普通 PC 电源不稳定、风扇容易堵死,故障率会很高。
PLC:它负责产线逻辑和机构动作。视觉系统给它的通常是一个或几个数据——比如"OK/NG"状态、测量数值、坐标偏移。PLC 拿到这些数据后,要么直接控制气缸或伺服执行分选,要么把数据转发给机器人或上位 MES 系统。
中间通信层:这是最容易出问题也最容易被忽略的部分。通信选型决定了数据怎么从工控机"跑"到 PLC。现场用得最多的协议是 Modbus TCP、S7 协议(西门子)、MC 协议(三菱)、OPC UA,以及一些国产 PLC 的私有协议。后面我会详细对比。
2. 选型与硬件连接:从镜头到控制柜的一整套方案
2.1 相机与光源的选择,不是分辨率越高越好
相机选型第一步是算分辨率。假设你要检测一个 30mm×20mm 的零件,需要识别的最小缺陷是 0.1mm,那么视野内至少要有 2~3 个像素去覆盖这个缺陷,也就是说分辨率的短边至少是 20mm / 0.1mm × 2 = 400 像素,实际我通常会留 3 倍余量,选 500 万像素级别的相机。别一上来就上 1200 万像素,分辨率高了数据量大,工控机处理压力大,帧率也上不去,反而拖慢节拍。
帧率方面,如果节拍是 2 秒一件,常规区域曝光相机 30fps 就完全够用。但如果是流水线不停顿地连续检测,比如瓶子在传送带上以每秒 500mm 的速度跑,那就得考虑线阵相机或者频闪光源配合面阵相机做动态抓拍,否则图像会拖影。
光源的选型比很多人想的更重要。背光源适合轮廓尺寸测量,环形光源适合字符和外观检测,同轴光源适合高反射平面。现场光源不匹配,再好的算法也救不回来。我习惯在实验室先用同款光源打样,把图像效果稳定下来,再谈后续。
2.2 嵌入式工控机的几个关键指标
这里我要展开说。嵌入式工控机不是随便买一台迷你主机就行的,产线场景有几个硬指标必须盯住:
无风扇设计:产线粉尘大,带风扇的机器几个月后风扇就被堵死,CPU 过热降频,导致视觉处理超时。无风扇的被动散热虽然性能上限低一些,但稳定性和免维护性才是产线的王道。
接口数量:至少要保证有两个千兆网口——一个接相机,一个接 PLC。如果相机数量超过两个或者用 PoE 供电的相机,就要选带 4 个千兆口的型号。另外至少要有 2~4 个串口(RS232/RS485),因为老设备比如变频器、电子秤、传感器可能只支持串口通讯。
扩展性和工业级选件:比如支持 9~36V 宽压 DC 输入,适应产线电压波动;支持固态硬盘而不是机械硬盘,避免震动导致坏道;最好带隔离的数字 I/O 接口,因为有些场景需要直接接收 PLC 的触发信号,光靠网络触发延迟和稳定性都不够。
我自己常用的配置是:Intel i5 或 i7 的低功耗版本、16GB 内存、256GB 固态硬盘、双千兆网口加两个串口。这个配置跑 Halcon 的单相机检测任务,处理时间一般在 30~80 毫秒,完全能跟上产线节拍。
2.3 PLC 的选型与接入方式
PLC 的选型多半是电气同事定的,视觉工程师要关心的是它支持哪些通信协议。西门子 S7-1200/1500 系列自带 S7 协议和 Modbus TCP,三菱 FX5U 支持 MC 协议和 Modbus TCP,台达、汇川等国产主流型号普遍支持 Modbus TCP。总的原则是:优先选支持 Modbus TCP 的 PLC,因为这个协议在几乎所有品牌上都有,且调试工具多、资料好找。
如果 PLC 只支持串口 Modbus RTU,也没问题,工控机上的串口直接转接就行。只是 RTU 的读写速度比 TCP 慢不少,数据量大的场合要多留些余量。还有一种情况是 PLC 用的是厂内私有协议,比如西门子早期 S7-200 的 PPI 协议、欧姆龙 Host Link,这类就需要在工控机上装对应的驱动库或者用一个协议转换网关,把私有协议转成 Modbus TCP 给视觉程序用。后面第 3 节我会细说怎么处理这些协议。
3. 通信协议与数据对接:让工控机跟 PLC "说上话"
3.1 Modbus TCP:最通用的"保底方案"
Modbus TCP 是我在大多数项目里的首选。原因很简单:几乎所有 PLC 都支持,而且协议结构清晰,一个请求包就能读写多个寄存器。视觉程序这边用 Socket 直接发 Modbus 报文,或者用现成的库(比如 C# 的 NModbus、Python 的 pymodbus),开发效率很高。
实际部署时,我一般会在 PLC 里专门划出一段保持寄存器区域给视觉结果用。比如:
- 40001:视觉 OK/NG 标志,0 表示 NG,1 表示 OK
- 40002~40003:测量的尺寸值或坐标值(32 位浮点数,占两个寄存器)
- 40004:视觉系统状态(空闲、检测中、出错)
PLC 侧的程序逻辑就是:先给视觉系统一个触发信号,然后等 40001 这个寄存器发生变化,再根据它的值去动作。PLC 的扫描周期一般在几毫秒到十几毫秒,所以从视觉写下结果到 PLC 读到,延迟最多也就几十毫秒,对绝大多数产线是够用的。
需要注意的是,不同的 PLC 对 Modbus 寄存器的地址映射规则不太一样。西门子 S7-200 SMART 的 Modbus 地址是从 VB 区映射的,汇川、台达的地址也可能有偏移,调试的时候一定要先用 Modbus 调试工具或者上位机读一遍确认,别想当然。我就遇到过在汇川 PLC 上写地址 40001 结果读到的是另一个数据区的值,白折腾了半小时。
3.2 OPC UA:当系统变复杂时的"高级选择"
如果现场不止一个 PLC,还有数控机床、机器人、传感器、MES 系统都要采集数据,那 Modbus TCP 一个个去读写就很累了。这时候引入 OPC UA 是更好的选择。OPC UA 的优势在于信息模型,它不只是传几个裸数值,而是把设备的数据组织成有结构的节点,哪怕是跨品牌设备也能统一访问。比如我在一个项目里就用 OPC UA 同时接了西门子 PLC、三菱机器人控制器和两台数控机床,里面的数据包括运行状态、报警代码、计数等,都走一个 OPC UA 服务器统一管理。
部署方式通常是在嵌入式工控机上装一个 OPC UA 服务器软件(比如 KEPServerEX,或者用开源方案实现),它负责跟各种设备通信,然后把数据暴露成 OPC UA 节点。视觉程序作为 OPC UA 客户端去读写这些节点。这样做的另一个好处是上层 MES 系统也可以直接通过 OPC UA 获取视觉检测统计,不需要视觉程序再额外开发接口。
OPC UA 的不便之处在于配置复杂,节点 ID、命名空间、安全证书这些概念对初学者不太友好。我第一次配 KEPServerEX 的时候,光是解决证书信任问题就花了一个多小时。但一旦跑通,后续加设备、看状态确实省心不少。如果你所在的产线属于自动化程度较高、设备种类多的场景,值得前期投入这个学习成本。
3.3 各品牌 PLC 的对接细节(西门子、三菱、汇川等)
这里把我在实际项目中验证过的对接方式列出来,方便参考:
| PLC 品牌/型号 | 推荐协议 | 注意事项 |
|---|---|---|
| 西门子 S7-1200/1500 | S7 协议(更推荐)或 Modbus TCP | S7 协议用第三方库时要设置正确的 Rack/Slot;Modbus TCP 需要在 PLC 里启用 Modbus 服务器 |
| 西门子 S7-200 SMART | Modbus TCP | 需要使用 "MBUS_SERVER" 指令初始化,地址映射基于 VB 区 |
| 三菱 FX5U / Q 系列 | MC 协议(更推荐)或 Modbus TCP | MC 协议需要知道 D 寄存器的地址编码规则 |
| 三菱 FX3U + 以太网模块 | 串口 Modbus RTU 或 MC 协议 | FX3U 本身没有网口,需要加装扩展模块 |
| 汇川 H系列/AM系列 | Modbus TCP / 私有协议 | AM 系列支持 OPC UA,但版本差异较大,注意固件兼容性 |
| 台达 / 信捷等国产 PLC | Modbus TCP | 地址映射与西门子不同,务必先用调试工具验证 |
一个非常实用的小技巧是:在工控机上装一个 Modbus 调试工具(比如 Modbus Poll),或者直接用 Python 写个几十行的测试脚本,先跟 PLC 把寄存器读写打通,再套上视觉程序。这样能把"通信问题"和"视觉问题"彻底隔离开,哪里出错一目了然。
4. 实操部署:从接线到跑通一个视觉定位/检测项目
4.1 硬件接线和网络拓扑
先画一个最标准的拓扑:一台 GigE 工业相机通过网线接到工控机的独立网口,工控机的另一个网口接交换机,交换机再接 PLC。如果相机是 PoE 供电的,交换机或者工控机网口要支持 PoE。PLC 放在控制柜里,通过以太网连到交换机。
需要注意网络规划。工控机上接相机的网口和接 PLC 的网口建议设置成两个不同网段,比如相机网段是 192.168.10.x,控制网段是 192.168.1.x。这样做有两个原因:一是避免 IP 冲突,相机厂商的工具软件经常会把相机 IP 固定在一个私有网段;二是隔离广播域,防止相机的大数据流量干扰 PLC 通信。很多人图省事把相机和 PLC 放在一个交换机一个网段里,我实测下来,视觉数据量大的时候,PLC 和 HMI 的连接很容易闪断。
触发信号的处理是另一个关键。如果产线有传感器可以指示"零件到位",最好的方案是用传感器的信号同时去硬触发相机和告知 PLC。相机如果是硬件触发,把传感器的 24V 信号经过光电隔离转换成相机的触发输入,这样可以做到微秒级的同步,图像里的零件位置是确定的,视觉算法不需要做复杂的搜索。如果只能用软件触发,也就是等 PLC 通过通信告诉工控机"该拍了",再由程序给相机发送触发命令,这样延迟会高一些,但胜在接线简单,适合对精度要求不高的场景。
4.2 相机触发、图像采集、结果下发的完整逻辑
在一套典型的视觉定位系统(比如给机器人做抓取引导)里,核心逻辑是这样一条链:
- 光电传感器检测到零件到位,输出一个 24V 脉冲。
- 该脉冲同时接入相机外触发口和 PLC 输入点。
- 相机立即曝光并采集图像,通过 GigE 网口传给工控机。
- 工控机上的视觉程序对图像做处理(找特征、算坐标、判断有无缺陷),耗时 50~200 毫秒。
- 处理完成后,程序把结果(坐标值、角度、OK/NG 标志)写入 PLC 指定的寄存器。
- PLC 收到结果后,将坐标数据通过现场总线发给机器人,或者直接驱动气缸动作。
- 产线进入下一个循环。
这里最容易被忽视的是时序余量。视觉处理时间不是固定的,受图像内容、光照波动的影响会有波动。所以我在写 PLC 程序时,通常会加一个"视觉结果超时判断"——如果在设定时间内(比如 1.5 秒)没收到视觉返回,PLC 就把这个工位判为异常,报警停机。不然视觉程序一旦卡死,PLC 可能一直在等一个永远不会来的结果,整个产线就堵住了。
4.3 在工控机上部署运行环境
嵌入式工控机上跑视觉程序的部署,有一个常见误区是直接在开发用的笔记本上装好程序,然后把整个软件目录考到工控机上就完事。工业现场远没有这么简单。我总结了几条部署注意事项:
系统精简:工控机建议装 Windows 10/11 专业版或 LTSC 版,关掉自动更新,否则产线运行到一半系统突然重启更新,那可是大事故。有些项目的 PLC 软件和视觉软件必须装在同一个工控机上,这时候要先装 PLC 软件再装视觉库,避免环境变量冲突。
视觉授权:Halcon、VisionPro 这类商业视觉库用的是加密狗或软授权,部署前一定要确认授权能被工控机识别。我踩过工控机 USB 口供电不足导致加密狗间歇性识别不到的坑,后来换了一个带独立供电的 USB Hub 才解决。
开机自启:工控机通常放在控制柜里,没有显示器,所以视觉程序必须做成开机自启动,并且要有看门狗机制。我的做法是写一个启动脚本,程序启动后在后台运行,如果崩溃或者长时间无响应,脚本自动重启它。PLC 那边也有对应的通信超时报警,双重保险。
网络固定:相机的 IP、工控机的 IP、PLC 的 IP,全部设成静态地址,并把这些记录到项目文档里。一定要注意保证相机 IP 和工控机 IP 被 Windows 识别成"专用网络",并且关闭相关防火墙规则,不然相机 SDK 搜不到设备是常有的事。
5. 现场调试常见的坑与排查记录
5.1 PLC 搜索不到 CPU,但直接在软件里填 IP 能连接上
这个现象我在项目里遇到不止一次,特别是西门子 S7-200 SMART 和博途平台。用户在编程软件的"搜索 CPU"功能里扫不到设备,但又确确实实知道设备的 IP 地址,填上 IP 以后反而能连上。
这类问题的根源,绝大多数是 PC 和 PLC 不在同一个网段,或者 PC 上没有配置匹配的静态 IP。搜索功能往往只开启网卡自动识别,如果 PC 用的是自动获取 IP,而 PLC 是固定的 192.168.1.10,PC 分到的可能是 192.168.10.x 这种不同网段的地址,自然搜不到。解决办法是手动把 PC 侧网卡 IP 改成和 PLC 同一网段,然后再重新搜索。
还有一个隐蔽原因是电脑装了多个网卡或者虚拟网卡(比如 VMware 的虚拟网卡),Windows 的路由表混乱,搜索广播包走错了网卡。这时候可以在网络适配器里禁用无关网卡,或者在连接时指定正确的本地连接。西门子 S7-200 SMART 的软件有时还跟 Windows 防火墙冲突,放行对应的端口就行。
5.2 相机频繁掉线或触发不上
相机掉线这个事,我把它分成两类:一类是软件层面频繁丢包掉线,一类是硬件触发完全触发不了。
软件层面掉线,先从网线、水晶头查起,产线震动环境下劣质网线是最先出问题的,我建议工业相机一律用带屏蔽的成品网线,不要自己压水晶头。其次是检查巨型帧(Jumbo Frame)设置,相机和工控机网卡都要开启并设置相同的 MTU 值,不匹配会导致大数据包被丢弃,图像传输不稳定。最后,如果用交换机级联,一定要用工业级交换机而不是几十块钱的家用交换机,保证带宽和稳定性。
硬件触发不上的最常见原因有两个:一个是触发信号的电压和极性不匹配,用了 NPN 输出的传感器却接到需要 PNP 输入的相机触发口;另一个是信号没有共地,传感器和相机的地电位不一致,导致信号不形成回路。排查方法很简单,用万用表量触发引脚在触发瞬间有没有跳变,再对照相机手册确认触发电平规格。如果现场传感器是 24V 输出,而相机触发口只接受 5V,中间必须加一个信号转换模块或光电耦合器,千万别直接怼上去。
5.3 Modbus 通了但数据地址对不上
这是最让人抓狂的问题之一:PLC 程序的地址明明是 40001,上位机也去读 40001,但读回来的数值不是预期值,或者写进去 PLC 没反应。
原因通常出在地址映射的"0 基"和"1 基"差别上。很多 PLC 的 Modbus 地址是从 0 开始计数的,你在 PLC 里看到的寄存器标号可能是 40001,但在协议报文里实际对应的地址是 0x0000。设备厂商的文档如果写得含糊,很容易把地址算错。我给自己定了个规矩:任何 Modbus 联调,都先用 Modbus Poll 这个工具手动读写几个已知数测试,确认地址映射没错,再开始写正式程序。比如先在 PLC 程序里把某寄存器强制成 12345,然后上位机去找哪个地址读到 12345,一找一个准。
5.4 汇川 AM763 无法识别本地 IO 模块
这个是我最近在客户现场遇到的,也值得说一下。一台汇川 AM763 PLC,断电重启后本地 IO 模块识别不到,模块指示灯异常。排查顺序跟大多数 PLC 问题一样:先看模块接线和背板连接,确认地址拨码没有冲突,再更新 PLC 固件和组态软件版本。我们那次最终是重新上电并把组态里的模块版本刷新匹配后才恢复正常。这类问题没有统一的万能药,但有一个经验:凡是涉及"识别不到硬件"的问题,先试最笨的断电、重新拔插、再上电,很多时候模块之间接触不良或者电源波动导致的就是这么解决的。另外汇川 AM 系列支持在软件里做"模块实物扫描",扫描结果跟组态配置比对,看二者是否一致,不一致就把组态改成实际扫描到的型号。
6. 非标项目调试的一点心得
6.1 视觉工程师和电气工程师的分工配合
做非标项目,视觉工程师不能只管相机和算法,电气那边怎么接线、PLC 那边怎么编程,你都得了解,否则很容易在配合上出问题。我见过一个项目,视觉明明已经输出 OK/NG 了,结果 PLC 那边没人去读取,整个分选机构形同虚设,硬生生拖了一周的调试进度。
所以我在项目启动前会拉电气工程师开个短会,把通信方案、寄存器地址表、触发方式、控制逻辑四个问题全部敲定,形成一份简单的接口文档。大家按这个文档各自干活,联调时才顺畅。这份文档也是后续验收和维护的重要依据,别偷懒不写。
6.2 三菱 FX3U 这类老 PLC 的寄存器保持问题
有些老产线还在用三菱 FX3U 这种经典机型,配合扩展的以太网模块做通信。这里有个细节值得注意:FX3U 的普通数据寄存器 D0~D8 默认断电不保持。如果在这些地址里存了视觉系统的标定参数或者工位配置,一旦设备断电重启,参数就丢了,系统不得不重新标定。解决办法是在 PLC 参数里把需要的 D 寄存器范围设置为断电保持区,或者把重要参数放到锁存寄存器区。我在一个项目里就因为这个,客户一断电,坐标偏移全部清零,机器人抓取全部偏位,排查了好久才发现是寄存器保持属性没设置。
6.3 老设备串口对接:电子秤、数控机床、传感器
现在的产线里其实还是有不少"老设备"——电子秤只出串口,数控机床只支持 RS232,变频器用 RS485 走 Modbus RTU。嵌入式工控机配两个串口就是干这个的。
对接电子秤最常见的需求是"视觉识别电子秤数值":秤的串口会持续往外发一段 ASCII 字符串,比如 "ST,GS,+000.123kg\r\n",工控机用串口接收后再解析出数值。这个场景我一般建议直接读串口协议,而不是用摄像头对着屏幕做 OCR——后者受屏幕反光、字体、刷新率影响大,稳定性远不如直接解析串口数据来得可靠。当然,如果这台秤没有数据接口,只能看屏幕,那就只能走机器视觉+OCR 的路了,用 LabVIEW 或 OpenCV 的模板匹配加字符识别也能做,但要做好现场光照处理。
数控机床的对接则复杂一些。大部分老机床支持宏变量(比如 FANUC 的 # 号变量),通过 RS232 或以太网口读写。视觉系统如果要把测量结果写进机床的宏变量,一般得通过机床厂商提供的 SDK,或者用 OPC UA 网关去桥接。这种对接一定要在机床厂商或集成商的配合下进行,不要自己随便发指令,万一引起机床程序紊乱,责任不好划分。
6.4 LabVIEW 视觉检测的一个经典用法
很多同行会问 LabVIEW 在机器视觉里到底有什么用。我的看法是:LabVIEW 的视觉模块(NI Vision)特别适合快速搭建检测原型,尤其是需要配合运动控制和数据采集的项目。它自带的模板匹配、边缘检测、粒子分析这些函数,对常见缺陷检测(比如零件外观、定位标记、条码识别)足够用了,而且图形化编程让电气背景的工程师也容易上手。
但 LabVIEW 做深度定制算法(比如基于深度学习的缺陷分类)就比较吃力,一般还是要靠 C++/C# 集成 Halcon 或者 OpenCV 的深度学习模块来实现。我常用的架构是:现场稳定性和效率要求高的检测任务,用 Halcon 写核心算法,然后用 C# 封装成服务,LabVIEW 负责做一个参数界面和处理流程编排。这样既有快速开发的人机交互界面,又能保证算法底层的性能。
6.5 给刚入行的人一条学习路线
如果你刚接触机器视觉和 PLC 对接,我建议按照这个顺序来,比一头扎进算法底层高效得多:
- 先用一台 USB 相机配合 OpenCV 或者 LabVIEW,把图像采集、显示、保存跑通,搞清楚图像是怎么进入电脑的。
- 学最基本的图像处理概念:灰度化、阈值分割、边缘检测、模板匹配,能从一个图像里稳定地找到目标区域和坐标。
- 找一台支持 Modbus TCP 的 PLC(比如西门子 S7-200 SMART、汇川 H 系列,二手货也就几百块),用 Modbus 工具练习读写寄存器,把协议调通。
- 把视觉程序和 PLC 通信结合起来:用视觉找零件中心,然后把坐标通过 Modbus 写到 PLC,PLC 用这个坐标控制伺服走位。
- 最后再碰硬件触发和现场时序问题,因为这需要完整的产线环境,纯入门阶段很难模拟得很真实。
按照这个路线,一个零基础的人大约两个月就能独立完成一套"相机 + 工控机 + PLC"的基础 demo,之后再去啃深度学习、3D视觉这些进阶方向就会顺利很多。
写在最后
机器视觉和 PLC 的整套链路,说到底就是三层事情:图像采好、算法算准、通信传对。每一层都有成熟的工具和方案,难的是把它们在产线的物理约束下组合在一起。我自己这些年体会最深的一点是:视觉系统做的再好,通信这块掉链子,现场就是一堆废铁。所以做方案时一定把通信协议、地址映射、时序逻辑当作跟算法同等重要的事情来规划,宁可前期多花半天做接口文档和测试脚本,也不要到现场去赌运气。希望这篇文章里这些实际操作经验,能让你少走一些我已经走过的弯路。