开源改变世界!!

手动编程助手 #105

推推 grbl 2年前 (2023-02-12) 250次浏览
打开
mkaluza 打开了这个问题 2019 年 5 月 2 日 · 14条评论
打开

手动编程助手#105

mkaluza 打开了这个问题 2019 年 5 月 2 日 · 14条评论

评论

手动编程助手 #105

嗨,
我主要是手动使用 grbl,与专业的 cnc(我的是使用 Sinumeric 控制)相比,我缺少了一些功能,grbl 不支持(由于 Arduino 的限制甚至不能支持),但是控制器应用程序
用户界面可以轻松支持:

  • 点击当前位置应打开一个对话框以将其作为 G10 L20 P0 的快捷方式输入 …
  • 键入的命令历史记录(用于重播/编辑)

GCODE:
这些功能需要一些 gcode 预处理,但也许它们是可能的(从最简单和最需要的顺序排列):

  • 子程序。用 L_program_name_ 调用。它会从相对于正在执行的主脚本的“subprograms”子文件夹加载程序(如果没有找到,它也可以搜索“machine”子程序文件夹) – 这将非常有用,但我认为它不是很有帮助复杂的
  • 标签、向前跳转(GOTOF 标签)和 REPEAT 循环(REPEAT 标签 P=num_of_reps)——非常有用的东西,虽然有点复杂
  • 变量(这个会更复杂,但也不重要)

告诉我你的想法。虽然我不喜欢 java,也不怎么用 java 编程,但也许我可以帮忙写代码。

手动编程助手 #105
作者

哦,还有用户消息(对于具有许多工具的长程序的工具更改很有用)。
当遇到以感叹号开头的评论时,它应该停止发送 gcode 并在带有 OK(也可能是 Abort)按钮(不是气泡)的窗口中显示该消息。

这将使这些程序更加独立。

手动编程助手 #105
所有者

@mkaluza这些是您给出的优点,但该应用程序当前的目标是仅支持 grbl 支持的功能。
我认为一旦官方 grbl arm 固件发布,就可以添加更多功能。

键入的命令历史记录是我认为在下一个版本中可以想到的。
子程序我不确定,它们会有多大帮助
标签,向前跳转,变量(你能解释一下吗)

手动编程助手 #105
作者
姆卡卢扎 评论了 2019 年 5 月 2 日 通过电子邮件
手动编程助手 #105
作者

手动编程助手 #105

刚刚意识到电子邮件附件不会显示,所以这是图片

手动编程助手 #105
所有者

@mkaluza感谢您的图片。
这是一个不错的选择,我一定会调查一下。

你是对的,我对专业的数控机床一无所知,我开发这个应用程序时只考虑了 grbl。

如果找到像“(!drillbit hss 6)”这样的行,我没有弄清楚等待用户按确定。如果用户必须在此消息后更改工具,那么它有点复杂(并非不可能)。使用用户宏支持 M6 在我的待办事项列表中,完成后可能会解决此问题。

如果您能提供一些 gcode 示例,这对我会有很大帮助。

图像看起来有线,为什么两行文本“步长|慢进给”?应用程序应该全屏打开,移动状态栏不应该可见。
手机型号是什么?操作系统版本?和决议?
对我来说,您似乎增加了移动设置中的文字大小。

手动编程助手 #105
作者
姆卡卢扎 评论了 2019 年 5 月 2 日  

如果找到像“(!drillbit hss 6)”这样的行,我没有弄清楚等待用户按确定。如果用户必须在此消息后更改工具,那么它有点复杂(并非不可能)。使用用户宏支持 M6 在我的待办事项列表中,完成后可能会解决此问题。

让我们假设以下代码来更改工具(只是示例并不意味着真正或非常正确)

...
N1 G0 G91 Z20
N2 M5 M9
N3 G53 G90 X100 Y300
N4 G53 Z50
N5 M0
(!Endmill flat hss 6)
N6 G53 Z20
N7 M0
N8 G53 Z50
...

