毕业设计(论文)-激光喷丸系统运动控制软件编制及喷丸改性实验(含全套图纸)
本科毕业论文激光喷丸系统运动控制软件编制及喷丸改性实验EstablishmentoftheMotionControlSoftwareofLaserShotPeeningSystemandShotPeeningModificationExperiments全套CAD图纸,三维图纸,程序,联系学生学号:学生姓名:专业班级:指导教师姓名:指导教师职称:2012年6月\n激光喷丸系统运动控制软件编制及喷丸改性实验摘要:本文在分析了国内外多种类型的运动控制平台的基础上,设计并制作了一台适合激光喷丸系统的四轴运动控制平台。主要设计内容有:①对运动控制系统中的上位机控制和伺服驱动等关键技术进行深入剖析②根据激光喷丸系统要求进行机械和电气部分的设计和制作,搭建激光喷丸运动控制平台,使运动控制系统和激光发射系统集成在同一个平台中。③利用研华PCI-1240运动控制卡进行运动控制部分的设计,采用VisualC++软件调用运动控制卡中的运动函数库进行编程,使平台实现四根轴(X,Y,Z,U)各自的正反转运动,点动和联动功能,并可以按喷丸要求的轨迹移动。④利用PCI-1761DI/O卡的数字量输出功能进行激光控制部分的编程,数字量输出一个字节的数,这个输出信号输入到单片机中作为单片机的输入信号,控制激光能量和频率。⑤编制一个RS232串口程序,为今后实现工控机与电机的通信做准备。⑥利用设计的软件对ZCuSn10P1铜合金进行喷丸实验,验证此系统的可行性,并对喷丸后的试样进行性能测试,包括残余应力测试和纳米压痕实验,并对测试结果进行分析,得出结论。本课题设计的激光喷丸运动控制系统一方面解决了喷丸平台的运动控制,另一方面可控制激光器的参数,使喷丸系统形成一个整体,而且具有较高的柔性。关键字:运动控制;激光喷丸;运动控制卡;喷丸实验establishmentofthemotioncontrolsoftwareofLasershotpeeningsystemandshotpeeningmodificationexperimentsIV\nAbstract:Basedontheanalysisofmanytypesofmotioncontrolplatformofthedomesticandforeign,designedandproducedafouraxismotioncontrolplatform,it’ssuitedforlasershotpeeningsystem.Themaindesigncontentare:①ToanalysiscontrolsystemofPCcontrolandservodriveonthekeytechniques.②Accordingtothelasershotpeeningsystem’srequirements,designandmanufacturethemechanicalandelectricalparts,buildingthelasershotpeeningmotioncontrolplatform,makethemotioncontrolsystemandthelaseremissionsystemintegrateinthesameplatform.③Withadvantech’sPCI-1240movementcontrolcard,designingmotioncontrolpart,withVisualC++softwarecallsthemovementcontrolcard’smovementfunctionlibrary,maketheplatformhavethefouraxises’(X,Y,Z,U)positiveandnegativemovement,thepointmovefunction,andcanaccordingtotherequirementsoftheshotpeening’strackmove.④WithPCI-1761DI/Ocard’sdigitaloutputfunctionforlasercontrolpartoftheprogramming,digitaloutputabytesofdata,theoutputsignalisinputtothesinglechipmicrocomputer,thedataasthesinglechipmicrocomputerinputsignal,controlthelaserenergyandfrequency.⑤programaserialportsoftware,realizeingserialcommunicationfortheindustrialPC.⑥Doingthecopperalloyshotpeeningexperimentswiththesoftware,toprovethefeasibilityofthesystem.anddotheperformancetestsforthespecimensofshockpeening,Residualstresstestandnanocreasingexperment,analysetheresultofthetest,anddrawtheconclusion.Thislasershotpeeningmotioncontrolsystem,ontheonehand,solvedtheshotpeeningplatformmovementcontrol,ontheotherhand,itcancontroltheparametersofthelasermachine,thismaketheshotpeeningsystemasawhole,andwithhighflexibility.Keywordsmotioncontrol;lasershotpeening;motioncontrolcard;peeningexperiment目录IV\n第一章绪论11.1运动控制概念的提出11.2运动控制器的现状及发展趋势11.3本课题研究的意义和主要内容5第二章运动控制平台的结构方案设计62.1电气部分的设计62.2四轴运动平台的设计92.2.1角度调节台的设计92.2.2四轴平台的总体设计112.3本章小结12第三章运动控制平台的软件编制133.1RS232串口通讯程序的编制133.1.1RS232串口的简介133.1.2RS232的程序编制143.2运动控制软件的编制153.2.1运动控制卡的介绍153.2.2PC+运动控制卡的控制方案介绍153.2.3系统中PCI-1240运动控制卡和PCI-1761卡的介绍163.2.4基于VisualC++的运动控制软件的开发203.3本章小结24第四章激光喷丸改性实验254.1激光喷丸技术简介254.2铜合金的激光喷丸实验254.2.1材料选择与试样制备254.2.2实验装置及仪器274.2.3实验参数方案274.2.4后续性能测试284.2.5实验结论334.3本章小结34结论35致谢36参考文献37附录A39IV\n附录B43IV\n第一章绪论1.1运动控制概念的提出随着现代科学技术的进步,电机在实际应用中,过去是以简单的启停控制,提供动力为主要目的,现在上升到对其速度,位移,转矩等进行精确的控制,使被驱动的机械运动符合预想的要求。特别是在工业自动化,办公室自动化和家庭住宅自动化方面使用的大量控制电机,几乎都采用电力电子器件进行控制。在这种情况下,原先的“电机控制”,“电气传动”已发展到“运动控制”新阶段。“运动控制”(MotionControl)是近十年来国际上流行的一种新的技术,通常是指在复杂条件下,将预定的控制方案、规划指令转变成期望的机械运动。按照国际运动控制工程师协会的定义:“运动控制是指应用一个可控制的力的作用实现机电系统有效运动的技术,这个机电系统可以使以电气、液压、气动或其他形式驱动的。”运动控制系统对被控机械运动实现精确的位置控制、速度控制、加速度控制、转矩控制或力的控制,以及这些被控量的综合控制。运动控制器的主要任务是根据作业的要求和传感器件的信号进行必要的逻辑/数学运算,为电机驱动装置提供正确的控制信号。典型的运动控制器如图1.1所示。操作界面主机控制器驱动器电机机械装置反馈图1.1运动控制系统框图1.2运动控制器的现状及发展趋势运动控制器历经分立电子元件、集成电路(包括小、中、大、超大规模集成电路),直至微控制器的出现,使运动控制器发生了质的飞跃—由硬件电路发展到软件控制。运动控制系统也随之进入了全数字化控制的新阶段。第89页共89页\n1、基于模拟电路早期的运动控制器一般采用运算放大器等分立元件,以模拟电路硬接线方式构成。这种运动控制方式具有以下优点:①对输入信号进行实时处理,没有附加延时,响应速度快;②由于采用硬接线方式可实现无限的采样频率,因此控制器的精度较高且具有较大的带宽。但是,模拟控制系统与数字控制系统相比,也有明显的缺点:①老化和环境温度的变化对构成系统的元器件的参数影响很大:②构成模拟系统需要的元器件较多,增加了系统的复杂性,最终使系统的可靠性降低;③由于采用硬接线,系统设计安装完成后,几乎不可能修改系统的功能;④受系统规模的限制,很难实现运算量大、精度高、性能更先进的复杂控制算法。目前在一些早期的系统和功能简单的系统中仍然采用这种控制方式。2、基于微控制单元微控制单元(MCU,即单片计算机)将CPU、RAM、ROM或EPROM、CTC、I/O等集成在一块芯片上,具有集成度高、速度快、功耗低、抗干扰能力强、重量轻、体积小、功能强、价格低等诸多优点,并且微控制单元的功能愈来愈强,因而目前使用微控制单元为核心构成运动控制器非常普遍。这种运动控制方式具有以下优点:①模拟电路实现逻辑控制需要许多分立电子元件,而在微控制单元中绝大多数控制逻辑可采用软件来实现,使电路更简单;②微控制单元具有大容量的存储器和较强的逻辑功能,运算速度快、精度高,因此可以实现较复杂的控制运算;③由于微控制单元的控制方式主要通过软件来实现,需要改变控制规律时只需修改相应的软件即可,因而具有较强的灵活性和适应性;④由于数字控制系统中一般不会出现模拟电路中的零点漂移问题,且控制器的字长一般可保证足够的控制精度,因而具有较高的控制精度;⑤可设计友好的人机界面,实现多机联网工作。但是,由于—般微控制单元集成度较低,片上不具备运动控制系统所需要的专用外设,使以微控制单元为核心的运动控制器仍然需要较多的周边元器件,如要加上存储器、编码器信号处理及D/A转换电路等,软硬件设计的工作量较大,并增加了系统硬件的复杂性,降低了系统的可靠性。同时,由于微控制单元一般采用冯-诺依曼总线结构,使处理速度和能力有限,难以实现先进控制算法和满足运算量较大的实时信号处理的需要,不适用于高精度、高速度控制场合,只能应用在低速点位控制和对轨迹要求不高的轮廓运动控制场合。3、基于可编程逻辑控制器可编程逻辑控制器(PLC)是以微处理器为基础,在硬件接线逻辑控制技术和计算机技术的基础上发展起来的。它是将计算机技术与自动控制技术综合为一体的工业控制产品,第89页共89页\n由中央处理单元(CPU)、存储器、输入/输出单元(I/O)、电源、编程器等组成,是专为在工业环境下应用而设计的一种工业控制计算机。可编程逻辑控制器一般都具有脉冲输出功能,以它作为运动控制器,可以控制接收脉冲和方向信号工作的电机,如步进电机和数字式交流伺服电机等。这种控制方式具有体积小、可靠性高,通用性强,成本较低,软、硬件开发周期短,安装维护简便,在工业现场抗干扰能力强等优点。但由于PLC是以循环扫描方式工作,即每一次状态变化需要一个扫描周期,其扫描周期一般在几毫秒至几十毫秒之间(视PLC工作速度和用户程序大小而定)。由于受到PLC工作方式的限制以及扫描周期的影响,被控制电机不能在高频下工作,转速较慢,且不能实现复杂的运动关系,故一般只应用在点位控制和单轴运动控制等场合。4、基于通用计算机在通用计算机上,利用高级语言编制相关的控制软件,配合与计算机进行信号交换的通信接口板和驱动电机的电路板,构成一个运动控制系统。这种实现方法利用计算机的高速度、强大运算能力和方便的编程环境,可以实现高性能、高精度、复杂的控制算法,并且控制软件的修改也很方便。但是,由于通用计算机本身的限制,难以实现实时性要求高的信号处理算法;同时,系统体积过大,难以应用于工业现场。因此,这种实现方法一般用作上位机,与下层的实时系统一起构成两级或多级运动控制系统。5、基于专用运动控制芯片基于专用运动控制芯片的运动控制系统是将实现电机控制所需的各种逻辑功能做在一块专用集成电路内,并提供一些专用的控制指令,同时具有一些诸如限位开关、零位开关处理、电机使能、报警等必须的辅助功能,使用户的软件设计工作减少到最小程度。对于伺服电机,用一个芯片即完成速度曲线规划、PID伺服控制算法、编码器信号的处理等多种功能。一些需要用户经常更改的参数如电机位置、速度、加速度、PID参数等均在芯片内部的RAM区内,可由计算机用指令很方便地修改。这种方法具有系统使用元件少、集成度高、可靠性好等优点,同时又保持了模拟控制系统的快速响应能力。专用运动控制芯片价格便宜,使系统成本较低。但由于受专用运动控制芯片本身的限制,这种方法也有一些缺点:①为了保证较高的系统响应速度而将软件算法固化在芯片内部,降低了系统的灵活性,不具有扩展能力;②受芯片制作工艺的限制,现有的芯片很难实现复杂的控制算法和功能;③用户不能对芯片进行编程,很难实现系统的升级;④由于芯片本身算法的限制,系统的控制精度较低,难以实现高性能、高精度的应用场合。第89页共89页\n6、基于可编程逻辑器件由于现场可编程门阵列(FPGA)/复杂可编程逻辑器件(CPLD)具有用户可编程的特性,使得用户可以利用系统开发软件或VHDL等开发语言,通过软件编程实现运动控制算法,并将这些算法下载到相应的可编程逻辑器件中,从而最终以硬件的方式实现运动控制。这种方法的优点是:①系统的主要功能都可在单片FPGA/CPLD器件中实现,减少了所需的元器件个数,缩小了系统体积;②由于可编程器件具有系统可编程的特性,因而具有较好的扩展性和可维护性,通过修改软件即可实现系统的升级;③系统以硬件实现,响应速度快,可实现并行处理;④容易开发,通用性强。但是由于使用可编程逻辑器件实现的控制算法越复杂,器件内部需要的晶体管门数就越多,成本就越高,因此一般使用可编程逻辑器件实现较简单的控制算法,构成较简单的运动控制系统。7、基于数字信号处理器数字信号处理器(DSP)是微处理器的一种,它除具备普通微处理器的高速运算和控制功能外,针对高数据传输速率、数值运算密集的实时数字信号处理操作,在处理器结构、指令系统和指令流程设计等方面都做了较大的改进。特别是随着运动控制领域对嵌入式DSP控制器的市场需求的不断增大,DSP厂商为此推出各种运动控制专用DSP,且成本不断下降,因此数字信号处理器是单片机的理想替代品,采用DSP芯片为核心来实现电机的运动控制已经是一个必然趋势。由于DSP的高速运算能力使很多复杂的控制算法和功能都得以实现,且DSP将实时处理能力和控制的外设功能集于一身,基于DSP构成的运动控制器是一个单片系统,大幅度减少了外部元器件的数量,增加了系统的可靠性;同时,由于各种性能通过软件编程来实现,系统开放性、扩展性、维护性都很好。这种方法的优点是:①对输入和反馈信号的处理可以消除噪声污染或不精确的数据,从而可以去掉昂贵或不可靠的传感器;②在实现特殊输入轨迹时,应用微处理器的控制经常是通过查表产生控制输入,DSP可以用专门的函数和算法代替这些表和插补过程,因而可以使用更加复杂的多变量函数,减少对存储器的要求,提供最优的函数,且系统运行更加平稳,能耗更低,并提高驱动装置的可靠性;③DSP能实时实现许多先进的复杂控制算法,如自适应和最优多变量控制、重复控制、学习算法、神经网络、遗传算法、模糊逻辑控制和其它控制方法都可以借助DSP的速度和性能得以实时实现;④运动控制系统通常用PWM技术控制开关功率整流器,而通过DSP来实现产生PWM和电子换向可以去掉D/A转换器,因而与电流驱动的双极功率晶体管相比,减少了元件数目以及功耗和驱动系统的体积,第89页共89页\n这种方法提高了供给电压的利用率,同时降低了电动机电流中的谐波分量;⑤在运动控制系统中系统运行中的故障诊断和处理是处理器的重要任务之一,而DSP能够方便地实现实时监控,且DSP除了作为数字控制器之外,还可以用来处理非控制问题,包括与上位主机的通信、数字滤波和数据总线控制协议等。1.3本课题研究的意义和主要内容随着社会的不断发展,运动控制技术也由面向传统的数控加工行业专用运动控制技术而发展为具有开放结构、能结合具体应用要求而快速重组的先进运动控制技术。运动控制器已经从以单片机或微处理器作为核心的运动控制器和以专用芯片(ASIC)作为核心处理器的运动控制器,发展到了基于PC总线的以DSP和FPGA作为核心处理器的开放式运动控制器。本课题主要研究对象是4轴运动控制平台的设计与控制软件的编制。设计依据是Innolas激光器主要技术参数,上海联谊生产的运动轴及研华PCI-1240四轴运动控制卡和PCI-1761DI/O卡,光学精密平台及现有光路系统。系统提出的研华工业控制计算机,PCI-1240运动控制卡与伺服电机的控制方式实现了功能完善的运动控制功能,并结合PCI-1761卡的数字量输出功能将数字信号输入到单片机,由单片机控制激光器激光的能量和激光的频率,使平台的运动控制和激光器具有一定的同步性和可调性。该系统可应用于目前材料强化的实验当中。具有非常高的应用价值和市场前景。本课题完成的主要工作有:1、对四轴运动控制平台进行机械和电气部分的设计,使之能够满足激光喷丸系统运动控制方面的要求。2、完成四轴平台的搭建,并把平台与激光器部分连接起来。3、完成控制系统软件的编制,其中包括平台的运动控制、激光能量参数和频率参数的输出功能。4、对设计平台进行调试,并对ZCuSn10P1铜合金进行激光喷丸实验,并对喷丸后的试样进行性能测试,达到预期的效果。第89页共89页\n第二章运动控制平台的结构方案设计2.1电气部分的设计伺服电机的控制方式分为位置控制,速度控制,转矩控制,分别介绍如下:1、转矩控制:转矩控制方式是通过外部模拟量的输入或直接的地址的赋值来设定电机轴对外的输出转矩的大小,具体表现为例如10V对应5Nm的话,当外部模拟量设定为5V时电机轴输出为2.5Nm:如果电机轴负载低于2.5Nm时电机正转,外部负载等于2.5Nm时电机不转,大于2.5Nm时电机反转(通常在有重力负载情况下产生)。可以通过即时的改变模拟量的设定来改变设定的力矩大小,也可通过通讯方式改变对应的地址的数值来实现。应用主要在对材质的受力有严格要求的缠绕和放卷的装置中,例如饶线装置或拉光纤设备,转矩的设定要根据缠绕的半径的变化随时更改以确保材质的受力不会随着缠绕半径的变化而改变。2、位置控制:位置控制模式一般是通过外部输入的脉冲的频率来确定转动速度的大小,通过脉冲的个数来确定转动的角度,也有些伺服可以通过通讯方式直接对速度和位移进行赋值。由于位置模式可以对速度和位置都有很严格的控制,所以一般应用于定位装置。3、速度模式:通过模拟量的输入或脉冲的频率都可以进行转动速度的控制,在有上位控制装置的外环PID控制时速度模式也可以进行定位,但必须把电机的位置信号或直接负载的位置信号给上位反馈以做运算用。位置模式也支持直接负载外环检测位置信号,此时的电机轴端的编码器只检测电机转速,位置信号就由直接的最终负载端的检测装置来提供了,这样的优点在于可以减少中间传动过程中的误差,增加整个系统的定位精度。因为激光喷丸系统在喷丸过程中根据喷丸的需要应进行定位控制,所以本系统采用位置控制方式控制伺服驱动,通过外部输入脉冲确定速度和位移。此系统要求运动控制和激光发射的同步性,用位置控制方式可以精确控制轴的转动和速度。位置控制模式的接线图如图2.1所示。脉冲输入方式采用长线驱动器输入,接线端用44,45,46,47接口,脉冲输入也比较稳定。伺服驱动器上连接器X4处有五十针的插口,引出的线通过接线端子板与PCI-1240控制卡相连,并接24V外接电源,制作此接线头采用20芯的屏蔽线,把线用电烙铁焊接在接线头子上,焊接时应严格要求PCI-1240与伺服电机的接线图焊接。接好后应在伺服驱动器上设置好长线驱动的参数值和脉冲输出方向等参数,再利用研华公司提供的调试软件进行调试,看是否接线正确。第89页共89页\n图2.1位置控制模式接线图第89页共89页\n图2.2伺服电机与PCI-1240控制卡的接线图伺服驱动器与PCI-1240控制卡端子板的接线如图2.2所示。电气部分整体布局如图2.3所示。第89页共89页\n人机界面PCI-1240运动控制卡PCI-1761脉冲数字量I/O卡X、Y、Z、U四轴运动平台单片机脉冲输入激光器数字量研华工控机图2.3激光喷丸系统总体原理图通过设计的人机界面一方面通过PCI-1240运动控制卡控制四根轴的移动,另一方面通过PCI-1761DI/O卡输出数字量信号,数字信号通过单片机控制激光器,因此系统同时控制四轴运动控制平台的运动和设置激光器激光的能量选择,达到运动速度和激光脉冲相匹配的效果。2.2四轴运动平台的设计2.2.1角度调节台的设计角度调节台原理:通过伺服电机控制轴的旋转,由联轴器带动涡轮蜗杆转动,通过涡轮蜗杆传动从而使平台转动起来。其结构图如图2.4所示,其内部结构如图2.5所示。第89页共89页\n图2.4角度调节台三维示意图图2.5角度调节台爆炸图1,底盘2,轴承3,涡轮4,蜗杆5,铜套6,转台座7,线盒8,支架9,电机10,手拨螺母11,插座12,联轴器13,螺母14,轴承第89页共89页\n涡轮蜗杆主要技术参数:安装中心距:蜗杆轴面模数(涡轮端面模数):蜗杆头数:涡轮齿数:蜗杆分度圆直径:涡轮分度圆直径:齿顶圆直径:齿根圆直径:蜗杆材料:45#钢涡轮材料:灰铸铁轴承的选用:61807-RS内径35mm,外径47mm,厚度7mm618/5内径11mm,外径11mm,厚度3mm2.2.2四轴平台的总体设计三个平动轴的安装如图2.6所示。图2.6三轴平移台的装配图第89页共89页\n角度平移台安装在Z轴的平台上,这样就形成了4轴运动平台,三个平动加一个转动。喷丸试样放在角度调节台上,对试样进行喷丸时可对X,Y,Z,U轴进行点动和按轨迹运动。2.3本章小结本章完成了运动控制系统机械部分和电气部分的设计,对控制平台进行装配,并完成了工业控制计算机控制卡和伺服驱动的接线工作。总体上实现了运动控制平台硬件的连接,使整个系统硬件部分形成一个整体,为下面完成软件的编制做好铺垫。第89页共89页\n第三章运动控制平台的软件编制3.1RS232串口的编制3.1.1RS232串口的简介RS-232-C接口(又称 EIA RS-232-C)是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标 准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”,该标准规定采用一个25个脚的 DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。实际上RS-232-C的25条引线中有许多是很少使用的,在计算机与终端通讯中一般只使用3-9条引线。RS-232-C最常用的9条引线的信号内容RS-232-C接口连接器一般使用型号为DB-25的25芯插头座,通常插头在DCE端,插座在DTE端. 一些设备与PC机连接的RS-232-C接口,因为不使用对方的传送控制信号,只需三条接口线,即“发送数据”、“接收数据”和“信号地”。所以采用DB-9的9芯插头座,传输线采用屏蔽双绞线。在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。一般情况下,工控机和各智能仪表通过RS232总线进行通信。RS232的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点。每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答。 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活。其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。本文我们只介绍API串口通信部分。 第89页共89页\n串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。无论那种操作方式,一般都通过四个步骤来完成:(1)打开串口(2)配置串口(3)读写串口(4)关闭串口3.1.2RS232的程序编制图3.1是为本系统编制的RS232串口通讯部分,经过调试适用于本系统的串口传输。图3.1RS232串口界面串口号设置为COM2,波特率选为9600,数据位为8,校验位为None,停止位为1。程序如附录A所示。此串口部分是用来监控伺服驱动器的一些信息的,数字量输入为4个16进制数,且最后四位为FFFF时输入时转化为十进制输入,否则不输入值。此串口还未加入到运动控制软件中,在下一阶段的工作中会完成工控机的串口通讯,实现对伺服电机的实时监控。第89页共89页\n3.2运动控制软件的编制3.2.1运动控制卡的介绍目前国外己有很多著名的大公司开发出了功能多样的运动控制卡,其中可编程多轴运动控制器PMAC(programmableMulti-AxesController)是一个很有代表性的产品。国内针对运动控制器的研究起步较晚,主要是高校或科研院所为自己设计的基于PC的数控系统的运动控制卡,并没有形成一种通用的、系列化的供应于市场的产品。根据实现控制方法的不同大致分为以下几种:①基于大规模集成电路。利用其内部的计数器功能,通过编码器改变其脉冲输出频率,实现步进电机的速度和位置控制;②基于微处理器。此方案使用元器件较多,可靠性不高,运行速度慢,控制精度不高,软硬件配置灵活性差;③基于专用集成电路ASIC。该方案采用一块芯片就可以完成PID控制算法、编码器信号的处理等多种功能,并且其硬件电路的配置具有一定的灵活性,但由于受运算速度的限制,复杂的控制算法和功能在该系统中难以实现;④基于DSP型。此方案如果将DSP和PC机结合起来,可充分利用PC机现有的操作环境和资源,同时利用DSP运算速度快的优势,使PC机从大量复杂的运算中解脱出来做其它工作。这是未来运动控制卡的发展趋势。3.2.2PC+运动控制卡的控制方案介绍采用PC+运动控制卡作为上位控制,可充分利用计算机资源,用于比较复杂,且柔性比较强的设备。从用户使用的角度来看,基于PC机的运动控制卡主要是硬件接口(输入/输出信号的种类、性能)和软件接口(运动控制函数库的功能函数)的差异。运动控制卡是基于PC机各种总线的步进电动机或数字式伺服电动机的上位控制单元,总线形式也是多种多样。由于计算机主板的更新换代,ISA插槽越来越少,PCI总线的运动控制卡应该是目前的主流。卡上专用CPU与PC机CPU构成主从式双CPU控制模式。PC机CPU可以专注于人机界面、实时监控和发送指令等系统管理工作;卡上专用CPU用来处理所有运动控制的细节:升降速计算、行程控制、多轴插补等,无需占用PC机资源。同时随卡还提供功能强大的运动控制软件库:C语言运动库、WindowsDLL动态链接库等,让用户更快、更有效地解决复杂的运动控制问题。运动控制卡采用了开放式结构,使用简便,功能丰富,可靠性高。若采用PC机的PCI第89页共89页\n总线方式,卡上无需进行任何跳线设置,所有资源自动配置,并且所有的输入、输出信号均用光电隔离,提高了控制卡的可靠性和抗干扰能力;在软件方面提供了丰富的运动控制函数库,以满足不同的应用要求。用户只需根据控制系统的要求编制人机界面,并调用控制卡运动函数库中的指令函数,就可以开发出既满足要求又成本低廉的多轴运动控制系统。运动函数库为单轴及多轴的步进或伺服控制提供了许多运动函数,如单轴运动、多轴独立运动、多轴插补运动等等。另外,为了配合运动控制系统的开发,还提供了一些辅助函数,如中断处理、编码器反馈、间隙补偿及运动中变速等。正是由于运动控制卡的开放式结构,强大而丰富的软件功能,对于使用者来说,进行二次开发的设计周期缩短了,开发手段增多了,针对不同的数控设备,其柔性化、模块化、高性能的优势被充分利用。3.2.3系统中PCI-1240运动控制卡和PCI-1761卡的介绍PCI-12404轴步进/脉冲伺服马达控制卡的设计,适用于通用型极端动作应用。PCI-1240为PCI总线用高速4轴动作控制卡,可简化步进式及脉冲式伺服马达控制,并充分发挥马达潜能。本卡使用NOVA®MCX314动作ASIC芯片,内建多种动作控制函数,如2/3轴线性内插、2轴圆周内插、T/S曲线加速率/减速率等等不胜枚举。此外,PCI-1240驱动这些动作函数时,不须占用处理器负载。研华PCI-1240主要有以下功能:4轴个别控制:每一轴都有同样的功能和能力,接受相同的等速、四边形、或S曲线驱动控制。可程设T/S曲线加速及减速:4轴中,每一轴可单独预设S曲线或四边形加速/减速的速率。使用S曲线加速控制驱动速度时,产生拋物线加速或减速曲线输出脉冲,NOVA®MCX314动作ASIC设计观念下不会产生三角形曲线现象。线性及圆周内插:可选择任意2或3轴执行线性内插驱动,可选择任意2轴执行圆周弧线内插控制。内插速度范围从1PPS到4MPPS。功能强大的位置管理:每一轴配备一个32位逻辑位置计数器和一个32位真实位置计数器。逻辑位置计数器累计各轴的脉冲输出数。而真实位置计数器,则记录来自外部编码器或线性量尺的回授脉冲。速度控制:定速、四边形或S曲线加速/减速的脉冲输出速度范围是1PPS到4MPPS。脉冲的频率精确度小于+/-0.1%(当CLK=16MHz)。驱动时可自由改变脉冲输出的驱动速度。位置控制:每一轴配备一个32-位逻辑位置计数器和一个32-第89页共89页\n位真实位置计数器。逻辑位置计数器累计输出脉冲数。真实位置计数器则累计来自外部编码器或线性量尺的回授脉冲数。⑴开发环境Windows应用程序设计的最大特点就是消息处理。所有的Windows应用程序都是基于消息的,每一个Windows程序都要求有一个消息循环,应用程序中的每一个窗口都要求有一个消息处理器。不论什么时候,只要出现一个事件,Windows系统就会产生一条消息。因此,Windows应用程序设计的核心就是传递消息,读入消息,处理消息。Windows系统是多任务系统,如果有消息要处理,它就占用CPU处理消息,如果一个程序不再有要处理的消息,系统就询问其他正在运行的程序是否有消息要处理,并把控制权转给有消息要处理的应用程序。VisualC++是一个在Windows环境下的程序开发工具,它是可视化的,面向对象的,采用事件驱动的。它屏蔽了Windows环境下程序设计的复杂性,使Windows应用程序设计变得简单、方便、快捷。利用PCI-1240卡的动态链接库DLL可以很快地开发出Windows平台下的运动控制系统。PCI-1240卡动态链接库是标准的Windows32位动态链接库,选用的开发工具应支持Windows标准的32位DLL调用。⑵动态链接库函数调用方法在VC中调用动态链接库DLL中函数有两种方法。隐式调用需要DLL函数声明头文件ADVMOT.H;编译连接时用的导入库文件ADVMOT.lib;动态链接库文件ADVMOT.dll;设备驱动程序ADVMOT.sys。当建立工程之后,在VC集成环境中点击“/project/settings…”菜单,弹出“projectsettings”对话框。选“Link”选项卡,在“object/librarymodules”栏内输入导入库文件名ADVMOT.lib,单击“OK”按钮。在调用DLL函数的源代码文件开始处包含ADVMOT.h头文件。之后则可以按照调用内部函数一样调用DLL函数。显式调用只需要如下文件动态链接库文件ADVMOT.DLL和设备驱动程序ADVMOT.sys。显式调用方法需要调用WindowsAPI函数加载和释放动态链接库。此软件运用隐式调用链接库的方法调用PCI-1240控制卡运动函数的方法,编程时应把研华提供的几个头文件复制到编程目录中,这几个头文件分别是AdvMotApi.h、AdvMotDev.h、AdvMotDrv.h、AdvMotErr.h、AdvMotPropID.h,头文件和.lib文件路径定义好后进行运动控制软件的编程。⑶控制运动函数的用法PCI-1240控制卡的函数库中提供常用的单轴运动、多轴独立运动控制、多轴插补运动控制、多轴联动的函数。函数的含义和类型可参考PCI-1240手册,上面例举了运动函数库所有函数的用法。第89页共89页\n例如:Acm_AxMoveVel(m_Axishand(0),1)表示x轴正传,Acm_AxMoveVel(m_Axishand(0),0)表示x轴反转。Acm_AxMoveRel(m_Axishand(0),10000),表示x轴正转10000个脉冲的距离,Acm_AxMoveRel(m_Axishand(0),-10000),表示x轴反转10000个脉冲的距离运动函数可参照研华控制卡提供的motion中定义的运动函数库。控制软件中设置的变量如图3.2所示图3.2设置变量名PCI-1761DI/O卡是一款PCI总线的继电器输出及隔离数字量输入板卡。它提供16路光隔离数字量输入,隔离保护电压为2500VDC,可噪声环境下输入。它带有8个继电器输出,可以用作开关控制式小型电源断路开关。为了便于监控,每个继电器都配有一个红色的LED指示灯,用来显示器开/关状态。数字量输出函数的用法,PCI-1761卡提供了引入库Adsapi32.lib文件,在编程时链接中填写这个文件的路径,并且把研华提供的COMM.H,DEVICE.H,DNET.H,Driver.h,EVENT.H,OS.H,PARAS.H,USBErrorCode.h八个头文件复制到编程目录中进行编程,与PCI-1240控制卡头文件中重复定义的宏应进行重定义,结构体重复定义的应进行添加命名空间,防止编译时产生错误,在编程过程共会用到以下重要函数:第89页共89页\nLRESULTDRV_DeviceGetList(DEVLIST*DeviceList,SHORTMaxEntries,SHORT*OutEntries);用途:返回已安装设备的设备列表(DeviceList),该列表将在后续操作中使用。请注意安装在串口(COMports)或CAN端口的子设备不包含在该列表中。LRESULTDRV_DioWriteBit(LONGDriverHandle,LPT_DioWriteBitlpDioWriteBit);用途:在设备句柄DriverHandle指向的设备上,向某个DO(DigitalOutput)端口(Port)写一个位的数据。LRESULTDRV_DioWritePortByte(LONGDriverHandle,LPT_DioWritePortBytelpDioWritePortByte);用途:在设备句柄DriverHandle指向的设备上,向某个DO端口写一个字节的数据。LRESULTDRV_DioGetCurrentDOByte(LONGDriverHandle,LPT_DioGetCurrentDOBytelpDioGetCurrentDOByte);用途:在设备句柄DriverHandle指向的设备上,从相应的寄存器里,读取某数字量输出端口(Port)的状态,返回一个字节的数据。如果设备没有输出状态的寄存器,驱动将回返一个自身维护的之前用户设定的输出状态。两张卡应集成在一个界面上,同时控制平台的运动和激光器激光的参数选择与激光发射,轴在运动过程中应显示其具体的位置,从而进行精确定位,保证喷丸位置的精确度。集成过程的.lib文件的路径都放在LINK的“object/librarymodules”中,用双引号隔开,达到同时调用这两张卡的链接库。调用方式如图3.3所示。第89页共89页\n图3.3调用.lib文件3.2.4基于VisualC++的运动控制软件的开发编程时首先设计好界面的功能,首先界面需有点动和连续运动的功能,同时还具有根据喷丸路径所设计的运动路径,喷丸时速度按照激光参数而定,界面如图3.4所示。设计号界面后根据要求设置好消息响应函数,并设置好变量名和变量类型,再把变量初始化,准备工作结束后,在消息响应函数中添加所需要的函数,一些运动函数可参考PCI-1240用户手册,根据这些函数去设计所需要的运动功能,在轴的运动过程中应显示出轴的状态和运动时轴的反馈值,有助于判断轴当前所在位置,在编程中应添加OnTimer时间相应函数,可方便的观察到轴的状态和当前位置。在打开控制卡之后轴就应该在准备运动状态,但是,在伺服准备输出时轴才会运动,编程时必须注意这几个问题。根据激光器的参数要求应把PCI-1761卡的数字量输出功能集成在一个界面上,使激光器与运动控制平台的同步性增强,提高喷丸的精确度。两张卡合成在一个界面上时需注意宏的重定义与变量的重定义问题。第89页共89页\n图3.4运动控制界面此系统功能包括:X、Y、Z轴正向和反向移动,U轴正向转动和反向转动,在移动过程中可改变运动的速度,还可以根据要求进行点动,伺服开启后会显示出轴的状态和轴当前的位置,且根据激光喷丸的要求,分为横向喷丸和纵向喷丸,开始喷丸后,运动平台的运动和激光器的激光发射同时进行,具有相当高的同步性。为实现具体的控制激光能量和频率的任务,设计中选取PCI-1761控制卡的六路通用输出作为单片机C8051f020的输入,通过程序检测单片机输入口的状态,根据输入口状态的不同输出不同形式的脉冲,从而实现对激光器的控制,在设计中采用c8051f020的P1.7、P1.6、P1.5、P1.4、P1.3、P1.2(对应软件中的D2-D7的值)共六信号作为单片机的输入通过接口电路实现控制卡通用输出口的状态值作为单片机输入口的状态值,通过此控制软件可以很方便的设置PCI-1240第89页共89页\n控制卡输出口的状态从而实现单片机输入口状态的改变,进而实现对激光器控制脉冲形式的更改。设搭接率为a,光斑直径为d(0.5mm~1.5mm),激光频率为n,激光频率和激光能量由D2~D7端口设置,这部分参数由PCI-1761卡控制输出,通过单片机控制激光频率和能量。X、Y轴按设定的喷丸轨迹运动,Z轴调整激光的焦距,U轴运用于对柱面类零件的喷丸中。在喷丸过程中X和Y轴的速度由搭接率、光斑直径和激光频率三个参数而定,在选好参数后进行按横向或纵向的喷丸方式运动,速度是:,且两轴的速度相同,喷丸中X,Y轴相互切换,形成一个矩形喷丸区域。程序如附录B所示。喷丸轨迹如图3.5所示,激光频率和激光能量的设定如表3.1所示。图3.5喷丸轨迹图表3.1激光参数选择表p1.7P1.6P1.5P1.4P1.3P1.2控制内容000000激光器关闭000001单次喷丸能量1001能量2010能量3011能量4100能量5第89页共89页\n101能量6110能量7111能量8000011频率10HZ能量1001能量2010能量3011能量4100能量5101能量6110能量7111能量8000100频率5HZ能量1001能量2010能量3011能量4100能量5101能量6110能量7111能量8000001频率2HZ能量1001能量2010能量3011能量4100能量5101能量6110能量7111能量8000能量1第89页共89页\n001频率1HZ001能量2010能量3011能量4100能量5101能量6110能量7111能量83.3本章小结本章进行了运动控制软件的编程,结合激光喷丸的要求进行功能设计,实现了PCI-1240运动控制卡和PCI-1761DI/O卡的功能集成,使软件具有运动控制和数字量输出功能,并设计了一个可用于对电机实现实时监控的RSR232串口通讯软件,用在后续工作的对软件的完善中。第89页共89页\n第三章激光喷丸改性实验4.1激光喷丸技术简介激光喷丸技术(LaserShockPeening)是利用高功率密度、短脉冲的激光束诱导的高压冲击冲击波对金属零部件进行表面改性的一种技术,冲击波产生的机械“冷作”作用达到材料被压缩的效果。由于激光束对零件表面不产生加热效应,因此在整个过程中金属零件的表面是不会被加热的。事实上,在激光喷丸过程中零件是处在“微锻”状态,高能脉冲激光是一点接一点地作用在临界区域上的。激光喷丸原理示意图见图4.1。在进行激光喷丸工艺处理前,要在需处理的表面上敷设上一层不透明的涂敷层(典型的如黑漆或胶带)和一层约束层(典型的如流动的水)。激光脉冲通过约束层并作用在不透明的涂敷层上,使其部分蒸发。蒸汽吸收剩余的激光并产生急剧膨胀的等离子流。膨胀的等离子流被限定在零件表面和约束层之间,并产生一个急速增大的高压冲击波传入金属内。当冲击波的波峰强度高于金属的冲击屈服强度时,金属产生屈服,金属的表面被“冷作”或发生塑性变形。图4.1激光喷丸原理示意图4.2铜合金的激光喷丸实验4.2.1材料选择与试样制备1.材料的选择试样材料为ZCuSn10P1铜合金,其化学成分和机械性能参数如表4.1所示。ZCuSn10P1是典型的锡磷青铜,是以电解铜为原料,经高温烧结,通过气压离心铸造加工而成。该材料可用于制造在重载、高速、较高温条件下工作的受强烈摩擦的零件,如滑动轴承、连杆衬套、齿轮、蜗轮等,这些产品被广泛应用于纺织机械、注塑机械、矿山机械、工程机械、汽车工业等领域。第89页共89页\n表4.1ZCuSn10P1合金的化学成分和机械性能成分ZnPSnFeSbMnPbNiCu含量(%)0.050.05~1.09.0~11.50.100.050.050.250.10其余机械性能σb(MPa)σs(MPa)δ(%)E(GPa)ρ(kg/m3)ν330170511087600.332.试样的制备试样经激光线切割加工而成,尺寸为直径30mm、厚度4mm。如图4.2,所有试样的表面均经过500#~1200#的砂纸打磨,采用颗粒直径0.5nm的抛光粉和抛光剂在金相试样磨抛机进行抛光处理,抛光2小时成镜面,抛光后表面粗糙度为0.05μm。然后用丙酮进行超声波清洗后,放入干燥箱进行保存,最后经过一定时间的自然时效处理,试样中由机加工引起的残余应力达到最低水平。同时要保证上下表面的平行度。试样表面覆盖一定厚度的吸收层,紧贴吸收层的是约束层,然后固定靶材进行激光冲击实验。图4.2抛光试样图4.3SpitLight2000型Nd:YAG激光器系统图4.4SpitLight2000型Nd:YAG激光器系统第89页共89页\n4.2.2实验装置及仪器激光冲击实验在江苏大学激光研究所进行。本实验采用德国InnoLas公司生产的SpitLight2000型脉冲Nd:YAG固体激光器。该激光器脉宽为8ns,可选波长为1064nm、532nm、355nm,脉冲重复频率为1~10Hz,能量稳定性±2.5%,出口光斑大小9mm,发散角<0.5mrad,指向稳定性±25umrad。图4.4为所用激光器系统。激光器的输出能量大小可以通过控制器来调节,激光能量的具体数值采用激光功率计进行测量,最大激光脉冲能量为2J。表4.2为本实验所用到的激光参数。表4.2SpitLight2000型激光器的技术参数工作物质Nd:YAG重复频率(Hz)8激光波长(nm)1064光斑能量分布高斯单脉冲能量(J)≤2光斑形状圆形激光脉冲宽度(ns)8光斑直径(μm)100~500图4.5激光工艺参数控制界面4.2.3实验参数方案表4.3中列出了本实验中用到的激光参数,本实验采用激光单次冲击,选择黑漆为吸收层。由于激光能量和光斑直径很小,故约束层选择声阻抗高、约束刚性较好的4mm厚K9玻璃。K9玻璃与水相比,更能提高冲击波峰值压力,增加强化效果。激光器出口光斑直径在9mm,经过一系列的透镜聚焦后照射到试样上。在激光冲击试验前,将光斑直径调到所需的大小,在感光纸上测得的光斑直径为400μm。冲击区为20×10mm2的矩形区域,以便进行后续的性能测试。第89页共89页\n表4.3激光冲击试验参数试样编号光斑间距(mm)激光能量(mJ)试样编号光斑间距(mm)激光能量(mJ)10.575540.510202175551102031.575561.510204.2.4后续性能测试1.表面形貌图中是激光能量为755mJ下,不同光斑间距下的表面形貌。(a)间距0.5mm(b)间距1mm(c)间距1.5mm图4.6激光能量为755mJ时的形貌2.残余应力测试残余应力的测量方法可以分为有损和无损两大类。有损测试方法就是应力释放法,也可以称为机械的方法;无损方法就是物理的方法。机械方法目前用得最多的是钻孔法,其次还有针对一定对象的环芯法。物理方法中用得最多的是X射线衍射法,其他主要物理方法还有中子衍射法、磁性法和超声法。X射线衍射法依据X射线衍射原理,即布拉格定律。布拉格定律把宏观上可以准确测定的衍射角同材料中的晶面间距建立确定的关系。材料中的应力所对应的弹性应变必然表征为晶面间距的相对变化。当材料中有应力σ存在时,其晶面间距d必然因晶面与应力相对取向的不同而变化,按照布拉格定律,衍射角2θ也会相应改变。因此可以通过测量衍射角2θ随晶面取向不同而发生的变化来求得应力σ。本实验采用X射线衍射法测定,X射线不属于硬射线,在金属表面的有效穿透深度通常为几微米至几十微米,因此测得的应力是该深度方向应力的加权平均值。显然试样的表面状态对测量结果有决定性影响。激光冲击微凹坑试验结束,用脱漆剂去除表面的黑漆,第89页共89页\n使表面无黑漆残留,防止影响测量效果。激光冲击微凹坑前后的残余应力测试采用邯郸爱斯特应力技术有限公司的X-350A型X射线应力测定仪,测试设备如图4.7所示。图4.7X-350A型X射线应力测定仪测试方法采用侧倾固定Ψ法,交相关法定峰;采用Crkα辐射,(211)晶面衍射,衍射峰在144.4°左右,X光管电压20KV,管电流5.0mA,应力常数-180MPa/度,侧倾角Ψ分别取0°、24°、35°、45°,扫描起始和终止角分别为150°和138°,2θ角扫描步距0.10°,计数时间1.00s,准直管直径Ø2mm。激光冲击前后ZCuSn10P1铜合金试样的残余应力测试报告如下:(a)未冲击区第89页共89页\n(b)激光能量755mJ,间距0.5mm,冲击后图4.8残余应力测试结果图4.8为激光能量755mJ、光斑间距0.5mm的试样的残余应力测试结果,由图4.8(a)和图4.8(b)可得,在未冲击区域的应力值为-260MPa,呈现压应力状态,经分析是由于打磨和抛光过程中产生了较大的残余压应力,而冲击区域即微凹坑造型处的残余应力值为-360MPa,激光冲击微凹坑后产生的应力-100MPa。同样激光能量1020mJ、光斑间距0.5mm冲击后产生了-170MPa的残余压应力。3.纳米压痕实验材料的力学性能是评价材料质量的重要指标之一,而材料的微观力学性能(主要是弹性模量和硬度)的理论研究主要有以下几种方法:经典力学方法、应变梯度塑性理论、Hainsworth方法、体积比重法和分子动力学模拟方法。材料力学性能测量实验,一类是简单应力状态的实验,如单轴拉伸、压缩和扭转等,主要获得材料的应力—应变等数据;另一类是复杂应力状态的接触实验,如硬度实验,主要用来检验产品的质量和制定合理的加工工艺,用以表征材料抵抗局部变形的能力,是衡量材料硬度的一种性能指标。由于微凹坑造型特征尺寸小,对于尺度在几百μm量级及以下的样品,用常规的硬度测试方法比较困难。与之相比,接触实验在微尺度之下更为方便和有效。例如压入测试能提供硬度和弹性模量等,划入测试能提供诸如断裂起始的时效机理和区分韧性和脆性断裂方式等的定量信息。A.W.Warren等人模拟了纳米压痕实验对材料表面完整性和尖端几何形貌的影响,取得了一系列的成果。纳米压痕测试技术已日渐成熟,成为微纳米尺度力学测量主要的测试方式之一。第89页共89页\n3.1纳米压痕测试的基本思想和理论基础⑴材料基本性能参数的计算纳米压痕采用连续测量加载和卸载过程中的位移、载荷作为已知量,计算出硬度和弹性模量。实验中使用玻氏压针可以获得如图4.9(a)所示的典型的载荷—位移曲线。图4.9(b)为加载过程中压针压入剖面的示意图。加载过程中,被测试样表面会产生和压针形状相同的压痕,关键参数有压入接触深度和接触半径。卸载过程中,可从最大压力、最大压入深度、卸载后的残余深度和卸载曲线的顶部斜率(弹性接触刚度)中获得硬度和弹性模量。(a)载荷—位移曲线(b)纳米压痕测试原理图图4.9纳米压痕载荷—位移曲线和原理图纳米硬度()定义为:(3.1)其中是纳米压痕过程中的最大载荷,是最大载荷时接触面积的投影。弹性模量由压头的形状函数和载荷—位移曲线(载荷P,位移h)确定:(3.2)其中是简约弹性模量(又称折合模量或复合模量),(3.3)第89页共89页\n和,和分别是试样和压头材料的泊松比与弹性模量。对于金刚石压头,取1140GPa,取0.07。大多数的金属材料,的取值范围是0.25~0.35,而当ν=0.25±0.1时,压入模量的估算误差在5.3%以内,因此,通常取为0.25。式(3.3)中,S为图4.9(a)中载荷—位移曲线图中卸载曲线的斜率。是与压针形状有关的常数:玻氏压针=1.034,圆柱压针=1.000,维式压针=1.012,该式普遍适用于任意一种轴对称形状的压针,也适用于弹塑性接触,且不受材料凹陷和凸起的影响。⑵纳米硬度与宏观硬度的比较纳米压痕测试与以往的宏观硬度和显微硬度测试不同。测量宏观及显微硬度时,卸载后可直接观测试样表面留下的压痕接触面积。在微/纳米级,材料弹性变形比例显著增大,卸载后材料表面留下的压痕面积将小于在最大载荷时试样与压头的接触面积,也就是说,测试材料纳米硬度时,同时考虑了弹性变形与塑性变形。在纯弹性接触过程中,残余接触面积非常小,显微压入硬度的定义将导致压入硬度无穷大。这种微小的差异对使用球形压针压入的纳米压痕实验特别重要,因为在使用球形压针时,材料更容易发生纯弹性变形。其他类型的压针端部同样存在一定的曲率半径,在很小的压入深度下产生弹性变形。在这些情况下,显微压入硬度定义的值会比纳米硬度定义值大。3.2激光冲击微凹坑的纳米压痕实验硬度测试实验所用装置为原位纳米力学测试系统,如图4.10所示。该装置可以实现多种加载模式(准静态Quasistatic、动态Dynamic、超声态Acoustic),一般使用的是准静态测量,加载载荷范围为:1μN-1mN。可以在光镜模式(图4.11(a))以及原位成像模式(图4.11(b))下对材料表面进行压痕实验获得材料的弹性模量及硬度值。本次试验加载力为1000μN。第89页共89页\n图4.10原位纳米力学测试系统(a)光镜模式下(b)原位成像模式下图4.11微冲击后试样表面压痕实验图4.12不同激光能量下凹坑中心处的压深加卸载曲线第89页共89页\n由于微凹坑的直径比较小,通过常规的X射线衍射仪测得的残余应力值仅是表层的平均残余应力,测量的误差较大,所以凹坑内部的残余应力可由纳米力学测试系统得到的载荷—压深加卸载曲线判断。如图4.12为光斑直径400μm,光斑中心距0.5mm,激光能量755mJ、1020mJ下凹坑中心处的压痕加载曲线对比。可见激光能量增加后,凹坑中心的纳米硬度也随之增大。激光能量1020mJ下的压深加卸载曲线在激光能量为755mJ的压深加卸载曲线的左侧。4.2.5实验结论从测定的残余应力可以看出,经过激光喷丸后的残余压应力值增加,且激光能量越大材料的表面残余压应力越高。从纳米压痕实验可以看到喷丸后的硬度也有所增加,且激光能量越大冲击后材料表面的硬度就越高。从而可以得出结论:激光冲击技术可以在铜合金试样的表层形成一定厚度的残余压应力,从而能够提高铜合金的硬度、强度和使用寿命。4.3本章小结本章对编制的运动控制系统进行调试,对铜合金进行了激光喷丸实验,并对冲击后试样的残余应力和纳米硬度进行了测试,详细叙述了实验原理、过程和结论,因实验的复杂性,作者未对其进行深入的分析。本章通过对铜合金试样的激光冲击实验,验证了激光喷丸技术可以在材料表面产生残余压应力,从而可以提高铜合金的硬度、强度和使用寿命。第89页共89页\n结论本文对激光喷丸系统运动平台进行机械部分与电气部分合理的设计,并且运用研华PCI-1240四轴运动控制卡和PCI-1761DI/O卡进行喷丸系统控制软件的编制,运动控制卡控制四轴平台的运动,PCI-1761卡控制激光器激光参数的选择,达到平台的运动和激光喷丸具有较高的同步性,按照激光参数的不同,平台运行的速度也会做出相应的调整,分为横向喷丸和纵向喷丸两种喷丸方式,从而完成了激光喷丸所需要的软件平台控制系统。机械部分的三平动一转动的设计很好的实现了柱面类零件喷丸的要求,喷丸时也可以精确的定位,此系统的精度和柔性也有了很大的改进,对于激光喷丸实验具有重要意义。经过后续的对铜合金的喷丸实验验证了此运动控制系统能够完成激光喷丸的一系列要求。本文所设计的软件目前只适用于平面类零件的喷丸实验,但在柱面类零件的喷丸轨迹的设定还有待设计和编制,此软件也未把串口通信这一块加进去,只是单独的编制了一个RS232串口程序,在今后的工作中希望能在这几个方面能有所提高,编制出一个能够即适用于平面类又适用于柱面类零件的运动控制软件,并且能够实现工控机的串口通信。第89页共89页\n致谢毕业论文即将完稿之际,我的心情起伏难平。学海无涯,孤舟难行,每每想起鼓励我前行和成长的师长、同学,我内心就充满了感激。这篇论文的顺利完成,离不开他们几个月来一贯的支持、关心和帮助。我要衷心感谢我的导师周建忠老师和陈寒松老师。在他们的精心指导和亲切关怀下,学生才能够克服种种困难,顺利完成毕业设计和论文撰写工作。导师渊博的学识、严谨的治学态度、敏锐的科学洞察力、宽厚平易的仁者风范和对科学的不懈追求、对事业的忘我奉献精神都无时无刻不令学生感动和鼓舞,并激励学生在以后的学习、生活中不畏艰险、拼搏进取。在此,我还要感谢在同一组一起做毕业设计的同学,正是由于你们的帮助和支持,我才能克服一个一个的困难和疑惑,直至本文的顺利完成。最后,向百忙之中参加论文评审和论文答辩的各位专家、教授表示衷心的谢意!第89页共89页\n参考文献[1]王家军,齐东莲.运动控制系统的发展与展望.电气时代,2004.10.[2]吴宏,蒋仕龙,龚小云等.运动控制器的现状与展望.制造技术与机床.2004.1.[3]张春雷,运动控制新技术研究,2000.6[4]闫砺锋.四川大学硕士学位论文,运动控制技术研究及运动控制板卡开发.2001.5.[5]孔慧勇.四川大学硕士学位论文,基于运动控制卡的全闭环控制系统研究.2003.5[6]邓星钟等.机电传动控制(第四版).武汉:华中科技大学出版社.2006.10.[7]秦曾煌.电工学(第七版)(下册)电子技术.北京:高等教育出版社.2009.6.[8]松下公司.松下MINASA5系列交流伺服马达使用说明书.2010.2.[9]黄卫东,任国栋.Pro/ENGINEERWildfire2.0.北京:中国林业大学出版社;北京大学出版社.2006.7.[10]马履中.机械原理与设计(上册).北京:机械工业出版社.2009.2.[11]申永胜.机械原理教程(第2版).北京:清华大学出版社.2005.12.[12]龚建伟,熊光明.VisualC++/TurboC串口通信编程实践.北京:电子工业出版社,2004.10.[13]姜荣.一种基于运动控制卡的伺服电机控制系统.机电产品开发与创新.2006.5.[14]李颖,谭立新,张文凯.基于PC和运动控制卡的开放式运动控制系统.仪表技术.2007.4.[15]研华自动化公司.PCI-1240使用说明书.[16]研华自动化公司.PCI-1761使用说明书.[17]孙鑫,余安萍.VC++深入详解.北京:电子工业出版社,2006.6.[18]徐孝凯,张纪勇.C++面向对象程序设计.天津:天津大学出版社.2009.1.[19]揣锦华.面向对象程序设计与VC++实践.西安:西安电子科技大学出版社.2005.2.[20]谭浩强.C++程序设计.北京:清华大学出版社,2004.6.[21]PreventingFatigueFailureswithLaserPeening,MFN(MetalFinishingNews),Vol.8JanuaryIssueyear2007.[22]Interview,LaserPeening–AnAffordableSolutiontoMetalFatigue,MFN(MetalFinishingNews),Vol.7NovemberIssueyear2006.[23]P.Peyer,R.Fabbro.Lasershockprocessing:areviewofthephysicsand第89页共89页\napplication[J].OpticalandQuantumElectronics,1995,27:1213~1219[24]邹鸿承,戴蜀娟,徐明英等.激光冲击处理提高铝合金性能的研究[J].中国激光,1995,A22(6):476-480[25]张永康.激光冲击强化效果的直观判别与控制方法研究[J].中国激光,1997,A24(5):467-471.[26]Y.Zhang,S.Zang,X.Zangetal..Investigationofthesurfacequalitiesoflasershockprocessedzonesandtheeffectonfatiguelifeofaluminumalloy[J].SurfaceandCoatingsTechnology,1997,92:104~109[27]ChangYe,SergeySuslov,BongJoongKim,EricA.Stach,GaryJ.Cheng.FatigueperformanceimprovementinAISI4140steelbydynamicstrainaginganddynamicprecipitationduringwarmlasershockpeening.ScienceDirectActaMaterialia59(2011)1014-1025[28]袁发荣.残余应力测试与计算.湖南大学出版社,1987[29]LAngrisani,PDaponte,APietrosanto,CLiguori.Animagebasedmeasurementsystemforthecharacterizationofautomotivegaskets.Measurement25(1999):169~181[30]李庆利,张少军,李忠富等.一种基于多项式插值改进地亚像素细分算法.北京科技大学学报,2003,25(3):280~283[31]黎明,温诗铸.纳米压痕技术理论基础.机械工程学报.2003.3[32]JohnsonKL.ContactMechanics.CambridgeUniversityPress,1985第89页共89页\n附录ARS232串口通信的程序:BOOLCRS232CommDlg::OnInitDialog(){CDialog::OnInitDialog();//Add"About..."menuitemtosystemmenu.//IDM_ABOUTBOXmustbeinthesystemcommandrange.ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX<0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){CStringstrAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if(!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}//Settheiconforthisdialog.Theframeworkdoesthisautomatically//whentheapplication'smainwindowisnotadialogSetIcon(m_hIcon,TRUE);//SetbigiconSetIcon(m_hIcon,FALSE);//Setsmallicon//TODO:Addextrainitializationherem_mscom.SetCommPort(2);//串口2m_mscom.SetInBufferSize(1024);//设置输入缓冲区的大小,Bytesm_mscom.SetOutBufferSize(1024);//设置输出缓冲区的大小,Bytesif(!m_mscom.GetPortOpen())//打开串口{m_mscom.SetPortOpen(true);}m_mscom.SetInputMode(1);//设置输入方式为二进制方式m_mscom.SetSettings("9600,n,8,1");//设置波特率等参数m_mscom.SetRThreshold(1);//为1表示有一个字符即引发事件m_mscom.SetInputLen(0);//设置当前接收区数据长度为0returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}第89页共89页\nHCURSORCRS232CommDlg::OnQueryDragIcon(){return(HCURSOR)m_hIcon;}voidCRS232CommDlg::OnSendButton(){//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(true);CByteArraysendArr;WORDwLength;wLength=m_send.GetLength();sendArr.SetSize(wLength);for(inti=0;i
EnableWindow(TRUE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XActCnt);pEdit->EnableWindow(TRUE);m_XbIsRunning=FALSE;}}Result=Acm_AxGetCmpData(m_Axishand[0],&CurCmpData);if(Result==SUCCESS){strTemp.Format("%.0f",CurCmpData);}}if(m_YbInit){Result=Acm_AxGetCmdPosition(m_Axishand[1],&CurPos);if(Result==SUCCESS){strTemp.Format("%.0f",CurPos);m_editYCmdCnt.SetWindowText(strTemp);}Result=Acm_AxGetActualPosition(m_Axishand[1],&CurPos);if(Result==SUCCESS){strTemp.Format("%.0f",CurPos);m_editYActCnt.SetWindowText(strTemp);}Result=Acm_AxGetState(m_Axishand[1],&State);if(Result==SUCCESS){switch(State){case0:strTemp.Format("STA_AX_DISABLE");break;case1:strTemp.Format("STA_AX_READY");break;case2:strTemp.Format("STA_AX_STOPPING");break;case3:strTemp.Format("STA_AX_ERROR_STOP");第89页共89页\nbreak;case4:strTemp.Format("STA_AX_HOMING");break;case5:strTemp.Format("STA_AX_PTP_MOT");break;case6:strTemp.Format("STA_AX_CONTI_MOT");break;case7:strTemp.Format("STA_AX_SYNC_MOT");break;default:break;}m_editYState.SetWindowText(strTemp);if((State==1)||(State==3)){pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt);pEdit->EnableWindow(TRUE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YActCnt);pEdit->EnableWindow(TRUE);m_YbIsRunning=FALSE;}}Result=Acm_AxGetCmpData(m_Axishand[1],&CurCmpData);if(Result==SUCCESS){strTemp.Format("%.0f",CurCmpData);}}if(m_ZbInit){Result=Acm_AxGetCmdPosition(m_Axishand[2],&CurPos);if(Result==SUCCESS){strTemp.Format("%.0f",CurPos);m_editZCmdCnt.SetWindowText(strTemp);}Result=Acm_AxGetActualPosition(m_Axishand[2],&CurPos);if(Result==SUCCESS){strTemp.Format("%.0f",CurPos);m_editZActCnt.SetWindowText(strTemp);第89页共89页\n}Result=Acm_AxGetState(m_Axishand[2],&State);if(Result==SUCCESS){switch(State){case0:strTemp.Format("STA_AX_DISABLE");break;case1:strTemp.Format("STA_AX_READY");break;case2:strTemp.Format("STA_AX_STOPPING");break;case3:strTemp.Format("STA_AX_ERROR_STOP");break;case4:strTemp.Format("STA_AX_HOMING");break;case5:strTemp.Format("STA_AX_PTP_MOT");break;case6:strTemp.Format("STA_AX_CONTI_MOT");break;case7:strTemp.Format("STA_AX_SYNC_MOT");break;default:break;}m_editZState.SetWindowText(strTemp);if((State==1)||(State==3)){pEdit=(CEdit*)GetDlgItem(IDC_EDIT_ZCmdCnt);pEdit->EnableWindow(TRUE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_ZActCnt);pEdit->EnableWindow(TRUE);m_ZbIsRunning=FALSE;}}Result=Acm_AxGetCmpData(m_Axishand[2],&CurCmpData);if(Result==SUCCESS)第89页共89页\n{strTemp.Format("%.0f",CurCmpData);}}if(m_UbInit){Result=Acm_AxGetCmdPosition(m_Axishand[3],&CurPos);if(Result==SUCCESS){strTemp.Format("%.0f",CurPos);m_editUCmdCnt.SetWindowText(strTemp);}Result=Acm_AxGetActualPosition(m_Axishand[3],&CurPos);if(Result==SUCCESS){strTemp.Format("%.0f",CurPos);m_editUActCnt.SetWindowText(strTemp);}Result=Acm_AxGetState(m_Axishand[3],&State);if(Result==SUCCESS){switch(State){case0:strTemp.Format("STA_AX_DISABLE");break;case1:strTemp.Format("STA_AX_READY");break;case2:strTemp.Format("STA_AX_STOPPING");break;case3:strTemp.Format("STA_AX_ERROR_STOP");break;case4:strTemp.Format("STA_AX_HOMING");break;case5:strTemp.Format("STA_AX_PTP_MOT");break;case6:strTemp.Format("STA_AX_CONTI_MOT");break;case7:第89页共89页\nstrTemp.Format("STA_AX_SYNC_MOT");break;default:break;}m_editUState.SetWindowText(strTemp);if((State==1)||(State==3)){pEdit=(CEdit*)GetDlgItem(IDC_EDIT_UCmdCnt);pEdit->EnableWindow(TRUE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_UActCnt);pEdit->EnableWindow(TRUE);m_UbIsRunning=FALSE;}}Result=Acm_AxGetCmpData(m_Axishand[3],&CurCmpData);if(Result==SUCCESS){strTemp.Format("%.0f",CurCmpData);}}CDialog::OnTimer(nIDEvent);}voidCCompareDlg::OnClose(){//TODO:Addyourmessagehandlercodehereand/orcalldefaultUSHORTusAxisState[32];//UINTAxisNum;//StopEveryAxesif(m_XbInit==TRUE){Acm_AxGetState(m_Axishand[0],&usAxisState[0]);if(usAxisState[0]==STA_AX_ERROR_STOP){Acm_AxResetError(m_Axishand[0]);Acm_AxStopDec(m_Axishand[0]);}//CloseAxesAcm_AxClose(&m_Axishand[0]);//CloseDeviceAcm_DevClose(&m_Devhand);KillTimer(1);m_XbInit=FALSE;第89页共89页\n}if(m_YbInit==TRUE){Acm_AxGetState(m_Axishand[1],&usAxisState[1]);if(usAxisState[1]==STA_AX_ERROR_STOP){Acm_AxResetError(m_Axishand[1]);Acm_AxStopDec(m_Axishand[1]);}//CloseAxesAcm_AxClose(&m_Axishand[1]);//CloseDeviceKillTimer(1);m_YbInit=FALSE;}if(m_ZbInit==TRUE){Acm_AxGetState(m_Axishand[2],&usAxisState[2]);if(usAxisState[2]==STA_AX_ERROR_STOP){Acm_AxResetError(m_Axishand[2]);Acm_AxStopDec(m_Axishand[2]);}//CloseAxesAcm_AxClose(&m_Axishand[2]);//CloseDeviceKillTimer(1);m_ZbInit=FALSE;}if(m_UbInit==TRUE){Acm_AxGetState(m_Axishand[3],&usAxisState[3]);if(usAxisState[3]==STA_AX_ERROR_STOP){Acm_AxResetError(m_Axishand[3]);Acm_AxStopDec(m_Axishand[3]);}//CloseAxesAcm_AxClose(&m_Axishand[3]);//CloseDeviceKillTimer(1);m_UbInit=FALSE;第89页共89页\n}CDialog::OnClose();}voidCCompareDlg::OnSelectdevice(){//TODO:AddyourcontrolnotificationhandlercodehereU32Result;HANDDevhand;inti=0;CEdit*pEdit;ULONGslaveDevs[16];CStringstrTemp;ULONGbuffLen=64,AxisPerDev=0,AxisNumber=0;UpdateData(TRUE);Result=Acm_DevOpen(m_dwDevNum,&Devhand);if(Result!=SUCCESS){MessageBox("OpenDeviceFailed","Compare",MB_OK);return;}buffLen=4;Result=Acm_GetProperty(Devhand,FT_DevAxesCount,&AxisPerDev,&buffLen);if(Result!=SUCCESS){Acm_DevClose(&Devhand);MessageBox("getaxisnumbererror","Compare",MB_OK);return;}AxisNumber=AxisPerDev;Result=Acm_GetProperty(Devhand,CFG_DevSlaveDevs,slaveDevs,&buffLen);if(Result==SUCCESS){i=0;while(slaveDevs[i]!=0){AxisNumber+=AxisPerDev;i++;}}m_ulAxisCount=AxisNumber;Acm_DevClose(&Devhand);strTemp.Format("%x",m_dwDevNum);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_DEVNUM);第89页共89页\npEdit->SetWindowText(strTemp.GetBuffer(strTemp.GetLength()));}voidCCompareDlg::OnSelchangeAvlaibledevice(){//TODO:Addyourcontrolnotificationhandlercodeherem_dwDevNum=m_avaDevs[m_AvailableDevice.GetCurSel()].dwDeviceNum;}voidCCompareDlg::OnBtnXneg(){//TODO:AddyourcontrolnotificationhandlercodehereU32Result;CEdit*pEdit;CStringstrTemp;UpdateData(TRUE);Result=Acm_SetProperty(m_Axishand[0],PAR_AxVelHigh,&m_VelHigh,sizeof(m_VelHigh));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[0],PAR_AxVelLow,&m_VelLow,sizeof(m_VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_AxMoveVel(m_Axishand[0],1);if(Result!=SUCCESS){strTemp.Format("MovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}m_XbIsRunning=TRUE;pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XActCnt);pEdit->EnableWindow(FALSE);return;}voidCCompareDlg::OnBtnXpos(){//TODO:Addyourcontrolnotificationhandlercodehere第89页共89页\nU32Result;CEdit*pEdit;CStringstrTemp;UpdateData(TRUE);Result=Acm_SetProperty(m_Axishand[0],PAR_AxVelHigh,&m_VelHigh,sizeof(m_VelHigh));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[0],PAR_AxVelLow,&m_VelLow,sizeof(m_VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_AxMoveVel(m_Axishand[0],0);if(Result!=SUCCESS){strTemp.Format("MovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}m_XbIsRunning=TRUE;pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XActCnt);pEdit->EnableWindow(FALSE);return;}voidCCompareDlg::OnBtnXstop(){//TODO:AddyourcontrolnotificationhandlercodehereUSHORTusAxisState=0;CEdit*pEdit;m_XbIsRunning=FALSE;//ifaxisisinerrorstate,resetitfirst.thenStopAxesAcm_AxGetState(m_Axishand[0],&usAxisState);if(usAxisState==STA_AX_ERROR_STOP){Acm_AxResetError(m_Axishand[0]);}Acm_AxStopDec(m_Axishand[0]);第89页共89页\npEdit=(CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt);pEdit->EnableWindow(TRUE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XActCnt);pEdit->EnableWindow(TRUE);//KillTimer(1);return;}voidCCompareDlg::OnBtnYneg(){//TODO:AddyourcontrolnotificationhandlercodehereU32Result;CEdit*pEdit;CStringstrTemp;UpdateData(TRUE);Result=Acm_SetProperty(m_Axishand[1],PAR_AxVelHigh,&m_VelHigh,sizeof(m_VelHigh));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[1],PAR_AxVelLow,&m_VelLow,sizeof(m_VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_AxMoveVel(m_Axishand[1],1);if(Result!=SUCCESS){strTemp.Format("MovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}m_YbIsRunning=TRUE;pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YActCnt);pEdit->EnableWindow(FALSE);return;}voidCCompareDlg::OnBtnYpos(){//TODO:Addyourcontrolnotificationhandlercodehere第89页共89页\nU32Result;CEdit*pEdit;CStringstrTemp;UpdateData(TRUE);Result=Acm_SetProperty(m_Axishand[1],PAR_AxVelHigh,&m_VelHigh,sizeof(m_VelHigh));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[1],PAR_AxVelLow,&m_VelLow,sizeof(m_VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_AxMoveVel(m_Axishand[1],0);if(Result!=SUCCESS){strTemp.Format("MovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}m_YbIsRunning=TRUE;pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YActCnt);pEdit->EnableWindow(FALSE);return;}voidCCompareDlg::OnBtnYstop(){//TODO:AddyourcontrolnotificationhandlercodehereUSHORTusAxisState=0;CEdit*pEdit;m_YbIsRunning=FALSE;//ifaxisisinerrorstate,resetitfirst.thenStopAxesAcm_AxGetState(m_Axishand[1],&usAxisState);if(usAxisState==STA_AX_ERROR_STOP){Acm_AxResetError(m_Axishand[1]);}Acm_AxStopDec(m_Axishand[1]);第89页共89页\npEdit=(CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt);pEdit->EnableWindow(TRUE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YActCnt);pEdit->EnableWindow(TRUE);return;}voidCCompareDlg::OnBtnZneg(){//TODO:AddyourcontrolnotificationhandlercodehereU32Result;CEdit*pEdit;CStringstrTemp;UpdateData(TRUE);Result=Acm_SetProperty(m_Axishand[2],PAR_AxVelHigh,&m_VelHigh,sizeof(m_VelHigh));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[2],PAR_AxVelLow,&m_VelLow,sizeof(m_VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_AxMoveVel(m_Axishand[2],1);if(Result!=SUCCESS){strTemp.Format("MovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}m_ZbIsRunning=TRUE;pEdit=(CEdit*)GetDlgItem(IDC_EDIT_ZCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_ZActCnt);pEdit->EnableWindow(FALSE);return;}voidCCompareDlg::OnBtnZpos(){//TODO:AddyourcontrolnotificationhandlercodehereU32Result;第89页共89页\nCEdit*pEdit;CStringstrTemp;UpdateData(TRUE);Result=Acm_SetProperty(m_Axishand[2],PAR_AxVelHigh,&m_VelHigh,sizeof(m_VelHigh));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[2],PAR_AxVelLow,&m_VelLow,sizeof(m_VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_AxMoveVel(m_Axishand[2],0);if(Result!=SUCCESS){strTemp.Format("MovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}m_ZbIsRunning=TRUE;pEdit=(CEdit*)GetDlgItem(IDC_EDIT_ZCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_ZActCnt);pEdit->EnableWindow(FALSE);//SetTimer(1,100,NULL);return;}voidCCompareDlg::OnBtnZstop(){//TODO:AddyourcontrolnotificationhandlercodehereUSHORTusAxisState=0;CEdit*pEdit;m_ZbIsRunning=FALSE;//ifaxisisinerrorstate,resetitfirst.thenStopAxesAcm_AxGetState(m_Axishand[2],&usAxisState);if(usAxisState==STA_AX_ERROR_STOP){Acm_AxResetError(m_Axishand[2]);}Acm_AxStopDec(m_Axishand[2]);第89页共89页\npEdit=(CEdit*)GetDlgItem(IDC_EDIT_ZCmdCnt);pEdit->EnableWindow(TRUE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_ZActCnt);pEdit->EnableWindow(TRUE);return;}voidCCompareDlg::OnBtnUneg(){//TODO:AddyourcontrolnotificationhandlercodehereU32Result;CEdit*pEdit;CStringstrTemp;UpdateData(TRUE);Result=Acm_SetProperty(m_Axishand[3],PAR_AxVelHigh,&m_VelHigh,sizeof(m_VelHigh));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[3],PAR_AxVelLow,&m_VelLow,sizeof(m_VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_AxMoveVel(m_Axishand[3],1);if(Result!=SUCCESS){strTemp.Format("MovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}m_UbIsRunning=TRUE;pEdit=(CEdit*)GetDlgItem(IDC_EDIT_UCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_UActCnt);pEdit->EnableWindow(FALSE);return;}voidCCompareDlg::OnBtnUpos(){//TODO:Addyourcontrolnotificationhandlercodehere第89页共89页\nU32Result;CEdit*pEdit;CStringstrTemp;UpdateData(TRUE);Result=Acm_SetProperty(m_Axishand[3],PAR_AxVelHigh,&m_VelHigh,sizeof(m_VelHigh));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[3],PAR_AxVelLow,&m_VelLow,sizeof(m_VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_AxMoveVel(m_Axishand[3],0);if(Result!=SUCCESS){strTemp.Format("MovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}m_UbIsRunning=TRUE;pEdit=(CEdit*)GetDlgItem(IDC_EDIT_UCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_UActCnt);pEdit->EnableWindow(FALSE);return;}voidCCompareDlg::OnBTNXCmdResetERR(){//TODO:Addyourcontrolnotificationhandlercodehereif(m_XbInit==TRUE){Acm_AxResetError(m_Axishand[0]);}}voidCCompareDlg::OnBTNYCmdResetERR(){//TODO:Addyourcontrolnotificationhandlercodehereif(m_YbInit==TRUE){第89页共89页\nAcm_AxResetError(m_Axishand[1]);}}voidCCompareDlg::OnBTNZCmdResetERR(){//TODO:Addyourcontrolnotificationhandlercodehereif(m_ZbInit==TRUE){Acm_AxResetError(m_Axishand[2]);}}voidCCompareDlg::OnBTNUCmdResetERR(){//TODO:Addyourcontrolnotificationhandlercodehereif(m_UbInit==TRUE){Acm_AxResetError(m_Axishand[3]);}}voidCCompareDlg::OnBtnUstop(){//TODO:AddyourcontrolnotificationhandlercodehereUSHORTusAxisState=0;CEdit*pEdit;m_UbIsRunning=FALSE;//ifaxisisinerrorstate,resetitfirst.thenStopAxesAcm_AxGetState(m_Axishand[3],&usAxisState);if(usAxisState==STA_AX_ERROR_STOP){Acm_AxResetError(m_Axishand[3]);}Acm_AxStopDec(m_Axishand[3]);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_UCmdCnt);pEdit->EnableWindow(TRUE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_UActCnt);pEdit->EnableWindow(TRUE);return;}voidCCompareDlg::OnBtnXptp(){//TODO:AddyourcontrolnotificationhandlercodehereU32Result;CEdit*pEdit;doubleCfgMaxVel;CStringstrTemp;第89页共89页\nUpdateData(TRUE);if(m_VelHigh>8000.0){CfgMaxVel=m_VelHigh+100.0;}else{CfgMaxVel=8000.0;}Result=Acm_SetProperty(m_Axishand[0],CFG_AxMaxVel,&CfgMaxVel,sizeof(CfgMaxVel));if(Result!=SUCCESS){MessageBox("SetProperty-AxMaxVelFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[0],PAR_AxVelLow,&m_VelLow,sizeof(m_VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[0],PAR_AxVelHigh,&m_VelHigh,sizeof(m_VelHigh));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_AxMoveRel(m_Axishand[0],m_XPos);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}m_XbIsRunning=TRUE;pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XActCnt);pEdit->EnableWindow(FALSE);return;}voidCCompareDlg::OnBtnYptp()第89页共89页\n{//TODO:AddyourcontrolnotificationhandlercodehereU32Result;CEdit*pEdit;doubleCfgMaxVel;CStringstrTemp;UpdateData(TRUE);if(m_VelHigh>8000.0){CfgMaxVel=m_VelHigh+100.0;}else{CfgMaxVel=8000.0;}Result=Acm_SetProperty(m_Axishand[1],CFG_AxMaxVel,&CfgMaxVel,sizeof(CfgMaxVel));if(Result!=SUCCESS){MessageBox("SetProperty-AxMaxVelFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[1],PAR_AxVelLow,&m_VelLow,sizeof(m_VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[1],PAR_AxVelHigh,&m_VelHigh,sizeof(m_VelHigh));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_AxMoveRel(m_Axishand[1],m_YPos);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}m_YbIsRunning=TRUE;pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt);第89页共89页\npEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YActCnt);pEdit->EnableWindow(FALSE);return;}voidCCompareDlg::OnBtnZptp(){//TODO:AddyourcontrolnotificationhandlercodehereU32Result;CEdit*pEdit;doubleCfgMaxVel;CStringstrTemp;UpdateData(TRUE);if(m_VelHigh>8000.0){CfgMaxVel=m_VelHigh+100.0;}else{CfgMaxVel=8000.0;}Result=Acm_SetProperty(m_Axishand[2],CFG_AxMaxVel,&CfgMaxVel,sizeof(CfgMaxVel));if(Result!=SUCCESS){MessageBox("SetProperty-AxMaxVelFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[2],PAR_AxVelLow,&m_VelLow,sizeof(m_VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[2],PAR_AxVelHigh,&m_VelHigh,sizeof(m_VelHigh));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_AxMoveRel(m_Axishand[2],m_ZPos);if(Result!=SUCCESS){第89页共89页\nstrTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}m_ZbIsRunning=TRUE;pEdit=(CEdit*)GetDlgItem(IDC_EDIT_ZCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_ZActCnt);pEdit->EnableWindow(FALSE);return;}voidCCompareDlg::OnBtnUptp(){//TODO:AddyourcontrolnotificationhandlercodehereU32Result;CEdit*pEdit;doubleCfgMaxVel;CStringstrTemp;UpdateData(TRUE);if(m_VelHigh>8000.0){CfgMaxVel=m_VelHigh+100.0;}else{CfgMaxVel=8000.0;}Result=Acm_SetProperty(m_Axishand[3],CFG_AxMaxVel,&CfgMaxVel,sizeof(CfgMaxVel));if(Result!=SUCCESS){MessageBox("SetProperty-AxMaxVelFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[3],PAR_AxVelLow,&m_VelLow,sizeof(m_VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[3],PAR_AxVelHigh,&m_VelHigh,sizeof(m_VelHigh));if(Result!=SUCCESS){第89页共89页\nMessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_AxMoveRel(m_Axishand[3],m_UPos);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}m_UbIsRunning=TRUE;pEdit=(CEdit*)GetDlgItem(IDC_EDIT_UCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_UActCnt);pEdit->EnableWindow(FALSE);return;}voidCCompareDlg::OnButtonStart(){//TODO:AddyourcontrolnotificationhandlercodehereU32Result;CEdit*pEdit;CStringd;U16State;inti;doubleCfgMaxVel;doubleVel;doubleVel1;doubleXdistance;doubleYdistance;doubleVelLow;CStringstrTemp;CStringstr;UpdateData(true);m_byOutData=0;m_byOutData|=m_bDataBit0;m_byOutData|=m_bDataBit1<<1;m_byOutData|=m_bDataBit2<<2;m_byOutData|=m_bDataBit3<<3;m_byOutData|=m_bDataBit4<<4;m_byOutData|=m_bDataBit5<<5;m_byOutData|=m_bDataBit6<<6;m_byOutData|=m_bDataBit7<<7;m_usChan=m_iChan;m_usMask=CvtHex(m_szMask.GetBuffer(100));第89页共89页\nm_ptDioWritePortByte.port=m_usChan;m_ptDioWritePortByte.mask=m_usMask;m_ptDioWritePortByte.state=m_byOutData;if((m_lrErrCode=DRV_DioWritePortByte(m_lDriverHandle,(LPT_DioWritePortByte)&m_ptDioWritePortByte))!=0){DRV_GetErrorMessage(m_lrErrCode,(LPSTR)m_szErrMsg);MessageBox((LPCSTR)m_szErrMsg,"DriverMessage",MB_OK);return;}if(m_frequence>1){Vel=(1-0.01*m_dajielv)*m_diameter*(m_frequence-1);Vel1=Vel*5000;VelLow=5000;Xdistance=m_distance*5000;Ydistance=(1-(0.01*m_dajielv))*m_diameter*5000;for(i=1;i<=2;i++){if(Vel1>8000.0){CfgMaxVel=Vel1+100.0;}else{CfgMaxVel=8000.0;}Result=Acm_SetProperty(m_Axishand[0],CFG_AxMaxVel,&CfgMaxVel,sizeof(CfgMaxVel));if(Result!=SUCCESS){MessageBox("SetProperty-AxMaxVelFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[1],CFG_AxMaxVel,&CfgMaxVel,sizeof(CfgMaxVel));if(Result!=SUCCESS){MessageBox("SetProperty-AxMaxVelFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[0],PAR_AxVelLow,&VelLow,sizeof(VelLow));if(Result!=SUCCESS){第89页共89页\nMessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[1],PAR_AxVelLow,&VelLow,sizeof(VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[0],PAR_AxVelHigh,&Vel1,sizeof(Vel1));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[1],PAR_AxVelHigh,&Vel1,sizeof(Vel1));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_AxMoveRel(m_Axishand[0],Xdistance);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XActCnt);pEdit->EnableWindow(FALSE);UpdateData(FALSE);while(1){Acm_AxGetState(m_Axishand[0],&State);if(State==1)break;}Result=Acm_AxMoveRel(m_Axishand[1],Ydistance);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;第89页共89页\n}pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YActCnt);pEdit->EnableWindow(FALSE);while(1){Acm_AxGetState(m_Axishand[1],&State);if(State==1)break;}Acm_AxMoveRel(m_Axishand[0],-Xdistance);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XActCnt);pEdit->EnableWindow(FALSE);while(1){Acm_AxGetState(m_Axishand[0],&State);if(State==1)break;}Result=Acm_AxMoveRel(m_Axishand[1],Ydistance);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YActCnt);pEdit->EnableWindow(FALSE);}}//激光频率>1HZ时的程序elseif(m_frequence==1){Vel=(1-0.01*m_dajielv)*m_diameter;Vel1=Vel*5000;VelLow=1000;Xdistance=m_distance*5000;第89页共89页\nYdistance=(1-(0.01*m_dajielv))*m_diameter*5000;for(i=1;i<=2;i++){if(Vel1>8000.0){CfgMaxVel=Vel1+100.0;}else{CfgMaxVel=8000.0;}Result=Acm_SetProperty(m_Axishand[0],CFG_AxMaxVel,&CfgMaxVel,sizeof(CfgMaxVel));if(Result!=SUCCESS){MessageBox("SetProperty-AxMaxVelFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[1],CFG_AxMaxVel,&CfgMaxVel,sizeof(CfgMaxVel));if(Result!=SUCCESS){MessageBox("SetProperty-AxMaxVelFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[0],PAR_AxVelLow,&VelLow,sizeof(VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[1],PAR_AxVelLow,&VelLow,sizeof(VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[0],PAR_AxVelHigh,&Vel1,sizeof(Vel1));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}第89页共89页\nResult=Acm_SetProperty(m_Axishand[1],PAR_AxVelHigh,&Vel1,sizeof(Vel1));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_AxMoveRel(m_Axishand[0],Xdistance);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XActCnt);pEdit->EnableWindow(FALSE);UpdateData(FALSE);while(1){UpdateData(TRUE);Acm_AxGetState(m_Axishand[0],&State);if(State==1)break;}Result=Acm_AxMoveRel(m_Axishand[1],Ydistance);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YActCnt);pEdit->EnableWindow(FALSE);while(1){Acm_AxGetState(m_Axishand[1],&State);if(State==1)break;}Acm_AxMoveRel(m_Axishand[0],-Xdistance);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);第89页共89页\nreturn;}pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XActCnt);pEdit->EnableWindow(FALSE);while(1){Acm_AxGetState(m_Axishand[0],&State);if(State==1)break;}Result=Acm_AxMoveRel(m_Axishand[1],Ydistance);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}//m_YbIsRunning=TRUE;pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YActCnt);pEdit->EnableWindow(FALSE);//return;}}//激光频率=1HZ时的程序}voidCCompareDlg::OnButtonStart1(){//TODO:AddyourcontrolnotificationhandlercodehereU32Result;CEdit*pEdit;CStringd;U16State;inti;doubleCfgMaxVel;doubleVel;doubleVel1;doubleXdistance;doubleYdistance;doubleVelLow;CStringstrTemp;CStringstr;UpdateData(true);m_byOutData=0;第89页共89页\nm_byOutData|=m_bDataBit0;m_byOutData|=m_bDataBit1<<1;m_byOutData|=m_bDataBit2<<2;m_byOutData|=m_bDataBit3<<3;m_byOutData|=m_bDataBit4<<4;m_byOutData|=m_bDataBit5<<5;m_byOutData|=m_bDataBit6<<6;m_byOutData|=m_bDataBit7<<7;m_usChan=m_iChan;m_usMask=CvtHex(m_szMask.GetBuffer(100));m_ptDioWritePortByte.port=m_usChan;m_ptDioWritePortByte.mask=m_usMask;m_ptDioWritePortByte.state=m_byOutData;if((m_lrErrCode=DRV_DioWritePortByte(m_lDriverHandle,(LPT_DioWritePortByte)&m_ptDioWritePortByte))!=0){DRV_GetErrorMessage(m_lrErrCode,(LPSTR)m_szErrMsg);MessageBox((LPCSTR)m_szErrMsg,"DriverMessage",MB_OK);return;}if(m_frequence>1){Vel=(1-0.01*m_dajielv)*m_diameter*(m_frequence-1);Vel1=Vel*5000;VelLow=5000;Ydistance=m_distance*5000;Xdistance=(1-(0.01*m_dajielv))*m_diameter*5000;for(i=1;i<=2;i++){if(Vel1>8000.0){CfgMaxVel=Vel1+100.0;}else{CfgMaxVel=8000.0;}Result=Acm_SetProperty(m_Axishand[0],CFG_AxMaxVel,&CfgMaxVel,sizeof(CfgMaxVel));if(Result!=SUCCESS){MessageBox("SetProperty-AxMaxVelFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[1],CFG_AxMaxVel,&CfgMaxVel,第89页共89页\nsizeof(CfgMaxVel));if(Result!=SUCCESS){MessageBox("SetProperty-AxMaxVelFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[0],PAR_AxVelLow,&VelLow,sizeof(VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[1],PAR_AxVelLow,&VelLow,sizeof(VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[0],PAR_AxVelHigh,&Vel1,sizeof(Vel1));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[1],PAR_AxVelHigh,&Vel1,sizeof(Vel1));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_AxMoveRel(m_Axishand[1],Ydistance);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YActCnt);pEdit->EnableWindow(FALSE);UpdateData(FALSE);while(1)第89页共89页\n{Acm_AxGetState(m_Axishand[1],&State);if(State==1)break;}Result=Acm_AxMoveRel(m_Axishand[0],Xdistance);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XActCnt);pEdit->EnableWindow(FALSE);while(1){Acm_AxGetState(m_Axishand[0],&State);if(State==1)break;}Acm_AxMoveRel(m_Axishand[1],-Ydistance);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YActCnt);pEdit->EnableWindow(FALSE);while(1){Acm_AxGetState(m_Axishand[1],&State);if(State==1)break;}Result=Acm_AxMoveRel(m_Axishand[0],Xdistance);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}//m_YbIsRunning=TRUE;pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt);第89页共89页\npEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XActCnt);pEdit->EnableWindow(FALSE);//return;}}//激光频率>1HZ时的程序elseif(m_frequence==1){Vel=(1-0.01*m_dajielv)*m_diameter;Vel1=Vel*5000;VelLow=1000;Ydistance=m_distance*5000;Xdistance=(1-(0.01*m_dajielv))*m_diameter*5000;for(i=1;i<=2;i++){if(Vel1>8000.0){CfgMaxVel=Vel1+100.0;}else{CfgMaxVel=8000.0;}Result=Acm_SetProperty(m_Axishand[0],CFG_AxMaxVel,&CfgMaxVel,sizeof(CfgMaxVel));if(Result!=SUCCESS){MessageBox("SetProperty-AxMaxVelFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[1],CFG_AxMaxVel,&CfgMaxVel,sizeof(CfgMaxVel));if(Result!=SUCCESS){MessageBox("SetProperty-AxMaxVelFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[0],PAR_AxVelLow,&VelLow,sizeof(VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[1],PAR_AxVelLow,&VelLow,第89页共89页\nsizeof(VelLow));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelLowFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[0],PAR_AxVelHigh,&Vel1,sizeof(Vel1));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_SetProperty(m_Axishand[1],PAR_AxVelHigh,&Vel1,sizeof(Vel1));if(Result!=SUCCESS){MessageBox("SetProperty-AxVelHighFailed","Compare",MB_OK);return;}Result=Acm_AxMoveRel(m_Axishand[1],Ydistance);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YActCnt);pEdit->EnableWindow(FALSE);UpdateData(FALSE);while(1){UpdateData(TRUE);Acm_AxGetState(m_Axishand[1],&State);if(State==1)break;}Result=Acm_AxMoveRel(m_Axishand[0],Xdistance);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt);pEdit->EnableWindow(FALSE);第89页共89页\npEdit=(CEdit*)GetDlgItem(IDC_EDIT_XActCnt);pEdit->EnableWindow(FALSE);while(1){Acm_AxGetState(m_Axishand[0],&State);if(State==1)break;}Acm_AxMoveRel(m_Axishand[1],-Ydistance);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YActCnt);pEdit->EnableWindow(FALSE);while(1){Acm_AxGetState(m_Axishand[1],&State);if(State==1)break;}Result=Acm_AxMoveRel(m_Axishand[0],Xdistance);if(Result!=SUCCESS){strTemp.Format("PTPMovefailedwithErrorCode:%xh",Result);MessageBox(strTemp,"Compare",MB_OK);return;}pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt);pEdit->EnableWindow(FALSE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XActCnt);pEdit->EnableWindow(FALSE);}}//激光频率=1HZ时的程序}voidCCompareDlg::OnButtonStop(){//TODO:AddyourcontrolnotificationhandlercodehereUSHORTusAxisState=0;CEdit*pEdit;m_XbIsRunning=FALSE;m_YbIsRunning=FALSE;//ifaxisisinerrorstate,resetitfirst.thenStopAxes第89页共89页\nAcm_AxGetState(m_Axishand[0],&usAxisState);if(usAxisState==STA_AX_ERROR_STOP){Acm_AxResetError(m_Axishand[0]);}Acm_AxStopDec(m_Axishand[0]);Acm_AxGetState(m_Axishand[1],&usAxisState);if(usAxisState==STA_AX_ERROR_STOP){Acm_AxResetError(m_Axishand[1]);}Acm_AxStopDec(m_Axishand[1]);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt);pEdit->EnableWindow(TRUE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_XActCnt);pEdit->EnableWindow(TRUE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt);pEdit->EnableWindow(TRUE);pEdit=(CEdit*)GetDlgItem(IDC_EDIT_YActCnt);pEdit->EnableWindow(TRUE);}voidCCompareDlg::OnSelchangeDevice(){//TODO:AddyourcontrolnotificationhandlercodeherepComboBox=(CComboBox*)this->GetDlgItem(IDC_DEVICE);m_usDevice=pComboBox->GetCurSel();ProcessInit();ProcessInit1();}voidCCompareDlg::OnSelchangeModule(){//TODO:AddyourcontrolnotificationhandlercodeherepComboBox=(CComboBox*)this->GetDlgItem(IDC_MODULE);m_usSubDevice=pComboBox->GetCurSel();ProcessInit();ProcessInit1();}voidCCompareDlg::OnReadback(){//TODO:Addyourcontrolnotificationhandlercodeherem_usChan=m_iChan;m_byOutData=0;m_ptDioGetCurrentDOByte.port=m_usChan;m_ptDioGetCurrentDOByte.value=(USHORTfar*)&m_byOutData;if((m_lrErrCode=DRV_DioGetCurrentDOByte(m_lDriverHandle,第89页共89页\n(LPT_DioGetCurrentDOByte)&m_ptDioGetCurrentDOByte))!=0){DRV_GetErrorMessage(m_lrErrCode,(LPSTR)m_szErrMsg);MessageBox((LPCSTR)m_szErrMsg,"DriverMessage",MB_OK);return;}////displaythevalueinOutputStateEdit//_itoa(m_byOutData,m_szBuffer,16);GetDlgItem(IDC_EDIT2)->SetWindowText(m_szBuffer);}BOOLCCompareDlg::ProcessInit(){inti,nOutEntries;//TODO:Addextrainitializationhere//--------------------------------//InitializeDeviceListCombobox//--------------------------------//getnumberoftheinstalleddevicesif((m_lrErrCode=DRV_DeviceGetNumOfList((SHORTfar*)&m_sNumOfDevices))!=SUCCESS){DRV_GetErrorMessage(m_lrErrCode,(LPSTR)m_szErrMsg);MessageBox((LPCSTR)m_szErrMsg,"DriverMessage",MB_OK);returnTRUE;}if(m_sNumOfDevices>MAX_DEVICES)m_sNumOfDevices=MAX_DEVICES;//retrievetheinformationofallinstalleddevicesif((m_lrErrCode=DRV_DeviceGetList((DEVLISTfar*)&m_DeviceList[0],(SHORT)m_sNumOfDevices,(SHORTfar*)&nOutEntries))!=(LONG)SUCCESS){DRV_GetErrorMessage(m_lrErrCode,(LPSTR)m_szErrMsg);MessageBox((LPCSTR)m_szErrMsg,"DriverMessage",MB_OK);returnTRUE;}//initializetheDeviceListComboboxwiththeretrievedinformationpComboBox=(CComboBox*)this->GetDlgItem(IDC_DEVICE);pComboBox->ResetContent();for(i=0;iAddString((LPSTR)m_DeviceList[i].szDeviceName);第89页共89页\npComboBox->SetCurSel(m_usDevice);//-----------------------------------------------------------//InitializeModuleListComboboxforCOMportorCANdevices//-----------------------------------------------------------//checkifthereisanydeviceattachedonthisCOMportorCANm_sNumOfSubdevices=m_DeviceList[m_usDevice].nNumOfSubdevices;if(m_sNumOfSubdevices>MAX_DEVICES)m_sNumOfSubdevices=MAX_DEVICES;//retrievetheinformationofallinstalleddevicesif(m_sNumOfSubdevices!=0){if((m_lrErrCode=DRV_DeviceGetSubList((DWORD)m_DeviceList[m_usDevice].dwDeviceNum,(DEVLISTfar*)&m_SubDeviceList[0],(SHORT)m_sNumOfSubdevices,(SHORTfar*)&nOutEntries))!=(LONG)SUCCESS){DRV_GetErrorMessage(m_lrErrCode,(LPSTR)m_szErrMsg);MessageBox((LPCSTR)m_szErrMsg,"DriverMessage",MB_OK);returnTRUE;}//initializetheModuleListComboboxwiththeretrieved//informationpComboBox=(CComboBox*)this->GetDlgItem(IDC_MODULE);pComboBox->EnableWindow(TRUE);pComboBox->ResetContent();for(i=0;iAddString((LPSTR)m_SubDeviceList[i].szDeviceName);pComboBox->SetCurSel(m_usSubDevice);}else{pComboBox=(CComboBox*)this->GetDlgItem(IDC_MODULE);pComboBox->EnableWindow(FALSE);pComboBox->ResetContent();}//fourth:closedeviceDRV_DeviceClose((LONGfar*)&m_lDriverHandle);returnTRUE;//returnTRUEunlessyousetthefocustoacontrol//EXCEPTION:OCXPropertyPagesshouldreturnFALSE}BOOLCCompareDlg::ProcessInit1(){inti=0;第89页共89页\n////opendeviceif(m_sNumOfSubdevices==0){m_lrErrCode=DRV_DeviceOpen(m_DeviceList[m_usDevice].dwDeviceNum,(LONGfar*)&m_lDriverHandle);}else{m_lrErrCode=DRV_DeviceOpen(m_SubDeviceList[m_usSubDevice].dwDeviceNum,(LONGfar*)&m_lDriverHandle);}if(m_lrErrCode!=SUCCESS){strcpy(m_szErrMsg,"Deviceopenerror!");MessageBox((LPCSTR)m_szErrMsg,"Notice",MB_OK);return0;}pComboBox=(CComboBox*)GetDlgItem(IDC_COMBO1);for(i=0;i<8;i++){_itoa(i,m_szBuffer,10);pComboBox->AddString(m_szBuffer);}pComboBox->SetCurSel(m_byOutBit);CheckDlgButton(IDC_D0,(m_byOutData&0x1));CheckDlgButton(IDC_D1,(m_byOutData&0x2));CheckDlgButton(IDC_D2,(m_byOutData&0x4));CheckDlgButton(IDC_D3,(m_byOutData&0x8));CheckDlgButton(IDC_D4,(m_byOutData&0x10));CheckDlgButton(IDC_D5,(m_byOutData&0x20));CheckDlgButton(IDC_D6,(m_byOutData&0x40));CheckDlgButton(IDC_D7,(m_byOutData&0x80));returntrue;}WORDCCompareDlg::CvtHex(char*str){chartemp;WORDdata=0;inti;for(i=0;i<4;++i){temp=str[i];第89页共89页\nif(temp==0)break;if(temp=='')continue;data<<=4;if(temp>='0'&&temp<='9'){data|=(temp-'0');}elseif(temp>='a'&&temp<='f'){data|=(temp-'a')+10;str[i]=temp-'a'+'A';}elseif(temp>='A'&&temp<='F'){data|=(temp-'A')+10;}else{break;}}return(data);}第89页共89页