开源改变世界!!

推推 grbl 2年前 (2023-01-28) 193次浏览
打开
AndyCXL 打开了这个问题 2021 年 8 月 12 日 · 7条评论
打开

在 XYZABC 的 DRO 中显示所有启用的轴,而不仅仅是线性轴#1660

AndyCXL 打开了这个问题 2021 年 8 月 12 日 · 7条评论

注释

贡献者

您的功能请求是否与问题相关?请描述。在 XYZABC 的 DRO 中显示所有启用的轴,而不仅仅是线性轴

描述您想要的解决方案
在 DRO 中单击鼠标右键仅显示 XYZ 以及是否禁用。如果 XYZABC 都能够以这种方式启用或禁用,那么实际机器中的任何“具有能力”的轴都可以显示在 DRO 中。如果轴是旋转的,那么如果可以在视觉上与线性轴进行一些区分就更好了。

描述您考虑过的备选方案
我已经破解了 axisutils 以将 A 轴声明为线性轴,从而在 DRO 中显示。这表明底层代码和数据报告已经存在并且能够工作,因此“正式”解决方案可能并不那么困难。

附加上下文

合作者

您使用的是 Grbl-Mega-5x 吗?UGS 还没有完全实现支持多轴。

它最好有自己的控制器实现,可以检测硬件配置了多少轴,然后添加该功能。然后它将自动显示在 DRO 中:
https ://github.com/winder/Universal-G-Code-Sender/blob/master/ugs-platform/ugs-platform-plugin-dro/src/main/java/ com/willwinder/ugs/nbp/dro/panels/DROPopup.java#L42

这是一个关于如何使用 Grbl-ESP32 完成的示例:
https ://github.com/winder/Universal-G-Code-Sender/blob/master/ugs-core/src/com/willwinder/universalgcodesender/GrblEsp32Controller.java #L75

我认为我们已经提出了一些建议,可以更改 DRO 中轴的可视化,默认情况下 ABC 应以度数显示。但我不确定如果 gcode 不是旋转的,应该如何可视化…

贡献者作者

是的,我的 Carbide 3D ShapeOKO 3XL 上的 Grbl Mega 5X 带有 VFD 主轴和旋转轴升级。我已经详细研究了 Mega 5XL 源并了解以下内容:

  • 最多 6 个轴,最少 3 个
  • 前 N 个轴是线性的,其余轴假定是旋转的。Number of axes set to 5, number of Linear set to 4 意味着1个旋转轴推定
  • 轴字母可以重复以启用双驱动,例如 XYZYA 与双 Y,这报告 5 个轴,4 个唯一的轴字母
  • Mega 5XL 中指定 Y 轴的命令应用于 Y 的每个和任何实例,从而实现真正的双轴驱动,而无需发送 gcode 命令来了解有关双 Y 的任何信息
  • 默认轴图是 XYZABC,如果需要,可以选择使用不同的 ABC 字母,并根据需要影响报告顺序(参见下面的 $I)
  • 轴图中不允许有间隙
  • 以上设置是预构建选项,无法通过 $= 设置访问。
  • $I 从 UGS 向终端请求给出以下内容,例如:
    [VER:1.1t.20210510:]
    [AXS:5:XYZYA]
    [OPT:VNMGPH,25,255,48]
  • 如果定义了 5 个轴,位置报告(用于在 UGS 运行时读取位置和状态)报告 5 个位置编号,即使 5 个中的一个(在我的例子中是 Y)重复并显示相同的编号,例如:
    <Run| MPos:-70.475,-150.000,-52.538,-150.000,-446.681|Bf:0,186|FS:1400,20000>
  • MPos 编号的顺序“含义”按照 $I 轴序列 XYZYA
贡献者作者

对可视化的评论:

  • Visualizer 可以根据旋转轴的移动来旋转视图,以便“切割器”图标始终垂直于切割。这可能会导致过度的处理负载,但这是一个想法。
  • DRO 表示的一个想法可能是根据需要在 MPos 编号后加上“mm”、“in”或“dg”
贡献者作者

我有一个 GrblMega5XController 的工作实例启动并成功连接。在此期间,我从 Mega5X 报告的状态字符串中提取 AxisOrder 并实例化了一个调用(通过覆盖层适当实例化)以获取此字符串,因为它在 GrblUtils.java 中需要正确排序和分配 MPos 等位置。
为了使这最后一部分起作用,我需要一种获取当前控制器实例的轻量级方法,这样我就可以调用新的 getAxisLetterOrder() 方法。GrblUtils 当前没有与 Controller 相关的对象——据我所知,我深入了解这里的代码,我将不胜感激关于如何实现这一目标的指针……?