现在在 grbl 上,这段代码将转到 X100 Y300 绝对机器坐标(刀具更换位置,刀具探头位置),主轴和冷却液关闭并略高于它(N4),并保持程序以便我可以移除立铣刀和插入另一个。之后它会下降并再次等待,以便我可以在参考水平上拧紧立铣刀(我还没有工具探针,所以这是我处理工具长度设置的方式)。之后,它会随着铣削而上升。

但是现在每次机器等待时,我都需要查看代码以找到包含机器期望的工具的注释。我提议的修改将使我能够在屏幕上永久看到消息,这样我就知道现在我应该插入 6mm 立铣刀,然后在找到它时单击“确定”或在出现问题时中止(但它不是这不是绝对必要的,因为我可以在机器等待 M0 时中止,所以只需“确定”按钮就足以启动,但拥有它会很好)。

顺便说一句,你已经告诉我如何在 grbl 中轻松灵活地实现 M6 :) 我不确定 UI 是否应该这样做……我认为它更像是一个 grbl 工作……

此外 – 这种消息将是通用的 – 用户可以获得各种消息,例如关于库存和初始设置:“库存 100×150,中心为零”,一些安全检查或操作员应该获得的其他一些消息/信息在操作过程中,如“合上盖子”。

如果您能提供一些 gcode 示例,这对我会有很大帮助。

好的,假设我们有 20 个孔要钻(这是我现在面临的直接问题)。现在我需要这样的 gcode:

G0 G90 X20 Y20
G0 Z4

(drill the first hole)
G0 G91 Z-3
G1 Z-5 f300
G0 Z8

G0 X10

(and another)
G0 G91 Z-3
G1 Z-5 f300
G0 Z8

G0 X10

and repeat that last 4 lines 18 more times...

这是一个非常长、丑陋的代码,可以在手机上编辑……
现在想象一下这个钻孔不是那么简单(接近材料,钻孔,向上)。想象一下,这是一个向下钻 5 或 6 次的啄钻,而您必须在文件中重复该代码 20 次……它更糟糕。

但是如果我有子程序,我可以这样做:

file: drill_5.sub
G0 G91 Z-3
G1 Z-5 f300
(many other lines of code that should be repeated for each hole)
G0 Z8
M17
file: rail.gcode
G0 G90 X20 Y20
G0 Z4

(drill the first hole)
L_drill_5 (<--- call "subprograms/drill_15.sub subprogram)

G0 G91 X10

(and another)
L_drill_5 (<--- call "subprograms/drill_15.sub subprogram)

G0 G91 X10

and repeat that last 2 lines 18 more times...

这看起来已经好多了,因为通过查看主程序,您可以轻松地弄清楚它的作用(钻孔、前进 10 毫米、钻孔、前进等…)

现在让我们在这里添加一个循环。drill_5.sub 保持不变,只有主程序发生变化

file: rail.gcode
G0 G90 X20 Y20
G0 Z4

drill_label:
(drill the hole)
L_drill_5 (<--- call "subprograms/drill_15.sub subprogram)

G0 G91 X10

REPEAT drill_label P=19

最后一行指示 UI 从那里重复 gcode 到“drill_label”19 次(它已经执行过一次,所以总共会有 20 个孔)。之后,它将继续执行该程序。
看起来不是更好吗?

子程序是最简单的东西——在解析gcode时,如果遇到L_(filename),你应该只发送从相对于主脚本的文件夹打开的subprograms/filename.sub的内容。它不需要保持任何状态,也不应该很复杂。将其视为“包含”。

REPEAT 更复杂,因为您必须跟踪标签和已经完成的重复次数,但仍然应该是可行的。它不会改变任何语法,也不会造成混淆(可以使用正则表达式检测标签:不带括号的 alnum 字符(我们忽略注释)以冒号结尾。而且 REPEAT 很好……重复 :D 也可以用 a 解析正则表达式。它也不需要任何预处理,因为 REPEAT 总是向后走,所以您要么已经在代码中遇到了标签,要么是错误的。

向前跳转只是一个GOTOF 标签,不同之处在于该标签位于 goto 之后,而不是像 repeat 中那样位于之前。如果您不得不在某个时候中止程序并且想在同一时间重新启动它,这将非常有用。然后,您只需在此处添加一个标签并在开头添加一个 GOTOF,而无需删除所有行。这里的困难在于,此时您必须向前扫描文件才能找到标签。或者可能不是——你只是跳过所有的行,直到你找到标签或程序结束(在这种情况下它是一个错误,但它仍然会停止程序)。

我现在将跳过变量,因为它会变得更加复杂。

我希望你明白这一点。任何版本的 grbl 都不会实现这些功能,因为它无法立即访问整个 gcode,因此它无法“记住”REPEAT 的标签(此外,重复的代码块可能太大而无法放入 uP 内存中) ) 或者在 GOTOF 中寻找它们(好的,它可以跳过这些行直到找到标签)。

如果没有 gui 支持,它也无法向用户显示消息。

图像看起来有线,为什么两行文本“步长|慢进给”?应用程序应该全屏打开,移动状态栏不应该可见。

它是全屏的——状态栏可见是截图的副作用

手机型号是什么?操作系统版本?和决议?

LG K7 2017

对我来说,您似乎增加了移动设置中的文字大小。

是的,我设置了大字体。我什至没有注意到它:)

手动编程助手 #105
所有者

感谢您的精彩解释。
这是包含“!”的标准做法吗?在用户确认消息的评论中?

顺便说一句,你已经告诉我如何在 grbl 中轻松灵活地实现 M6 :) 我不确定 UI 是否应该这样做……我认为它更像是一个 grbl 工作……

UGS 和 BCNC 等桌面发送器支持 M6 宏,其中 M6 命令替换为用户定义的 gcode 块。

好的,假设我们有 20 个孔要钻(这是我现在面临的直接问题)。现在我需要这样的 gcode:

对于简单的可重复 gcode 块,我认为我们可以使用自定义按钮,我们将可重复代码放在自定义按钮中并按下按钮 n 次。或者甚至我们可以在按钮配置中选择“重复 n 次”。事实上,我想在应用程序中有一个简单的凸轮工具,我可以在其中进行钻孔、仿形和切割基本形状,但由于时间不够,我无法实现它。

支持“L_”、“标签”和“REPEAT”只有在 CNC 世界中成为标准做法时才是好主意。(我怀疑人们可能有不同的标签/字母来表示它们)
应用程序的当前架构阻止了像这样做的任何事情(因此 M6 宏仍未实现),我计划重写结构以便这些类型的实现可以完成。
除非为我实现“REPEAT”,否则它看起来不太好(多次调用子程序)

当我重写应用程序的核心时,我会牢记这些要点。

手动编程助手 #105
作者

感谢您的精彩解释。
这是包含“!”的标准做法吗?在用户确认消息的评论中?

从来没听说过。它和其他任何东西一样好。那是我的第一个想法。事实上,您可以添加一个配置选项来输入一个正则表达式,而不是对其进行硬编码,该正则表达式将匹配应显示为对话框的消息 – 然后任何人都可以设置他们喜欢/想要的任何内容,例如默认设置为 /^!(? P<消息>[\w]+)/

顺便说一句,你已经告诉我如何在 grbl 中轻松灵活地实现 M6 :) 我不确定 UI 是否应该这样做……我认为它更像是一个 grbl 工作……

UGS 和 BCNC 等桌面发送器支持 M6 宏,其中 M6 命令替换为用户定义的 gcode 块。

是的,我知道,但这是因为 grbl 的作者拒绝实施它……我仍然认为这是机器控制器的责任 – 这样它只实施一次并且独立于更高级别的应用程序

好的,假设我们有 20 个孔要钻(这是我现在面临的直接问题)。现在我需要这样的 gcode:

对于简单的可重复 gcode 块,我认为我们可以使用自定义按钮,我们将可重复代码放在自定义按钮中并按下按钮 n 次。或者甚至我们可以在按钮配置中选择“重复 n 次”。

