当前位置: 首页 > article >正文

openpnp - Warning - Unknown firmware

文章目录

    • openpnp - Warning - Unknown firmware
    • 概述
    • 笔记
    • https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares
    • 备注
    • END

openpnp - Warning - Unknown firmware

概述

接上飞达控制板后, 显示未知固件的警告
在这里插入图片描述
开始没看源码之前, 总以为是回答的版本号不合适, 就照着冰沙板子回的版本号来回固件版本. 还是有这个警告.
现在已经在使用自己编译出来的openpnp, 就想去看看这个警告咋来的.

笔记

判断是否有未知固件的函数为 findIssues()
D:\my_openpnp\openpnp_dev_2022_0801\src\main\java\org\openpnp\machine\reference\solutions\GcodeDriverSolutions.java

public void findIssues(Solutions solutions) {
// ...
if (gcodeDriver.getFirmwareProperty("FIRMWARE_NAME", "").contains("Smoothieware")) {
                    firmware = (gcodeDriver.getFirmwareProperty("X-GRBL_MODE", "").contains("1"))? 
                            FirmwareType.SmoothiewareGrblSyntax : 
                                gcodeDriver.getFirmwareProperty("FIRMWARE_VERSION", "").contains("chmt-")?
                                        FirmwareType.SmoothiewareChmt : FirmwareType.Smoothieware;
                    firmwareAxesCount = Integer.valueOf(gcodeDriver.getFirmwareProperty("X-AXES", "0"));
                    if (firmware == FirmwareType.SmoothiewareChmt) {
                        // OK, CHMT STM32 Smoothieware board. Take PAXES == 5 if missing (legacy build).
                        firmwarePrimaryAxesCount = Integer.valueOf(gcodeDriver.getFirmwareProperty("X-PAXES", "5"));
                    }
                    else if (gcodeDriver.getFirmwareProperty("X-SOURCE_CODE_URL", "").contains("best-for-pnp")) {
                        // OK, regular Smoothieboard with pnp firmware.
                        firmwarePrimaryAxesCount = Integer.valueOf(gcodeDriver.getFirmwareProperty("X-PAXES", "3"));
                    }
                    else {
                        solutions.add(new Solutions.PlainIssue(
                                gcodeDriver, 
                                "There is a better Smoothieware firmware available. "+gcodeDriver.getDetectedFirmware(), 
                                "Please upgrade to the special PnP version. See info link.", 
                                Severity.Error, 
                                "https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares#smoothieware"));
                    }
                    if (firmwarePrimaryAxesCount != null 
                            && firmwarePrimaryAxesCount != firmwareAxesCount) {
                        solutions.add(new Solutions.PlainIssue(
                                gcodeDriver, 
                                "Smoothieware firmware should be built with the PAXIS="+firmwareAxesCount+" option.", 
                                "Download up-to-date firmware optimized for OpenPnP, or if you build the firmware yourself, please use the `make AXIS="+firmwareAxesCount+" PAXIS="+firmwareAxesCount+"` command. See info link.", 
                                Severity.Warning, 
                                "https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares#smoothieware"));
                    }
                }
                else if (gcodeDriver.getFirmwareProperty("FIRMWARE_NAME", "").contains("Duet")) {
                    firmware = FirmwareType.Duet;
                    String firmwareVersion = gcodeDriver.getFirmwareProperty("FIRMWARE_VERSION", "0.0");
                    Integer major = null;
                    Integer minor = null;
                    try {
                        Matcher matcher =
                                Pattern.compile("(?<major>-?\\d+)\\.(?<minor>-?\\d+).*").matcher(firmwareVersion);
                        matcher.matches();
                        major = Integer.parseUnsignedInt(matcher.group("major"));
                        minor = Integer.parseUnsignedInt(matcher.group("minor"));
                    }
                    catch (Exception e) {
                        Logger.warn(e);
                    }
                    if (major == null || minor == null
                            || major < 3 || (major == 3 && minor < 3)) {
                        solutions.add(new Solutions.PlainIssue(
                                gcodeDriver,
                                "Duet3D firmware was improved for OpenPnP, please use version 3.3beta or newer. Current version is "+firmwareVersion,
                                "Get the new version through the linked web page.",
                                Severity.Error,
                                "https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares#duet"));
                    }
                    if (gcodeDriver.getConfiguredAxes() != null) {
                        try {
                            Matcher matcher =
                                    Pattern.compile(".*\\s(?<axes>-?\\d+)\\saxes\\svisible.*").matcher(gcodeDriver.getConfiguredAxes());
                            matcher.matches();
                            firmwareAxesCount = Integer.parseUnsignedInt(matcher.group("axes"));
                        }
                        catch (NumberFormatException e) {
                            // ignore
                        }
                        if (gcodeDriver.getConfiguredAxes().contains("(r)")) {
                            solutions.add(new Solutions.PlainIssue(
                                    gcodeDriver,
                                    "Axes should be configured as linear in feedrate calculations on the Duet controller. See the linked web page.",
                                    "Use the M584 S0 option in your config.g file.",
                                    Severity.Error,
                                    "https://duet3d.dozuki.com/Wiki/Gcode#Section_M584_Set_drive_mapping"));
                        }
                        else {
                            firmwarePrimaryAxesCount = firmwareAxesCount;
                        }
                    }
                }
                else if (gcodeDriver.getFirmwareProperty("FIRMWARE_NAME", "").contains("Marlin")) {
                    firmware = FirmwareType.Marlin;
                    firmwareAxesCount = Integer.valueOf(gcodeDriver.getFirmwareProperty("AXIS_COUNT", "0"));
                    if (firmwareAxesCount > 3) { 
                        firmwarePrimaryAxesCount = firmwareAxesCount;
                    }
                    else {
                        solutions.add(new Solutions.PlainIssue(
                                gcodeDriver, 
                                "Marlin firmware is not reporting support for rotation axes (A B C). "+gcodeDriver.getDetectedFirmware(), 
                                "Please upgrade the firmware and/or axis configuration. See the info link.", 
                                Severity.Error, 
                                "https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares#marlin-20"));
                    }
                }
                else if (gcodeDriver.getFirmwareProperty("FIRMWARE_NAME", "").contains("TinyG")) {
                    // Having a response already means we have a new firmware.
                    firmware = FirmwareType.TinyG;
                }
                else if (gcodeDriver.getFirmwareProperty("FIRMWARE_NAME", "").contains("Grbl")) {
                    firmware = FirmwareType.Grbl;
                }
                else if (gcodeDriver.getFirmwareProperty("FIRMWARE_NAME", "").contains("GcodeServer")) {
                    firmware = FirmwareType.Generic;
                }
                else { 
                    solutions.add(new Solutions.PlainIssue(
                            gcodeDriver, 
                            "Unknown firmware. "+gcodeDriver.getDetectedFirmware(), 
                            "Check out firmwares known to be well supported. See info link.", 
                            Severity.Warning, 
                            "https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares"));
                }

// ...
}

