插补、另存为、标记过滤、采集超时------今天聊的四件事
2026-09-14
今天聊了四件事,看似不相干,其实都在回答同一个问题:让工业设备"听话"。运动控制是让它"动得准",另存为是"存得对",标记过滤是"该跳的跳",采集超时是"查得清"。逐个讲。
一、运动控制:插补、闭环、排障
1. 插补:让多个轴走出直线和圆弧
工业设备往往有好几个轴(X、Y、Z),每个轴能独立移动。要走到「斜方向」的目标点,怎么办?
-
单轴串联:先走 X、再走 Y------轨迹是折线;
-
联动(插补):X、Y 同时动、按比例走------轨迹是直线。
单轴串联: ┌──┐ 先横再竖,走 L 形
──┘ │
▼
联动插补: ╲ 同时动,直接斜过去
╲
直线插补的核心:各轴速度按位移比例分配,同时启动、同时到达。要走到 (X=3, Y=2),X 速度 : Y 速度 = 3 : 2。
圆弧插补分两种:平面圆弧 2 个轴就够;空间圆弧(躺在三维倾斜面)要 XYZ 三轴联动。
多轴同步别和插补混:插补 = 走「轨迹」(直线/圆弧);同步 = 保持「比例/跟随」(如电子齿轮:主轴转一圈,从轴按比例跟一圈,像自行车链条)。
2. 轴控闭环:发指令 → 确认到位 → 再采集
一个完整的轴控任务,不是「发个指令就完事」,而是五步闭环:
① 定位 → ② 到位判断 → ③ 触发采集 → ④ 下一步 → ⑤ 异常处理
为什么必须轮询确认到位? 因为「发指令 ≠ 到位」------轴有惯性,要走完「加速 → 匀速 → 减速」才真正停稳,必须读回确认。
异常处理最容易搞混的两类退出:
| 情况 | 处理 | 原因 |
|---|---|---|
| 到位 / 取消 | 正常返回 | 正常结束,让流程继续 |
| 报错 / 超时 | 抛异常 | 失败,必须打断流程 |
失败若不抛异常,上层会误以为成功了、继续往下走------可轴根本没到位。抛异常才能让失败向上传播。类比:快递丢了必须报警,不能假装签收了继续往下走。
3. 排障:限位 / 超时 / 轴报警
- 限位:软限位 = 坐标范围(红线),硬限位 = 物理开关(墙)。根因通常是坐标算错 / 没回原点 / 机械跑偏。
- 超时:先分「根本没动」还是「动了没到」------没动查命令/使能/通讯,动了没到查卡死/负载/速度/距离。类比:外卖超时,先看骑手出发没(没动)还是路上堵了(动了没到)。
- 轴报警:先分单轴还是多轴(多轴一起报 = 系统级,单轴 = 那根轴自己的问题),再看具体报警码映射故障。
二、另存为:挑提交、深拷贝、同名覆盖
1. git cherry-pick:从篮子里挑一颗果子
「另存为」功能原来散在别的分支上,被一堆不相关的提交夹着。要搬过来,用 cherry-pick------只挑想要的单个提交 ,而不是 merge(把整条线都带过来)。
类比 :merge 是把整筐水果都倒进来;cherry-pick 是从筐里只挑一颗想要的果子。
2. 深拷贝:复印一份,原版不动
「另存为」的本质是复制:深拷贝 = 序列化再反序列化,得到一份独立副本,改副本不影响原件。
一个坑:被标记为「不参与序列化」的字段,深拷贝时不会复制,要手动重新赋值。
类比:深拷贝 = 复印机复印一份,你在复印件上随便改,原件一点事没有。
3. 同名覆盖:一个经典的边界 bug
「另存为」如果不改名 ,新名 = 原名 → 存到了原文件上 → 覆盖了原件,还顺手把原件的路径信息清掉。
修法:新旧名相同时,弹提示强制改名,杜绝同名。
教训一句话:编译通过 ≠ 没 bug。改完代码要回头审「同名 / 边界 / 空值」这类场景。
类比:你想「另存为」一份,却忘了改名,结果把原件盖了。
三、标记过滤:该跳的整条链跳掉
1. 临时标记不落盘
给某个对象打个「跳过」标记,但要求下次打开就失效(不持久化)。做法:字段标「不参与序列化」,序列化时被忽略,自然不落盘。
类比:临时标记 = 便利贴,贴上去当天有效,不写进档案。
2. 筛选语义:true 留下、false 丢弃
过滤一个列表时,回调的返回值含义要想清楚:返回 true = 留下,返回 false = 丢掉 。所以「要跳过」的,要反过来写(return !跳过)。
类比:筛水果------挑「留下」的还是挑「扔掉」的,方向别搞反。
3. 跨层共享状态:放一块公共的「黑板」
两个模块分层了(一层够不到另一层),但都要读同一个状态(比如「当前在哪个页面」)。解法:把这个状态放到公共的静态上下文里,像一块大家都看得到的黑板。
类比:黑板------谁都能写、谁都能看,不用一层层传话。
四、采集超时排查:两层日志、进工作态又回退、关键纠正
1. 两层日志:签收记录 vs 物流轨迹
排查「采集不到图」时,有两份日志要对着看:
- 上层日志:只记结果------「收到没收到、收了几帧」;
- 底层日志:记每一步过程------「停了流、切了模式、重建了队列、进了工作态」。
只看上层,只能知道「没收到」,看不到中间哪步出问题;对着看,才能定位。
类比 :上层像快递的签收记录 (到没到),底层像物流轨迹(每一步在哪)。
2. 进工作态又回退:故障的「指纹」
正常的采集:进入工作态 → 出图。故障的采集:进入工作态后立刻退回待命、一帧没出。
这个「进一下又退回来」就是故障特征,多次故障都是同一个指纹------说明不是偶发,是同一个根因。
类比:按下开关,机器「咔哒」启动了一下,又自己关掉了------不是没电,是它自己退了。
3. 关键纠正:两个病别混
排查时容易把两件事混成一个:「初始化失败」(找不到设备) 和 「采集超时」(收了但 0 帧) 是两个完全不同的病。分清起点,才能把历史捋对。
教训:报错是症状,别把两个症状当一个病------先分清「到底是哪个问题」。
五、语法速记(附录)
- 异步等待(await):等耗时操作时不占线程。
- 轮询:循环反复检查某个状态(比如「到位没」),每隔一小段时间查一次。
- 取消令牌:一个「停止信号」,让等待能随时被打断。
- 正常返回 vs 抛异常:正常结束用返回,失败用抛异常。
- cherry-pick:git 里挑单个提交,区别于 merge 整条线。
- 深拷贝:序列化再反序列化,得到独立副本。
- 不序列化字段:序列化时被忽略的字段(临时标记不落盘)。
- 筛选回调:返回 true 留下、false 丢弃。