你错过了重点。我已经可以做到这一点 – 我编写了一个脚本来钻一个孔并执行 20 次 – 这样我就不受任何按钮的限制。我希望能够快速方便地编写脚本,这些脚本将一次完成所有操作 – 可以多次重复很多事情。开火就忘了。

顺便说一句 – 该应用程序可以记住上一个文件的位置并在那里启动“打开文件”对话框吗?每次我想打开一个脚本时,我都必须从顶层点击一些东西到我的那个 – 总是相同的 – 与我的脚本的目录……

事实上,我想在应用程序中有一个简单的凸轮工具,我可以在其中进行钻孔、仿形和切割基本形状,但由于时间不够,我无法实现它。

没有“简单的凸轮工具”这样的东西——凸轮几乎“按照定义”是复杂的。或者有 – 它叫做 gcode :) 循环和跳跃是你需要做“基本形状”的一切,比如螺旋,口袋,规划等……而且它会更容易实现……和使用 – 我可以’在手机或任何其他触摸屏上使用任何图形设计软件都无法真正成像。

支持“L_”、“标签”和“REPEAT”只有在 CNC 世界中成为标准做法时才是好主意。(我怀疑人们可能有不同的标签/字母来表示它们)

你确实意识到“标签”可以是任何名称……我建议使用 L_xxx 而不是 Lxxx 以避免冲突。这就是 Sinumerik 使用的,这就是我所知道的。但我认为 Fanuc 更受欢迎,是一种“标准”,并且有对子程序的 M98/M99 调用。( https://www.cnccookbook.com/m98-m99-g-code-cnc-subprograms/ )。Mach 3 似乎也在使用 Fanuc 语法。只要您实施行业中使用的任何东西,您就很好 – 没有“标准”方式可能是因为在某些时候每个供应商都引入了他们自己的扩展,但我认为 Fanuc 是一个很好的模板。

该应用程序的当前架构阻止了像这样完成任何事情(因此 M6 宏仍未实现),我计划重写结构以便可以完成这些类型的实现。

好吧,这是个问题——我还没有查看代码,希望我不必这样做,但我会在某个时候(也就是当我设置了所有环境时,因为现在我什么都没有.. .)

除非为我实现“REPEAT”,否则它看起来不太好(多次调用子程序)

否 – REPEAT 和子程序是两个独立的事物,一个不依赖于另一个。虽然我可以没有 REPEAT/GOTO 生活,但子程序是必不可少的。

当我重写应用程序的核心时,我会牢记这些要点。

伟大的。如果你需要什么,尽管问。你可以看看这个 cnccookbook 页面——它有很多关于专业数控机床如何工作的好信息。

手动编程助手 #105
所有者

当然,我会看看 cnccookbook

手动编程助手 #105
作者

我已经尝试查看您的代码,但没有 – 我仍然不喜欢一般的 java,特别是 Android 的 java:P,所以我无法直接帮助您。但是…如果您知道 python,或者至少可以阅读并或多或少地理解它,我可以为 REPEAT、GOTO 和子程序编写一个概念验证(完全工作)gcode 预处理器。我当然会让代码尽可能的可读。

因为我一直在想——循环、跳转和包含的实现是完全静态的。这意味着我们只需要一个函数 – preprocessGCode() – 它将获取主输入文件,遍历它,用重复块的多个实例替换 REPEATs,删除跳过的行并包含子程序的代码(也有预处理,所以它必须是递归的,但这应该不是问题),并为 grbl 生成一个带有“vanilla”gcode 的临时文件。然后您的代码可以发送该文件而不是原始文件!因此,它不需要对您当前的代码进行任何修改。此函数还将处理 M6 宏扩展。

此外,如果您可以在您的代码中向我展示/解释启动文件读取的位置、完成读取的位置以及发送 gcode 的位置,也许我可以帮助您弄清楚如何轻松地从评论中插入这些用户消息,或者在至少我们可以一起考虑一下。

如果你无法阅读 python,也许我可以稍后将该代码翻译成 vanilla java,你所要做的就是包含它并执行所有 android 的东西,比如文件读取等。它’可能会很丑陋,但希望它会起作用。

手动编程助手 #105
所有者

我懂一点python,
如果你能提供python代码,我可以把它转换成java。

应用程序中的文件流处理在 FileStreamerIntentService.java 中处理

https://github.com/zeevy/grblcontroller/blob/master/app/src/main/java/in/co/gorest/grblcontroller/service/FileStreamerIntentService.java#L199
Line number: 199
手动编程助手 #105
作者
姆卡卢扎 评论了 2019 年 5 月 4 日  

我懂一点python,
如果你能提供python代码,我可以把它转换成java。

好的,那太好了,因为用 Java 编写它会花费我很长时间。这是:https ://github.com/mkaluza/gcode_preprocessor

与我建议的一个区别是它不处理子程序(单独的文件),而只处理子例程(在同一文件中)。这是 Fanuc 和 Mach3 使用的“官方”语法。我还添加了类似 Sinumerik 的标签,因为我认为冗长的标签比纯数字标签要好得多。当我仔细考虑它时,在 99% 的情况下,一个文件中的子例程比多个文件中的子例程更好(更简单)。如果有人请求多个文件,可以轻松添加。

它远非完美,但如果我想让它完美,我可能永远也不会完成它。我支持按需改进和足够好的代码。一个明显缺失的东西是子例程的递归限制以避免无限循环,但同样 – 作者的最大利益是不要将他的 gcode 搞砸到那种程度,所以我从一开始就不会担心太多;)

