机器视觉与PLC对接全指南:从选型到通信调试实战经验
干机器视觉集成的朋友几乎都会遇到同一个问题视觉系统怎么跟产线上的 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 表示 NG1 表示 OK40002~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/1500S7 协议更推荐或 Modbus TCPS7 协议用第三方库时要设置正确的 Rack/SlotModbus TCP 需要在 PLC 里启用 Modbus 服务器西门子 S7-200 SMARTModbus TCP需要使用 MBUS_SERVER 指令初始化地址映射基于 VB 区三菱 FX5U / Q 系列MC 协议更推荐或 Modbus TCPMC 协议需要知道 D 寄存器的地址编码规则三菱 FX3U 以太网模块串口 Modbus RTU 或 MC 协议FX3U 本身没有网口需要加装扩展模块汇川 H系列/AM系列Modbus TCP / 私有协议AM 系列支持 OPC UA但版本差异较大注意固件兼容性台达 / 信捷等国产 PLCModbus 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.10PC 分到的可能是 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 写到 PLCPLC 用这个坐标控制伺服走位。最后再碰硬件触发和现场时序问题因为这需要完整的产线环境纯入门阶段很难模拟得很真实。按照这个路线一个零基础的人大约两个月就能独立完成一套相机 工控机 PLC的基础 demo之后再去啃深度学习、3D视觉这些进阶方向就会顺利很多。写在最后机器视觉和 PLC 的整套链路说到底就是三层事情图像采好、算法算准、通信传对。每一层都有成熟的工具和方案难的是把它们在产线的物理约束下组合在一起。我自己这些年体会最深的一点是视觉系统做的再好通信这块掉链子现场就是一堆废铁。所以做方案时一定把通信协议、地址映射、时序逻辑当作跟算法同等重要的事情来规划宁可前期多花半天做接口文档和测试脚本也不要到现场去赌运气。希望这篇文章里这些实际操作经验能让你少走一些我已经走过的弯路。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →