** 草稿 **
grblHAL 有许多扩展并在处理器/板上运行,这与 Grbl 最初编写的 8 位 Arduino 变体有很大不同。一个主要区别是许多不能在连接时硬重置,并且控制器并不总是可以在发送方连接时发送欢迎消息。
这对想要完全支持 grblHAL 的发件人作者提出了一些挑战。
连接中
当连接到基于 Arduino 的电路板时,处理器通常会硬重置,从而导致控制器干净启动。通常这意味着控制器处于定义良好的状态并且已准备好进行通信。这不再适用于基于 grblHAL 的控制器,因为有些控制器可能允许通过本机 USB 1或网络连接进行连接。当通过本机 USB 或网络建立连接时,通常无法进行硬重置,因为这会导致连接断开。有些具有用于通信的 USB <> UART 芯片,该芯片未通过 DTR 或 RTS 握手信号进行硬重置。并且一些 grblHAL 驱动程序也可以配置为 MPG/DRO 进行控制,从而阻止来自发送方的所有传入流量。
这意味着不再可能依赖在连接时自动输出的 grbl 欢迎消息,并且发送者的启动顺序必须考虑到这一点。因此,启动序列可能如下所示:
连接时等待片刻(400 – 500 毫秒),同时监听任何传入流量。
如果在此等待期间收到实时报告,则第二发送器 (MPG) 处于活动状态。然后发送方应进入等待模式并收听实时报告并检查辅助发送方是否释放控制。这是通过报告中元素的存在来表示的|MPG:0
。
如果收到 grbl 欢迎消息,发件人可以假设控制器已硬重置,可以继续。注意:可以吗?
然后应该通过发送0x87
和等待来请求扩展状态请求,250 毫秒应该绰绰有余。如果收到,则在另一端有一个具有扩展版本的 grbl 协议(例如 grblHAL)的控制器,然后发送方可以确定控制器是否处于可以进行进一步通信的状态2。
扩展协议
某些警报状态、保持、门和工具更换状态会阻止常规命令,如果检测到控制器可能会尝试发送软重置命令0x18
(ctrl-X) 以使其进入可以进行通信的状态。
如果报告了警报状态,则将警报代码作为子状态添加到Alarm
,例如Alarm:1
。如果检测到警报代码 1、2 和 10(新 – 急停),则控制器处于锁定状态(由于严重事件)并且除了实时报告请求外无法响应任何其他内容。然后应该尝试软重置(?)。
其他警报子状态和状态至少允许$
– 命令,并且发送者可以继续配置自身,通常通过请求扩展的 $I 报告来$I+
确定控制器的能力。
遗留协议
采取你曾经做过的任何行动..
供讨论:
- 如果请求了完整的实时状态请求,控制器是否可以假定发送方能够处理(某些?)\扩展,例如完整的设置报告和扩展的 $I 报告?
- 我们是否需要一个最高位设置字符来请求 $I+ 报告,以便即使在锁定模式下也可以输出?
- 警报代码分配。
- 如果处于等待、门或工具状态怎么办?询问用户采取的行动?尝试软重置?
- 如果硬重置,ESP32 可能会在连接时发送大量启动消息呢?它也有愚蠢的“冥想大师”稍后随机输出消息。我不得不承认我和这个角色的关系不是最友好的……
- 8 位 grbl 控制器在锁定状态下不响应任何内容。这不是问题,因为这些总是(?)在连接时硬重置?许多 32 位端口都存在相同的“错误”,但 AFAIKT 这些端口并未实现许多扩展功能。
协议扩展
协议的grblHAL 扩展遵循与原始协议相同的结构,如果以正确的方式进行解析,当前和未来的扩展不应导致发送方崩溃。
- 不要假设标签值/元素以任何特定顺序排列。
- 忽略未知的标签值。
- 忽略未知标签。
- 期望以逗号分隔的值列表获得额外的值。
- 期望具有单个字符定义(例如引脚状态)的列表会扩展。
为了改进错误/警报/设置代码处理:
- 使用新的代码枚举到错误代码、警报和设置的文本映射。如果不可用,请使用csv 文件作为备用。不要硬编码设置用户界面。
实时报告
实时报告已经扩展了几个新元素。
单字符实时命令。
在读取 $ 命令或消息的输入时,grblHAL 不支持可打印的单字符实时命令。这是为了允许这些字符出现在密码等字符串设置中,并阻止 grbl 在它们出现在消息中时表现得很奇怪。然而,这个解决方案并不完美,因为它依赖于流输入缓冲区在任何时候都只保存单个块(或行)的输入。为了克服这个额外的最高位集字符版本已经可用:
0x80
可以用来代替?
请求实时报告。目前0x05
(CTRL+E
-ASCII ENC) 也可以使用。0x81
可以用来代替~
请求周期开始。0x82
可以用来代替!
请求进给暂停。
附加命令字符:
0x83
可用于请求解析器状态报告,这可用作 的快捷方式$G
。0x87
可用于请求完整的实时报告,包括仅在更改时发送的所有元素。如果警报状态处于活动状态,则警报代码将作为子状态添加到该Alarm
状态。0x88
可用于切换虚拟可选停止开关,当物理开关不可用时可用。0xA2
可用于在主轴同步可用时请求 PID 报告(当前仅限调试模式)。0xA3
用于确认换刀请求。0xA4
可用于切换虚拟可选探头连接开关,当物理开关不可用时可用。注意:还没有功能!
对这些字符的支持由响应中标记中的RT+
或指示。RT-
NEWOPT
$I
解析器状态
对命令的解析器状态响应$G
已通过 grblHAL 支持的新 G 代码和 M 代码以及原始代码中缺少的一些代码进行了扩展。
推送消息
grblHAL 可以配置为$G
在更改时发布解析器状态(响应),这将在状态报告请求之后输出。发件人应该能够处理此问题或证明它无法这样做。
代码集和枚举
可以从控制器获取带有文本映射的代码集,取代必须以某种方式保持同步的文件的使用。唯一的数字代码仍然被使用,因为它们易于解析并且可用于查找翻译的术语。如果没有可用的翻译,则应使用列举的英文版本。
1本机 USB 是指微控制器本身处理 USB 协议,这不同于通过专用 USB <> UART 转换器芯片提供 USB 连接的板卡。
2一些与安全相关的grblHAL扩展:
内核支持急停信号,一些驱动程序已实现此功能。如果置位,则在信号无效之前软复位将不起作用,因为控制器将立即重新进入锁定模式,并显示警报代码 10。
复位信号的处理方式也不同,如果在控制器启动(冷启动)时置位,则进入并'$H'|'$X' to unlock
输出警报状态。没有与此关联的警报代码,因此没有报告警报子状态。G 代码执行被阻止,直到解锁。
类似地,如果“硬限制”与“在初始化时检查硬限制”一起启用,并且任何限位开关被声明'$H'|'$X' to unlock
将在重置时输出,直到所有限位开关被取消声明或机器归位。
最后,如果启用“启动时归位”,则进入并Homing cycle required
输出报警代码为 11 的报警状态。与 grbl 不同,在按照配置成功完成归位之前,并不总是可以使用软复位退出此状态。此行为取决于设置。
2020-12-18