开源改变世界

英寸或毫米 #456

推推 grbl 2年前 (2023-02-01) 195次浏览
关闭
佩洛维茨 打开了这个问题 2021 年 1 月 6 日 · 9条评论
关闭

英寸或毫米#456

佩洛维茨 打开了这个问题 2021 年 1 月 6 日 · 9条评论

注释

英寸或毫米 #456
佩洛维茨 评论了 2021 年 1 月 6 日  

慢跑似乎被硬编码为以强制 mm 的 G21 开头。

虽然这并不少见,但应该发生的是点动命令应该遵循机器配置。

如果机器以英寸为单位报告 (GRBL $13=1),则点动 $j 应以 G20 命令开始,如果连接的机器配置为 mm,则点动应以 G21 开始。

我确信这个 OPINION 会被激怒,但如果一个人通常在 mm 中配置运行,这不会对当前正在做的事情有任何改变。但是对于那些喜欢以英寸为单位工作的人来说,慢跑的工作量最少(在创建软件时通常是一件好事)。

或者,在点动框或配置项中添加按钮控件也足够了,就像在点动命令中删除硬编码的 G21 一样。

英寸或毫米 #456

慢跑似乎被硬编码为以强制 mm 的 G21 开头。

https://github.com/Denvi/Candle/blob/master/src/frmmain.cpp#L3886
是的,是的。
但是,这不应影响解析器状态,因此仅适用于慢跑,而不适用于您之后运行的命令。

点动命令应遵循机器配置

实际上在其他地方使用了一个 Candle 设置,所以我认为应该遵循它。

… 在点动命令中删除硬编码的 G21。

这似乎是一个非常糟糕的主意。如果用户期望机器以 mm 的速度移动,但程序运行之前设置的G20,他将会感到不愉快的惊喜。

仅查看源代码,我没有看到无需重新编译程序即可更改此行为的简单方法。

如果您只希望点动菜单中的步进和进给以英寸为单位,应该可以通过使用该double frmMain::toMetric(double value)功能并保持G21. 但是,我想下拉菜单可用的值集也应该不同,因此这可能需要进行更大的更改。(如有必要,可以手动更改这些值settings.ini,但软件应该可以处理。)

void frmMain::jogStep()
{
    if (m_jogVector.length() == 0) return;

    if (ui->cboJogStep->currentText().toDouble() == 0) {
        const double acc = m_settings->acceleration();              // Acceleration mm/sec^2
        int speed = ui->cboJogFeed->currentText().toInt();          // Speed mm/min
        double v = (double)speed / 60;                              // Rapid speed mm/sec
        int N = 15;                                                 // Planner blocks
        double dt = qMax(0.01, sqrt(v) / (2 * acc * (N - 1)));      // Single jog command time
        double s = v * dt;                                          // Jog distance

        QVector3D vec = m_jogVector.normalized() * s;

    //    qDebug() << "jog" << speed << v << acc << dt <<s;

        sendCommand(QString("$J=G21G91X%1Y%2Z%3F%4")
                    .arg(vec.x(), 0, 'g', 4)
                    .arg(vec.y(), 0, 'g', 4)
                    .arg(vec.z(), 0, 'g', 4)
                    .arg(speed), -2, m_settings->showUICommands());
    } else {
        int speed = ui->cboJogFeed->currentText().toInt();          // Speed mm/min
        QVector3D vec = m_jogVector * ui->cboJogStep->currentText().toDouble();

        sendCommand(QString("$J=G21G91X%1Y%2Z%3F%4")
                    .arg(vec.x(), 0, 'g', 4)
                    .arg(vec.y(), 0, 'g', 4)
                    .arg(vec.z(), 0, 'g', 4)
                    .arg(speed), -3, m_settings->showUICommands());
    }
}

会变成类似

void frmMain::jogStep()
{
    if (m_jogVector.length() == 0) return;

    if (ui->cboJogStep->currentText().toDouble() == 0) {
        const double acc = m_settings->acceleration();              // Acceleration mm/sec^2
        int speed = toMetric(ui->cboJogFeed->currentText().toInt());// Speed mm/min CHANGE HERE
        double v = (double)speed / 60;                              // Rapid speed mm/sec
        int N = 15;                                                 // Planner blocks
        double dt = qMax(0.01, sqrt(v) / (2 * acc * (N - 1)));      // Single jog command time
        double s = v * dt;                                          // Jog distance

        QVector3D vec = m_jogVector.normalized() * s;

    //    qDebug() << "jog" << speed << v << acc << dt <<s;

        sendCommand(QString("$J=G21G91X%1Y%2Z%3F%4")
                    .arg(vec.x(), 0, 'g', 4)
                    .arg(vec.y(), 0, 'g', 4)
                    .arg(vec.z(), 0, 'g', 4)
                    .arg(speed), -2, m_settings->showUICommands());
    } else {
        int speed = toMetric(ui->cboJogFeed->currentText().toInt());// Speed mm/min CHANGE HERE
        QVector3D vec = m_jogVector * toMetric(ui->cboJogStep->currentText().toDouble()); // CHANGE HERE

        sendCommand(QString("$J=G21G91X%1Y%2Z%3F%4")
                    .arg(vec.x(), 0, 'g', 4)
                    .arg(vec.y(), 0, 'g', 4)
                    .arg(vec.z(), 0, 'g', 4)
                    .arg(speed), -3, m_settings->showUICommands());
    }
}