如果你有任何问题随时问。

应用程序中的文件流处理在 FileStreamerIntentService.java 中处理

好的,至于那些用户消息 – 我认为您当前的代码非常简单:

  • 将“bool resume”参数添加到 startStreaming
  • 在 startStreaming 的开头
    • if resume == false:检查this.stream是否为null,如果不是,关闭并清理;然后照常打开文件
    • if resume == true and this.stream != null: br = this.stream else br = (照常打开文件)
  • 在此 if的某处- 最好在最后 – 添加:if gcodeCommand.isUserMessage(): this.stream = br; show user message dialog and return;
  • 在用户消息对话框中,单击“确定”按钮将调用 startStreaming(, resume = true),中止按钮将执行与 estop/reset 按钮相同的操作(可选地它可以询问“你确定吗?”)

同样在此函数中,您将调用预处理器,而不是打开原始文件的流,您将读取预处理器创建的临时文件。或者预处理器函数也可以返回一个流并且可以是一个生成器并按需生成代码而不是处理整个文件,但这会使事情变得有点复杂(错误检查将被推迟,此外它需要至少读取整个文件一次无论如何扫描标签) – 我认为阅读整个文件会更容易开始。

考虑了一下 – 我不知道 android 如何处理意图,如果this.streamFileStreamerIntentService 会在对话框调用中幸存下来,但是你可以将该流传递给对话框并resume用它替换参数(stream如果给定的话),将被进一步阅读,并且如果为空,将导致重新打开文件。或者 – 如果可能的话 – 你可以将服务标记为某种“重要”服务,这样它就不会被意外破坏……

手动编程助手 #105
所有者

我将选择预处理器选项,因为它会是更快的解决方案,并且不需要对当前结构进行任何重大更改。我可能需要几个星期才能开始。
我会在这里更新进度。

手动编程助手 #105
作者

我一直在想…如果你能完成 android 部分(我肯定无法帮助你),我可能会在周末尝试一下处理器本身。现在只需使用一个带有一个入口点的存根类,该入口点接收一个文件名并返回一个流。

手动编程助手 #105 zeevy 添加了 增强 标签 2019 年 5 月 17 日
手动编程助手 #105 zeevy 修改了里程碑: 2.41 , 2,45 2019 年 6 月 10 日
手动编程助手 #105 zeevy 自己分配了这个 2020 年 3 月 21 日
手动编程助手 #105 zeevy 添加了 进行中 标签 2020 年 3 月 21 日

免费注册 在 GitHub 上加入此对话。已有帐户? 登录评论
项目

还没有

发展

没有分支机构或拉取请求

2名参加者
手动编程助手 #105手动编程助手 #105

喜欢 (0)