看了判断是否为未知固件的实现, 明白了.
原来openpnp只支持几种御用固件, 其他的固件都是未知固件.
在代码中, 看到openpnp支持的御用固件如下:

Smoothieware
Duet
Marlin
TinyG
Grbl
GcodeServer

以前和一个同学讨论, 他问一个主板是否支持openpnp, 我当时现去查, 看到有个openpnp硬件项目拟采用那个主板, 才知道那个主板可以用做openpnp的主板.

现在看了代码就很清楚了, openpnp就支持有限的几种御用主板.

如果不是openpnp主板, 而是辅助用的飞达控制板, 出现这种未知固件的警告是不用担心的, 将这个警告禁止掉就行.
飞达控制板不涉及到openpnp硬件的运动位置, 只在固定位置送料, 这种只要送料控制好使就行.

下面是openpnp未知主板固件的提示信息

                else { 
                    solutions.add(new Solutions.PlainIssue(
                            gcodeDriver, 
                            "Unknown firmware. "+gcodeDriver.getDetectedFirmware(), 
                            "Check out firmwares known to be well supported. See info link.", 
                            Severity.Warning, 
                            "https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares"));
                }

看到给出了官方openpnp支持的主板固件的wiki连接.
看了一下, 知道了如果用于openpnp, 主板需要支持哪些特性(GCode)

