开源改变世界

M70/M72 模态状态恢复失败,进给参数中有逗号“,” #1158

推推 grbl 3年前 (2023-01-30) 152次浏览
关闭
Luddi1 打开了这个问题 2021 年 5 月 17 日 · 6 条评论 · 由#1159修复
关闭

M70/M72 模态状态恢复失败,进给参数中有逗号“,”#1158

Luddi1 打开了这个问题 2021 年 5 月 17 日 · 6 条评论 · 由#1159修复

注释

M70/M72 模态状态恢复失败,进给参数中有逗号“,” #1158

在一个子程序中,REMAP=M6 modalgroup=6 ngc=...我使用 M70/M72 来存储和恢复模态。当子程序中进给率在这些之间发生变化时,我收到以下 G 代码错误消息,该消息在加载程序时显示:M7x: restore_settings failed executing ' F123,0': Bad character ',' used.此处保存的进给率是 F123。
当进给率不改变时,这不是问题,因此解决方法是单独存储和恢复#<_feed> 变量。

我目前的想法是:snprinf浮动根据语言环境改变行为。我在德国,小数点是逗号。
这就是它可能发生的地方: 第 2752 行中的 linuxcnc/src/emc/rs274ngc/interp_convert.cc

一种解决方案是先使用setlocale然后snprintf按照此处的建议恢复语言环境:https ://stackoverflow.com/a/14753747

为了完整性:

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

  1. 使用德语或法语语言环境
  2. REMAP=M6 modalgroup=6 ngc=...在 ini 文件 ( )中放置 M6 的子程序。此处示例:https ://forum.linuxcnc.org/10-advanced-configuration/5596-manual-tool-change-tool-lengh-touch-off?start=30#48235
  3. 在子程序中执行 M70、更改进给、M72
  4. 加载一个 gcode 程序

这是我期望发生的事情:

模态状态的顺利恢复。

这是发生了什么:

G代码错误消息:M7x: restore_settings failed executing ' F0,0': Bad character ',' used.

在此之前它工作正常:

(如果在对硬件或软件进行特定更改后行为发生了变化
,请描述您认为负责的更改。例如,“
从 LinuxCNC 2.7.3 升级到 2.7.4 后”)

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

  • 我正在使用这个 Linux 发行版和版本(通常用 表示lsb_release -a):debian。linuxcnc iso
  • 我在跑步 …
    • [ x] 来自 linuxcnc.org 的二进制版本(包括 buildbot.linuxcnc.org)
  • 我正在使用这个 LinuxCNC 版本(显示在包管理器中,或者对于 git 版本,scripts/get-version-from-git):2.8.1
  • 我正在使用此用户界面 (GUI)(例如 AXIS、Touchy、gmoccapy 等):gmoccapy
  • 我正在使用此接口硬件供应商和芯片组(例如,并行端口、以太网端口、FPGA 卡):mesa 7i96
M70/M72 模态状态恢复失败,进给参数中有逗号“,” #1158
合作者
安迪普 评论了 2021 年 5 月 17 日  

F10,1 是否在您的语言环境中的实际 G 代码中起作用?我怀疑答案是否定的,因为 G 代码相当古老并且最初是在美国开发的,他们很少考虑其他国家以不同方式做事的可能性。

有趣的是,该代码仅将进给率保存到小数点后一位,将主轴转速保存到零位。我认为这可能也是错误的。

答案可能是更改:
snprintf(buf,sizeof(buf)," F%.1f", float_saved[i]);
强制
snprintf(buf,sizeof(buf)," F%i.%04i", (int)floor(float_saved[i]), (int)(10000 * (float_saved - floor(float_saved)));
使用特定的十进制基数是一种相当不雅的方式,但感觉比更改 LC_NUMERIC 更好

M70/M72 模态状态恢复失败,进给参数中有逗号“,” #1158
合作者

在这方面,此提交中的注释很有趣。

5772776

M70/M72 模态状态恢复失败,进给参数中有逗号“,” #1158
作者

F10,1 同样的问题。

我只是按照 Build LinuxCNC 指南,检查了 2.8.1 标签并应用了这个差异:

index b4a424a75..67c24536c 100644
--- a/src/emc/rs274ngc/interp_convert.cc
+++ b/src/emc/rs274ngc/interp_convert.cc
@@ -2712,7 +2712,7 @@ int Interp::gen_settings(double *current, double *saved, std::string &cmd)
            switch (i) {
            case 0: break; // sequence_number - no point in restoring
            case 1:
-               snprintf(buf,sizeof(buf)," F%.1f", saved[i]);
+               snprintf(buf,sizeof(buf)," F%i.%04i", (int)floor(saved[i]), (int)(10000 * (saved[i] - floor(saved[i]))));
                 cmd += buf;
                break;
            case 2:

这似乎解决了这个问题。
优雅与否,这对语言环境设置的变化是稳健的。

M70/M72 模态状态恢复失败,进给参数中有逗号“,” #1158
合作者

@Luddi1你能从 Jepler 检查这个变化吗?

要将更改作为补丁文件获取,请使用此 URL:
https ://github.com/jepler/linuxcnc/commit/d7666adb7d35d8fafbd9cbac0af3e1ef240d01df.patch

M70/M72 模态状态恢复失败,进给参数中有逗号“,” #1158
作者

我查看了 jepler:locale-independent-rs274ngc 并编译测试了它。这解决了这个问题。

感谢你们的工作?