• / 30
  • 下载费用:12 金币  

LINUXCNC源程序原理说明.doc

关 键 词:
LINUXCNC 源程序 原理 说明
资源描述:
''opLINUXCNC源程序学习源程序的树结构如下:Overview of the emc2 directory (generated by tree -I .git -d) :.|-- app-defaults|-- bin (user mode binaries)|-- configs| |-- 5axis| |-- boss| |-- common| |-- dallur-thc| |-- demo_mazak (sample mazak config files)| |-- demo_sim_cl (sample sim with ladder IO)| |-- demo_step_cl (sample stepper with ladder IO)| |-- etch-servo| |-- halui_halvcp| |-- hexapod-sim| |-- lathe-pluto| |-- m5i20 (sample servo using Mesa PCI)| |-- max| |-- motenc (sample servo using Vital PCI)| |-- nist-lathe| |-- plasma-thc| |-- plasma-thc-sim| |-- ppmc| |-- puma| |-- scara| |-- sim (simulated motion and IO)| |-- stepper (parport stepper driver) | |-- stepper-gantry| |-- stepper-xyza| |-- stg (sample servo using STG ISA)| |-- univpwm (sample PICO servo generator)| |-- univstep (sample PICO stepper generator)| `-- vti|-- debian (files needed to build deb packages)| |-- extras-Ubuntu-5.10 (extra files for Ubuntu 5.10)| | |-- etc| | | |-- modprobe.d| | | |-- udev| | | | |-- rules.d| | | | `-- scripts| | | `-- xdg| | | `-- menus| | | `-- applications-merged| | `-- usr| | `-- share| | |-- applications| | |-- desktop-directories| | `-- pixmaps| |-- extras-Ubuntu-6.06 (extra files for building on Ubuntu 6.06 Dapper Drake)| | |-- etc| | | |-- modprobe.d| | | |-- udev| | | | |-- rules.d| | | | `-- scripts| | | `-- xdg| | | `-- menus| | | `-- applications-merged| | `-- usr| | `-- share| | |-- applications| | |-- desktop-directories| | `-- pixmaps| |-- extras-Ubuntu-7.10 (extra files for building on Ubuntu 7.10)| | |-- etc| | | |-- modprobe.d| | | |-- udev| | | | `-- rules.d| | | `-- xdg| | | `-- menus| | | `-- applications-merged| | `-- usr| | `-- share| | |-- applications| | |-- desktop-directories| | `-- pixmaps| |-- extras-Ubuntu-8.04 (extra files for building on Ubuntu 8.04 Hardy Heron)| | |-- etc| | | |-- modprobe.d| | | `-- xdg| | | `-- menus| | | `-- applications-merged| | `-- usr| | `-- share| | |-- applications| | |-- desktop-directories| | `-- pixmaps| |-- extras-sim-Ubuntu-5.10 (extra files for sim package for Ubuntu 5.10)| | |-- etc| | | `-- xdg| | | `-- menus| | | `-- applications-merged| | `-- usr| | `-- share| | |-- applications| | |-- desktop-directories| | `-- pixmaps| `-- extras-sim-Ubuntu-6.06 (extra files for sim package for Ubuntu 6.06 Dapper Drake)| |-- etc| | `-- xdg| | `-- menus| | `-- applications-merged| `-- usr| `-- share| |-- applications| |-- desktop-directories| `-- pixmaps|-- docs (All the important and relevant Docs.)| |-- help| |-- html (html version of docs - some generated from lyx)| |-- man (man pages)| | |-- man1| | |-- man3| | `-- man9| `-- src (API and source notes should be in each src dir.) (source for the handbooks) (top level .lyx files)| |-- code| |-- common (shared .lyx files and images, such as glossary, GPLD license)| |-- config| |-- gcode (.lyx files, images, etc. for G-Code documentation)| |-- gui (.lyx files, images, etc. for GUI documentation)| |-- hal (.lyx files, images, etc. for HAL documentation)| |-- install| |-- ladder| |-- motion| `-- quickstart|-- include (headers installed here - originals in src/xxx/)|-- lib (user mode object files)| `-- python| |-- rs274| `-- yapps|-- nc_files (Sample NC files)|-- rtlib (kernel mode object files, only after a successfull compile)|-- scripts(bash scripts like linuxcnc, realtime, rip-environment, etc.)|-- share| |-- axis| | |-- images| | `-- tcl| |-- emc| `-- locale| |-- de| | `-- LC_MESSAGES| |-- es| | `-- LC_MESSAGES| |-- fr| | `-- LC_MESSAGES| |-- hu| | `-- LC_MESSAGES| |-- it| | `-- LC_MESSAGES| |-- pt_BR| | `-- LC_MESSAGES| |-- ro| | `-- LC_MESSAGES| |-- ru| | `-- LC_MESSAGES| |-- se| | `-- LC_MESSAGES| |-- sr| | `-- LC_MESSAGES| `-- zh_CN| `-- LC_MESSAGES|-- src (source tree - configure script, top level makefile, Makefile.inc, etc)| || |-- depends (generated dependency tree)| || |-- emc (actual LinuxCNC code)| | |-- canterp (interpreter for canonical commands)| | |-- ini (inifile related operations)| | |-- iotask (IO interface, lots of HAL pins)| | |-- kinematics (trajectory planner and kinematics)| | |-- motion (motion controller, talks through SHM to the rest of EMC)| | |-- nml_intf (emc specific NML implementation, all messages sent in emc)| | |-- rs274ngc (the rs274 g-code interpreter)| | |-- sai| | |-- task (core component in emc, dispatches actions to other parts)| | `-- usr_intf (interfaces for some GUIs, and other interfaces: AXIS, halui, stepconf)| | |-- axis| | | |-- etc| | | |-- extensions| | | `-- scripts| | `-- stepconf| |-- hal (the Hardware Abstraction Layer, provides a unified interface across all hardware)| | |-- classicladder| | | `-- projects_examples| | |-- components| | |-- drivers| | | |-- m5i20| | | | |-- bit| | | | `-- hostmot5_src| | | |-- mesa-hostmot2| | | | |-- doc| | | | `-- firmware| | | | |-- 5i20| | | | | `-- SOURCE| | | | `-- 7i43| | | | |-- CPLD| | | | | `-- SOURCE| | | | `-- SOURCE| | | |-- mesa7i43-firmware| | | | |-- gpio| | | | | `-- source| | | | |-- hostmot2| | | | | `-- src| | | | `-- source| | | |-- mesa_5i2x| | | | `-- firmware| | | |-- pluto_servo_firmware| | | `-- pluto_step_firmware| | |-- user_comps| | | |-- devices| | | `-- vcp| | `-- utils| | `-- halgui| |-- libnml (a clean implementation of RCSLIB)| | |-- buffer| | |-- cms| | |-- inifile| | |-- linklist| | |-- nml| | |-- os_intf| | |-- posemath| | `-- rcs| |-- module_helper| |-- objects| | |-- emc| | | |-- canterp| | | |-- ini| | | |-- iotask| | | |-- motion| | | |-- nml_intf| | | |-- rs274ngc| | | |-- sai| | | |-- task| | | `-- usr_intf| | | `-- axis| | | `-- extensions| | |-- hal| | | |-- classicladder| | | |-- components| | | |-- drivers| | | |-- user_comps| | | | |-- devices| | | | `-- vcp| | | `-- utils| | |-- libnml| | | |-- buffer| | | |-- cms| | | |-- inifile| | | |-- linklist| | | |-- nml| | | |-- os_intf| | | |-- posemath| | | `-- rcs| | |-- rtapi| | |-- rtemc| | | |-- kinematics| | | `-- motion| | |-- rthal| | | |-- classicladder| | | |-- components| | | `-- utils| | |-- rtlibnml| | | `-- posemath| | `-- rtobjects| | `-- hal| | `-- components| |-- po (Translation files for i18n support)| |-- rtapi (*.c and *.h for RTAPI) (unified RT API, wraps over RTLinux, RTAI and sim)| | `-- examples (testing examples for the RTAPI)| | |-- extint| | |-- fifo| | |-- semaphore| | |-- shmem| | `-- timer| `-- tests|-- tcl (tkemc.tcl, mini.tcl - the tcl GUI's)| |-- bin| `-- scripts`-- tests |-- abs.0 |-- and-or-not-mux.0 |-- basic |-- ccomp | |-- lathe-comp | |-- mill-g90g91g92 | |-- mill-line-arc-entry | `-- mill-zchanges |-- counter-encoder.0 |-- flipflop.0 |-- interp | |-- cam-nisley | `-- flowsnake |-- limit3.0 |-- limit3.1 |-- limit3.2 |-- modparam.0 |-- overrun |-- oword | `-- sub.0 |-- save.0 |-- save.1 |-- source.0 |-- stepgen.0 |-- stepgen.1 |-- stepgen.2 |-- threads.0 `-- timedelay.0Overview of the emc2 install dirs: / (file system root) | | |--- etc/ | | | \--- init.d/ | | | \--- realtime (realtime start/stop script) | | |--- $(prefix) (default: /usr/local) | | (all the following $xxxxdir are configurable through autoconf | | | |--- bin/ (known as $bindir, files from EMC2/bin) | | | |--- sbin/ (known as $sbindir, ) | | | |--- etc/ (known as $sysconfdir, config files and subdirs from configs/) | | | |--- lib/ (known as $libdir, lib files *.so from libs/) | | | \--- share/ | | | \--- emc/ | | | | | |--- docs/ | | | | | \--- (All the important and relevant Docs.) | | | |--- handbooks/ | | | | | \--- (PDF versions of handbooks) | | | \--- nc_files/ | | | \--- (Sample NC files) | |--- $MAN_DIR/ (default: /usr/local/man) | | | |--- man1/ | | | | | | | | \--- man3/ | | | | \--- $moduledir/ (based on where ./configure finds the RTOS modules)根据这个结构树,我们可以清楚的知道每一个文件夹,每一个子文件的作用,包括了接口,硬件抽象层,实时内核等等部分。当然,在这里面我们需要深入研究的是linuxcnc-dev/src/emc文件夹中的各个文件,也是该数控系统的核心所在。我们再次列出linuxcnc-dev/src/emc中的子结构树:linuxcnc-dev/src/emc中的子结构树:| |-- emc (actual LinuxCNC code)| | |-- canterp (interpreter for canonical commands)| | |-- ini (inifile related operations)| | |-- iotask (IO interface, lots of HAL pins)| | |-- kinematics (trajectory planner and kinematics)| | |-- motion (motion controller, talks through SHM to the rest of EMC)| | |-- nml_intf (emc specific NML implementation, all messages sent in emc)| | |-- rs274ngc (the rs274 g-code interpreter)| | |-- sai| | |-- task (core component in emc, dispatches actions to other parts)| | `-- usr_intf (interfaces for some GUIs, and other interfaces: AXIS, halui, stepconf)| | |-- axis| | | |-- etc| | | |-- extensions| | | `-- scripts| | `-- stepconf根据该结构树,我们一个一个的再一次进行分析:(1)canterp (interpreter for canonical commands,即规范命令的解释器)#include // FILE, fopen(), fclose()#include // strcpy()#include // isspace()#include #include #include "config.h"#include "emc/nml_intf/interp_return.hh"#include "emc/nml_intf/canon.hh"#include "emc/rs274ngc/interp_base.hh"其中包括了语法解析,读取,执行等函数,对刀具信息、主轴转速、开始、停止等信息进行判断和执行工作。(2)ini (inifile related operations,初始化相关的文件)同样,列出该文件夹的结构树:| |-- ini (inifile related operations)| | |-- emcIniFile.cc/hh | | |-- iniaxis.cc/hh | | |-- inihal.cc/hh | | |-- initraj.cc/hh | | |-- initool.cc /hh (2.1) emcIniFile.cc/hh #include // M_PI.#include "emcIniFile.hh"该文件定义了一些INI文件中字符的赋值,包括 一个TURE或者FAULSE,单位mm ,m,角度,直线,旋转等等。(2.2) iniaxis.cc/hh #include #include // NULL#include // atol(), _itoa()#include // strcmp()#include // isdigit()#include #include #include "emc.hh"#include "rcs_print.hh"#include "emcIniFile.hh"#include "iniaxis.hh"// these decls#include "emcglb.h"// EMC_DEBUG#include "emccfg.h"// default values for globals#include "inihal.hh"该文件主要用到了两个函数:loadaxis以及iniaxis。前一个函数loadaixs是对INI文件中的轴类型,轴单元,最大最小位置限值,误差限值,最大速度,加速度,加加速度等初始化参数进行读取并存储在&axisIniFile中,这些参数对应于INI文件中[AXIS]一栏中的参数,并将部分参数赋值给old_inihal_data。除此之外,iniaxis函数主要是读取INI文件中[TRAJ]部分的AXIS轴数,然后调用loadaxis进行初始化加载。除去两个主要函数,还有一个精度判断函数iniGetFloatPrec以及状态函数(可有可无)。(2.3)initraj.cc/hh该文件主要包含以下几个函数:loadTraj,用于加载INI文件中[TRAJ]中的配置参数,然后将读取的参数值进行保存,主要赋值给old_inihal_data以及traj_max_velocity等变量,供后续其他文件调用。同时该文件的后面还有一个坐标轴返回原点的判断程序,从而保证[TRAJ]中的原点坐标。其实,该文件类似于iniaxis.cc/hh。(2.4)inihal.cc/hh#include "rcs_print.hh"#include "emc.hh"#include #include "hal.h"#include "rtapi.h"#include "inihal.hh"该文件中主要包含以下几个函数:ini_hal_init,用于定义HAL中的新的管脚,包括了各轴中的INI参数管脚,以及TRAJ中的INI参数管脚;ini_hal_init_pins,用于对之前定义好的新管脚进行赋值,主要是将old_inihal_data中的参数值存储到*(the_inihal_data->NAME)中去。check_ini_hal_items(),用于对各个管脚的值进行更新检查。备注:old_inihal_data中的值都是在iniaxis.cc以及initraj.cc中赋值了的。(3) iotask该文件在这里不做详细介绍,主要是创建“iocontrol”组件,并对一些接口文件进行配置。(4)Kinamitcs该文件夹中包含了不同的运动控制模块,例如五轴、三轴、六轴等等。除此之外,还包含了插补以及速度控制的轨迹规划文件。(4.1)运动控制模块(4.2)轨迹规划模块TC.C文件——主要是基于轨迹规划的简单判别文件,由TP.C调用。下面我们分别说明该文件中的一些函数。#include "rtapi.h"/* rtapi_print_msg */#include "posemath.h"#include "emcpos.h"#include "tc.h"(1)tcGetStartingUnitVector 主要是获取运动轨迹的起始点的起始单位向量,如果是直线或者攻丝,那么直接计算起始与终止点的位移大小。如果不是,那么就是圆形运动,计算曲率,半径,起始点等等。(2)tcGetEndingUnitVector 主要是获取运动轨迹的终止点的终止单位向量,如果是直线,那么直接计算终点坐标减去起点坐标的大小。如果是攻丝,那么计算起点坐标减去终点坐标的大小。对于其他运动,即曲线运动,则根据转过的角度,计算终点坐标,然后计算曲率半径,并将数据保存到指定位置V中。(3)tcGetPos/tcGetEndpoint 两个都是通过调用函数tcGetPosReal从而得到位置信息。(4) tcGetPosReal 根据传入的参数判断是计算当前位移值还是目标位移值;其次判断运动类型,如果是攻丝,判断是正转还是反转的,再进行坐标值计算(具体算法先省略)。如果是直线运动,因为只是涉及到了xyz,其他轴uvw,abc等只需要进行配合运动即可,或者是XYZ不动,或者只有ABC再动等等。如果是曲线运动,同样配合计算其他各轴位移。判断完毕之后,返回各个轴的位移。(5)tcqCreate() 建立TC结构体的新队列。(6)tcqDelete() 删除TC结构体的队列。(7)tcqInit (8)tcqPut()/tcqRemove()/tcqLen()/tcqItem() 数据存放,先入先出;tcqLen()数据队列的大小;tcqItem()读取数据队列的第N的元素。(9)tcqFull() 判断堆栈是否已满,或者快要满了。TP.C文件——主要实现轨迹规划。#ifdef RTAPI#define assert(args...) do {} while(0)#else// SIM#include #include #include #include #endif#include "rtapi.h"/* rtapi_print_msg */#include "rtapi_string.h" /* NULL */#include "posemath.h"#include "tc.h"#include "tp.h"#include "rtapi_math.h"#include "../motion/motion.h"#include "hal.h"#include "../motion/mot_priv.h"#include "motion_debug.h"(1)tpCreate()创建队列,供后续调用。(2)tpClearDIOs() 如果需要改变的数字IO的存放队列,该函数将会清除之前的IO触发器队列供下次使用。(3)tpClear() 某种程度而言,该函数属于“软件初始化”,结构体TP_STRUCT中的参数将会被保留下来,而队列将会被清空。(4)tpInit(),初始化TP结构体中的参数值。(5)tpSetCycleTime(),设置程序循环时间。(6)tpSetVmax()设置最大速度。(7)tpSetVlimit()/ tpSetAmax() 同上,设置速度限制以及最大速度。(8)tpSetId()/tpGetExecId() 分别设置下一个运行周期的ID号,或获取当前的ID号。(9)pSetTermCond(tp, cond) 设置后续运动队列移动的终止条件,返回终止条件和公差。(10)tpSetPos()设置当前位置以及目标位置。备注:(4-10)所返回的参数值都是TP结构的成员,可以理解为TP中都是当前运动模式下的参数值。(11)tpAddRigidTap()/ tpAddLine()/tpAddCircle() 这三个函数是用于判断在原有的运动上所需要加入的新的运动模式,根据下一步的运动模式不同,设置不同的参数保存在结构体TC中,可以理解为TC结构体中存入了下一个运动模式时的参数值。(12)tcRunCycle() 该函数通过传入结构体参数TP以及TC,进行运动段的速度控制,源程序用到的是T形速度控制。根据判断速度和加速度的状态控制速度变化。最后返回新的速度,以及最终速度变化量(以当前的速度与最大限速进行比较,得到需要加速或者减速的多少)。(13)tpToggleDIOs() 控制数字或者模拟IO口的开或者断,保证下一次输入或者输出正确。(14)tpRunCycle() 该函数是运动控制的核心部分。首先进行emcmotStatus的初始化;判断TC是否空队列;判断当前运动是否同步进行,执行当前运动,完毕之后删除,载入下一个运动;判断下一个运动的可行性,如果出现异常中断(abording),那么TP队列中的值全部初始化。判断所等待的ID号是否与TC中的ID号一致,如果不一致,则输出错误信息,并给所等待的ID赋空值;对于TC值得第一次读取进行一系列状态判断,保证所有动作符合要求;对于攻丝动作,需要进行特殊处理。即当状态tc->motion_type == TC_RIGIDTAP的时候,先保证主轴正转;其次判断攻丝动作所处的状态:TAPPING,该状态表示正在攻丝,如果当前位移量以及超过了或者等于所需要攻丝的长度,那么将状态切换到REVERSING,主轴反向,并设置反向运动的参数,如果当前位移量超过了攻丝长度,那么切换状态到FINAL_REVERSAL;主轴最后一个反向,然后回位;判断下一次的运动状态,判断是否TC是第一次被读取;判断TC结构体中的同步参数,然后判断运动中的速度以及加速度是否满足要求。其中一部分算法属于轨迹规划中的加速度判断法;在做完上述一些列判断之后,进行轨迹规划的重要部分:primary_before = tcGetPos(tc); tcRunCycle(tp, tc, &primary_vel, &on_final_decel); primary_after = tcGetPos(tc); pmCartCartSub(primary_after.tran, primary_before.tran, &primary_displacement.tran); primary_displacement.a = primary_after.a - primary_before.a; primary_displacement.b = primary_after.b - primary_before.b; primary_displacement.c = primary_after.c - primary_before.c; primary_displacement.u = primary_after.u - primary_before.u; primary_displacement.v = primary_after.v - primary_before.v; primary_displacement.w = primary_after.w - primary_before.w;调用之前的函数,计算当前值,然后运行一个周期,再次获取新的位置,然后分别计算各轴位移量。下一步计算属于混合模式下(即将几段相似的程序进行合并)的运动控制:同样进行条件判断,之后计算前后两段运动的速度,位移等等,最后输出前后两端的位移大小,实现合并。(15)最后对一些错误信息进行判断和验证。保证正确输出。备注:在tp.c中轨迹规划是如何完成的:(1)解释调用tpAddLine还是tpAddCircle?主要是依据MDI或者G代码的输入;(2)tpRunCycle在每一个TRAJ_PERIOD周期内进行调用,从而更新currentPos;(3)currentPos最终反馈回HAL对应的是axis.X.motor-pos-cmd HAL pins。在tpruncycle中:l 判断tc队列是否为空,if(!tc);运动队列为空就表示已经到了程序的终点或者说队列处于饥饿状态,需要存入数据:此时,采取以下动作:(1)初始化一个空的运动队列;(2)通过tp->goalPos = tp->currentPos and tp->done = 1来终止机器的动作;(3)调用tpResume(tp)然后等待队列tc中写入东西。l 判断是否有异常终止信息if(tp->aborting);此时,采取以下动作:(1) 将当前的速度设置为0;(2)通过tp->goalPos = tp->currentPos and tp->done = 1来终止机器的动作;l 判断是否当前命令行执行完毕if (tc->target == tc->progress):此时,采取以下动作:(1) 将当前的命令行从队列中删除;(2)将下一个命令载入到队列中。(4.3)cubic.c三次样条插值(5)MotionMotion部分主要是(5.1)command.c#include #include #include "posemath.h"#include "rtapi.h"#include "hal.h"#include "motion.h"#include "motion_debug.h"#include "motion_struct.h"#include "emcmotglb.h"#include "mot_priv.h"#include "rtapi_math.h"#include "motion_types.h"该函数主要是通过用户空间获取命令,执行不同的动作,这些命令结构体为emcmotCommand->command,而全部动作值都保存为EMCMOT_COMMAND在 motion.h中。如果想要进行添加新的信号参数,你就需要做以下的工作:(1)在motion.h中添加新的配置或者轴参数'foo'。(2)在motion.h中添加'EMCMOT_SET_FOO"命令,在cmd_code_t中。(3)在command_t struct中添加一个类a field(4)在command.c中加一个大的选择开关从而控制'EMCMOT_SET_FOO' command。(5)添加一个函数emcSetFoo()在taskintf.cc中。(6)在emc.hh中添加规范emcSetFoo()。(7)iniaxis.cc或者inixxx.cc中加入代码从而获取INI file中的值,以及调用emcSetFoo().注意,参量一定不要重复。(8)在iniaxis.cc中写入新值。这说明你可以在INI文件中读取数据保存到共享内存,然后在运动控制器中调用。如果你想通过NML实现数据操作,还应该做以下:(9)定义#define EMC_SET_FOO_TYPE 在 emc.hh中。(10)定义一个类EMC_SET_FOO 枣emc.hh中。(11)在emctaskmain.cc中添加一个大的状态控制开关,从而在接收到NML信息之后调用emcSetFoo()。(12)在emc.cc,中添加两个与查找和设计新的命令相关的大的状态开关控制。好的,说完这些我们进行逐一介绍该函数的主程序。(1)checkAllHomed(void) 根据名字就很好猜到,这是检查各轴是否处于原点。(2)limits_ok()/jog_ok() 检查限位以及各轴是否准备好。(3)refresh_jog_limits() 重新检查限位;如果是从原点开始的,则直接重新给限位赋值,如果不是,则在原有位置信息的基础上加上限位大小;(4)inRange() 检查轴是否在限定范围内运行。如果是,返回非零值,如果超过,返回零。(5)clearHomes() 清零回位标志位;(6)emcmotDioWrite()/emcmotAioWrite 用于管脚写入值,对于数字IO,写入0或者1;对于模拟IO,输出实际值。(7)is_feed_type() 用于判断运动类型。对于不同的运动类型返回不同的值;(8)emcmotCommandHandler() 在主循环中进行调用,用于读取共享内存中的数据。在进行命令判断之前,先判断命令的读取以及数目是否正确。并且一定要将emcmotCommand中的axis与joint_num对应起来。之后进行各个命令的判断:EMCMOT_ABORT:不管机器运行在何种模式,所有轴都停止动作,并清除错误标志位。EMCMOT_AXIS_ABORT:只是某一个轴出现错误,停止该轴动作,并清除标志位。EMCMOT_FREE:切换当前模式到自由运行模式;这段代码并非是真正实现模式转换的代码,只是将部分标志位清除,并且重置emcmotDebug->coordinating,从而推迟该周期的转换。EMCMOT_COORD: 切换当前模式到坐标轴运行模式;同样,这段代码并非是真正实现模式转换的代码,只是将部分标志位清除,并且重置emcmotDebug->coordinating,从而推迟该周期的转换。EMCMOT_TELEOP: 切换当前模式到遥控运行模式(teleop motion);EMCMOT_SET_NUM_AXES:其实应该叫EMCMOT_SET_NUM_JOINTS。EMCMOT_SET_WORLD_HOME:将当前位置信息设置为世界坐标系的原点。EMCMOT_SET_HOMING_PARAMS:将emcmotCommand中的成员赋值给Joint。EMCMOT_OVERRIDE_LIMITS:EMCMOT_SET_MOTOR_OFFSET: 将emcmotCommand中的刀具偏置成员赋值给Joint。EMCMOT_SET_POSITION_LIMITS: 将emcmotCommand中的限位信息成员赋值给Joint。EMCMOT_SET_BACKLASH:EMCMOT_SET_MAX_FERROR:EMCMOT_JOG_CONT:做连续的JOG运动,直到极限。当然只限于自由运动模式,并且被激活的情况下。至于回位,坐标轴运行模式,以及进给保持或者速度倍率为0时都是不可以的,进行完限制之后,设定自由模式下的速度等信息。EMCMOT_JOG_INCR:做增量式JOG运动,同上。EMCMOT_JOG_ABS: 做绝对式JOG运动,同上。EMCMOT_SET_TERM_COND:调用TP.C中的函数,设置终止条件。EMCMOT_SET_SPINDLESYNC: 调用TP.C中的函数,设置刀具同步信息。EMCMOT_SET_LINE: emcmotDebug->queue做线性队列,要求是在坐标轴模式下运行,使能关闭,没有限制。EMCMOT_SET_CIRCLE:同上。EMCMOT_SET_VEL:设置下一个运动的速度。将emcmotCommand中的速度值赋值给joint。EMCMOT_SET_VEL_LIMIT: 设置所有后续行动的绝对最大速度。将emcmotCommand中的速度值赋值给joint。EMCMOT_SET_JOINT_VEL_LIMIT:设置轴的最大速度。将emcmotCommand中的速度值赋值给joint。EMCMOT_SET_JOINT_ACC_LIMIT: 设置轴的最大加速度。将emcmotCommand中的速度值赋值给joint。EMCMOT_SET_ACC: 设置所有后续行动的绝对最大加速度。将emcmotCommand中的加速度值赋值给joint。EMCMOT_PAUSE:调用tpPause进行暂停。EMCMOT_RESUME: 调用tpResume关闭暂停。EMCMOT_STEP:单步运行。EMCMOT_FEED_SCALE: 设置速度倍率。将emcmotCommand中的速度倍率值赋值给emcmotStatus。EMCMOT_FS_ENABLE:打开或者关闭速度倍率设置。EMCMOT_FH_ENABLE: 打开或者关闭速度保持。EMCMOT_SPINDLE_SCALE:设置主轴转速的倍率。EMCMOT_SS_ENABLE: 打开或者关闭速度倍率。EMCMOT_AF_ENABLE:打开或者关闭来自于HAL管脚的自适应速度。EMCMOT_DISABLE:重置emcmotDebug->enabling标志位,EMCMOT_ENABLE:EMCMOT_ACTIVATE_JOINT:打开轴动作。EMCMOT_DEACTIVATE_JOINT:关闭轴动作。EMCMOT_ENABLE_AMPLIFIER:不用计算,直接使用放大器。EMCMOT_DISABLE_AMPLIFIER:EMCMOT_HOME:使得某个特定的轴回位。EMCMOT_ENABLE_WATCHDOG:打开看门狗。EMCMOT_UNHOME:不让某个特定的轴回位。EMCMOT_DISABLE_WATCHDOG:EMCMOT_CLEAR_PROBE_FLAGS:对刀信息标志位清除。EMCMOT_PROBE:在坐标系模式下进行对刀。EMCMOT_RIGID_TAP:EMCMOT_SET_TELEOP_VECTOR:EMCMOT_SET_DEBUG:EMCMOT_SET_AOUT:调用tpSetAout函数。EMCMOT_SET_DOUT: 调用tpSetDout函数。EMCMOT_SPINDLE_ON:将emcCommand中的参数值赋值给emcmotStatus。EMCMOT_SPINDLE_OFF:EMCMOT_SPINDLE_ORIENT:EMCMOT_SPINDLE_INCREASE:以100为基础进行加。EMCMOT_SPINDLE_DECREASE:EMCMOT_SPINDLE_BRAKE_ENGAGE:打开制动。EMCMOT_SPINDLE_BRAKE_RELEASE:关闭制动。EMCMOT_SET_JOINT_COMP:轴补偿。EMCMOT_SET_OFFSET:刀具偏置设置。(5.2)control.c#include "posemath.h"#include "rtapi.h"#include "hal.h"#include "emcmotglb.h"#include "motion.h" 很多参数由此而来#include "mot_priv.h"#include "rtapi_math.h"#include "tp.h"#include "tc.h"#include "motion_debug.h"#include "config.h"该部分是伺服周期内的主要部分,调用各种状态逻辑以及轨迹计算。(1)本地函数定义LOCAL FUNCTION PROTOTYPESprocess_inputs()——用于读取HAL中通过硬件层传进来的信号;do_forward_kins(void)——获取轴的坐标位置反馈,通过正解计算出笛卡尔坐标系下的位置反馈,还有部分是用来控制机器不是正向运动或者是没有回到原点的情况。process_probe_inputs(void)——在探测器被触发的时候笛卡尔坐标位置被锁定,并且只有在正向运动过程中探测器输入才会有效。check_for_faults()——用于检测是否超过限位,是否存在跟随误差等等,并且只检测正在动作的轴。set_operating_mode()——用于切换free, coordinated, and teleop.三种模式。handle_jogwheels(void)——控制旋钮或者按钮的开关。do_homing_sequence()——根据emcmotStatus->homingSequenceState来决定做什么。如果是多个轴的,则在homing.c和mot_priv.h中。do_homing()——根据每个轴结构的home_state来决定做什么。Homing作为机器的一种状态进行执行。同上,在homing.c和mot_priv.h中。get_pos_cmds()——产生位置的设置点,通过调用轨迹规划和插补。compute_screw_comp()——用于计算间隙和导程误差补偿。Leadscrew的误差补偿比间隙更加精密,通过使用emcmotStatus->joint_vel_cmd中的速度信息决定轴的运动方式,通过emcmotStatus->joint_pos_cmd中的位置信息决定轴在什么位置。这些信息都会被用来计算补偿值,从而将补偿值加入到joint_pos_cmd中生成motor_pos_cmd,或者从motor_pos_fb中减去从而得到joint_pos_fb值。最基本的补偿值保存在backlash_corr中,当然,如果方向反转,则会使得下一步发生变化。backlash_filt作为一个加强版。output_to_hal()——控制函数的结果输出到HAL中,将内部变量输出到HAL中以便在HAL的示波器和采集卡中显示。update_status()——输出各种状态信息到共享内存中,从而保证更高级的代码调用。(2)公共函数PUBLIC FUNCTION CODEemcmotController()——每个周期的轨迹规划和插补。即使是不动作的轴也是在计算,只是不进行输出而已。该函数开始进行周期的设定,然后依次调用前面介绍的这些函数进行计算。最后通过判断emcmotStatus的状态来确定是否运行完毕。(3)本地函数代码LOCAL FUNCTION CODEprocess_probe_inputs()——emcmotStatus->probeValprocess_inputs(void)——(5.3)emcmotcfg.h 编译时参数的默认值;(5.4)emcmotglb.c/h#include "emcmotglb.h"/* these decls */#include "emcmotcfg.h"/* initial values */编译时的配置参数。主要是将emcmotcfg.h中的默认值赋给emcmotglb.h中的参数。(5.5)motion.c#include #include "rtapi.h"/* RTAPI realtime OS API */#include "rtapi_app.h"/* RTAPI realtime module decls */#include "rtapi_string.h" /* memset */#include "hal.h"/* decls for HAL implementation */#include "emcmotglb.h"#include "motion.h"#include "motion_debug.h"#include "motion_struct.h"#include "mot_priv.h"#include "rtapi_math.h"// Mark strings for translation, but defer translation to userspace#define _(s) (s)主模块初始化以及例程清理。(1)内核模块参数KERNEL MODULE PARAMETERS(2)定义全局变量GLOBAL VARIABLE DEFINITIONS*emcmot_hal_data *joints joint_array[EMCMOT_MAX_JOINTS] *emcmotStruct*emcmotCommand *emcmotStatus *emcmotConfig *emcmotDebug *emcmotInternal*emcmotError注意,参数的传递无非就是从一个变量赋值到另一个变量;对于Linux/RT-Linux是在映射内存中对于Unixes是在OS共享内存中。emcmotStruct就是在该内存中。而各个指针的方向如下:emcmotCommand points to em
展开阅读全文
  语墨文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
0条评论

还可以输入200字符

暂无评论,赶快抢占沙发吧。

关于本文
本文标题:LINUXCNC源程序原理说明.doc
链接地址:http://www.wenku38.com/p-145133.html

                                            站长QQ:1002732220      手机号:18710392703    


                                                          copyright@ 2008-2020 语墨网站版权所有

                                                             经营许可证编号:蜀ICP备18034126号

网站客服微信
收起
展开