https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares

主板固件支持异步GCode驱动和高级运动控制.
不过异步GCode驱动停危险的, 同步GCode驱动就够用了.
异步GCode驱动的官方wiki GcodeAsyncDriver
高级运动控制的官方wiki Advanced Motion Control

openpnp要求的主板关键特性:

  • 支持M115命令, 用来向openpnp上报固件版本, 好让openpnp能判断固件.
  • 必须支持除了X, Y, Z之外的附加轴(A, B, C)控制, 而且可以使多个轴的混合控制好使.
  • 支持M114命令, 用来上报所有轴的位置.
  • 支持G92命令, 用来让每个轴位置归零.
  • 支持M400命令, 用来等待移动完成. 在移动完成之前, 通讯必须是阻塞的. (在M400之后, 可能会发送其他命令, 但是移动完成之前, 必须阻塞住, 不能执行后续的指令)
  • 必须支持M204(加速度控制), M201.3(禁止加速)
  • 最好内置GcodeServer控制器模拟器(可选), 用来和openpnp联调, 用来确定openpnp发送的指令能产生正确的动作和效果.

官方御用的主板和固件如下:
Duet3D => https://docs.duet3d.com/en/Duet3D_hardware/Hardware_overview

RepRapFirmware

只是固件, 板子支持多种, 没细看.

Smoothieware 官方特意说, 不支持中国同学做的山寨版冰沙, 不过都是吓唬人, 用起来挺好的.
冰沙有第三方出的新固件 => makr.zone: “Smoothieware: New Firmware for PnP”

Marlin 2.0

TinyG

备注

对换冰沙主板之外的板子, 不感兴趣. 因为都是钱和时间啊, 等以后时机到了, 再折腾其他主板.

END


http://www.kler.cn/news/108848.html

相关文章:

  • IEEE Standard for SystemVerilog—Chapter 25.7 Tasks and functions in interfaces
  • GZ035 5G组网与运维赛题第6套
  • eslint识别不了别名解决方法
  • C++可视化 有穷自动机NFA 有穷自动机DFA
  • Linux——文件权限属性和权限管理
  • Python学习——Day11--封装、继承、多态
  • NLP之搭建RNN神经网络
  • Python 框架学习 Django篇 (六) ORM关联
  • Ansible脚本进阶---playbook
  • lwip代码分析
  • 信息系统项目管理师教程 第四版【第6章-项目管理概论-思维导图】
  • 常用conda和pip命令总结
  • 构建外卖小程序:技术要点和实际代码
  • 【深度学习】使用Pytorch实现的用于时间序列预测的各种深度学习模型类
  • Ubuntu系统编译调试QGIS源码保姆级教程
  • C#两个表多条件关联写法
  • 基于springboot,vue校园社团管理系统
  • 【pandas技巧】group by+agg+transform函数
  • Mysql第四篇---数据库索引优化与查询优化
  • IconWorkshop中文官方版下载_IconWorkshop最新版下载v6.91汉化破解版下载
  • Docker安装部署Elasticsearch+Kibana+IK分词器
  • 网络搭建和运维的基础题目
  • C++设计模式_16_Adapter 适配器
  • Java游戏修炼手册:2023 最新学习线路图
  • EtherNet/IP转profienrt协议网关连接EtherNet/IP协议的川崎机器人配置方法
  • 【LeetCode】3. 无重复字符的最长子串
  • 二叉树的概念
  • 竹云产品入选《2023年度上海市网络安全产业创新攻关成果目录》
  • 【操作系统】进程的控制和通信
  • Pytorch整体工作流程代码详解(新手入门)