Contact me: hankecnc@gmail.com

自定义 GCode 命令 #808

推推 grbl 3年前 (2023-01-30) 524次浏览
关闭
Protoneer 打开了这个问题 2021 年 3 月 9 日 · 30条评论
关闭

自定义 GCode 命令#808

Protoneer 打开了这个问题 2021 年 3 月 9 日 · 30条评论

注释

自定义 GCode 命令 #808
质子 评论了 2021 年 3 月 9 日  

请描述您想要实现的功能
我正在尝试设置拾放机。但它需要特殊的机器特定 gCode 命令。
示例:M115

openPNP 使用它来检测机器类型和配置应用程序。

为什么您认为这会改进 Grbl_ESP32?
Grbl_ESP32 在引脚分配方面已经非常可配置。
能够使用自定义命令扩展 vanilla GRBL 将使其超级可扩展。
这也可以用来代替宏,对吧?

这个功能会出现在很多用户面前吗?
这绝对是针对定制机器的

自定义 GCode 命令 #808 Protoneer 添加了 增强 新功能或要求标签 2021 年 3 月 9 日
自定义 GCode 命令 #808
所有者

我们尽可能使用 LinuxCNC 定义的 gcode。这是基于 NIST 标准,并通过定义的模态组进行了深思熟虑。

Marlin 的列表一团糟,似乎任何人都可以在不遵循任何标准的情况下添加命令。我不想仅仅因为它们对一个人很重要就添加命令(这里不是在谈论你)。

我们有可能为人们创建一种简单的方法来添加 G 或 M 代码以供他们自己使用。Grbl_ESP32 会解析 gcode 并查看它不知道的命令。然后它会将其传递给自定义文件以可能对其进行处理。

自定义 GCode 命令 #808
作者

我们尽可能使用 LinuxCNC 定义的 gcode。这是基于 NIST 标准,并通过定义的模态组进行了深思熟虑。

Marlin 的列表一团糟,似乎任何人都可以在不遵循任何标准的情况下添加命令。我不想仅仅因为它们对一个人很重要就添加命令(这里不是在谈论你)。

我完全同意这种说法。这实际上就是人们比其他实现更喜欢 GRBL 的原因。

我也不希望这种情况发生改变。

自定义 GCode 命令 #808
作者

我们有可能为人们创建一种简单的方法来添加 G 或 M 代码以供他们自己使用。Grbl_ESP32 会解析 gcode 并查看它不知道的命令。然后它会将其传递给自定义文件以可能对其进行处理。

这正是我想要做的,就像 custom_code_template.cpp 一样,它会挂接到 gcode 处理器的末端。

就我而言,我想控制 5-100 个螺线管/执行器。它与 M62 命令相同,但具有更多的 IO。

自定义 GCode 命令 #808

我也想借此机会添加自定义 G 代码,因为我想添加代码来启动 http 请求。有一种结构化的方式来添加额外的文件而不修改原始代码会很棒。
在 ESP32 中拥有 WiFi 是相对于 Arduino 的另一个巨大优势。

自定义 GCode 命令 #808
作者

我也想借此机会添加自定义 G 代码,因为我想添加代码来启动 http 请求。有一种结构化的方式来添加额外的文件而不修改原始代码会很棒。
在 ESP32 中拥有 WiFi 是相对于 Arduino 的另一个巨大优势。

有趣…. 那会是什么类型的 http 请求?

完全同意这需要在一个单独的层上,以保留原始代码。

自定义 GCode 命令 #808

好吧,我想添加由 grbl 控制的基于 Tasmota 的设备(基于 ESP8266 的硬件的社区固件)。简单示例:使用便宜的 Tasmota 电源插头打开/关闭主轴。这将使高压完全远离我的设置。我更喜欢这个而不是使用继电器。https://github.com/arendst/Tasmota
我手机上的“工作完成”通知也不错。但是使用来自 G-Code 的 http 调用肯定有更大的潜力。

自定义 GCode 命令 #808

对于不适合已建立的语言框架的扩展,一种常用的方法是“智能注释”,即将新语法包装在注释中。然而,在 GRBL 世界中,一些发件人撕掉评论并且不将它们发送到 GRBL 的事实受到了影响。

另一种可能效果更好的解决方案是发明 M 代码。机器/控制器特定 M 代码有很多 GCode 先例;事实上,人们可以争辩说它们就是为了这一目的而设计的。

但是仍然存在一些问题:

  1. 添加 M 代码是 Marlin 所做的,并且在 GRBL 社区中有很大的阻力反对做任何有 Marlin 味道的事情
  2. 无论做什么都必须符合 GRBL 行长度限制 – 因此 http: 请求的 URL 需要很短
自定义 GCode 命令 #808
所有者

@MitchBradley是正确的。为“因为 Marlin 这样做”而进行的更改辩护对 Grbl 社区没有帮助。

这意味着添加命令的通用方法是更好的方法。

我有一些基本代码在工作。

Grbl_ESP32 应该如何响应 M115?

应该支持 EXTENDED_CAPABILITIES_REPORT 吗?它看起来应该如何?

