评论
哦,还有用户消息(对于具有许多工具的长程序的工具更改很有用)。 这将使这些程序更加独立。 |
@mkaluza这些是您给出的优点,但该应用程序当前的目标是仅支持 grbl 支持的功能。 键入的命令历史记录是我认为在下一个版本中可以想到的。 |
我写下这些是因为我看到你说你没有使用专业数控机床的经验,所以你甚至可能没有意识到有一些非常有用的功能。我写的所有这些(变量除外)应该相当容易实现(我不会全部用于需要大量工作的事情)这些要么已经支持的功能,要么没有任何版本的 grbl 将永远支持的功能,arm 与否arm(缺乏永久存储,内存很少)并且实际上完全独立于 grbl – 现在你有将 X、Y 和 Z 轴归零的快捷方式,它们在后台生成 G10 L20 P0 X/Y/Z0。我想要的是能够通过单击坐标(见图)输入任意值,这样您就不必每次都写写 G10 L20 P0 Xxxx。这是我做过很多次的事情。- 命令历史是显而易见的,绝对是最少的。最好有一个在执行时不清除的多行编辑窗口,这样您就可以在没有外部文本编辑器的情况下编写更复杂的临时程序。- 给用户的消息。Grbl 无法支持它们(而且永远不会),但在 UI 内部应该很容易。如果在发送 gcode 时遇到像“(!drillbit hss 6)”这样的注释(一个从文件读取 gcode 的函数中的简单正则表达式),grbl 将忽略它,但应用程序应该继续发送更多 g 代码并显示消息“drillbit hss 6”并等待用户单击“确定”(或“中止”)。这将使工具更改变得非常容易和健壮(特别是如果它稍后在可以自动生成带有这些消息的工具更改“宏”的后处理器中实现)。否则,如果你在一个程序中使用 5 个不同的工具(我这样做),你要么需要有 5 个单独的程序(这很痛苦),要么使用 M0 并在某处有一个列表,现在要更改哪个工具(容易出错,因为你需要手动跟踪你在哪里)至于那些gcode功能,我会在我到达一些PC时写一些例子,因为从电话不是很方便。如果您进行任何类型的 gcode 编程而不仅仅是从 cad/cam 运行文件,它们将非常有用且非常需要。
|
@mkaluza感谢您的图片。 你是对的,我对专业的数控机床一无所知,我开发这个应用程序时只考虑了 grbl。 如果找到像“(!drillbit hss 6)”这样的行,我没有弄清楚等待用户按确定。如果用户必须在此消息后更改工具,那么它有点复杂(并非不可能)。使用用户宏支持 M6 在我的待办事项列表中,完成后可能会解决此问题。 如果您能提供一些 gcode 示例,这对我会有很大帮助。 图像看起来有线,为什么两行文本“步长|慢进给”?应用程序应该全屏打开,移动状态栏不应该可见。 |
让我们假设以下代码来更改工具(只是示例并不意味着真正或非常正确)
现在在 grbl 上,这段代码将转到 X100 Y300 绝对机器坐标(刀具更换位置,刀具探头位置),主轴和冷却液关闭并略高于它(N4),并保持程序以便我可以移除立铣刀和插入另一个。之后它会下降并再次等待,以便我可以在参考水平上拧紧立铣刀(我还没有工具探针,所以这是我处理工具长度设置的方式)。之后,它会随着铣削而上升。 但是现在每次机器等待时,我都需要查看代码以找到包含机器期望的工具的注释。我提议的修改将使我能够在屏幕上永久看到消息,这样我就知道现在我应该插入 6mm 立铣刀,然后在找到它时单击“确定”或在出现问题时中止(但它不是这不是绝对必要的,因为我可以在机器等待 M0 时中止,所以只需“确定”按钮就足以启动,但拥有它会很好)。 顺便说一句,你已经告诉我如何在 grbl 中轻松灵活地实现 M6 我不确定 UI 是否应该这样做……我认为它更像是一个 grbl 工作…… 此外 – 这种消息将是通用的 – 用户可以获得各种消息,例如关于库存和初始设置:“库存 100×150,中心为零”,一些安全检查或操作员应该获得的其他一些消息/信息在操作过程中,如“合上盖子”。
好的,假设我们有 20 个孔要钻(这是我现在面临的直接问题)。现在我需要这样的 gcode:
这是一个非常长、丑陋的代码,可以在手机上编辑…… 但是如果我有子程序,我可以这样做:
这看起来已经好多了,因为通过查看主程序,您可以轻松地弄清楚它的作用(钻孔、前进 10 毫米、钻孔、前进等…) 现在让我们在这里添加一个循环。drill_5.sub 保持不变,只有主程序发生变化
最后一行指示 UI 从那里重复 gcode 到“drill_label”19 次(它已经执行过一次,所以总共会有 20 个孔)。之后,它将继续执行该程序。 子程序是最简单的东西——在解析gcode时,如果遇到L_(filename),你应该只发送从相对于主脚本的文件夹打开的subprograms/filename.sub的内容。它不需要保持任何状态,也不应该很复杂。将其视为“包含”。 REPEAT 更复杂,因为您必须跟踪标签和已经完成的重复次数,但仍然应该是可行的。它不会改变任何语法,也不会造成混淆(可以使用正则表达式检测标签:不带括号的 alnum 字符(我们忽略注释)以冒号结尾。而且 REPEAT 很好……重复 也可以用 a 解析正则表达式。它也不需要任何预处理,因为 REPEAT 总是向后走,所以您要么已经在代码中遇到了标签,要么是错误的。 向前跳转只是一个GOTOF 标签,不同之处在于该标签位于 goto 之后,而不是像 repeat 中那样位于之前。如果您不得不在某个时候中止程序并且想在同一时间重新启动它,这将非常有用。然后,您只需在此处添加一个标签并在开头添加一个 GOTOF,而无需删除所有行。这里的困难在于,此时您必须向前扫描文件才能找到标签。或者可能不是——你只是跳过所有的行,直到你找到标签或程序结束(在这种情况下它是一个错误,但它仍然会停止程序)。 我现在将跳过变量,因为它会变得更加复杂。 我希望你明白这一点。任何版本的 grbl 都不会实现这些功能,因为它无法立即访问整个 gcode,因此它无法“记住”REPEAT 的标签(此外,重复的代码块可能太大而无法放入 uP 内存中) ) 或者在 GOTOF 中寻找它们(好的,它可以跳过这些行直到找到标签)。 如果没有 gui 支持,它也无法向用户显示消息。
它是全屏的——状态栏可见是截图的副作用
LG K7 2017
是的,我设置了大字体。我什至没有注意到它:) |
感谢您的精彩解释。
UGS 和 BCNC 等桌面发送器支持 M6 宏,其中 M6 命令替换为用户定义的 gcode 块。
对于简单的可重复 gcode 块,我认为我们可以使用自定义按钮,我们将可重复代码放在自定义按钮中并按下按钮 n 次。或者甚至我们可以在按钮配置中选择“重复 n 次”。事实上,我想在应用程序中有一个简单的凸轮工具,我可以在其中进行钻孔、仿形和切割基本形状,但由于时间不够,我无法实现它。 支持“L_”、“标签”和“REPEAT”只有在 CNC 世界中成为标准做法时才是好主意。(我怀疑人们可能有不同的标签/字母来表示它们) 当我重写应用程序的核心时,我会牢记这些要点。 |
从来没听说过。它和其他任何东西一样好。那是我的第一个想法。事实上,您可以添加一个配置选项来输入一个正则表达式,而不是对其进行硬编码,该正则表达式将匹配应显示为对话框的消息 – 然后任何人都可以设置他们喜欢/想要的任何内容,例如默认设置为 /^!(? P<消息>[\w]+)/
是的,我知道,但这是因为 grbl 的作者拒绝实施它……我仍然认为这是机器控制器的责任 – 这样它只实施一次并且独立于更高级别的应用程序
你错过了重点。我已经可以做到这一点 – 我编写了一个脚本来钻一个孔并执行 20 次 – 这样我就不受任何按钮的限制。我希望能够快速方便地编写脚本,这些脚本将一次完成所有操作 – 可以多次重复很多事情。开火就忘了。 顺便说一句 – 该应用程序可以记住上一个文件的位置并在那里启动“打开文件”对话框吗?每次我想打开一个脚本时,我都必须从顶层点击一些东西到我的那个 – 总是相同的 – 与我的脚本的目录……
没有“简单的凸轮工具”这样的东西——凸轮几乎“按照定义”是复杂的。或者有 – 它叫做 gcode 循环和跳跃是你需要做“基本形状”的一切,比如螺旋,口袋,规划等……而且它会更容易实现……和使用 – 我可以’在手机或任何其他触摸屏上使用任何图形设计软件都无法真正成像。
你确实意识到“标签”可以是任何名称……我建议使用 L_xxx 而不是 Lxxx 以避免冲突。这就是 Sinumerik 使用的,这就是我所知道的。但我认为 Fanuc 更受欢迎,是一种“标准”,并且有对子程序的 M98/M99 调用。( https://www.cnccookbook.com/m98-m99-g-code-cnc-subprograms/ )。Mach 3 似乎也在使用 Fanuc 语法。只要您实施行业中使用的任何东西,您就很好 – 没有“标准”方式可能是因为在某些时候每个供应商都引入了他们自己的扩展,但我认为 Fanuc 是一个很好的模板。
好吧,这是个问题——我还没有查看代码,希望我不必这样做,但我会在某个时候(也就是当我设置了所有环境时,因为现在我什么都没有.. .)
否 – REPEAT 和子程序是两个独立的事物,一个不依赖于另一个。虽然我可以没有 REPEAT/GOTO 生活,但子程序是必不可少的。
伟大的。如果你需要什么,尽管问。你可以看看这个 cnccookbook 页面——它有很多关于专业数控机床如何工作的好信息。 |
当然,我会看看 cnccookbook |
我已经尝试查看您的代码,但没有 – 我仍然不喜欢一般的 java,特别是 Android 的 java:P,所以我无法直接帮助您。但是…如果您知道 python,或者至少可以阅读并或多或少地理解它,我可以为 REPEAT、GOTO 和子程序编写一个概念验证(完全工作)gcode 预处理器。我当然会让代码尽可能的可读。 因为我一直在想——循环、跳转和包含的实现是完全静态的。这意味着我们只需要一个函数 – preprocessGCode() – 它将获取主输入文件,遍历它,用重复块的多个实例替换 REPEATs,删除跳过的行并包含子程序的代码(也有预处理,所以它必须是递归的,但这应该不是问题),并为 grbl 生成一个带有“vanilla”gcode 的临时文件。然后您的代码可以发送该文件而不是原始文件!因此,它不需要对您当前的代码进行任何修改。此函数还将处理 M6 宏扩展。 此外,如果您可以在您的代码中向我展示/解释启动文件读取的位置、完成读取的位置以及发送 gcode 的位置,也许我可以帮助您弄清楚如何轻松地从评论中插入这些用户消息,或者在至少我们可以一起考虑一下。 如果你无法阅读 python,也许我可以稍后将该代码翻译成 vanilla java,你所要做的就是包含它并执行所有 android 的东西,比如文件读取等。它’可能会很丑陋,但希望它会起作用。 |
我懂一点python, 应用程序中的文件流处理在 FileStreamerIntentService.java 中处理
|
好的,那太好了,因为用 Java 编写它会花费我很长时间。这是:https ://github.com/mkaluza/gcode_preprocessor 与我建议的一个区别是它不处理子程序(单独的文件),而只处理子例程(在同一文件中)。这是 Fanuc 和 Mach3 使用的“官方”语法。我还添加了类似 Sinumerik 的标签,因为我认为冗长的标签比纯数字标签要好得多。当我仔细考虑它时,在 99% 的情况下,一个文件中的子例程比多个文件中的子例程更好(更简单)。如果有人请求多个文件,可以轻松添加。 它远非完美,但如果我想让它完美,我可能永远也不会完成它。我支持按需改进和足够好的代码。一个明显缺失的东西是子例程的递归限制以避免无限循环,但同样 – 作者的最大利益是不要将他的 gcode 搞砸到那种程度,所以我从一开始就不会担心太多;) 如果你有任何问题随时问。
好的,至于那些用户消息 – 我认为您当前的代码非常简单:
同样在此函数中,您将调用预处理器,而不是打开原始文件的流,您将读取预处理器创建的临时文件。或者预处理器函数也可以返回一个流并且可以是一个生成器并按需生成代码而不是处理整个文件,但这会使事情变得有点复杂(错误检查将被推迟,此外它需要至少读取整个文件一次无论如何扫描标签) – 我认为阅读整个文件会更容易开始。 考虑了一下 – 我不知道 android 如何处理意图,如果 |
我将选择预处理器选项,因为它会是更快的解决方案,并且不需要对当前结构进行任何重大更改。我可能需要几个星期才能开始。 |
我一直在想…如果你能完成 android 部分(我肯定无法帮助你),我可能会在周末尝试一下处理器本身。现在只需使用一个带有一个入口点的存根类,该入口点接收一个文件名并返回一个流。 |
嗨,
我主要是手动使用 grbl,与专业的 cnc(我的是使用 Sinumeric 控制)相比,我缺少了一些功能,grbl 不支持(由于 Arduino 的限制甚至不能支持),但是控制器应用程序
用户界面可以轻松支持:
GCODE:
这些功能需要一些 gcode 预处理,但也许它们是可能的(从最简单和最需要的顺序排列):
告诉我你的想法。虽然我不喜欢 java,也不怎么用 java 编程,但也许我可以帮忙写代码。