LinuxCNC学习(三)Qt内使用rs274ngc

本文记录在Qt中使用RS24ngc的一些使用注意事项。仅供参考,不喜勿喷,谢谢!

导入rs274ngc源码到Qt

右键插入rs274源码
在Qt工程里通过source右键把所有的rs274ngc的源码都选上(driver.cc和Makefile不需要)。
添加完代码文件目录
最好在Qt工程内创建一个rs274ngc文件夹,将需要的rs274ngc源码从rs274ngc-main/rs274ngc/所有源码,复制到rs274ngc中,删去其中的Makefile和driver.cc

创建一个QThread线程执行rs274ngc

ngcThread.cc内容

#include "ngcThread.h"
#include "rs274ngc/myNGC.hh"
#include <QString>
#include <QDebug>
#include "rs274ngc/myNGC.hh"
myNGC *workNGC=nullptr;
void ngcThread::run()
{
    workNGC = new myNGC(this);
    while(1){
        msleep(200);
    }
}
void ngcThread::slotGetGCode(const QString &str)
{
    workNGC->getOneLine(str);
}

ngcThread.hh内容

#ifndef NGCTHREAD_H__
#define NGCTHREAD_H__
#include <QThread>
#include <QWidget>
class ngcThread:public QThread
{
    Q_OBJECT;
public:
    void run() override;
public slots:
    void slotGetGCode(const QString &str);
};
#endif

创建一个myNGC类

用于实现rs274函数接口调用。myNGC.CC源码

#include "myNGC.hh"
#include <QObject>
#include <QDebug>
#include <QFile>
#include <cstdio>
#include <cstring>
#include <QCoreApplication>
#include "canon.hh"
#include "rs274ngc.hh"
#include "rs274ngc_return.hh"
#define GCODE_LINE_MAX      256
FILE *_outfile=nullptr;
extern char _parameter_file_name[];
extern CANON_TOOL_TABLE _tools[];
extern int _tool_max;
myNGC::myNGC(QObject *parent):QObject(parent)
{
    QString exePath = QCoreApplication::applicationDirPath();
    QString outPath = exePath + "/out.bin";
    char buff[20]="TEST NGC";
    this->rs274Flag = false;
    char paraFileName[]=":/rs274ngc.var";
    // 输出结果到文件中
    _outfile = fopen(outPath.toUtf8(), "wb+");
    outPath = exePath + "/rs274ngc.var";
    memcpy(_parameter_file_name, outPath.toUtf8(), strlen(outPath.toUtf8()));
    if(0 == read_tool_file(":/rs274ngc.tool_default")){
        if(RS274NGC_OK == rs274ngc_init()){
            this->rs274Flag = true;
            qDebug()<<"RS274 OK"<<endl;
        }
    }
}
myNGC::~myNGC()
{

}
void myNGC::getOneLine(QString str)
{
    int status;
    gcodeLine = str;
    char gcodeLine[GCODE_LINE_MAX];
    if(this->rs274Flag == true){
        this->copyToArray(str, gcodeLine);
        status = rs274ngc_read(gcodeLine);
        qDebug()<<status<<endl;
        if(RS274NGC_OK == status){
        	status = rs274ngc_execute();
        	qDebug()<<status<<endl;
        	if(RS274NGC_OK == status){ 
        		fflush(_outfile);
		        QFile file("./out.bin");
		        file.open(QFile::ReadOnly | QIODevice::Text);
		        QTextStream in(&file);
		        while(! in.atEnd()){
            		QString line = in.readLine();
            		qDebug()<<line;
        		}
        	}
        }
     }
}
int myNGC::read_tool_file(const char *name)
{
    QFile toolFile(name);
    int getFlag = -1;
    int slot;
    toolFile.open(QFile::ReadOnly);
    if(toolFile.size() > 0){
        // 跳过表头的内容,找到刀具参数实际内容
        QTextStream infile(&toolFile);
        QString getStr;
        while(!infile.atEnd()){
            getStr = infile.readLine();
            if(0 == getStr.size()){ // C语言需要判断的是\n符号
                getFlag = 0;
                break;
            }
        }
        if(getFlag != 0){
            toolFile.close();
            return -1;
        }
        for(slot = 0; slot <= _tool_max; slot ++){
            _tools[slot].id = -1;
            _tools[slot].length = 0;
            _tools[slot].diameter = 0;
        }
        while(! infile.atEnd()){
            getStr = infile.readLine();
            QStringList list = getStr.split(QRegExp("\\s+"));
//            foreach (QString tempStr, list) {
//                qDebug()<<tempStr<<endl;
//            }
            getStr = list.at(0);
            slot = getStr.toInt();
            if(slot > 0 && slot < _tool_max){
                getStr = list.at(1);
                _tools[slot].id = getStr.toInt();
                getStr = list.at(2);
                _tools[slot].length = getStr.toDouble();
                getStr = list.at(3);
                _tools[slot].diameter = getStr.toDouble();
//                qDebug()<<"slot"<<slot<<_tools[slot].id<<" len"<<_tools[slot].length<<"diam"<<_tools[slot].diameter<<endl;
            }

        }
    }
    toolFile.close();
    return 0;
}
void myNGC::copyToArray(QString &str, char array[])
{
    QByteArray byteArry = str.toUtf8();
    strcpy(array, byteArry.data());
}

