以下是本人学习rs274ngc的粗浅认识,和说明文档不当不妥之处,以官方说明文档为准,能力有限,不当之处,海涵!
1、RS274源码的获取
有条件的可以通过翻墙下载,下载地址:https://code.google.com/p/rs274ngc/downloads/list
参考博客:https://www.cnblogs.com/cai-zi/p/14584246.html 。也可以通过GitHub下载,直接在搜索栏内查找rs274ngc,找到更新时间较近的,没有任何后缀的rs274ngc源码,以下是本文使用的源码下载地址:https://github.com/QGCoder/rs274ngc。
2、RS274源码的编译 SAI编译
根据下载的源码配套文件中的说明文档,5.2 Building an SAI Executable章节说的,一个标准的G代码解释器需要11个文件,并且和Makefile就可以完成编译。
根据该章节所述:
- canon.hh 规范加工头文件声明
- canon_pre.cc 规范加工的函数定义
- driver.cc 处理用户和G代码解释器交互的驱动程序
- rs274ngc.hh G代码头文件
- rs274ngc_errors.cc 定义G代码解释器错误消息数组,具体内容由6文件声明
- rs274ngc_return.hh 消息声明
- rs274ngc_pre.cc G代码解释器的函数定义,也是rs274ngc.cc文件的预处理版本。
- rs274ngc.cc不是必须的文件,根据需要使用,rs274ngc.cc自动生成5,6的文件。
Makefile的说明,无任何参数执行make rs274时将生成一个支持XYZ的标准3轴G代码解释器,可通过轴存在选项配置成-DAA(即XYZ+A轴),-DBB(即XYZ+B轴),-DCC(即XYZ+C轴),或则混合叠加形成XYZ+AB,XYZ+AC,XYZ+BC形式的5轴G代码解释器,还可以通过-DALL_AXIS配置成支持XYZ+ABC的六轴G代码解释器。
还可以添加-DAXIS_ERROR使生成的G代码解释器对不支持的运动轴产生不支持轴的错误信息。如默认的XYZ轴G代码解释器,当执行G0 A1.0时会产生错误信息,不支持A轴。
此处先默认生成XYZ三轴G代码解释器,使用make rs247进行编译。
编译步骤:
1、将rs274ngc-main.zip复制到ubuntu18
2、通过unzip命令解压
3、进入rs274ngc-main/rs274ngc目录
4、执行make rs274
3、刀具文件和参数文件
G代码解释器的执行必须提供刀具文件rs274ngc.tool_default 和 参数文件rs274ngc.var。两个文件的修改参考文件内的格式进行添加或修改,均为由linuxCNC自带的配置文件。
1、rs274ngc.tool_default文件的修改
根据源码中的说明文档2.3 Tool File说明:除了版权声明行外,需要另起一空行,之后才到刀具信息行。一行数据表示1把刀具的信息,刀具描述需要5列的数据项,其中最后一项为注释内容可省略,同时规定第三项数据之后必须用空格,tab或换行符中的一个和第4列数据隔开。
第一列POCKET:用无符号整数表示,表示放置旋转刀库的口袋号。数值唯一。
第二列FMS:用无符号整数表示,表示刀具的代号。
第三列TLO:double表示的刀具长度偏移量。
第四列DIAM:double表示的刀尖半径(进行左右刀补时会使用)。
第五列COMMENT:表示注释。
以下是部分源码中默认的刀具文件内容:
文件中的长度补偿单位由用户自行处理是使用公制单位还是英制单位,只要和G代码解释器统一即可。任意行之间的刀具参数无先后顺序,只要口袋号不重复即可。
2、rs274ngc.var参数文件的修改
打开后可看注释,提到G代码解释器必须包含所有表中提到的参数,启动G代码解释器时会读取该文件,结束时会保存数据到该文件。默认时都为0除了5220(工件坐标系G54-G59.3)必须初始化为1~9中的一个数值。
查看说明文档3.2.1 Parameters章节里面有涉及到的参数编号说明:
- 5161~5166 G28指令回原点的机械坐标位置。
- 5181~5186 G30指令返回第二参考点机械坐标位置。
- 5211~5216 G92指令对G10 L2 Pn设定的9个子坐标系的整体偏移量。
- 5220 工件坐标系只有G54~G59.3共9个值,其他值错误,G54坐标系用1表示。
- 5221~5226 G54工件坐标系原点(机械坐标)。
- 5241~5246 G55工件坐标系原点(机械坐标)。
- 5261~5266 G56工件坐标系原点(机械坐标)。
- 5281~5286 G57工件坐标系原点(机械坐标)。
- 5301~5306 G58工件坐标系原点(机械坐标)。
- 5321~5326 G59工件坐标系原点(机械坐标)。
- 5341~5346 G59.1工件坐标系原点(机械坐标)。
- 5361~5366 G59.2工件坐标系原点(机械坐标)。
- 5381~5386 G59.3工件坐标系原点(机械坐标)。
参数文件还可以保存任意的参数项,参数项要求必须是1~5400内,且按序递增写入。
4、使用测试
将编译出来的rs274程序直接启动./rs274
在弹出的1-5的选项中可以录入需要的操作。
- 1:直接启动G代码解释器,录入后直接出现READ => 此时直接输入G代码回车就会出现解析之后的函数说明。如录入G01 X1 Y2 Z3 F100。
- 2:和3的如果想测试,特别注意driver.cc中函数入口处的fopen函数的字符串是否对最后一个字符\n处理掉,如果没有,则应该改动代码到’\0’ ,2和3功能看菜单字符串。
- 4:用于是否开启跳段执行G代码,开启时以/开头的G代码行被解释,关闭时/开头的G代码被忽略。
- 5:进入二级菜单,二级菜单1,当解析G代码出错时,进入出错的回调函数,二级菜单2,当解析G代码出错时,打印错误到错误堆栈中。
除了上述的MDI方式使用G代码解释器外,还可以通过传入G代码文件,进行调用,调用结束后会返回处理后的G代码到屏幕,也可以同时传入G代码文件和生成的数据的保存文件名,实现输出到文件中。
例如,保存到input.nc:
G0 X100 Y100 Z100
G0 X0 Y0 Z0
G1 X100 Y100 Z100 G98 F200
M30
执行./rs274 input.nc 在弹出的菜单栏录入1,启动G代码解析。结果如图:
还可以通过./rs247 xxx.nc out.file 直接将解析后的数据输出到文件中。
5、输出结果说明
根据说明文档4 Output: the Canonical Machining Functions章节的说法,输出的文件包含三个目标:第一规范的加工描述,第二是运动控制板卡能实现的指令,第三能执行的加工函数或动作。G代码解释器着重将G代码解释成简单的原子操作命令,但也不是绝对的,有些单条G代码也会解析成多条原子操作命令。如G01只会解析成1条原子操作命令,但是G75循环指令就会解析成多条原子操作命令以实现G代码的实际内涵。
G代码解释器输出的规范函数会有两种执行结果,一种是打印函数到标准文件(屏幕)或文件中,另一种进行测试和调试,会生成图形调用数据,用于生成刀具轨迹图形。第二种调用需要配套的驱动程序配合实现。图中是输出的规范函数的部分实现。
详细是函数内容查看说明文档4.3 The Canonical Machining Functions Defined。文档中还提到,冷却液的开启有多种方式,都可以通过一个命令全部关闭。每一个运动轴上是否有自动卡盘G代码解释器不能掌控,需要通过其他,如内部软件标识实现,即使对于需要加紧保护再启动的轴,在没有加紧动作时,也能解析出该轴的运动函数。
6、G代码解释器的接口说明
详细看说明文档的附录Appendix D. Interpreter Software。G代码解释器具有4个函数调用的接口,流向如图中所示。
第一类函数接口是告诉G代码解释应该执行某种动作,如读取一行G代码,G代码调用这类函数后,会通过返回函数接口,返回执行动作的结果状态码,成功或失败等6个状态码(看附录1Appendix A. Error Handling)。这一函数调用接口的声明在rs247ngc.hh,定义在rs247ngc_pre.cc中,函数都以rs247ngc_开头。
第二类函数接口要求G代码解释器提供一些信息,或则通过驱动程序将需要的信息映射到G代码解释器保存信息的位置,G代码解释器生成信息后会保存到映射的指针中。这一对函数调用接口的声明在rs247ngc.hh,定义在rs247ngc_pre.cc中,函数都以rs247ngc_开头。
第三类函数接口告诉系统一些规范加工应该完成的事情,它们在canon.hh声明,在canon_pre.cc中定义,不返回值。
第四类函数接口是G代码解释器需要的一些外部数据接口,有些G代码解释器的函数会提供指针,以便外部能将数据赋值到指针用于返回给G代码解释器(看附录6D.6 World-give-information Functions)。它们在canon.hh声明,在canon_pre.cc中定义,并且所有函数都是以GET_EXTERNAL_开头。
7、G代码解释器的软件结构
根据说明文档附录D.2 Software Files and Organization,G代码解释器采用C++语言编写,除了rs274ngc_pre.cc超过1.2w行外,其他文件都在100到1100行范围内,独立执行G代码解释器和LinuxCNC执行G代码解释器的文件组织形式如图所示。
独立使用G代码解释器时,只使用坐标和中间部分的程序和文件,黑色箭头表示4个接口,注意函数调用时数据的流向。LinuxCNC工作时会包含图中右边和中间部分的程序和文件,黑色箭头表示4个接口。
rs274ngc_pre.cc包含接口函数(第一类接口和第4类接口),和其他函数。文件中的其他函数最终只能通过接口函数进行调用,如图中显示只有驱动程序可以调用(SAI驱动程序或EMC驱动程序)。所有的接口类函数都可以调用规范加工函数,即canon.cc中的函数。
独立的G代码解释器和LinuxCNC使用的G代码解释器执行了不一样版本的规范加工函数。独立G代码解释器的规范加工函数执行输出打印(屏幕或文件),LinuxCNC中的G代码解释器的规范加工函数会传输到运动控制器执行加工。所有的规范加工函数采用相同的头文件canon.hh声明。详细的函数说明可以参考文件中的声明文件。
8、G代码的执行流程
查看说明文档的附录D.3 Cyclic Operation。
1、读取
G代码解释器一次读取一行G代码到内部缓冲区,然后删去非注释行的空格,同时也删去注释的内容,然后将所有的字母转换成小写字符,得到一行紧凑的小写G代码内容。接下来指向缓冲器的索引将在各种以read_xxx开头的函数间进行传递,实现处理首字母并进行读取。
2、存储
所有G代码都被存储在一种块数据结构中,每个块都有对应的槽,用于存储一行G代码的有效信息。
3、检查
调用read_xxx开头的函数会大量检查引起读取和存储的错误(语法错误检查),同时还需要众多以check_xxx开头的函数进行G代码逻辑检查。
4、执行
一旦块数据结构被创建和语法检查,将会由以convert_xxx开头的一个或多个执行函数块执行,实现一行G代码执行多个动作。