[{"data":1,"prerenderedAt":380},["ShallowReactive",2],{"header-article-translation-zh-section-none":3,"section-zh-engineering":4},null,[5,226],{"id":6,"title":7,"body":8,"category":193,"date":194,"description":195,"difficulty":3,"draft":196,"duration":3,"extension":197,"featured":196,"image":198,"layout":202,"locale":203,"meta":204,"navigation":205,"path":206,"references":207,"related":3,"section":219,"seo":220,"slug":221,"status":222,"stem":223,"tags":3,"translationKey":224,"updated":3,"video":3,"__hash__":225},"content\u002Fzh\u002Fengineering\u002Fconnection-recovery-contract.md","设备连接冲突恢复：拟议工程契约",{"type":9,"value":10,"toc":184},"minimark",[11,20,24,27,43,46,52,55,58,69,72,75,78,108,111,116,119,122,146,149,152,155,173,178,181],[12,13,16],"cnc-warning",{"level":14,"title":15},"warning","这是路线图契约，不是已经交付的恢复功能",[17,18,19],"p",{},"本文描述 Laetoly 应实现的恢复行为，不声称自动重连、位置恢复、命令重放或续切功能已经可用。任何恢复动作都必须先遵守机器厂商的急停和故障恢复流程。",[21,22,23],"h2",{"id":23},"必须控制的故障",[17,25,26],{},"CNC 连接中断不只是网络错误。浏览器失去会话视图时，控制器可能仍处于运动、暂停、报警或等待输入状态；另一个进程也可能同时访问同一串口。因此，恢复契约必须采用失败关闭策略：",[28,29,30,34,37,40],"ul",{},[31,32,33],"li",{},"一个控制器会话只能由一个活动应用持有；",[31,35,36],{},"未确定的命令不能因为重连就被标记为完成；",[31,38,39],{},"重连事件本身不能授权运动；",[31,41,42],{},"任何经管理员批准的运动前，都必须重新读取工作坐标和模态状态。",[17,44,45],{},"不同操作系统对串口所有权的表现不同。“单一所有者”是应用层不变量，不是声称所有驱动都会以相同方式拒绝第二次打开。",[47,48],"figure",{"alt":49,"caption":50,"src":51},"Grbl 报警、暂停和恢复状态的示意图","示意图：恢复路径继续前，必须观察并确认控制器状态。","\u002Fmedia\u002Fdiagrams\u002Fconnection-recovery\u002Fgrbl-state-machine.svg",[21,53,54],{"id":54},"恢复状态机",[17,56,57],{},"建议的状态顺序：",[59,60,66],"pre",{"className":61,"code":63,"language":64,"meta":65},[62],"language-text","已连接\n  -> 链路过期\n  -> 暂停运动 \u002F 操作员停止\n  -> 检查串口所有者\n  -> 无运动重连\n  -> 查询控制器状态\n  -> 比较会话检查点\n  -> 管理员批准或保持阻塞\n","text","",[67,68,63],"code",{"__ignoreMap":65},[17,70,71],{},"每次状态转换都应写入驱动日志，并在 UI 中显示。超时应保持在阻塞状态，不能作为跳过检查的理由。",[21,73,74],{"id":74},"需要查询的状态",[17,76,77],{},"重新获得串口会话后，驱动应使用目标固件支持的协议查询控制器。对于 Grbl v1.1，接口文档描述了：",[28,79,80,86,92,98],{},[31,81,82,85],{},[67,83,84],{},"?","：请求实时状态报告；",[31,87,88,91],{},[67,89,90],{},"$G","：查询当前解析器模态状态；",[31,93,94,97],{},[67,95,96],{},"$#","：查询保存的坐标参数，包括工作坐标偏移；",[31,99,100,103,104,107],{},[67,101,102],{},"!"," 与 ",[67,105,106],{},"~","：实时暂停和恢复控制。",[17,109,110],{},"驱动必须在使用任何值前验证响应格式和固件身份。响应超时、报告格式错误、固件家族变化或与会话检查点不一致，都应让任务保持阻塞。",[47,112],{"alt":113,"caption":114,"src":115},"断线重连过程中保持工作坐标偏移的示意图","示意图：工作偏移必须重新读取；浏览器本地副本不能证明控制器当前状态。","\u002Fmedia\u002Fdiagrams\u002Fconnection-recovery\u002Fcoordinate-offsets.svg",[21,117,118],{"id":118},"禁止自动执行的动作",[17,120,121],{},"第一阶段实现不得自动：",[28,123,124,127,130,133,140,143],{},[31,125,126],{},"重放未知的在途命令；",[31,128,129],{},"假设最后一次确认的命令等于机器实际位置；",[31,131,132],{},"串口打开后立即发送 Cycle Start；",[31,134,135,136,139],{},"使用 ",[67,137,138],{},"$X"," 绕过未解决的报警或安全条件；",[31,141,142],{},"仅凭浏览器状态推断工作零点仍然有效；",[31,144,145],{},"把示例配置文件当作运行时真实来源。",[17,147,148],{},"如果链路中断期间机器发生了运动，软件不能通过浏览器时间戳重建真实位置。安全结果应是显示检查清单并要求操作员现场确认。",[21,150,151],{"id":151},"管理员审批清单",[17,153,154],{},"在批准恢复运动前，UI 应要求确认：",[156,157,158,161,164,167,170],"ol",{},[31,159,160],{},"当前持有串口的进程；",[31,162,163],{},"控制器固件和当前状态；",[31,165,166],{},"工作坐标系和偏移量；",[31,168,169],{},"刀具、工件、夹具和安全高度；",[31,171,172],{},"管理员选择重新回零、重新设零、放弃任务还是重新开始。",[47,174],{"alt":175,"caption":176,"src":177},"恢复运动前检查夹持和安全间隙的示意图","示意图：物理间隙必须由操作员检查，不能从重连事件自动推断。","\u002Fmedia\u002Fdiagrams\u002Fconnection-recovery\u002Fworkholding-clearance.svg",[21,179,180],{"id":180},"实施边界",[17,182,183],{},"第一阶段应先交付状态模型、日志、阻塞恢复界面和只读控制器查询。命令重放、续切检查点和任何自动进给倍率控制，都需要单独的协议评审和真实硬件测试矩阵。在这些工作完成前，正确的工程行为是采用带人工确认的较慢恢复，而不是快速但不可信的自动续切。",{"title":65,"searchDepth":185,"depth":185,"links":186},2,[187,188,189,190,191,192],{"id":23,"depth":185,"text":23},{"id":54,"depth":185,"text":54},{"id":74,"depth":185,"text":74},{"id":118,"depth":185,"text":118},{"id":151,"depth":185,"text":151},{"id":180,"depth":185,"text":180},"Architecture","2026-09-09","为 CNC 断线后的串口所有权、控制器状态确认和管理员审批建立失败关闭的恢复契约。",false,"md",{"src":199,"alt":200,"caption":201},"\u002Fmedia\u002Farticle-covers\u002Fengineering\u002Fconnection-recovery.webp","CNC 控制器、本地驱动和浏览器工作区之间的概念连接图","概念架构示意图；不代表已经发布的 Laetoly UI 或真实硬件拓扑。","article","zh",{},true,"\u002Fzh\u002Fengineering\u002Fconnection-recovery-contract",[208,212,216],{"id":209,"title":210,"url":211},"grbl-interface","Grbl v1.1 Interface Basics","https:\u002F\u002Fgithub.com\u002Fgnea\u002Fgrbl\u002Fblob\u002Fmaster\u002Fdoc\u002Fmarkdown\u002Finterface.md",{"id":213,"title":214,"url":215},"grbl-commands","Grbl v1.1 Commands","https:\u002F\u002Fgithub.com\u002Fgnea\u002Fgrbl\u002Fblob\u002Fmaster\u002Fdoc\u002Fmarkdown\u002Fcommands.md",{"id":217,"title":218},"laetoly-driver-bridge-v2","Technical Architecture Spec: Laetoly Driver WebSocket Bridge Protocol V2","engineering",{"title":7,"description":195},"connection-recovery-contract","roadmap","zh\u002Fengineering\u002Fconnection-recovery-contract","engineering-connection-recovery-contract","1I78KXDFyIrl-EGQXqhSA87DYRzD8y6RZuKfaoYKDAw",{"id":227,"title":228,"body":229,"category":358,"date":359,"description":360,"difficulty":3,"draft":196,"duration":3,"extension":197,"featured":196,"image":3,"layout":202,"locale":203,"meta":361,"navigation":205,"path":362,"references":363,"related":3,"section":219,"seo":374,"slug":375,"status":376,"stem":377,"tags":3,"translationKey":378,"updated":3,"video":3,"__hash__":379},"content\u002Fzh\u002Fengineering\u002Fdriver-bridge-architecture.md","Laetoly 驱动桥架构与 GRBL 硬件协议设计",{"type":9,"value":230,"toc":353},[231,234,242,251,275,281,285,292,334,337],[21,232,233],{"id":233},"系统分层架构",[17,235,236,237,241],{},"Laetoly 采用清晰的 ",[238,239,240],"strong",{},"云端\u002F网页工作台与本地计算控制解耦"," 架构：",[243,244,245],"blockquote",{},[17,246,247,250],{},[238,248,249],{},"状态：实验性。"," 本页描述当前内部桥接技术笔记；端点、阈值和硬件兼容范围必须以具体 Driver 与控制器版本核对为准。",[28,252,253,263,269],{},[31,254,255,258,259,262],{},[238,256,257],{},"浏览器工作台（Laetoly Web）","：运行于浏览器前端（",[67,260,261],{},"app.laetoly.com","）。负责 2D 矢量设计（SVG\u002FDXF 导入）、刀具库配置、工程云端存取以及三维切削仿真预览。",[31,264,265,268],{},[238,266,267],{},"本地驱动程序（Laetoly PC Driver）","：安装并运行于用户电脑的后台守护进程。它作为核心 CAM 引擎，执行复杂的刀路计算、进给与下刀量规划、后处理生成 G 代码，并通过本地 USB 串口或 Wi-Fi 维持与 CNC 机床的低延迟指令通信及真机控制。",[31,270,271,274],{},[238,272,273],{},"数控机床硬件（CNC Machine）","：运行 GRBL 固件的标准 3 轴桌面数控雕刻机。",[59,276,279],{"className":277,"code":278,"language":64},[62],"+------------------------------------+\n|       Laetoly 网页工作台 (Web)      |\n|   - 2D 矢量画布与图形导入 (SVG)     |\n|   - 3D 刀路切削与材料去除仿真       |\n|   - 刀具参数配置与项目云端存储      |\n+-----------------+------------------+\n                  | 本地安全回环 (WebSocket \u002F IPC)\n                  v\n+-----------------+------------------+\n|       Laetoly PC 驱动程序 (CAM)    |\n|   - 自研后台 CAM 刀路生成引擎       |\n|   - G 代码后处理器与流控分发        |\n|   - USB 串口 \u002F Wi-Fi 硬件连接控制   |\n+-----------------+------------------+\n                  | USB 串口 (115200 波特率) \u002F Wi-Fi\n                  v\n+-----------------+------------------+\n|       GRBL 兼容桌面数控雕刻机       |\n|   - 三轴步进电机运动驱动 (XYZ)      |\n|   - 主轴电机、限位与急停开关        |\n+------------------------------------+\n",[67,280,278],{"__ignoreMap":65},[21,282,284],{"id":283},"缓冲区管理字符计数流控法","缓冲区管理：字符计数流控法",[17,286,287,288,291],{},"批准的 Driver V2 技术笔记将 GRBL 或 FluidNC 控制器的接收环形缓冲区描述为 128 字节。为避免缓冲区溢出，Laetoly PC Driver 采用 GRBL 推荐的 ",[238,289,290],{},"字符计数（Character-Counting）"," 方法：",[156,293,294,301,311,326],{},[31,295,296,297,300],{},"在内存中维护可用缓冲变量 ",[67,298,299],{},"buffer_available","，初始值为 128 字节。",[31,302,303,304,307,308,310],{},"每发送一行指令（包含 ",[67,305,306],{},"\\r\\n","），从 ",[67,309,299],{}," 中扣除该行字节长度。",[31,312,313,314,317,318,321,322,325],{},"若 ",[67,315,316],{},"buffer_available \u003C 当前待发指令长度","，暂停发送，等待机床返回 ",[67,319,320],{},"ok"," 或 ",[67,323,324],{},"error:","。",[31,327,328,329,331,332,325],{},"收到 ",[67,330,320],{}," 响应时，将最早一条已完成指令的字符长度退还给 ",[67,333,299],{},[21,335,336],{"id":336},"实时特权指令拦截",[17,338,339,340,342,343,345,346,348,349,352],{},"诸如 ",[67,341,102],{},"（进给保持\u002F暂停）、",[67,344,106],{},"（继续切削）与 ",[67,347,84],{},"（实时坐标与状态查询）等单字节控制字符会优先于排队的 G 代码发送。V2 技术笔记规定 WebSocket 断开后先经过 500 ms 防抖，再触发进给保持和 ",[67,350,351],{},"M5","；端到端响应取决于操作系统、连接路径、Driver 构建版本与控制器，因此本页不作亚毫秒保证。",{"title":65,"searchDepth":185,"depth":185,"links":354},[355,356,357],{"id":233,"depth":185,"text":233},{"id":283,"depth":185,"text":284},{"id":336,"depth":185,"text":336},"底层架构","2026-09-08","详解免安装浏览器工作台、本地 PC 后台 CAM 引擎与数控雕刻机硬件之间的架构分工与低延迟控制设计。",{},"\u002Fzh\u002Fengineering\u002Fdriver-bridge-architecture",[364,367,371],{"id":365,"title":366,"url":211},"grbl-protocol","GRBL v1.1 接口基础",{"id":368,"title":369,"url":370},"rfc-6455","WebSocket 协议 RFC 6455 规范文档","https:\u002F\u002Fdatatracker.ietf.org\u002Fdoc\u002Fhtml\u002Frfc6455",{"id":372,"title":373},"spec-proto-01","Laetoly Driver WebSocket Bridge Protocol V2 技术架构笔记",{"title":228,"description":360},"driver-bridge-architecture","experimental","zh\u002Fengineering\u002Fdriver-bridge-architecture","engineering-driver-architecture","TOIqvMJjTjsn7ca_-8tBPTZWdNe1Z4NvoVTF8bCSWM0",1789009347331]