myNGC.hh源码

#ifndef MYNGC_HH_
#define MYNGC_HH_
#include <QObject>
#include <QString>
#include <QFile>
#include <cstdlib>
#include "../ngcThread.h"
class myNGC:public QObject
{
    Q_OBJECT;
public:
    explicit myNGC(QObject *parent = nullptr);
    ~myNGC();
    void getOneLine(QString str);
    int read_tool_file(const char *name);
    void copyToArray(QString &str, char strArray[]);
private:
    QString gcodeLine;
    bool rs274Flag;
};

#endif

main.cpp实体化myThread类并连接信号和槽

#include "mainwidget.h"
#include <QApplication>
#include <QFile>
#include <QString>
#include "ngcThread.h"
#include <fstream>
#include <QThread>
#include <QObject>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ngcThread ngcTask;
    mainWidget w(&ngcTask);
    QObject::connect(&w, &mainWidget::sendInputText, &ngcTask, &ngcThread::slotGetGCode);

    w.show();
    ngcTask.start();
    return a.exec();
}

在需要的控件页的头文件内,声明一个信号sig(QString Str)用于将需要译码的文本信息发送到myNGC类的槽函数中。
使用时,在需要的位置通过emit发送sig(QString Str)信号即可。

emit this->sendInputText(gCodeStr);

发送G代码:g0x100y100
实验结果显示:
结果显示
UI页面:
UI画面
录入G代码文本后,点击就绪按钮,发送到ngcThread线程,执行并输出,后期可以和运动控制指令结合实现运动控制。

注意事项

1、必须让rs274ngc.tool_default和rs274ngc.var文件能正确指示路径并打开。
2、输出文件_outfile也需要指示到正确的文件,确保文件能打开。
3、通过中间数据即可实现UI和rs274ngc的数据互传。
4、以上只是学习示例,仅供参考,不喜勿喷,谢谢。
仅供学习:Qt工程源码

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了学习 LinuxCNC 的源代码,您可以照以下步骤进行: 1. 下载源代码:您从 LinuxCNC 的官方网站或者代码托管平台(如 GitHub)上获取 LinuxCNC 的源代码。确保选择最新的稳定版本或者您感兴趣的特定版本。 2. 配置开发环境:在学习 LinuxCNC 源代码之前,您需要设置好开发环境。这包括安装编译器、构建工具和相关的依赖项。根据您的操作系统,可以参考 LinuxCNC 的官方文档或者社区资源来完成环境设置。 3. 理解代码结构:在开始阅读源代码之前,建议先对 LinuxCNC 的代码结构有一个大致的了解。查阅官方文档、阅读开发者指南或者参考社区资源,以便熟悉主要模块和文件。 4. 阅读关键文件:选择一些关键的文件进行阅读,这些文件包括主要的执行程序、核心模块和功能模块。开始阅读时,可以先从入口文件开始,然后根据代码中的引用关系逐步展开。 5. 调试和测试:学习源代码的过程中,可以通过调试和测试来加深对代码逻辑和功能的理解。尝试在开发环境中编译、运行和调试 LinuxCNC,并观察代码执行过程中的变化和结果。 6. 参与社区:LinuxCNC 拥有活跃的社区,您可以加入邮件列表、论坛或者参与开发者讨论,与其他开发者交流学习经验和解决问题。通过参与社区,您可以更好地理解 LinuxCNC 的设计思路和开发过程。 请注意,学习源代码是一个需要耐心和持续努力的过程。建议您在学习过程中保持良好的记录和整理习惯,以便后续查阅和复习。祝您在学习 LinuxCNC 源代码的过程中取得好的进展!如果您有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值