合作者

感谢您对状态报告的澄清!

我认为您可以创建自己GrblMega5XUtils.java的专门处理来自 GrblMega5X 的状态消息,因为它偏离了 Grbl。用于解析状态报告的 util 方法需要控制器配置的状态,因此我认为这些也可以一起发送。

因此,例如,以前在 Grbl 中解析状态消息的方法是使用以下方法完成的GrblUtils.getStatusFromStatusStringV1

/**
 * Parses a GRBL status string in in the v1.x format:
 * 1.x: <status|WPos:1,2,3|Bf:0,0|WCO:0,0,0>
 * @param lastStatus required for the 1.x version which requires WCO coords
 *                   and override status from previous status updates.
 * @param status the raw status string
 * @param reportingUnits units
 * @return the parsed controller status
 */
 public static ControllerStatus getStatusFromStatusStringV1(ControllerStatus lastStatus, String status, Units reportingUnits)

GrblMega5XUtils 的新方法可能类似于:

/**
 * Parses a GrblMega5X status string: <status|WPos:1,2,3,N|Bf:0,0|WCO:0,0,0,N>
 * 
 * @param lastStatus required for WCO coords
 *                   and override status from previous status updates.
 * @param status the raw status string
 * @param reportingUnits units
 * @param axisOrder a list of axises that will be reported by the controller. Normally [X, Y, Z] but could also be [X, Y, Z, Y] when the Y-axis is mirrored.
 * @return the parsed controller status
 */
 public static ControllerStatus getStatusFromStatusStringV1(ControllerStatus lastStatus, String status, Units reportingUnits, List<Axis> axisOrder)
贡献者作者

你的解释让我更好地理解了代码和类的结构,现在我可以看到需要什么了。首先通过编写和构建。现在要测试。

贡献者作者
安迪CXL 评论了 2021 年 8 月 27 日  

我已经在我(有限的)Java 和 UGS 架构知识的极限范围内探索了这个想法,并且不相信 UGS 结构中的编织在我掌握的代码中以合并 GrblMega5X 方法。就是说,为了做到这一点,我已经制定了各种单独的代码片段……希望有人可以采用这些代码,或者确定架构需求以便我可以完成它,或者让他们自己来做这件事。

与此同时,我有一个肮脏的 hack 可以让我需要的东西工作,它只是不适合按原样合并,并且不能处理来自 GrblMega5X 控制器板的任意轴顺序选择。

需要 GrblUtils.java(或新的 GrblMega5XUtils)中的新版本函数:将 axisOrder 添加到调用中,并通过调用树能够正确解释轴报告数据

static private Position getPositionFromStatusString(final String status, final Pattern pattern, Units reportingUnits, String axisOrder) {
/* GrblMega5XController 知道报告的轴顺序,例如:XYZ 或 XYA 或 XYZYA
// 并根据每个唯一的轴字母添加功能,即使轴的计数
//更大(XYZYA 是 4 个不同的字母 5 个位置)。位置报告
// 是每个物理轴,所以 XYZYA 是字符串顺序,即使 Y 是重复的
*/
Matcher matcher = pattern.matcher(status);

    // Do we have any matches, if so assign them to axes
    if (matcher.find()) {
        // Is Axis ordering default, or dictated by the controller
        // String axisOrder defines the order
        if ("".equals(axisOrder)) {
            axisOrder = "XYZABC";
        }
        
        // pX contains the integer position of X in axisOrder
        // indexOf returns 0th index of first match, or -1 if no match
        int pX = axisOrder.indexOf("X")+1;
        int pY = axisOrder.indexOf("Y")+1;
        int pZ = axisOrder.indexOf("Z")+1;
        int pA = axisOrder.indexOf("A")+1;
        int pB = axisOrder.indexOf("B")+1;
        int pC = axisOrder.indexOf("C")+1;
        
        // Position is a fixed order structure, indexOf bridges to axisOrder
        Position result = new Position(
                pX > 0 ? Double.parseDouble(matcher.group(pX)) : 0.00D,
                pY > 0 ? Double.parseDouble(matcher.group(pY)) : 0.00D,
                pZ > 0 ? Double.parseDouble(matcher.group(pZ)) : 0.00D,
                reportingUnits
        );
        
        result.a = pA > 0 ? Double.parseDouble(matcher.group(pA)) : 0.00D;
        result.b = pB > 0 ? Double.parseDouble(matcher.group(pB)) : 0.00D;
        result.c = pC > 0 ? Double.parseDouble(matcher.group(pC)) : 0.00D;
        
        return result;
    }
    // No match, default return null
    return null;
}