我还没有测试过这个,但我明天可能会做那个,如果我让它工作的话,我会提交一个 PR。

英寸或毫米 #456
作者
佩洛维茨 评论了 2021 年 1 月 6 日 通过电子邮件
英寸或毫米 #456
ondras12345 评论了 2021 年 1 月 6 日  

在我看来,遵循 $13 设置中报告的机器配置将是最佳解决方案。

是的,但这是一个完全不同的问题。这个“帝国慢跑”功能应该和Candle的其他功能保持一致,即遵循Candle的设置。此蜡烛设置(以及“加速”和“快速”)可能应该遵循 Grbl 设置。

英寸或毫米 #456

此蜡烛设置(以及“加速”和“快速”)可能应该遵循 Grbl 设置。

实际上,Experimental分支(在撰写本文时,最新的提交是72a573380dd79db07c2f9a33ca3e028268f8e4f0)似乎就是这样做的:

蜡烛/src/candle/frmmain.cpp

第 1328 至 1342 行 72a5733

//设置响应
if (ca. command == $$ && ca. tableIndex == – 2 ) {
static QRegExp gs ( \\ $( \\ d+) \\ =([^;]+) \\ ; );
QMap< int , double > 集合;
诠释p = 0 ;
while ((p = gs.indexIn (response, p)) != – 1 ) {
设置[gs。盖帽( 1 )。toInt ()] = gs. 盖帽( 2 )。toDouble ();
p += gs。匹配长度();
}
if ( set.keys ( ). contains ( 13 ))m_settings-> setUnits (set[ 13 ]);
if ( set.keys ( ). contains ( 110 ))m_settings-> setRapidSpeed (set[ 110 ]);
if ( set.keys (). contains ( 120 ))m_settings-> setAcceleration (set[ 120 ]);
设置坐标文本框();
}

 

直到今天,我实际上无法从这个分支(Ubuntu 64 位)编译 SW,但我想通了。为了将来参考,这些是我需要安装的包:

sudo apt install qt5-default libqt5serialport5-dev qttools5-dev-tools
# the above is sufficient for master, Experimental also requires:
sudo apt install qtmultimedia5-dev qttools5-dev qtscript5-dev

我还需要将这两行添加到src/candle/frmmain.cpp

#include <QDrag>
#include <QTranslator>

似乎在其他函数中处理公制与英制的方式也发生了变化:
旧的

蜡烛/src/frmmain.cpp

2008 年至 2017 年的行 8fd07bf

void frmMain::restoreOffsets ()
{
//仍然有预复位工作位置
sendCommand ( QString ( G21G53G90X%1Y%2Z%3 ) .arg ( toMetric (ui-> txtMPosX -> text (). toDouble ()))
. arg ( toMetric (ui-> txtMPosY -> text () .toDouble ()))
. arg ( toMetric (ui-> txtMPosZ -> text (). toDouble ())), – 1 , m_settings-> showUICommands ());
sendCommand ( QString ( G21G92X%1Y%2Z%3 ) .arg ( toMetric (ui-> txtWPosX -> text (). toDouble ()))
. arg ( toMetric (ui-> txtWPosY -> text () .toDouble ()))
. arg ( toMetric (ui-> txtWPosZ -> text (). toDouble ())), – 1 , m_settings-> showUICommands ());
}

新的

蜡烛/src/candle/frmmain.cpp

第 2179 至 2193 行 72a5733

void frmMain::restoreOffsets ()
{
//仍然有预复位工作位置
sendCommand ( QString ( %4G53G90X%1Y%2Z%3 ) .arg (ui-> txtMPosX -> value ())
. arg (ui-> txtMPosY ->())
. arg (ui-> txtMPosZ ->())
. arg (m_settings-> units () ? G20 : G21 ),
2、m_settings-> showUICommands ());
sendCommand ( QString ( %4G92X%1Y%2Z%3 ) .arg (ui-> txtWPosX -> value ())
. arg (ui-> txtWPosY ->())
. arg (ui-> txtWPosZ ->())
. arg (m_settings-> units () ? G20 : G21 ),
2、m_settings-> showUICommands ());
}

 

但是,我认为这样做只是为了简化代码,我的修复可能会保持几乎相同。
我去测试一下。

英寸或毫米 #456

好吧,它似乎工作。但是,我注意到的一个问题是,如果$13在 Candle 运行时更改,则 Candle 设置在您重新启动它之前不会更改。这不是我添加的代码的问题,Candle 只读取一次 Grbl 设置(实际上,它似乎每次^X发出软重置命令时都会读取设置)。不过,我认为这不是一个大问题。
我将提交一份包含我所做更改的 PR。

英寸或毫米 #456
作者
佩洛维茨 评论了 2021 年 1 月 7 日 通过电子邮件
英寸或毫米 #456

是的,我并没有那么多考虑正常使用。我只是想防止“我刚刚测试过它,它仍然以毫米为单位慢跑”的评论……
我不相信爱好者会在这个应用程序中杀死 EEPROM,但你是对的 – 这是一个潜在的问题。

英寸或毫米 #456

@pelowitz认为这应该在 1.12.13b 中修复。您能否尝试一下,如果已解决,请关闭此问题?

英寸或毫米 #456
作者

我会玩它。谢谢。