技术分享roadmap • 2026-09-09

设备连接冲突恢复:拟议工程契约

为 CNC 断线后的串口所有权、控制器状态确认和管理员审批建立失败关闭的恢复契约。

CNC 控制器、本地驱动和浏览器工作区之间的概念连接图
概念架构示意图;不代表已经发布的 Laetoly UI 或真实硬件拓扑。
目录索引

必须控制的故障

CNC 连接中断不只是网络错误。浏览器失去会话视图时,控制器可能仍处于运动、暂停、报警或等待输入状态;另一个进程也可能同时访问同一串口。因此,恢复契约必须采用失败关闭策略:

  • 一个控制器会话只能由一个活动应用持有;
  • 未确定的命令不能因为重连就被标记为完成;
  • 重连事件本身不能授权运动;
  • 任何经管理员批准的运动前,都必须重新读取工作坐标和模态状态。

不同操作系统对串口所有权的表现不同。“单一所有者”是应用层不变量,不是声称所有驱动都会以相同方式拒绝第二次打开。

Grbl 报警、暂停和恢复状态的示意图
示意图:恢复路径继续前,必须观察并确认控制器状态。

恢复状态机

建议的状态顺序:

已连接
  -> 链路过期
  -> 暂停运动 / 操作员停止
  -> 检查串口所有者
  -> 无运动重连
  -> 查询控制器状态
  -> 比较会话检查点
  -> 管理员批准或保持阻塞

每次状态转换都应写入驱动日志,并在 UI 中显示。超时应保持在阻塞状态,不能作为跳过检查的理由。

需要查询的状态

重新获得串口会话后,驱动应使用目标固件支持的协议查询控制器。对于 Grbl v1.1,接口文档描述了:

  • ?:请求实时状态报告;
  • $G:查询当前解析器模态状态;
  • $#:查询保存的坐标参数,包括工作坐标偏移;
  • !~:实时暂停和恢复控制。

驱动必须在使用任何值前验证响应格式和固件身份。响应超时、报告格式错误、固件家族变化或与会话检查点不一致,都应让任务保持阻塞。

断线重连过程中保持工作坐标偏移的示意图
示意图:工作偏移必须重新读取;浏览器本地副本不能证明控制器当前状态。

禁止自动执行的动作

第一阶段实现不得自动:

  • 重放未知的在途命令;
  • 假设最后一次确认的命令等于机器实际位置;
  • 串口打开后立即发送 Cycle Start;
  • 使用 $X 绕过未解决的报警或安全条件;
  • 仅凭浏览器状态推断工作零点仍然有效;
  • 把示例配置文件当作运行时真实来源。

如果链路中断期间机器发生了运动,软件不能通过浏览器时间戳重建真实位置。安全结果应是显示检查清单并要求操作员现场确认。

管理员审批清单

在批准恢复运动前,UI 应要求确认:

  1. 当前持有串口的进程;
  2. 控制器固件和当前状态;
  3. 工作坐标系和偏移量;
  4. 刀具、工件、夹具和安全高度;
  5. 管理员选择重新回零、重新设零、放弃任务还是重新开始。
恢复运动前检查夹持和安全间隙的示意图
示意图:物理间隙必须由操作员检查,不能从重连事件自动推断。

实施边界

第一阶段应先交付状态模型、日志、阻塞恢复界面和只读控制器查询。命令重放、续切检查点和任何自动进给倍率控制,都需要单独的协议评审和真实硬件测试矩阵。在这些工作完成前,正确的工程行为是采用带人工确认的较慢恢复,而不是快速但不可信的自动续切。