Cap:EEPROM:1
Cap:AUTOREPORT_TEMP:1
Cap:PROGRESS:0
Cap
:AUTOLEVEL:1 Cap:Z_PROBE:1
Cap:SOFTWARE_POWER:0
Cap:TOGGLE_LIGHTS:0
Cap:EMERGENCY_PARSER:1

自定义 GCode 命令 #808
作者

@bdring,我在下面的 openPNP 论坛上引用了更多背景知识……

M115 至少应该重新运行 FIRMWARE_NAME: XXXX 和 FIRMWARE_VERSION: X.XXX

FIRMWARE_NAME:GRBL_ESP32 FIRMWARE_VERSION:1.3 [20210101]

https://groups.google.com/g/openpnp/c/VzSW0rScx2c/m/T5fshkY-BQAJ?pli=1

没有真正的标准(据我所知),只有惯例。有这个
https://reprap.org/wiki/M115_Keywords

但似乎没有人真正坚持或维护它。

这些是已知的响应:
FIRMWARE_NAME:Smoothieware,FIRMWARE_URL:http%3A//smoothieware.org,X-SOURCE_CODE_URL:https%3A//github.com/markmaker/Smoothieware/tree/feature/best-for-pnp,FIRMWARE_VERSION:feature /best-for-pnp-c82d0b45,X-FIRMWARE_BUILD_DATE:2020 年 10 月 22 日 21:21:58,X-SYSTEM_CLOCK:120MHz,X-AXES:5,X-PAXES:5,X-GRBL_MODE:0,X-CNC: 0, X-MSD:1

FIRMWARE_NAME:适用于 Duet 3 MB6HC 的 RepRapFirmware FIRMWARE_VERSION:3.2-RC1+1 ELECTRONICS:Duet 3 MB6HC v1.01 或更高版本 FIRMWARE_DATE:2020-12-23

FIRMWARE_NAME:TinyG,FIRMWARE_URL:https%3A//github.com/synthetos/TinyG,FIRMWARE_VERSION:0.97,FIRMWARE_BUILD:440.21,HARDWARE_PLATFORM:1.00,HARDWARE_VERSION:8.00

注意:由于“:”用作分隔符,因此不能在值内部使用它。因此将它们编码为“%3A”。

我想你明白了。问题和解决方案使用了一些基本属性,例如 FIRMWARE_NAME 和 FIRMWARE_VERSION。除此之外,你很自由​​。如果有重要的编译时定义或配置选项,通过自定义属性传达这些会很酷(告诉我如何解释)。作为示例,问题和解决方案解释了 Smoothie 上的 X-AXES 和 X-PAXES 属性,如此处所述,加上 X-GRBL_MODE,因为它会影响归位命令。

也不要忘记实施 M114 ;-)

你能告诉我们更多关于你的 Grbl 端口的信息吗?
_标记

自定义 GCode 命令 #808
作者

@MitchBradley是正确的。为“因为 Marlin 这样做”而进行的更改辩护对 Grbl 社区没有帮助。

这意味着添加命令的通用方法是更好的方法。

绝对同意通用方法。我的想法是它会在机器 cpp 中定义/链接或实现。

这样每台机器都可以像上面的 SMOOTHIE 示例一样向它添加额外的位。

自定义 GCode 命令 #808
作者

应该支持 EXTENDED_CAPABILITIES_REPORT 吗?它看起来应该如何?

Cap:EEPROM:1
Cap:AUTOREPORT_TEMP:1
Cap:PROGRESS:0
Cap
:AUTOLEVEL:1 Cap:Z_PROBE:1
Cap:SOFTWARE_POWER:0
Cap:TOGGLE_LIGHTS:0
Cap:EMERGENCY_PARSER:1

对于 openPNP,我认为它不需要基本设置

自定义 GCode 命令 #808
所有者

它似乎工作正常。M115 是一个非常简单的命令。你必须非常了解 Grbl 才能添加复杂的。可能也有限制。用户当心。

Grbl 1.3a ['$' for help]
m115
FIRMWARE_NAME:Grbl_ESP32, FIRMWARE_VERSION:1.3a, FIRMWARE_BUILD:20210308
ok

我让它向所有客户发送响应。这类似于探测命令。没有太多 gcodes 发送除“OK”以外的响应

它位于 devt 的一个分支上,名为UserDefinedGcode

自定义 GCode 命令 #808
作者

惊人的东西!感谢那!!!

自定义 GCode 命令 #808

建议:添加G代码的框架不仅应该允许添加一些功能,还应该允许将grbl置于某些状态,例如将机器置于警报模式。
在我的示例中:如果此 http 请求失败,http 请求将运行主轴的电源插头切换为“on”,应导致警报模式。

自定义 GCode 命令 #808
作者
质子 评论了 2021 年 3 月 11 日  

@bdring

我正在尝试编译测试分支(UserDefineGcode),但它说找不到文件。

Custom/user_gcode_example.cpp 的替代方案:[]C:\Users\IT\AppData\Local\Temp\arduino_build_368994\sketch\src\CustomCode.cpp:7:34: fatal error: Custom/user_gcode_example.cpp: No such file 或目录