需要 GrblController.java(或新的 GrblMega5XController.java)中的新版本功能:这将提取 GrblMega5X 控制器报告的轴顺序,并使其可用于其他模块,除了更新功能

静态字符串 axisOrder = “XYZABC”;
static Pattern axisCountPattern = Pattern.compile(“\[AXS:(\d*):([XYZABC]*)]”);

可选的 getAxisCount(String response) {
Matcher m = axisCountPattern.matcher(response);
如果 (!m.find()) {
返回 Optional.empty();
}
返回 Optional.of(Integer.parseInt(m.group(1)));
}

可选的 getAxisOrder(String response) {
Matcher m = axisCountPattern.matcher(response);
如果 (!m.find()) {
返回 Optional.empty();
}
返回 Optional.of(m.group(2).trim());
}

// 从状态字符串解析轴细节 – AndyCXL
private void parseAxesFromStatus(final String response) {
/*
[VER:1.1t.20210510:]
[AXS:5:XYZYA]
[OPT:VNMGPH,25,255,48]
*/
可选轴= getAxisCount(响应);
可选顺序 = getAxisOrder(响应);

    if (axes.isPresent()) {
        this.capabilities.removeCapability(X_AXIS);
        this.capabilities.removeCapability(Y_AXIS);
        this.capabilities.removeCapability(Z_AXIS);
        this.capabilities.removeCapability(A_AXIS);
        this.capabilities.removeCapability(B_AXIS);
        this.capabilities.removeCapability(C_AXIS);

        /* Axes defines the number of distinct axes, Order defines the
        // sequence and any duplication, eg: dual-Y or dual-X configs
        // eg: 3=XYZ 3 distinct, 3=XYA 3 distinct, or 5=XYZYA 4 distinct
        // Ignore for now that Mega 5X allows letters other than ABC
        //
        // Strategy for coping with non XYZABC order, and duplicates:
        // Iterate 1..axes.get()
        //   Obtain nth axis letter from order
        //   Test if this.capabilities.hasCapability(n_AXIS) already exists
        //   and addCapability() if not
        //
        // Capabilities now added for each distinct axis letter, potentially
        // different (fewer) than the number of physical axes Mega5X reports
        */
        char nthChar;
        for (int n=0; n < axes.get(); n++) {
            nthChar = order.get().charAt(n);
            switch(nthChar) {
                case 'X':
                    if (!this.capabilities.hasCapability(X_AXIS))
                        this.capabilities.addCapability(X_AXIS);
                    break;
                case 'Y':
                    if (!this.capabilities.hasCapability(Y_AXIS))
                        this.capabilities.addCapability(Y_AXIS);
                    break;
                case 'Z':
                    if (!this.capabilities.hasCapability(Z_AXIS))
                        this.capabilities.addCapability(Z_AXIS);
                    break;
                case 'A':
                    if (!this.capabilities.hasCapability(A_AXIS))
                        this.capabilities.addCapability(A_AXIS);
                    break;
                case 'B':
                    if (!this.capabilities.hasCapability(B_AXIS))
                        this.capabilities.addCapability(B_AXIS);
                    break;
                case 'C':
                    if (!this.capabilities.hasCapability(C_AXIS))
                        this.capabilities.addCapability(C_AXIS);
                    break;
            }
        }
        // Record Axis ordering as a capability
        if (order.isPresent()) {
            axisOrder = order.get();
            this.capabilities.addCapability(AXIS_ORDERING);
        } else {
            axisOrder = "XYZABC";
        }
        // Log outcome, and to aid machine and setup diagnostics
        logger.log(Level.CONFIG, "Axes:{0} Order:{1}",
            new Object[] {axes.get(), order.get()}
        );
    }
}

需要对 CapabilitiesConstants.java 添加:

public static final String A_AXIS = “A_AXIS”;
public static final String B_AXIS = “B_AXIS”;
public static final String C_AXIS = “C_AXIS”;
public static final String AXIS_ORDERING = “AXIS_ORDERING”;

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

还没有

发展

没有分支机构或拉取请求

2名参加者

在 XYZABC 的 DRO 中显示所有启用的轴,而不仅仅是线性轴 #1660

喜欢 (0)