产线上跑视觉检测,真正难缠的从来不是"相机坏了"。相机彻底坏掉反而好办,换一台,十分钟的事。烦人的是那些"偶尔":连续跑三个班都没事,第四个班突然少了两帧,产品被判成不良;贴标工位隔一段时间报一次未识别,重启一下相机又好了;操作界面拖个窗口一顿一顿,可图像本身看着却是好的。
这三类现象,现场的人往往统一叫"有问题",然后统一去查——重启、换线、换电源、找厂家。折腾一整天什么都没查出来,因为丢帧、掉线、卡顿是三件根因完全不同的事,混在一起查,等于拿着三把钥匙去开一把锁,试错的成本高得离谱。
这张排查表是我在自己的视觉检测项目里,边踩坑边攒出来的。它不解决"所有问题",但能把"我该往哪个方向看"这件事在五分钟内定下来。不管你是刚接手视觉工位的设备维护、做项目交付的集成商,还是被产线电话追着跑的视觉工程师,这套分类思路都能直接用。下面我把三类故障拆开讲,每一类都给出现象特征、优先怀疑项、要抓的数据,以及现场真正管用的操作细节。
1. 先把三类故障分清楚再说排查
1.1 三个词在产线上的真实含义
丢帧的本质是"帧没到手"。相机确实拍了,链路里也确实传了,但应用层没有完整拿到这一帧,或者拿到了却被判定为无效直接丢掉。它的典型特征是:设备没断、通信没报错、程序一直在跑,只是结果少了一次。判断口径最硬的一条是帧号连续性——机器视觉相机的数据流里通常带递增的帧号或时间戳,把帧号打出来看有没有跳号,比任何体感都准。此外,PLC 那边收到的结果次数、计数器累加值、工控机上的落盘图片张数,都是可以拿来对账的。
掉线的本质是"设备没了"。相机从系统设备树里消失,或者网络链路中断,SDK 直接抛出断连错误,设备管理器里网卡、USB 设备节点一闪一闪。它和丢帧最大的区别在于:掉线是有明确时间戳事件的,是离散的、可数的。一旦掉线,通常还伴随着重连过程,重连期间的数据是整段缺失,而不是零散少几帧。现场经常有人说"相机动不动掉线",这时候第一件事不是看软件日志,而是看断连的时间点有没有规律。
卡顿的本质是"时间不够用了"。数据可能一帧没丢,但处理一帧花的时间超过了节拍,导致结果延迟、队列越积越多、界面无响应。它的核心指标是单帧处理耗时的 P99 值,不是平均值。平均值 20ms 看着很漂亮,只要 P99 冲到 80ms,产线上就会看到"时不时卡一下"。卡顿还有一层容易混淆的地方:界面卡顿和采集卡顿经常同时出现,但根因常常是两回事,后面单独讲。
1.2 一张表先判断现象该落哪一格
| 现场现象 | 更像哪类 | 第一优先怀疑方向 | 立刻要抓的数据 |
|---|---|---|---|
| 跑几小时少几帧,程序无报错 | 丢帧 | 带宽 / 缓存 / 处理耗时 | 相机帧号序列、采集软件队列深度 |
| 结果偶尔缺失但相机仍在 | 丢帧 | 触发信号抖动、曝光超帧周期 | 触发源波形、曝光时间设置 |
| 相机在设备列表里消失后重连 | 掉线 | 供电、线缆、USB 挂起、链路协商 | 断连时间戳、网卡链路速率历史 |
| 通信中断时间很规律(每 5 分钟等) | 掉线 | 后台服务心跳 / 定时任务抢占 | 断连时刻与系统计划任务对照 |
| 界面拖动窗口一顿一顿 | 卡顿 | UI 主线程阻塞、同步写日志 | UI 线程占用、磁盘写入曲线 |
| 单帧耗时忽高忽低,平均正常 | 卡顿 | 内存换页、杀软扫描、CPU 降频 | 处理耗时 P99、CPU 频率、内存页错误 |
| 图像模糊导致识别失败 | 不是丢帧 | 曝光时间偏长、运动模糊 | 传送带速度 × 曝光时间 |
| 多台相机同时开就出问题 | 丢帧或掉线 | 共享带宽 / 共享电源 / 共享控制器 | 单台独跑是否正常 |
这张表的用法是"先落格,再深挖"。很多人跳过这一步,看到界面卡就重装系统,看到丢帧就换相机,本质上都是在赌。
1.3 为什么必须先分类再看指标
因为三类故障的根因分布在完全不同的层:丢帧大多出在采集段,掉线大多出在物理连接与供电段,卡顿大多出在处理段与系统资源段。层与层之间的排查手段不通用——查掉线要的是示波器、万用表和链路日志,查卡顿要的是性能计数器和耗时打点。
还有一个更现实的原因:不能复现的故障是最贵的故障。如果不先把现象分类,你就会陷入"改了某个参数,跑了半小时没出问题,以为修好了,第二天又犯"的循环。分类之后,你可以针对性地做加压复现:丢帧就拉高帧率压带宽,掉线就做长时 ping 加供电波动,卡顿就灌满队列看耗时尾部分布。能主动复现,问题就解决一半了。
2. 丢帧:从采集链路一层一层往下剥
2.1 先算带宽,不算是瞎查
丢帧排查的第一步不是看代码,是算带宽。这一步九成的人跳过,而恰恰是最容易出结论的一步。
计算公式:
单帧原始大小(Byte) = 宽 × 高 × 位深 / 8 所需带宽(Byte/s) = 单帧大小 × 帧率 × 1.05 // 1.05 是协议包头开销的粗略系数拿一个现场最常见的配置举例:500 万像素灰度相机,2448 × 2048,8bit,30fps。
单帧 = 2448 × 2048 × 1 = 5,013,504 Byte ≈ 5.01 MB 带宽 = 5.01 MB × 30 × 1.05 ≈ 157.8 MB/s ≈ 1262 Mbps千兆网理论 1000 Mbps,扣掉协议开销,实际可用吞吐通常在 940 Mbps 左右,也就是约 110 MB/s。这个配置的需求量是供给的 1.4 倍,必然丢帧,而且往往表现为"跑得越快丢得越多",跟相机质量一点关系都没有。
| 分辨率 | 位深 | 帧率 | 原始带宽需求 | 千兆网实际余量 | 结论 |
|---|---|---|---|---|---|
| 1280 × 1024 | 8bit | 30 | 约 40 MB/s | 约 110 MB/s | 单口可带 2 台 |
| 1920 × 1080 | 8bit | 30 | 约 65 MB/s | 约 110 MB/s | 单口带 1 台,2 台必丢 |
| 2448 × 2048 | 8bit | 30 | 约 158 MB/s | 约 110 MB/s | 单口不够 |
| 2448 × 2048 | 8bit | 15 | 约 79 MB/s | 约 110 MB/s | 勉强可用但没余量 |
| 2448 × 2048 | 8bit | 30 | 约 158 MB/s | 万兆约 1100 MB/s | 有大量余量 |
注意:算出来的余量要留出至少 30%,因为交换机、网卡中断、协议重传都会额外吃掉带宽。不要按"刚好够"来配。
降带宽的手段按优先级排:降帧率 > 开 ROI 只传有效区域 > 降低位深或改用压缩输出 > 升级到 2.5G/万兆。压缩输出(比如 JPEG)能省带宽,但会增加相机端和主机端的 CPU 开销,在窄带宽链路上划算,在高带宽链路上反而添乱。
2.2 相机与触发侧:容易被忽略的丢帧源
带宽算完还有余量,但还是丢帧,就要看触发。曝光时间不能超过帧周期,这是硬约束。帧周期 = 1/帧率,30fps 就是 33.3ms,如果曝光设成 40ms,相机自己在物理上就完不成这个节拍,丢帧是必然的。
再看触发源抖动。外部光电开关、编码器、PLC 输出的触发信号如果有毛刺或者重复脉冲,相机就会收到多余触发。用示波器或者采集卡抓一下触发波形,看有没有十几微秒的尖脉冲。这种毛刺在示波器上看不出来,只在特定工况下出现,是典型的"偶发丢帧"来源。
还有一类特别值得说:图像模糊被误判成丢帧。传送带速度 500mm/s,曝光时间设 1ms,那么曝光期间工件已经移动了 0.5mm。如果视野是 100mm 宽对应 2448 像素,那就是每像素约 0.04mm,0.5mm 相当于 12 个像素的拖影。结果就是识别失败、被上层当成"这一帧没拿到"。这不是丢帧,是曝光和运动的匹配问题,解决方式是缩短曝光加补光,或者改用频闪光源。我在现场至少见过三次把这个问题当成相机故障来处理。
2.3 传输侧:网卡、交换机、线缆的设置细节
GigE Vision 的传输有几个参数直接影响丢帧率,很多人装了相机就用默认值:Packet Size(包大小)和 Inter-Packet Delay(包间隔)。默认包大小 1500 字节时,一帧 5MB 要拆成三千多个包,主机要处理三千多次中断,CPU 占用高且容易来不及收。
解决的常规做法是把网卡和相机两端的巨帧(Jumbo Frame)都设成 9K,一帧拆成约 570 个包,中断次数降一个数量级。但这里有三个硬条件:相机支持、交换机支持、网卡支持,缺一不可。只改一端会导致更严重的问题——大包在交换机处被丢弃或分片,丢帧率反而更高。这也是很多"改了巨帧以后更糟"的原因。
网卡层面还有几个默认开着但应该关掉的选项:节能以太网(EEE)、中断节流(Interrupt Moderation)、流控(Flow Control)在部分场景下会引起突发丢包。流控要谨慎,链路两端配置必须一致,一端开一端关比两端都关更糟。
USB 相机同理,只是把带宽换成控制器带宽。USB 3.0 理论 5Gbps 约 625MB/s,实际持续吞吐通常在 350 到 400MB/s,而且同一控制器下的所有设备共享这个额度。我把一个 U 盘插在同一组 USB 口上,采集就开始丢帧——这种案例真的发生过。规范做法是相机独占一个 USB 控制器,用设备管理器查看控制器分组,别把相机和移动硬盘、加密狗插在同一组。
2.4 软件侧:队列、回调与拷贝
到了软件这一层,丢帧的典型原因是取流队列溢出。相机的数据进来得快,你处理得慢,中间靠一个缓冲区顶着。缓冲区一旦被填满,新来的帧就只能丢。
这个可以算:帧周期 33.3ms,处理耗时 50ms,那么每秒积压的帧数是 1/0.0333 − 1/0.05 ≈ 10 帧。如果缓冲区只有 10 帧,一秒钟就满了,之后就是持续丢帧。所以要么提升处理速度,要么加大缓冲区,要么改成"只取最新帧"的策略。
常见的几个具体问题:
- 回调里干重活。SDK 的图像回调函数里做推理、存盘、发网络消息,回调会被阻塞,采集线程被拖慢。回调里只做"把指针塞进队列"这一件事。
- 预览窗口的隐式拷贝。很多人不知道打开预览会触发额外的格式转换和拷贝。测试丢帧时先关掉预览,再看结果。
- 同步写盘。每帧都同步写一张图,磁盘响应时间一波动,采集就跟着抖。改成异步队列 + 批量落盘。
- 多相机串行取流。多台相机在同一个线程里轮流等,必然有一台在等待期间溢出。每台相机独立线程,或者用统一的外部触发让多台严格同步。
2.5 丢帧速查表
| 症状 | 优先检查 | 验证方法 |
|---|---|---|
| 帧率越高丢得越多 | 带宽是否超限 | 按 2.1 公式算需求与供给 |
| 单台正常,多台一起丢 | 网口/控制器共享 | 分开跑对照测试 |
| 改了巨帧后更严重 | 链路是否端到端一致 | 逐段确认相机、交换机、网卡设置 |
| 处理耗时均值正常仍丢 | 队列深度不足 | 打点记录队列长度随时间变化 |
| 只在某工位丢 | 触发信号质量 | 示波器抓触发波形 |
| 识别失败被当成丢帧 | 曝光与运动匹配 | 临时缩短曝光,看是否恢复 |
实操心得:压测丢帧时不要一上来就满速跑。先降一半帧率看是否消失,如果消失,基本可以锁定带宽或处理能力相关,方向立刻收窄。
3. 掉线:间歇性断连按这个顺序查
3.1 供电和接地:最常见的元凶,最容易被跳过
掉线里最难查的一类,是供电引起的间歇性断连。它的特点是无规律、跟设备运行状态相关,比如产线加速时掉、某台电机启动时掉、机械手动作时掉。
先算压降。相机供电 24V,工作电流 0.5A,线缆 5 米,线径 0.5mm² 铜线,电阻率约 0.0175 Ω·mm²/m,往返长度 10m:
线阻 = 0.0175 × 10 / 0.5 = 0.35 Ω 压降 = 0.35 × 0.5 = 0.175 V看着很小。但相机的启动电流可能是工作电流的 2 到 3 倍,而且如果多台相机串在同一对电源线上,电流要累加。四台相机共线,总电流 2A,压降涨到 0.7V,再加上电源本身的负载调整率和线缆老化的接触电阻,端电压可能掉到 22V 以下,进入相机工作电压的下限边缘。这时候任何一次瞬态都会让它重启,表现就是"动不动掉线"。
接地是另一个重灾区。工业现场变频器、伺服驱动、点焊机都是干扰源。屏蔽层的正确做法是单端接地(通常接在控制柜一侧),两端都接会形成地环路,反而把干扰引进来。屏蔽层接哪里,接得好不好,往往是掉线和不掉线的分界线。
注意:不要把相机的地和伺服驱动器的功率地随便混接。信号地和功率地在柜子里汇到同一个端子排上,是现场非常普遍但危害很大的做法。
3.2 网络层:链路协商、IP 冲突与时间同步
网络引起的掉线,第一件事是看链路速率有没有掉。网线接头氧化、线序不标准、水晶头压接不良,都会导致千兆链路降速协商到百兆,或者反复重协商。重协商的瞬间,链路就是断的。
持续观察的方法:
# Linux 下反复查看链路状态,看 Speed 和 Link detected 是否变化 for i in $(seq 1 200); do date +%T ethtool enp3s0 | grep -E "Speed|Link detected" sleep 2 done# 长时 ping 观察丢包是否成规律性成簇出现 ping -i 0.2 -c 10000 192.168.1.10 | tail -n 20Windows 下可以用netstat -e看接口错误计数,或者用性能监视器看"网络接口\接收错误的数据包"。如果错误计数在持续增长,基本就是物理层问题——线、头、口、光模块,逐个换。我的经验是先换网线,这是成本最低、命中率最高的动作。
IP 冲突也是常见原因,尤其是有人拿着笔记本直接插到相机网段、或者顺手设了静态 IP 的情况。冲突的表现是"能通一会儿,然后断一会儿"。做法是固定相机 IP 段,工控机侧不配网关、不配 DNS,把这个网口彻底隔离成专用采集口,不参与办公网络。
还有一点容易被忽略:工控机上的其他网口如果配了网关,路由选择可能出错。相机流量本应走专用口,结果被路由到办公口去了,自然断断续续。用route print或ip route确认路由表,把相机网段明确绑定到指定接口。
3.3 USB 与串口:CH340 类设备为什么总掉
现场大量使用 USB 转串口芯片做光源控制器、PLC 通信或者辅助设备。这类芯片成本低、用量大,掉线问题也集中。
掉线的几个成因,按现场出现频率排:
- USB 选择性暂停。Windows 默认允许系统挂起空闲的 USB 设备省电,但很多这类芯片的固件对恢复挂起响应不完整,一挂起就再也没回来。设备管理器里把这个选项关掉。
- 供电不足。主板某些 USB 口的供电能力有限,加上延长线压降,芯片工作不稳。
- 驱动版本不匹配。同一颗芯片在不同系统上需要不同版本的驱动,装错了会出现枚举失败、反复重连。
- 静电和共地问题。设备外壳带静电时插拔,很容易打坏芯片的 IO。
常规的处理顺序是:换到主板直出的 USB 口、不用延长线、换带独立供电的集线器、关闭 USB 选择性暂停、统一驱动版本。如果换了之后还是掉,考虑直接换成工业级的串口方案,成本增加不多,但稳定性提升明显。
3.4 后台服务和外部因素造成的"莫名掉线"
有一个现象很值得单独说:相机被本机的后台服务周期性打断。很多设备厂商会装一套管理软件,里面带一个常驻服务,定时扫描在线设备、做心跳、同步配置或者校时。这些动作本身不坏,但如果扫描逻辑写得比较粗暴——比如把设备关掉再打开、重新枚举、抢占独占句柄——上层应用就会看到一次断连。
判断方法很直接:看断连的时间戳是否有规律。如果断连间隔高度一致,比如每 5 分钟、每整点、每 30 分钟一次,那基本可以排除物理层问题(物理层问题不会这么有节奏),重点去查计划任务和服务。做法是把断连时刻和系统事件日志逐条对照,或者把可疑服务临时停掉对照跑一段。
外部因素还包括:有人远程连上工控机看画面、有软件在后台做全盘扫描、有软件在做增量同步。这些都会抢占设备或资源。排查阶段,把工控机做成"专机专用",除了采集软件外一切从简,是收敛问题的最快路径。
另外,网络配置的变更也要留记录。有同事反馈过开启新的网络协议栈之后,浏览和解析类操作出现间歇性卡顿,回退配置就恢复了。这类改动看起来跟视觉软件无关,但会通过系统网络栈影响整体响应,所以在排查期间的所有配置变更都要记下来,出问题先回退。
3.5 掉线速查表与断连日志模板
| 症状 | 优先怀疑 | 快速验证 |
|---|---|---|
| 无规律断开,跟设备动作相关 | 供电压降、干扰 | 万用表测端电压,动作时观察波动 |
| 断连间隔高度规律 | 后台服务、计划任务 | 对照系统事件日志时间戳 |
| 网口速率反复协商 | 线缆、接头、光模块 | 循环读取链路速率 |
| 多台同时掉 | 共用电源、共用交换机 | 拆分供电和链路分组测试 |
| USB 设备反复枚举 | 挂起设置、驱动、供电 | 关闭选择性暂停,换口换线 |
| 只在有人远程时掉 | 资源或设备被抢占 | 断开远程对照测试 |
断连日志建议至少记录这几列,现场复现时比任何猜测都值钱:
时间戳(毫秒级) | 设备编号 | 断连类型(网/USB/供电重启) | 重连耗时 | 断连时系统负载 | 同期是否有其他事件4. 卡顿:先分清卡在哪个环节
4.1 界面卡顿和采集卡顿是两件事
先把一个误区摆正。同样是"卡顿",不同软件的根因天差地别:游戏类软件的卡顿多半卡在渲染和物理模拟,数值计算类软件的卡顿常常是内存带宽和缓存命中率,播放器类软件的卡顿多是解码路径选错了(比如 H265 走了软解),浏览器类软件的卡顿往往是多进程和扩展在抢资源,办公软件退出时的卡顿则常是保存状态和释放内存。视觉软件的卡顿也一样,得先看它卡在哪一段。
界面卡顿最典型的原因是 UI 主线程被占用。界面线程里做同步读图、同步写日志、同步查数据库、同步做推理,任何一次耗时超过 100ms 的操作都会让窗口"假死"一下。解决办法很朴素:UI 线程只负责绘制,所有耗时操作放后台线程,用消息回传结果。
几个具体的坑:
- 图像控件整幅刷新。每帧都重绘整个图像控件,分辨率一高就卡。改成只刷新变化区域,或者降低预览刷新率(预览 10fps 就够了,不需要跟采集同频)。
- 表格控件绑定大数组。逐行添加几千条记录,界面会卡死。用虚拟模式或者批量更新。
- 日志每条都同步写盘。改成内存缓冲 + 定时批量落盘,写入量能降一个数量级。
- 日志文本无限增长。文本框内容越来越多,渲染开销线性上升,跑几个班次后必然卡。设上限,超了截断。
实操心得:判断是界面问题还是采集问题,有个很简单的办法——把预览窗口关掉,看采集是否还卡。如果关掉就流畅了,问题在 UI 和显示链路,跟相机和网络无关。
4.2 系统资源的隐形消耗
系统层的卡顿,看四个指标:CPU 占用、内存使用与换页、磁盘队列、CPU 频率。
杀毒软件的实时扫描是现场卡顿的头号嫌疑人。视觉软件的临时图片目录、日志目录如果在实时扫描范围内,每写一个文件都要被扫一遍,磁盘和 CPU 都被吃走。把工作目录、图片目录、日志目录加到排除列表,效果通常立竿见影。
Windows 更新和索引服务也是常见来源,尤其在工控机上,系统盘被后台更新任务占满 I/O 时,界面会明显卡。工控机一般建议关闭自动更新(走离线补丁流程)、关闭搜索索引、关闭不必要的计划任务。
电源计划容易被完全忽略。默认的"平衡"或"节能"计划会让 CPU 在低负载时降频,等有突发计算任务时来不及升频,表现就是"偶尔卡一下"。工控机一律设成"高性能"或者直接用 BIOS 层面的性能模式。
内存不足引发的换页是最伤性能的一种。物理内存一旦被吃满,系统开始把内存页写到磁盘,访问延迟从纳秒级跳到毫秒级,卡顿幅度是数量级的。视觉软件里大图缓存、模型加载、多路视频缓冲都很吃内存,配置时按"峰值内存 × 2"来留余量。
还有一类比较少见但确实存在的:某些主板固件或安全模块相关的 BIOS 设置变更之后,系统出现周期性微卡顿。这类情况如果是在改完 BIOS 之后才出现的,第一件事就是把 BIOS 改动回退,而不是去折腾系统。
4.3 显卡与解码能力估算
涉及视频录制、多路预览、深度学习推理的视觉项目,显卡能力很容易被低估。
解码路数的粗略估算(以 1080p30 H.265 为例,实际以厂家规格和实测为准):
| 显卡档次 | 1080p30 H.265 硬解路数(粗估) | 备注 |
|---|---|---|
| 入门级集显 | 4 到 8 路 | 与显示输出、其他任务共享 |
| 中端独显 | 15 路以上 | 注意驱动版本 |
| 高端独显 | 30 路以上 | 受显存带宽和解码器数量限制 |
关键是确认走的是硬解。播放器类软件卡顿的经典案例,就是 H265 走了软解,CPU 单核跑满,画面一顿一顿。视觉软件里也一样,如果用了不带硬解的编码路径,录制几路视频就能把 CPU 吃干净。排查时看任务管理器里 GPU 的 Video Decode 引擎占用,如果 CPU 爆高而 GPU 解码引擎是 0,就说明走了软解。
GPU 驱动版本也是个变量。新版驱动不一定更好,尤其是老卡配新驱动,有时候回退一个大版本反而顺畅。所以卡顿排查期间升级驱动要谨慎,一次只改一个变量。
4.4 存储:从写盘到 SSD 掉速
视觉项目的数据流是"读图 + 写图"。写盘这一环出问题,会直接拖成卡顿。
先算写入量。每帧 5MB,30fps,保存率 10%,就是 15 MB/s。一天按 20 小时算:
15 MB/s × 3600 × 20 ≈ 1.08 TB/天这个量级下,普通消费级 SSD 很快就会写满。而写满之后的问题不只是空间:SSD 在容量占用超过 70% 到 80% 后,主控的垃圾回收压力剧增,写入性能会明显下降,写入延迟从几百微秒涨到几十毫秒,视觉软件一写图就卡一下。
应对方式:用带掉电保护的工业级 SSD;保持至少 20% 的空闲容量;开启 TRIM;图片按时间分目录并及时归档到其他存储;如果是多盘,把系统盘、日志盘、图片盘分开,避免互相抢 I/O。
关于"整盘清零能不能恢复 SSD 性能"这个问题:对部分掉速严重的固态盘,做一次全盘安全擦除(正规工具里的 Secure Erase)确实能让性能回到出厂状态,因为它把所有块强制置为可写。但这个操作会清空全部数据,只能用于专用盘,而且必须提前备份。它也解决不了主控老化、颗粒磨损这类物理层面的问题。至于拿磁盘编辑工具去手工清数据,代价高、风险大,除非有明确目的,否则不推荐。另外,RAID 卡如果没有电池或电容保护,且写了回写策略,掉电时风险很大,这个要在方案设计阶段就定下来,而不是出事后再改。
4.5 卡顿速查表
| 症状 | 优先检查 | 验证方法 |
|---|---|---|
| 关掉预览就不卡 | UI 或显示链路 | 对照测试 |
| 界面假死一下然后恢复 | UI 线程同步操作 | 检查 UI 线程耗时打点 |
| CPU 长期 100% 但某几核闲置 | 单线程瓶颈 | 看各核心占用分布 |
| 磁盘队列持续大于 1 | 写入量、杀软扫描 | 资源监视器看每进程写入 |
| 凌晨或整点卡 | 系统计划任务 | 对照任务计划程序 |
| 用了几个月才越来越卡 | SSD 容量与掉速 | 查剩余空间与写入延迟 |
| 显存占用高但 GPU 解码为 0 | 走了软解 | 换硬解路径或换编码格式 |
5. 现场排查流程和常用工具
5.1 五分钟定位法
我自己的顺序是这样,现场一般五分钟内能定方向:
第一步,看现象落在哪一格。设备列表里有没有消失、帧号有没有跳、界面是卡还是延迟高。这一步决定后面往哪个方向走。
第二步,抓一个关键计数器。丢帧就抓队列深度和帧号,掉线就抓链路速率和断连时间戳,卡顿就抓单帧耗时和处理线程的 CPU 占用。不要什么都看,看一个能定性的就够。
第三步,看事件之间的相关性。断连是不是跟某个动作同时发生?卡顿是不是跟某次写盘同时发生?用时间戳对齐,比看日志里的文字描述有用十倍。
第四步,单变量变更并复现。一次只改一个参数,改完要有明确的验证方法。这一点说起来简单,现场能做到的人不多。
第五步,记录。记下改了什么、结果如何、是否复现。这份记录在第二次出问题的时候价值极高。
5.2 工具清单
| 用途 | 工具 | 说明 |
|---|---|---|
| 系统资源 | 任务管理器、资源监视器 | 看每进程 CPU、内存、磁盘、网络 |
| 精细性能 | 性能监视器 | 自定义计数器,长时记录 |
| 进程与句柄 | 进程资源管理器类工具 | 看句柄占用、线程栈 |
| 延迟分析 | 延迟监测工具 | 定位系统级卡顿来源 |
| 网络抓包 | 抓包分析工具 | 看是否有重传、丢包、异常中断 |
| 链路状态 | ping、链路信息查询命令 | 长时观察丢包规律与速率协商 |
| 硬件打点 | PLC 或 IO 模块打点 | 把软件事件与产线节拍对齐 |
| 耗时统计 | 代码打点 + 直方图 | 记录 P50/P95/P99,不只看均值 |
5.3 两个必须会算的参数
缓存深度。处理耗时 T,帧周期 P,每秒积压帧数 = 1/P − 1/T。缓冲区大小至少要能撑住"最长一次处理抖动"的时间。比如处理耗时 50ms、帧周期 33ms,积压 10 帧/s,如果某次磁盘卡了 2 秒,需要 20 帧缓冲才不会溢出。
曝光与运动模糊。位移 = 运动速度 × 曝光时间。要求位移小于 1/3 个像素对应尺寸,才能保证图像不糊。这条计算决定了曝光时间的上限,也决定了补光的亮度需求,是方案设计阶段就该算的。
6. 现场经验与避坑清单
6.1 布线和接地的几条硬规矩
网线和电源线分开走,间距至少 20cm,平行走线距离越短越好。拖链里用的线缆必须是柔性线缆,普通线缆在拖链里弯折几千次后铜丝断裂,表现就是"跑一段时间掉线,动一动就好",这种故障最难查因为一碰就变。所有接头做防拉脱固定,相机端的接插件要选带锁紧结构的。屏蔽层单端接地,接地点尽量靠近控制柜的接地母排。接地电阻和等电位连接在项目交付时测一次,别等出了问题再回头查。
6.2 参数改动纪律
这条没有什么技术含量,但能省最多时间:一次只改一个参数,改之前记录当前值,改完写清楚验证方法和结论。我见过把巨帧、包间隔、曝光、缓冲区、电源计划五样东西一起改,然后问题消失了的案例——问题确实没了,但谁也不知道为什么,下次换个工况又来了。同时在排查期间,任何"顺手装个软件""顺手更新个驱动"的动作都要记下来,因为它们是典型的引入新变量。
6.3 一份可以复用的复盘表
| 项目 | 内容 |
|---|---|
| 故障分类 | 丢帧 / 掉线 / 卡顿 |
| 现象描述 | 用数字:几小时几次、单帧耗时多少 |
| 复现条件 | 帧率、负载、运行时长 |
| 已排除项 | 换过什么、测过什么 |
| 根因 | 具体到参数或部件 |
| 验证方式 | 跑了多久、指标如何变化 |
| 长期措施 | 配置固化、定期检查项 |
产线设备的问题,八成不是"设备坏了",而是几个参数在特定工况下互相打架。这张表的价值就在于,把"感觉"变成"证据"。我自己现在的习惯是每个视觉工位都留一份配置基线快照,包括相机参数、网卡参数、系统设置、软件版本,出问题先跟基线对比,往往一眼就能看出是哪次改动引入的。这个做法麻烦一次,之后每个月都能省下几个晚上。