
现场最磨人的往往不是算法准确率而是“相机连不上工控机、触发线没接对、PLC 那边死活收不到 OK/NG 信号”这类基础链路问题。机器视觉产线嵌入式工控机的部署核心是把相机采集、图像处理、结果下发 PLC 这件事串成一条稳定可靠的链路这篇内容适合正在做视觉项目实施的工程师、刚转行做机器视觉应用的新人以及被现场通信问题折腾过的电气人员参考。很多人以为视觉系统就是把工业相机接到工控机上、跑个算法就完事真到产线上才会发现相机、工控机、PLC 三者之间至少涉及两套网络、一路硬触发、一组 IO 信号通信协议。任何一环对不上整套设备就卡壳。今天我把自己在产线上把“相机至 PLC 整套链路”从零部署连接的完整经验写出来从设备角色分工、连接方式选型、实际接线配置到联调排坑一条龙讲清楚。1. 一套视觉链路里到底有什么角色分工与设计思路1.1 四个角色的职责边界一条完整的视觉检测链路通常由四个角色构成被测物检测传感器、工业相机、嵌入式工控机、PLC 执行机构。光电传感器或接近开关负责“通知”系统工件到了。工业相机负责在正确时刻抓拍清晰的图像。嵌入式工控机负责运行视觉算法输出判定结果。PLC 负责根据结果驱动剔除机构、报警灯或机械臂。这里有个容易踩的误区有人试图让 PLC 直接做视觉判定。PLC 的强项是逻辑控制和时序执行不是图像计算。哪怕现在的 PLC 支持一些简单视觉模块遇到表面缺陷检测、精密测量、OCR 识别这类算法需求时性能和灵活性都不够。正确做法是视觉任务全部交给工控机PLC 只做决策执行。嵌入式工控机在这条链路里充当的是“计算 通信中枢”。它既要通过 PCIe/USB/GigE 接口接收相机数据又要通过串口、以太网或 IO 点与 PLC 交互。选型时不能只看 CPU 跑不跑得动 Halcon 或 OpenCV还得看接口数量、供电方式、抗振防尘能力这些直接决定部署时顺不顺。1.2 链路设计的两条主线一条完整链路实际是两股信号在并行流转。第一股是触发流工件到达 → 传感器给出脉冲 → 相机触发拍照 → 工控机取图分析。这条线讲究实时性尽量用硬件 IO 硬触发不要用软件轮询触发因为软件触发受操作系统调度影响拍照时机不稳定高速产线很容易漏拍或拍糊。第二股是结果流工控机分析完图像 → 将 OK/NG 结果写入 PLC → PLC 执行剔除或放行。结果流的实现方式有三种主流选择方式实时性信息量实现难度适用场景IO 硬接线极高毫秒级低仅 OK/NG/READY简单只做剔除动作串口自由协议高中一般老 PLC、无网口场景Modbus TCP/Profinet 网络通信高高可传缺陷类型、统计数据较高需要信息交互的产线我个人建议能走网络通信就别只靠 IO因为网络通信可以传“缺陷代码、总检数、不良数、良率”这些数据方便后续接 MES 或上位机追溯。但如果你只需要一个剔除动作IO 硬接线的实时性和稳定性反而最省心。现场往往两种方式同时用结果走网络急停和启动握手走 IO。还有一个网络规划上的黄金法则相机单独占用工控机的一个网口PLC 通信走另一个网口或独立网段。不要把相机和 PLC 混插在同一个交换机下面。相机传输的是大量图像数据带宽占用高。和 PLC 通信抢带宽会导致相机丢帧、PLC 通信超时我踩过这个坑之后再没让它们混网。2. 硬件选型和接口预判先把“口子”对接好2.1 嵌入式工控机选型的关键指标嵌入式工控机选择要围绕现场的物理环境和通信需求展开有几个参数我每次选型都会重点核对。CPU 和内存要看视觉算法算力需求。常规的划痕检测、缺料检测Intel i5 级别处理器加上 8GB 内存基本够用。如果跑深度学习模型则必须上 i7 或者独立 GPU 方案同时注意工控机的散热设计保证长时间满载不死机。接口是真正的重点。至少需要两个千兆网口一个接相机一个接 PLC 或工厂网络。有两个串口更稳妥部分老传感器或老 PLC 只能走 RS232/RS485。DIO 至少要有 8 路输入、8 路输出而且最好是带隔离的避免外部信号干扰损坏主板。供电方式别忽略。产线上最常见的是 24V 直流供电选 DC24V 输入的工控机能直接从现场开关电源取电省一个电源适配器。同时注意工作温度范围工业现场夏天机柜里 50°C 很正常普通电脑散热跟不上就死机但做工良好的无风扇嵌入式工控机反而更稳定。存储建议安装固态硬盘并且预留足够空间给 NG 图像保存。视觉系统每天保存的缺陷图数量很可观128GB 起步、256GB 更好。另外强烈建议把 Windows 系统装在工控机上时关闭系统自动更新把杀毒软件加入白名单否则半夜产线设备重启或杀毒拦截相机 SDK 的场景会让你怀疑人生。2.2 相机、镜头、光源的匹配与连接工业相机选型不能只看分辨率还要看传感器类型、靶面尺寸、像素尺寸、帧率、接口类型。对于产线应用GigE Vision 接口的相机最普及。这类相机使用标准网线通信布线长度可达 100 米配合 PoE 供电还能省一根电源线。USB3 Vision 接口相机速度更快但线缆长度受限通常只有 3 到 5 米适合近距离安装。CameraLink 接口带宽极高但需要专用采集卡成本也高没有特殊高帧率需求一般不选。镜头和相机靶面位置匹配C 口镜头配 C 口相机要注意连接尺寸CS 口镜头需要加转接环。焦距选择可以按这个公式估算焦距 靶面宽度 × 工作距离 ÷ 视野宽度举例相机靶面宽度 6.4mm工作距离 200mm视野需要 80mm那么焦距约为 6.4 × 200 ÷ 80 16mm选 16mm 或接近的定焦镜头即可。实际选型时还要考虑光圈和畸变测量类项目尽量选低畸变工业镜头。光源选型也直接影响成像质量。环形光源适合打划痕条形光源适合大范围均匀照明背光源适合轮廓测量。光源控制器要支持频闪模式频闪可以大幅提高瞬间亮度并延长 LED 寿命。相机上的光源输出口Strobe 信号接到光源控制器就能实现曝光瞬间闪光的同步效果。如果项目需要测量尺寸或定位坐标还需要做相机标定。用标定板拍多张图计算像素与实际尺寸的比例关系把畸变校正掉。纯缺陷检测项目可以不上标定但也要先算像素当量确认最小缺陷能被多少个像素覆盖。2.3 PLC 侧的接口确认部署之前先确认 PLC 的通信能力。不同品牌差异很大台达 PLC 多数带网口支持 Modbus TCP配置方便。西门子 S7-1200/1500 支持 S7 协议和 Modbus TCPS7-300 老款没网口只能走 Profibus 或加通信模块。使用 Codesys 的 PLC 一般自带多种协议库Modbus TCP 配置很开放。一些微型 PLC 只有串口那就走 RS485 Modbus RTU设置好波特率、数据位、停止位、校验位即可。还要确认 PLC 支持的寄存器区域。Modbus TCP 下常用的是保持寄存器Holding Register一个寄存器 16 位能传整数、状态字两个寄存器组合还能传 32 位浮点数。PLC 程序里必须预留一段地址给视觉系统用建议单独划一块区域不要跟程序内部变量混在一起排查起来会容易很多。如果追求更直接的连接也可以在工控机上加一个 PCIe 总线运动控制卡或离散 IO 卡直接跟 PLC 的点对点硬接线。不过这种方式需要确认共地、极性、电平兼容不如网络通信那样干净现场也更复杂。3. 从零开始接线与配置相机、工控机、PLC 的完整安装流程3.1 相机端的安装与网络配置安装相机时第一原则是固定牢靠。产线振动会让相机轻微移位连累视野变化。支架尽量用双螺母锁死有条件加防振橡胶垫。第二步是 IP 地址规划。相机的 IP 可以按照这样的习惯设置假设工控机有两个网口一个用于相机一个用于 PLC。相机网口 IP192.168.1.100子网掩码 255.255.255.0相机 IP192.168.1.10子网掩码 255.255.255.0PLC 网口 IP192.168.2.100子网掩码 255.255.255.0PLC IP192.168.2.10子网掩码 255.255.255.0相机 IP 要在 SD 卡或相机配置工具里先设置好。海康相机用 MVS 客户端Basler 相机用 pylon Viewer都能一键修改 IP。新相机默认可能是 DHCP 或固定 IP直接改成规划好的地址即可。网线建议用带屏蔽的工业以太网线水晶头要压好线槽里走线时离动力线远一点。GigE 相机对网线质量比较敏感劣质网线会造成随机丢包现场的“时好时坏”大多是这个原因。触发接线是大多数人翻车的地方。相机通常有专门的 IO 接口常见的是 6PIN 或 8PIN 端子。以典型的 GigE 相机为例LINE0 可以作为触发输入Trigger InputLINE1 可以作为光源同步输出Strobe Output把光电传感器的信号线接到 LINE0 和 LINE0-别接反。现在多数相机支持 NPN 和 PNP 两种类型在相机配置里要选对。默认配置常常是 PNP但很多国产光电开关是 NPN不匹配就触发不了。现场用万用表量一下触发信号的电压电平和极性比瞎猜靠谱得多。如果传感器直接接相机抗干扰能力不够在传感器和相机之间加一个中间继电器或光电隔离器中转信号会干净很多。3.2 工控机端环境搭建工控机到手后第一步安装操作系统、相机驱动和 SDK。Basler 相机装 pylon海康相机装 MVS装完用官方的例程先跑通“取图显示”确认相机链路没有硬件问题再做视觉算法开发。开发环境根据团队习惯选择。C 配 Halcon 或 OpenCV 性能最好LabVIEW 做视觉集成也常见NI Vision现在很多人用 Python OpenCV 做原型但落地到产线还是推荐用通用视觉平台比如 VisionMaster、Halcon它们对 IO 触发、相机标定、通信协议支持更完整开发效率也高。主循环逻辑可以先用伪代码理解while True: if check_trigger(): # 检查是否收到触发信号 image camera.grab() # 从相机取一帧图 result algorithm(image) # 运行视觉算法 write_plc(result) # 把结果写入 PLC 对应寄存器 save_ng_image(image) # 若 NG 则保存原图 sleep(0.02)这里有个细节触发信号可以走相机硬件轮询也可以走工控机 DIO 中断。硬件触发模式下相机会在收到 LINE0 信号后立即曝光并送图到工控机工控机只要循环 grab 就好。软件的等待循环里加一个超时判断比如 3 秒没取到图就报错防止死等。双网口分工一定要在操作系统里固化过来可以用静态 IP 绑定网口别名避免重启后配置丢失。关闭 Windows 防火墙对私有网段的拦截或者直接把相关网口加入到防火墙白名单。3.3 PLC 端的通信配置以最常见的 Modbus TCP 为例PLC 作为服务端从站工控机作为客户端主站。PLC 侧要做的事情是定义视觉系统专用的保持寄存器区域。允许工控机通过以太网访问该区域。PLC 程序里周期性读取这些寄存器的值执行对应动作。我曾经用过的寄存器规划表如下寄存器地址名称方向说明40001工位状态PLC → 视觉1请求拍照 2空闲 3复位40010检测结果视觉 → PLC0无结果 1OK 2NG 3超时40011错误码视觉 → PLC0无错误 1相机断开 2通信异常40012-40013缺陷类型视觉 → PLC高位字低位字可扩展40020视觉心跳视觉 → PLC每 500ms 自增PLC 端的梯形图逻辑大致思路当工位状态为“请求拍照”时PLC 调用视觉完成标志位等待检测结果寄存器变化。视觉结果为 OK 时放行NG 时启动剔除机构同时记录计数。收到心跳超时时报警停机。台达 PLC 配置 Modbus TCP 从站比较直观在串口/以太网设置里使能 EtherNet开放寄存器访问即可。Codesys 系统则在网络通信里加载 Modbus TCP Slave 协议将 Modbus 地址映射到 PLC 变量。西门子 S7 如果不走 Modbus 走 S7 协议工控机侧可以用 S7.NET 这类库连接注意 DB 块地址偏移。联调时容易栽在字节序上。Modbus 传两个字节时存在高低位顺序问题不同 PLC 厂家的字节序定义可能有差异。工控机读回的数据若出现“数字完全不对”先做一件事把 16 进制原始报文打出来人工换算一次确认是不是 AB CD 和 BA DC 的问题。我曾经因为一个大端小端没对齐浪费了整整一下午。4. 一个真实检测工位的完整调试过程4.1 工位描述与流程用一个电子元器件表面缺陷检测工位作为样例皮带线运输工件节拍 2 秒一个工件经过光电传感器时触发相机相机拍摄表面图像工控机判断是否有划痕或异物NG 品由 PLC 控制气缸剔除OK 品直接放行。流程顺序工件遮挡光电传感器传感器输出信号。信号同时给相机触发输入和 PLC 输入。相机频闪光源亮起拍摄照片。工控机取图运行缺陷检测算法。结果写入 PLC 寄存器。PLC 根据结果在剔除位置触发气缸或放行。统计总检数、OK 数、NG 数显示在人机界面上。4.2 节拍与相机参数匹配计算这个工位的参数计算很有代表性。皮带速度大约 200mm/s视野需要覆盖 80mm 宽的工件。检测最小缺陷要求 0.2mm 被至少 4 个像素覆盖那么单个像素对应的物理尺寸要≤0.05mm/px即 50μm/px。相机分辨率横向 80mm ÷ 0.05mm/px 1600 像素。考虑余量选择 1920×1200 的相机更稳妥。接下来算运动模糊。如果曝光时间 5ms皮带移动了 200mm/s × 0.005s 1mm在 50μm/px 下图像会拖出 20 个像素的模糊。这个程度在表面缺陷检测里基本是毁灭性的所以解决方案有两个方案一加频闪光源把曝光时间压到 0.2ms 甚至更短瞬间照亮工件。方案二工位做停顿拍照工件到位后皮带短暂停止拍完再走。多数产线接受方案一。0.2ms 曝光时间下运动位移 200mm/s × 0.0002s 0.04mm不足一个像素完全可接受。相机帧率方面节拍 2 秒一个件30fps 的相机绰绰有余。图像数据量计算1920×1200×8bit 2.3MB 每帧30fps 时约 552Mbps千兆网卡能跑得动。如果选 500 万像素以上相机并满帧率传输需要留意带宽余量必要时开启巨帧 Jumbo Frame 或者降低帧率。4.3 联调时序与 PLC 程序逻辑整个系统的时序配合状态PLC 收到传感器信号置“请求拍照”标志。同一拍摄周期内相机硬触发拍图。工控机处理完成写结果寄存器。PLC 检测到结果寄存器变化读取判定值。PLC 根据判定值执行剔除动作。工控机清除结果寄存器等待下一轮。这里有一个时序的关键视觉结果写寄存器后PLC 要用“边沿触发”去读不要用电平检测。比如结果一直是 NG如果没有边沿检测PLC 会重复执行多次剔除动作。正确做法是检测结果寄存器从“无结果”变成“有结果”这个边沿时触发一次读取。工控机侧的主循环伪代码import time from camera import Camera from plc import ModbusClient cam Camera() plc ModbusClient(192.168.2.10) heartbeat 0 while True: # 心跳更新 heartbeat (heartbeat 1) % 65535 plc.write_register(40020, heartbeat) # 等待 PLC 请求拍照 status plc.read_register(40001) if status 1: image cam.grab(timeout3.0) if image is None: plc.write_register(40010, 3) # 超时 continue result detect_defect(image) if result NG: plc.write_register(40010, 2) else: plc.write_register(40010, 1) plc.write_register(40011, 0) time.sleep(0.02)实战中还应该加入异常处理相机获取失败时写错误码通信读失败时连续重试几次连续失败则本地报错并保存日志连续多个 NG 时可以建议 PLC 停机处理避免批量不良流到后端。每个环节联调完成后我都会在程序里加一个测试模式手动模拟触发不启动皮带拍一张图确认成像和通信链路稳定再开自动模式。5. 现场排查必读十年工程师的避坑清单5.1 链路不通先排通信再排硬件排查问题有顺序我惯用的顺序是物理层 → 网络层 → 应用层。先看网线连接是否松动、水晶头是否氧化。再检查 IP 是否在一个网段用 ping 包测试连续性。然后用相机自带工具检查是否能看到设备比如 MVS 或 pylon Viewer。最后检查视觉软件本身是否报错、是否连接上了 PLC。链路完全不通时先把问题“切开”。比如相机单独用官方软件取图测试排除 PLC 的影响PLC 单独用 Modbus 调试工具读取寄存器排除视觉软件的影响。分段定位比整体摸索高效得多。如果发现 ping 通但相机会丢帧可以用长时间丢包测试判断稳定性。工控机上相机网口开启巨帧 Jumbo Frame把 MTU 从 1500 调到 9000能显著降低大图传输的分包丢失概率。注意 PLC 网口不需要巨帧两边保持独立。5.2 触发不稳定的三个隐蔽原因触发时有时无是现场最烦人的问题。我遇到过的原因主要集中在这三类第一个是极性不匹配。传感器的 NPN/PNP 类型与相机触发输入的配置不一致导致高电平有效变成低电平有效。解决办法万用表量触发信号在工件经过时的电压变化然后在相机配置里选择对应的触发极性。第二个是传感器灵敏度设置太灵敏工件还没到位就提前抖动触发或者从背景板反射误触发。把传感器靠近工作区域一点灵敏度适当降低或者改用带屏蔽背景的传感器。第三个是线缆和动力线挨得太近干扰脉冲导致误触发。触发线尽量用屏蔽双绞线单端接地不要和变频器输出线、伺服电机线走同一个线槽。如果干扰实在压不住就在传感器输出端加一个滤波电容或中间继电器把窄脉冲滤掉。5.3 PLC 通信偶发断线的处理PLC 通信“偶尔断一下”比完全不通更难查。通常原因有三种交换机本身不稳定或功率不足。廉价交换机在长时间运行后容易丢包换一个工业级交换机往往立竿见影。相机流量挤占网络带宽。相机和 PLC 混网时图像数据在交换机里广播和处理占用大量带宽。解决方式很简单相机与 PLC 分开网段各走各的网口。PLC 从站连接数超过限制。有的 PLC 默认只允许 1 到 2 个 TCP 连接如果有个上位机连在上面工控机就连不上或者连接不稳定。查询 PLC 的连接管理表该释放的连接释放掉。工控机软件侧要写重连机制Modbus 通信失败后不要退出程序延迟 2 秒重连直到恢复。PLC 侧则用视觉心跳寄存器做看门狗心跳超过 2 秒没更新就认为视觉系统异常触发安全停机或报警。这样即使视觉程序崩溃产线也不会带着问题继续跑。5.4 现场问题速查表症状可能原因优先排查动作相机无图像IP 不在同网段、防火墙拦截、线缆损坏先用官方工具连接相机图像时好时坏网线质量差、MTU 过大、电磁干扰换屏蔽网线检查 MTU 设置触发不拍照NPN/PNP 极性不对、信号线接反万用表量触发信号确认接线拍糊曝光时间太长、光源不够亮改用频闪模式压曝光到 1ms 内PLC 收不到结果寄存器地址错位、字节序不对用 Modbus 调试工具直接读地址PLC 偶尔超时通信带宽被抢、连接数占满分网段隔离相机流量查看连接表视觉程序崩溃内存不足、SDK 版本问题加日志定位崩溃位置升级驱动排查问题时要多用工具少猜。相机有官方诊断工具Modbus 有 Modbus Poll 类调试软件串口有串口助手。把每个环节的通信报文抓下来问题基本能快速定位。最后再分享一个我自己的习惯项目部署完成当天把整条链路的连接表、IP 地址表、寄存器规划表打印出来贴在机柜门上。以后半夜被电话叫起来处理产线问题时这张纸能帮你省掉两个小时重新翻图纸的时间。视觉项目的复杂从来不在算法而在这些容易被忽略的细节。把这些细节管住了链路自然就稳了。