首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在编译或解释机器G代码时涉及到什么?

在编译或解释机器G代码时涉及到什么?
EN

Software Engineering用户
提问于 2016-02-28 21:12:49
回答 4查看 3.2K关注 0票数 1

据我所知,我们用来指导数控车床、3D打印机和雕刻机的G-代码和M-代码不是一种编程语言,而是一种脚本语言,如G00、T01、M18等,它将指示微控制器调用函数(例如,一些数值数学)。

这些函数或函数库在哪里?是否有这些G代码调用的ISO标准C/C++库?

我试图理解机器如何“理解”G代码,以及它在哪里获取G代码所指向的一系列逻辑和运动。以马林固件为例。它应该解析G码,并相应地指导步进电机,但我没有通过这些代码来完善数学和逻辑。单片机似乎能神奇地理解G码是什么,编译机器二进制文件并输出相应的数字信号。

我相信我不是误解了,就是遗漏了一些我在维基百科上找不到的信息。

EN

回答 4

Software Engineering用户

回答已采纳

发布于 2016-02-28 23:22:41

G代码被创建成非常容易被计算资源极其有限的设备解析。它更像是一种数据文件格式,而不是一种编程语言。没有“编译”步骤。当它被逐行读取时,它会被解释为带有一个小的缓冲区,以避免时间延迟带来的机械问题。也没有“标准库”。固件通常需要重新编译的每一个不同的组合微控制器和电机硬件使用,它需要相当多的工作,甚至支持什么看起来可能是微小的变化。

在Marlin固件中,在Marlin_main.cpp中有一个get_command()函数,它保持一个队列中的命令填充,还有一个process_next_command(),它包含一个大量的switch语句,用于从队列中提取下一个命令并调用适当的函数。

就这些功能而言,这在很大程度上取决于你所连接的硬件类型,但是如果你知道你有一个特定的时钟速率,一个特定类型的步进电机,连接到某个轴,一个特定的分辨率,连接到某个引脚,你可以计算出正确的引脚,在正确的时间切换,也就是说,以一定的速度从a到b沿x轴直线移动头部。从这里开始,用正确的时间来实现所有不同的所需命令,实在是太费劲了。

票数 8
EN

Software Engineering用户

发布于 2021-01-08 20:12:33

这个问题表明了对“代码”、编译器、解释器等的根本误解。

获取BMP图像文件。它由一个短标题和一组像素组成。

十六进制代码0000FF (是的,它是向后的)意味着调用一个函数插入一个红色像素。我们在哪里能找到像素码?位图文件调用的是ISO标准C/C++库吗?

不,没有!位图文件是位图文件。它不知道函数。它只知道像素。它没有说“调用红色像素函数”,它只说“红色像素”。如果微软画图想要使用红色像素函数,那就是微软画图的问题--与文件无关。

同样地,G代码不关心函数.G00的意思是“指向点的快速移动”。这并不意味着“调用快速移动到点函数”。

如果您正在设计一台处理G代码的机器,您可以决定如何实现它。你可以写:

代码语言:javascript
复制
if(command == "G00") {
    // code for rapid movement to point
} else if(command == "G01") {
    // code for precise movement to point
} else if(...etc...

或者你可以写这个:

代码语言:javascript
复制
if(command == "G00") {
    doRapidMovementToPoint(); // code is inside function
} else if(command == "G01") {
    doPreciseMovementToPoint(); // code is inside function
} else if(...etc...

或者你可以写这个:

代码语言:javascript
复制
if(commandChar == 'G' && gCommands[commandNumber]) {
    (*gCommands[commandNumber])(); // call through function pointer
} else if(...etc...

在Marlin中,这里是将G代码命令拆分为变量的代码,而这里是在命令被拆分后处理该命令的代码。没有魔法。只有ifswitch语句。

正如您所看到的,在Marlin中,他们主要为每个G代码命令编写了一个函数。但不一定是那样的。我们看到的是case 90: set_relative_mode(false); break;而不是case 90: G90(); break;。我们看到G00和G01共享相同的函数,但是再次检查代码号。

票数 5
EN

Software Engineering用户

发布于 2021-08-15 13:05:38

在机器的任何固件(如使用G码的3D打印机)中,都有一个包含配置文件的文件,并存在将每个G代码分配给命令的子文件;存在许多编程页,但配置文件包括/调用它们,因此除非在其他固件文件夹中搜索,否则通常看不到它们。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/311349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档