ResolveLibrary(自定义/user_gcode_example.cpp)

当我注释掉…

#define CUSTOM_CODE_FILENAME “自定义/user_gcode_example.cpp”

在 test_drive.h 中它再次编译。

自定义 GCode 命令 #808
作者

尝试编译具有相同结果的 Simple_OLED 分支,但仅针对 oled_basic.cpp 文件。

这可能是 Windows 路径问题吗?

自定义 GCode 命令 #808
所有者

这时候使用自定义文件夹就必须使用PlatformIO来编译。custom文件夹不在src文件夹下,防止文件夹内所有文件自动被编译。这可能会导致问题,特别是如果某些文件包含相同的函数名称,例如machine_init()

自定义 GCode 命令 #808
所有者

@joedirium有更好的方法来处理替代 I/O。与 I2S 输出类似,您可以创建一个新的 I/O 类,然后任何功能都可以在不更改现有代码的情况下使用它。它会添加另一个像这样的输出选项。

#define SPINDLE_OUTPUT_PIN   GPIO_13 
// or
#define SPINDLE_OUTPUT_PIN   I2SO(12)
// or
#define SPINDLE_OUTPUT_PIN   Tasmota(3)

话虽如此,我对这些设备一无所知,我没有。这不是我自己感兴趣的事情。

自定义 GCode 命令 #808

@bdring谢谢你的建议!听起来很有希望能够使用现有的 G 代码。
所以我试着看看我是否能做到这一点,但显然我的 C++ 技能还远远不够。来自 Java 世界,我希望找到一个用于 I/O 的接口或抽象类来实现,但找不到。我迷失在所有这些 #define 和 #ifdef
对于 I2SO 我希望找到一个类,但实际上找到了这个

定义 I2SO(n) (I2S_OUT_PIN_BASE + n)

它看起来像一个带有偏移量的常数,对我来说不像一个对象。
C++ 真的让我很困惑。
我向所有能够在像这样的复杂项目中处理这个问题的人表示敬意!

自定义 GCode 命令 #808

GRBL 最初是用纯 C 语言编写的,用于在内存有限的小型 AVR 处理器上运行,到处都是#defines 以节省内存。Grbl_Esp32 随后被转换为 C++,因此它可以由 Arduino IDE 编译,但转换主要是“C 打扮成 C++”。我们正在将它的一部分更改为适当的 C++ 以使用抽象类,但这需要时间。设置框架、主轴支持和电机的许多方面现在都使用类,但许多核心仍在(修饰)纯 C 中。有分支 NewPinClass 将 IO 引脚引入 C++ 类折叠,但它还没有已部署。它在我们的发展优先事项清单上名列前茅。但坦率地说,像这样的“小”功能请求一直让我们分心……

自定义 GCode 命令 #808

关于 Tasmota 情况的进一步思考:

  1. 无论我们想出什么名字,都不应该是“Tasmota”。该名称应反映网络协议,而不是实现它的特定固件。Tasmota 实施多种通信协议,包括 MQTT、HTTP 和串行。除了 Tasmota 之外,还有其他固件解决方案可以实现这些协议。因此,调用接口“Tasmota”既
    过于具体又不够具体。
  2. Tasmota 最常使用的协议是 MQTT。因此,如果我们假设 MQTT 是主轴引脚更改的传输,那么名称将是“MQTT”的某种变体。但是涉及到很多配置,包括如何指定MQTT broker地址,MQTT订阅变量的名称是什么,服务等级是什么等问题。
  3. 或者,可以使用 Tasmota 的 HTTP(REST 风格)接口——但它也有类似的配置要求。
  4. 新 Pin 类框架的抽象接口将能够通过这样的接口表达简单的引脚更改,但性能可能存在问题,因为看似简单的“引脚更改”实际上涉及对网络堆栈的深入研究. 再加上引脚更改——包括那些控制主轴的更改——通常需要从中断服务例程中完成——你不能在其中调用网络堆栈——你最终会遇到一连串的蠕虫病毒。
    结论:这比表面上看起来要复杂得多。
自定义 GCode 命令 #808
作者

这时候使用自定义文件夹就必须使用PlatformIO来编译。custom文件夹不在src文件夹下,防止文件夹内所有文件自动被编译。这可能会导致问题,特别是如果某些文件包含相同的函数名称,例如machine_init()

@bdring….哈哈…我是在VC里看代码,在Arduino里编译的。

我已经切换到 PlatformIO,它更容易使用。

我已经使用 openPNP 进行了测试,它正在接受 M115 结果!!!!?

自定义 GCode 命令 #808
作者

结论:这比表面上看起来要复杂得多。

@MitchBradley 你在描述宇宙… ?

自定义 GCode 命令 #808
所有者

@Protoneer

You also have to “clean” before each compile. The automatic clean does handle the custom folder.

自定义 GCode 命令 #808

@MitchBradley Your are right. Please see Tasmota only as an example. It has a huge community, but some generic way to do HTTP requests would cover this anyway. I assume that a HTTP request library is already linked.
Not sure if the parser can read an URL as a parameter of a G-Code. So a custom G-Code with URL support is maybe the better

喜欢 (0)