《LINUXCNC源程序原理说明.docx》由会员分享,可在线阅读,更多相关《LINUXCNC源程序原理说明.docx(24页珍藏版)》请在课桌文档上搜索。
1、opLINUXCNC源程序学习源程序的树构造如下:Overviewoftheemc2directory(generatedbytree-I.git-d):-app-defaults|bin(usermodebinaries)-configsI-5axisI-bossI-commonI-dallur-thcI-demo_mazakI-demo_sim_clI-demo_step_clI-etch-servoI-halui_halvcpI-hexapod-simI-lathe-plutoI-m5i20I-maxI-motencI-nist-latheI-plasma-thc(samplemazak
2、configfiles)(samplesimwithladderIO)(samplestepperwithladderIO)(sampleservousingMesaPCI)(sampleservousingVitalPCI)-plasma-thc-sim-ppmcpumaI-scaraI-simI-stepperI-stepper-gantryI-stepper-xyzaII-stgI-univpwmI-univstepIvti-debian(simulatedmotionand10)(parportstepperdriver)(sampleservousingSTGISA)(sampleP
3、ICOservogenerator)(samplePICOsteppergenerator)(filesneededtobuilddebpackages)extras-Ubuntu-5.10(extrafilesforUbuntu5.10)|etcI-modprobe.dI|udevII-rules.dII-scriptsI-Xdg-menusapplications-mergedUSshare|applications|desktop-directories-pixmaps-extras-Ubuntu-6.06(extrafilesforbuildingonUbuntu6.06DapperD
4、rake)|etcI-modprobe.dI-udevII|rules.dII-scriptsIxdgI、一menusI-applications-mergedUSshare|applications|desktop-directories-pixmapsextras-Ubntu-7.10(extrafilesforbuildingonUbuntu7.10)-etcI-modprobe.dI-udevIIrules.dI-XdgI、一menusI-applications-mergedusrshare|applications|desktop-directories-pixmaps-extra
5、s-Ubuntu-8.04(extrafilesforbuildingonUbuntu8.04HardyHeron)-etcI-modprobe.dI-xdgI、一menusI-applications-mergedusrshare|applications|desktop-directories-pixmaps-extras-sim-Ubuntu-5.10(extrafilesforsimpackageforUbuntu5.10)-etcI-XdgI、一menusIapplications-mergedusrI-shareI|applicationsI|desktop-directories
6、I-pixmaps-extras-sim-Ubuntu-6.06(extrafilesforsimpackageforUbuntu6.06DapperDrake)|etcI-xdgI、一menusIapplications-merged、-usrshare|applications|desktop-directories、-pixmapsdocs(AlltheimportantandrelevantDocs.)-help-html(htmlversionofdocs-somegeneratedfromlyx)|man(manpages)I|manlI-man3Iman9src(APIandso
7、urcenotesshouldbeineachsrcdir.)(sourceforthehandbooks)(toplevel.lyxfiles)-code|common(shared.lyxfilesandimages,suchasglossary,GPLDlicense)|config|geode(.lyxfiles,images,etc.forG-Codedocumentation)|gui(.lyxfiles,images,etc.forGUIdocumentation)|hal(.lyxfiles,images,etc.forHALdocumentation)|install|lad
8、der|motion-quickstartinclude(headersinstalledhere-originalsinsrcxxx)lib(usermodeobjectfiles)python-rs274、一yappsnc_files(SampleNCfiles)rtlib(kernelmodeobjectfiles,onlyafterasuccessfullcompile)scripts(bashscriptslikeIinuxcnc,realtime,rip-environment,etc.)share|axisI-imagesI-tcl-emclocale|deI-LC_MESSAG
9、ES-esI、-LC_MESSAGES-frI-LC_MESSAGES|huI、-LC_MESSAGES-itI-LC_MESSAGES|pt_BRI、-LC_MESSAGES|roI-LC_MESSAGES|ruI、-LC_MESSAGES-seI-LC_MESSAGES-srI、-LC_MESSAGES、一zh_CN-LC_MESSAGESsrc(sourcetree-configurescript,toplevelmakefile,Makefile.inc,etc)I-depends(generateddependencytree)I|emc(actualLinuxCNCcode)-ca
10、nterp(interpreterforcanonicalcommands)-ini(inifilerelatedoperations)|iotask(10interface,lotsofHALpins)-kinematics(trajectoryplannerandkinematics)|motion(motioncontroller,talksthroughSHMtotherestofEMC)-nml_intf(emcspecificNMLimplementation,allmessagessentinemc)|rs274ngc(thers274g-codeinterpreter)-sai
11、|task(corecomponentinemc,dispatchesactionstootherparts)usr_intf(interfacesforsomeGUIs,andotherinterfaces:AXIS,halui,stepconf)|axisII-etcI|extensionsI-scripts-stepconfhal(theHardwareAbstractionLayer,providesaunifiedinterfaceacrossallhardware)-classicladderIprojects-examples|components-driversII-m5i20
12、III-bitIIhostmot5_srcI-mesa-hostmot2II|docII-firmwareII-5i20III-SOURCEII、一7i43II-CPLDIII、-SOURCEII-SOURCEI-mesa7i43-firmwareIII-gpioIII-sourceII|hostmot2III-srcII-sourceI-mesa_5i2xIIfirmwareI-pluto_servo_firmwareIpluto_step_firmware-user_compsI-devicesI-vcputils-halgui-Iibnml(acleanimplementationofR
13、CSLIB)-buffer|cms-inifile|linklist-nml|os_intf-posemathres-module_helperobjects-emcI-canterpI-iniI-iotaskI-motionI-nml_intfI-rs274ngcI-saiI-taskIllusr_intfIII-axisIII-extensionsII-halIlll-classicladderIlll-componentsIII-driversIII-user_compsIllll-devicesIlll-vcp-utilsII|IibnmlIII-bufferIlll-cmsIII-i
14、nifileIlll-linklistIII-nmlIII-os_intfIII-posemath-resII-rtapiII|rtemcIII-kinematics-motionII-rthalIlll-classicladderIII-components-utilsII-rtlibnml-posemathII-rtobjectsII-halII-componentsI-po(Translationfilesforil8nsupport)I|rtapi(*.cand*.hforRTAPI)(unifiedRTAPLwrapsoverRTLinux,RTAIandsim)II-example
15、s(testingexamplesfortheRTAPI)II|extintII-fifoII|semaphoreII|shmemIItimerI-tests|tcl(tkemc.tcl,mini.tcl-thetclGUIs)I|binI-scriptstests|abs.0|and-or-not-mux.0|basic|ccompI|lathe-compI-mill-g90g91g92I|mill-line-arc-entryI-mill-zchanges|counter-encoder.0|flipflop.0|interpI|cam-nisleyI-flowsnake|limit3.0
16、|limit3.1-limit3.2|modparam.0|overrun|owordI-sub.0|save.0|save.l|source.0|stepgen.0-stepgen.1|stepgen.2|threads.0timedelay.0Overviewoftheemc2installdirs:/(filesystemroot)IIIetc/III-init.dIII-realtime(realtimestart/stopscript)III一$(PrefiX)(default:usrlocal)II(allthefollowingSxxxxdirareconfigurablethr
17、oughautoconfIIIIbin/(knownasSbindir,filesfromEMC2bin)IIII-sbin(knownasSsbindir,)-etc/(knownasSsysconfdir,configfilesandsubdirsfromconfigs/)IIlib/(knownasSlibdir,libfiles*.sofromlibs/)III-share/III一emcIIIIII-docs/IIIII-一(AlltheimportantandrelevantDocs.)IIII-handbooks/IIIII一(PDFversionsofhandbooks)III
18、-nc-files/III一(SampleNCfiles)II一$MAN_DIR/(default:usrlocalman)IIII-manlIIIIIIII-man3IIII一Smoduledir/(basedonwhere./configurefindstheRTOSmodules)根据这个构造树,我们可以清楚的知道每一个文件夹,每一个子文件的作用,包括了接口,硬件抽象层,实时内核等等局部。当然,在这里面我们需要深入研究的是linuxcnc-dev/src/emc文件夹中的各个文件,也是该数控系统的核心所在。我们再次列出linuxcnc-dev/src/emc中的子构造树:linuxcnc
19、-dev/src/emc中的子构造树:I1emc(actualLinuxCNCcode)II-canterp(interpreterforcanonicalcommands)II-ini(inifilerelatedoperations)II-iotask(10interface,lotsofHALpins)II-kinematics(trajectoryplannerandkinematics)II|motion(motioncontroller,talksthroughSHMtotherestofEMC)II-nml_intf(emcspecificNMLimplementation,al
20、lmessagessentinemc)II|rs274ngc(thers274g-codeinterpreter)II-saiII-task(corecomponentinemc,dispatchesactionstootherparts)II-usrjntf(interfacesforsomeGUIs,andotherinterfaces:AXIS,halui,stepconf)II-axisIIII-etcIII|extensionsIIIscriptsII、一stepconf根据该构造树,我们一个一个的再一次进展分析:C1)canterp(interpreterforcanonicalc
21、ommands,即标准命令的解释器)#include/FILE,fopen(),fclose()#include/strcpy()#include/isspace()#include#include#includeconfig.h#includeHemc/nml_intf7interp_return.hh#include,emcnmUntf7canon.hh#include,emcrs274ngcinterp-base.hh其中包括了语法解析,读取,执行等函数,对刀具信息、主轴转速、开场、停顿等信息进展判断和执行工作。2ini(inifilerelatedoperations,初始化相关的文件
22、)同样,列出该文件夹的构造树:I-ini(inifilerelatedoperations)II-emcIniFile.cc/hhII|iniaxis.cc/hhII-inihal.cchhII|initraj.ee/hhII-initool.ee/hh(2.(1) emcIniFile.cc/hh#include/M_PI.#include,emcIniFile.hh,该文件定义了一些INl文件中字符的赋值,包括一个TURE或者FAULSE,单位mm,m,角度,直线,旋转等等。(2.(2) iniaxis.ee/hh#include/ NULL/ atol(), Jtoa()/ strcmp
23、()/ isdigit()#include#include#include#include#include#include#includeemc.hh#includeHrcs_print.hh#includeemcIniFile.hh/ these decls/ EMC_DEBUG/ default values for globals#include,iniaxis.hh#includeemcglb.h#includeemccfg.h#includeinihal.hh该文件主要用到了两个函数:loadaxis以及iniaxis0前一个函数Ioadaixs是对INl文件中的轴类型,轴单元,最大
24、最小位置限值,误差限值,最大速度,加速度,加加速度等初始化参数进展读取并存储在&axisIniFile中,这些参数对应于INl文件中AXIS一栏中的参数,并将局部参数赋值给OkUnihaLdata。除此之外,iniaxis函数主要是读取INl文件中TRAJ局部的AXIS轴数,然后调用loadaxis进展初始化加载。除去两个主要函数,还有一个精度判断函数iniGetFloatPrec以及状态函数可有可无(2.3)initraj.cc/hh该文件主要包含以下几个函数:IoadTraj,用于加载INl文件中TRAJ中的配置参数,然后将读取的参数值进展保存,主要赋值给OkUnihaLdata以及tra
25、j_max_veloCity等变量,供后续其他文件调用。同时该文件的后面还有一个坐标轴返回原点的判断程序,从而保证TRAJ中的原点坐标。其实,该文件类似于iniaxis.cc/hh。2.4inihal.cc/hh#include,rcs-print.hh#include,emc.hh#includeincludehal.h,#includertapi.h#include,inihal.hh,该文件中主要包含以下几个函数:ini_hal_init,用于定义HAL中的新的管脚,包括了各轴中的INl参数管脚,以及TRAJ中的INI参数管脚;ini_haUnit_pins,用于对之前定义好的新管脚进展
26、赋值,主要是将OkLinihaLdata中的参数值存储到*(the_inihal_data-NAME)中去。CheCKJnLhaLitemS(),用于对各个管脚的值进展更新检查。备注:old_inihal_data中的值都是在iniaxis.cc以及initraj.cc中赋值了的。3)iotask该文件在这里不做详细介绍,主要是创立“iocontrol组件,并对一些接口文件进展配置。4)Kinamitcs该文件夹中包含了不同的运动控制模块,例如五轴、三轴、六轴等等。除此之外,还包含了插补以及速度控制的轨迹规划文件。4.1运动控制模块4.2轨迹规划模块TC.C文件主要是基于轨迹规划的简单判别文件
27、,由TPC调用。下面我们分别说明该文件中的一些函数。#includertapi.h*rtapi_print_msg*/#includeposemath.h#include,emcpos.h#include,tc.h,(1)tcGetStartingUnitVector主要是获取运动轨迹的起始点的起始单位向量,如果是直线或者攻丝,那么直接计算起始与终止点的位移大小。如果不是,那么就是圆形运动,计算曲率,半径,起始点等等。(2)tcGetEndingUnitVector主要是获取运动轨迹的终止点的终止单位向量,如果是直线,那么直接计算终点坐标减去起点坐标的大小。如果是攻丝,那么计算起点坐标减去终点
28、坐标的大小。对于其他运动,即曲线运动,那么根据转过的角度,计算终点坐标,然后计算曲率半径,并将数据保存到指定位置V中。(3)tcGetPos/tcGetEndpoint两个都是通过调用函数IcGetPosReal从而得到位置信息。4tcGetPoSReal根据传入的参数判断是计算当前位移值还是目标位移值;其次判断运动类型,如果是攻丝,判断是正转还是反转的,再进展坐标值计算具体算法先省略。如果是直线运动,因为只是涉及到了xyz,其他轴UVw,abc等只需要进展配合运动即可,或者是XYZ不动,或者只有ABC再动等等。如果是曲线运动,同样配合计算其他各轴位移。判断完毕之后,返回各个轴的位移。5)tc
29、qCreate()建设TC构造体的新队列。(6)tcqDelete()删除TC构造体的队列。(7)tcqlnit(8) tcqPut()tcqRemove()tcqLen()tcqItem()数据存放,先入先出;tcqLen()数据队列的大小;tcqltem()读取数据队列的第N的元素。(9) tcqFull()判断堆栈是否已满,或者快要满了。TRC文件主要实现轨迹规划。#ifdefRTAPI#defineassert(args.)do)while(0)#else/SIM#include#include#include#include#endif#includert叩i.h*rt叩i_prin
30、t_msg*/#includertapi_string.h*NULL*/#includeposemath.h#include,tc.h,#includetp.h#includertapi_math.h#include,.motionmotion.h#includehal.h,#include./motion/mot_priv.h#includemotion_debug.h(1tpCreate)创立队列,供后续调用。2SClearDloSO如果需要改变的数字IO的存放队列,该函数将会去除之前的IO触发器队列供下次使用。(3) tpClear()某种程度而言,该函数属于“软件初始化,构造体TP_S
31、TRUCT中的参数将会被保存下来,而队列将会被清空。4tplnit(X初始化TP构造体中的参数值。5tpSetCycleTime(),设置程序循环时间。6IpSetVmax设置最大速度。7IpSetVlimitC)tpSetAmax()同上,设置速度限制以及最大速度。8tpSetldZtpGetExecId)分别设置下一个运行周期的ID号,或获取当前的ID号。9PSetTermCond(tp,cond)设置后续运动队列移动的终止条件,返回终止条件和公差。(10)tpSetPos(设置当前位置以及目标位置。备注:4-10所返回的参数值都是TP构造的成员,可以理解为TP中都是当前运动模式下的参数值
32、。11IpAddRigidTap()tpAddLine()tpAddCircle()这三个函数是用于判断在原有的运动上所需要参加的新的运动模式,根据下一步的运动模式不同,设置不同的参数保存在构造体TC中,可以理解为TC构造体中存入了下一个运动模式时的参数值。(12)tcRunCycle该函数通过传入构造体参数TP以及TC,进展运动段的速度控制,源程序用到的是T形速度控制。根据判断速度和加速度的状态控制速度变化。最后返回新的速度,以及最终速度变化量以当前的速度与最大限速进展比较,得到需要加速或者减速的多少1。13tpToggleDIOs(控制数字或者模拟IO口的开或者断,保证下一次输入或者输出正
33、确。C14)tpRunCycle该函数是运动控制的核心局部。首先进展emcmotStatus的初始化;判断TC是否空队列;判断当前运动是否同步进展,执行当前运动,完毕之后删除,载入下一个运动;判断下一个运动的可行性,如果出现异常中断Cabording),那么TP队列中的值全部初始化。判断所等待的ID号是否与TC中的ID号一致,如果不一致,那么输出错误信息,并给所等待的ID赋空值;对于TC值得第一次读取进展一系列状态判断,保证所有动作符合要求;对于攻丝动作,需要进展特殊处理。即当状态tc-motionjype=TC_RIGIDTAP的时候,先保证主轴正转;其次判断攻丝动作所处的状态:TAPPIN
34、G,该状态表示正在攻丝,如果当前位移量以及超过了或者等于所需要攻丝的长度,那么将状态切换到REVERSING,主轴反向,并设置反向运动的参数,如果当前位移量超过了攻丝长度,那么切换状态到FINAL.REVERSAL;主轴最后一个反向,然后回位;判断下一次的运动状态,判断是否TC是第一次被读取;判断TC构造体中的同步参数,然后判断运动中的速度以及加速度是否满足要求。其中一局部算法属于轨迹规划中的加速度判断法;在做完上述一些列判断之后,进展轨迹规划的重要局部:Primary.before=tcGetPos(tc);tcRunCycle(tp,tc,&primary_vel,&on_final_de
35、cel);primary_after=tcGetPos(tc);pmCartCartSub(primary_after.tran,primary-befre.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
36、.u=primary_after.u-primary_befdre.u;primary_displacement.v=primary_after.v-primary_befbre.v;primary-displacement.w=primary_after.w-primary-befre.w;调用之前的函数,计算当前值,然后运行一个周期,再次获取新的位置,然后分别计算各轴位移量。下一步计算属于混合模式下即将几段相似的程序进展合并的运动控制:同样进展条件判断,之后计算前后两段运动的速度,位移等等,最后输出前后两端的位移大小,实现合并。15最后对一些错误信息进展判断和验证。保证正确输出。备注:在t
37、p.c中轨迹规划是若何完成的:(1解释调用IpAddLine还是tpAddCircle?主要是依据MDI或者G代码的输入;2IpRunCycle在每一yTRALPERIOD周期内进展调用,从而更新CUiTentPos;13CurrentPos最终反响回HAL对应的是axis.X.motor-pos-cmdHALpins在Ipruncycle中: 判断tc队列是否为空,if(!tc);运动队列为空就表示已经到了程序的终点或者说队列处于饥饿状态,需要存入数据:此时,采取以下动作:(1J初始化一个空的运动队列;(2通过tp-goalPos=tp-currentPosandtp-done=1来终止机器
38、的动作;3调用tpResume(tp)然后等待队列tc中写入东西。 判断是否有异常终止信息if(tp-aborting);此时,采取以下动作:将当前的速度设置为0;C2)iSStp-goalPos=tp-currentPosandtp-done二1来终止机器的动作; 判断是否当前命令行执行完毕if(tc-target=tc-progress):此时,采取以下动作:(1)将当前的命令行从队列中删除;2将下一个命令载入到队列中。(4.3cubic.c三次样条插值5MotionMotion局部主要是5.1command.c#include#include#includeposemath.h,#inc
39、ludertapi.hinclude,hal.h,#includemotion.h#includemotion_debug.hH#includemotion-struct.h#include,emcmotglb.h#includemot_priv.h#includertapi_math.h#includemotion_types.h该函数主要是通过用户空间获取命令,执行不同的动作,这些命令构造体为emcmotCommand-command,而全部动作值都保存为EMCMOT.COMMAND在motion.h中。如果想要进展添加新的信号参数,你就需要做以下的工作:1在motion.h中添加新的配置
40、或者轴参数foo2在motion.h中添力EMCMOT_SET_FOO”命令,在cmd_code_t中。3在commandstruct中添加一个类afield4在COmmand.c中加一个大的选择开关从而控制EMCMoT_SET_FOOcommand。5添加一个函数emcSetF()taskintf.cc中。6在emc.hh中添加标准emcSetFoo()o7iniaxis.cc或者inixxx.cc中参加代码从而获取INIfile中的值,以及调用emcSetFoo().注意,参量一定不要重复。8在iniaxis.cc中写入新值。这说明你可以在INl文件中读取数据保存到共享内存,然后在运动控制
41、器中调用。如果你想通过NML实现数据操作,还应该做以下:9定义#defineEMC_SET_FOO_TYPE在emc.hh中。(IO)定义一个类EMC_SET_FOO枣emc.hh中。11)在emctaskmain.cc中添加一个大的状态控制开关,从而在接收到NML信息之后调用emcSetFoo()o12)在emc.cc,中添加两个与查找和设计新的命令相关的大的状态开关控制。好的,说完这些我们进展逐一介绍该函数的主程序。1CheCkAHHomed(Void)根据名字就很好猜到,这是检查各轴是否处于原点。2IimitS_ok()/jog_ok()检查限位以及各轴是否准备好。3)refreshJo
42、g-IimitsC)重新检查限位;如果是从原点开场的,那么直接重新给限位赋值,如果不是,那么在原有位置信息的根基上加上限位大小;4inRange()检查轴是否在限定范围内运行。如果是,返回非零值,如果超过,返回零。5ClearHomeS()清零回位标志位;6emcmotDioWrite()emcmotAioWrite用于管脚写入值,对于数字10,写入0或者1;对于模拟10,输出实际值。7is_feed_type用于判断运动类型。对于不同的运动类型返回不同的值;8JenicmoiCommandHandlerO在主循环中进展调用,用于读取共享内存中的数据。在进展命令判断之前,先判断命令的读取以及数目是否正确。并且一定要将emcmotCommand中的axisVjoinjnum对应起来。之后进展各个命令的判断:EMCMOT_ABORT:不管机器运行在何种模式,所有轴都停顿动作,并去除错误标志位。EMCMOT_AXIS_ABORT:只是某一个轴出现错误,停顿该轴动作,并去除标志位。EMCMoT_FREE:切换当前模式到自由运行模式;这段代码并非是真正实现模式转换的代码,只是将局部标志位去除,并且重置emcmotDebug-co