开源改变世界

RS274NGC_STARTUP_CODE 多个 P 字 #569

推推 grbl 3年前 (2023-01-29) 262次浏览
关闭
phillc54 打开了这个问题 2019 年 3 月 17 日 · 11 条评论
关闭

RS274NGC_STARTUP_CODE 多个 P 字#569

phillc54 打开了这个问题 2019 年 3 月 17 日 · 11 条评论

注释

RS274NGC_STARTUP_CODE 多个 P 字 #569
合作者

以下是我重现该问题所遵循的步骤:

  1. 编辑 sim/axis/axis.ini
  2. 在 [RS274NGC] 部分
  3. 添加 RS274NGC_STARTUP_CODE = G64P0.1 M52P1
  4. 保存然后运行

这是我期望发生的事情:

LinuxCNC 启动时以上两个命令都生效

这是发生了什么:

LinuxCNC 因屏幕上出现以下错误而停止:
emc/task/emctask.cc 405: interp_error: Multiple p words on one line
Multiple p words on one line
emc/task/emctaskmain.cc 3085: can’t initialize interpreter

有关我的硬件和软件的信息:

  • 我正在使用 Debian GNU/Linux 9.8 (stretch)
  • 我正在使用 SMP PREEMPT RT Debian 4.9.88-1+deb9u1 (2018-05-07)
  • 我正在运行来自 linuxcnc.org 的二进制版本(包括 buildbot.linuxcnc.org)
  • 我正在使用 LinuxCNC v2.8.0-pre1-4634-g8d71cbc22
  • 我正在使用安讯士
  • 我只使用 sim
RS274NGC_STARTUP_CODE 多个 P 字 #569
合作者

一行中的关键字顺序在 G 代码规范中没有意义。命令按优先顺序解释,修饰符可以出现在行中的任何位置。
所以 G64 P0.1 M52 可能表示“G64”然后是“P0.1 M52”
错误消息是正确的,您不能在同一行上两次使用相同的字母命令。
一种解决方法是使用
RS274NGC_STARTUP_CODE = O CALL
并将启动 G 代码放在名为 startup.ngc 的文件中 OSUB 结构中的单独行上

RS274NGC_STARTUP_CODE 多个 P 字 #569
合作者作者

感谢您的解释,我假设启动代码将按顺序执行,而不是作为一行执行。

RS274NGC_STARTUP_CODE 多个 P 字 #569
合作者
c-莫利 评论了 2019 年 3 月 18 日 通过电子邮件
RS274NGC_STARTUP_CODE 多个 P 字 #569
合作者
安迪普 评论了 2019 年 3 月 18 日 通过电子邮件
RS274NGC_STARTUP_CODE 多个 P 字 #569
合作者
c-莫利 评论了 2019 年 3 月 18 日 通过电子邮件
RS274NGC_STARTUP_CODE 多个 P 字 #569
合作者

我们可以接受多个 STARTUP_CODE 行,如 MDI_COMMAND 和其他一些。但是列表可能更容易。

RS274NGC_STARTUP_CODE 多个 P 字 #569
合作者作者

我最初的想法和 Chris 的一样,这应该只是关于如何从 ini 文件中读取它。

RS274NGC_STARTUP_CODE 多个 P 字 #569
贡献者

interp 中的基本块读取例程只允许一个块内的唯一标志,并且重复是错误,因为@phillc54发现。

有些选项可以重复,但这个显然不能。它看起来并不难,遵循其他示例,例如REMAPin emc/rs274ngc/rs274ngc_pre.ccforemc/task/emctaskmain.cc和 using inifile.findall()instead of inifile.find()in emc/usr_intf/axis/scripts/axis.py。但考虑到这是多么容易,过去对它的需求不会太多,否则我们早就拥有了。

所以,+1@andypugh的建议。今天有效;请参阅中的示例tests/motion-logger/startup-gcode-abort/test.ini

RS274NGC_STARTUP_CODE 多个 P 字 #569
合作者作者

我很高兴保留它,因为它是 o 调用的工作方式。也许只是在此处
向文档添加注释

RS274NGC_STARTUP_CODE 多个 P 字 #569
合作者
安迪普 评论了 2019 年 3 月 18 日  

我已经实现了一个逗号分隔的列表,这是对 emctask.cc 的一个小改动

  if (retval > INTERP_MIN_ERROR) {  // I'd think this should be fatal.
	print_interp_error(retval);
    } else {
	if (0 != rs274ngc_startup_code[0]) {
        char startupcmd[LINELEN];
        char* ptr;
        strcpy(startupcmd, rs274ngc_startup_code);
        ptr = strtok(startupcmd, ",");
        while (ptr != NULL){
            retval = interp.execute("ptr");
            while (retval == INTERP_EXECUTE_FINISH) {
                retval = interp.execute(0);
            }
            if (retval > INTERP_MIN_ERROR) {
                print_interp_error(retval);
            }
            ptr = strtok(NULL, ",");
	    }
	}
    }

哪个有效,但 Axis 抱怨逗号,我怀疑 gremlin 和 Gmoccapy 也可能如此,因为它们也都查看了 RS274NGC_STARTUP_CODE 条目。

RS274NGC_STARTUP_CODE 多个 P 字 #569
合作者

另外,我更喜欢多行的想法和使用 ini.findall()