转台盘A4.dwg
转台盘A4.dwg

激光喷丸系统运动控制软件编制及喷丸改性实验【机+电】【SolidWorks三维】【4张图纸】【优秀】

收藏

压缩包内文档预览:
预览图
编号:271356    类型:共享资源    大小:25.84MB    格式:RAR    上传时间:2014-04-03 上传人:上*** IP属地:江苏
60
积分
关 键 词:
激光 喷丸系统 运动 控制 节制 软件 编制 改性 实验 试验 solidworks 三维 图纸 优秀 优良
资源描述:

激光喷丸系统运动控制软件编制及喷丸改性实验

94页 23000字数+说明书+答辩PPT+任务书+文献综述+SolidWorks三维图+4张CAD图纸

RS232串口程序.rar

SolidWorks角度调节台三维图.rar

任务书.doc

文献综述.doc

涡轮零件图A3.dwg

激光喷丸系统运动控制软件编制及喷丸改性实验答辩PPT.ppt

激光喷丸系统运动控制软件编制及喷丸改性实验论文.doc

调研报告.doc

调节台装配图.dwg

转台座A2.dwg

转台盘A4.dwg

运动控制软件程序.rar

目  录

第一章  绪  论1

1.1 运动控制概念的提出1

1.2运动控制器的现状及发展趋势1

1.3本课题研究的意义和主要内容5

第二章  运动控制平台的结构方案设计6

2.1电气部分的设计6

2.2 四轴运动平台的设计9

2.2.1角度调节台的设计9

2.2.2四轴平台的总体设计11

2.3 本章小结12

第三章  运动控制平台的软件编制13

3.1 RS232串口通讯程序的编制13

3.1.1 RS232串口的简介13

3.1.2 RS232的程序编制14

3.2运动控制软件的编制15

3.2.1运动控制卡的介绍15

3.2.2 PC+运动控制卡的控制方案介绍15

3.2.3 系统中PCI-1240运动控制卡和PCI-1761卡的介绍16

3.2.4 基于Visual C++的运动控制软件的开发20

3.3 本章小结24

第四章  激光喷丸改性实验25

4.1 激光喷丸技术简介25

4.2铜合金的激光喷丸实验25

4.2.1 材料选择与试样制备25

4.2.2 实验装置及仪器27

4.2.3 实验参数方案27

4.2.4 后续性能测试28

4.2.5 实验结论33

4.3 本章小结34

结    论35

致    谢36

参考文献37

附录 A39

附录 B43

摘要: 本文在分析了国内外多种类型的运动控制平台的基础上,设计并制作了一台适合激光喷丸系统的四轴运动控制平台。主要设计内容有:①对运动控制系统中的上位机控制和伺服驱动等关键技术进行深入剖析②根据激光喷丸系统要求进行机械和电气部分的设计和制作,搭建激光喷丸运动控制平台,使运动控制系统和激光发射系统集成在同一个平台中。③利用研华PCI-1240运动控制卡进行运动控制部分的设计,采用Visual C++软件调用运动控制卡中的运动函数库进行编程,使平台实现四根轴(X,Y,Z,U)各自的正反转运动,点动和联动功能,并可以按喷丸要求的轨迹移动。④利用PCI-1761DI/O卡的数字量输出功能进行激光控制部分的编程,数字量输出一个字节的数,这个输出信号输入到单片机中作为单片机的输入信号,控制激光能量和频率。⑤编制一个RS232串口程序,为今后实现工控机与电机的通信做准备。⑥利用设计的软件对ZCuSn10P1铜合金进行喷丸实验,验证此系统的可行性,并对喷丸后的试样进行性能测试,包括残余应力测试和纳米压痕实验,并对测试结果进行分析,得出结论。

   本课题设计的激光喷丸运动控制系统一方面解决了喷丸平台的运动控制,另一方面可控制激光器的参数,使喷丸系统形成一个整体,而且具有较高的柔性。

关键字: 运动控制;激光喷丸;运动控制卡;喷丸实验

   随着社会的不断发展,运动控制技术也由面向传统的数控加工行业专用运动控制技术而发展为具有开放结构、能结合具体应用要求而快速重组的先进运动控制技术。运动控制器已经从以单片机或微处理器作为核心的运动控制器和以专用芯片(ASIC)作为核心处理器的运动控制器,发展到了基于PC总线的以DSP和FPGA作为核心处理器的开放式运动控制器。

   本课题主要研究对象是4轴运动控制平台的设计与控制软件的编制。设计依据是Innolas激光器主要技术参数,上海联谊生产的运动轴及研华PCI-1240四轴运动控制卡和PCI-1761DI/O卡,光学精密平台及现有光路系统。系统提出的研华工业控制计算机,PCI-1240运动控制卡与伺服电机的控制方式实现了功能完善的运动控制功能,并结合PCI-1761卡的数字量输出功能将数字信号输入到单片机,由单片机控制激光器激光的能量和激光的频率,使平台的运动控制和激光器具有一定的同步性和可调性。该系统可应用于目前材料强化的实验当中。具有非常高的应用价值和市场前景。

   本课题完成的主要工作有:

1、对四轴运动控制平台进行机械和电气部分的设计,使之能够满足激光喷丸系统运动控制方面的要求。

   2、完成四轴平台的搭建,并把平台与激光器部分连接起来。

3、完成控制系统软件的编制,其中包括平台的运动控制、激光能量参数和频率参数的输出功能。

4、对设计平台进行调试,并对ZCuSn10P1铜合金进行激光喷丸实验,并对喷丸后的试样进行性能测试,达到预期的效果。


内容简介:
江 苏 大 学毕 业 设 计(论 文)任 务 书 学院 班级 学生设计(论文)题目 激光喷丸系统运动控制软件编制及喷丸改性实验课题来源 国家自然科学基金 起讫日期 2012 年 3 月 5 日至 2012 年 6 月 8 日共 15周指导教师(签名) 系(教研室)主任(签名) 课题依据:课题来源为国家自然科学基金项目研究内容,拟对基于Innolas激光器的微喷丸实验系统进行完善。依据现有激光器的脉冲频率,进行四轴运动控制平台的设计,使其运动速度能与激光冲脉实现匹配,以达到使用特定能量和频率的激光脉冲对试样进行喷丸的目的。设计依据:Innolas激光器主要技术参数,上海联谊产运动轴及控制卡,光学精密平台及现有光路系统任务要求: (1) 毕业设计调研报告1份,15002000汉字;(2) 专题综述或专业文献阅读报告1份,20003000汉字;(3) 完整的英文专业文献翻译12篇,6000汉字左右;(4) 激光喷丸系统结构设计及控制软件编制;(5) 控制系统软件的集成调试及激光喷丸强化铜合金的实验;(6) 机械结构的三维装配及二维图纸;(7) 设计图纸量不少于1张零号图;(8) 毕业设计/论文说明书1份, 1万字以上。毕业设计(论文)进度计划:起讫日期工 作 内 容备 注3.5 015.316.16.8查阅文献资料,熟悉运动控制平台结构,Pro/E或UG软件学习,零件三维设计,文献阅读报告调研相关材料、总体方案设计,平台结构控制方案制定 运动平台的三维装配,人机界面软件及运动控制程序的编写机械结构的三维装配及二维图纸;控制程序调试和实验,撰写毕业设计说明书文档整理,论文答辩准备,毕业答辩英文翻译文献阅读报告调研报告等文字材料穿插其间进行本 科 毕 业 论文文 献 综 述毕业论文题目:激光喷丸系统运动控制软件编制及喷丸改性实验学生姓名: 学 号:系 别: 专业班级:机械设计制造及其自动化关于激光喷丸运动控制系统方面的专题综述报告机电一体化技术的发展状况是衡量一个国家机械工业发展水平的重要标志。运动控制技术是机电一体化技术的核心部分。因此,对运动控制技术作深入细致的研究,把握国内外运动控制技术的最新发展动态,开发运动控制类产品是摆在我们面前的一个重大课题。在激光喷丸领域,激光喷丸工艺是利用高能脉冲激光在零件表面产生冲击波,冲击波作用于金属表面产生的机械“冷作”作用使表面金属材料达到压缩和塑性变形的效果;表面金属材料塑性变形的结果是在零件表面造成残余压应力,而残余压应力增强了零件材料对表面相关破坏(如疲劳、腐蚀疲劳和应力腐蚀裂纹)的抵抗能力。激光喷丸工艺的最大优越性在于激光喷丸工艺可使飞机和航空发动机零部件在同一零件上的不同区域达到各自不同的抗疲劳性能。当零件上的不同区域要求不同的抗疲劳性能时,激光喷丸工艺可以发挥其“点冷作”的优越性,通过调整工艺参数使零件不同的区域达到不同的残余应力强度和深度,从而实现不同的抗疲劳性能。这是以往常规喷丸工艺所难以实现的,这一优越性赋予了飞机和航空发动机设计师更宽广的零件设计空间。进行激光喷丸首先要具备激光喷丸机,由于航空零部件的结构特点和激光喷丸工艺的“点”工作特性,要求激光喷丸机具有较高的自动化程度。利用目前成熟的三轴、四轴或五轴数控加工中心的控制系统将不难实现上述激光喷丸工艺的要求。美国的激光喷丸设备处于相对成熟和工业应用推广阶段,但主要的应用领域还局限于航空发动机零部件,而激光喷丸设备存在的效率低是其最大的不足之处。对国内而言现有的激光喷丸设备仅限于试验阶段,激光器的控制不成熟,这限制了激光喷丸工艺的应用和快速发展。在自动控制领域,开放式控制系统具有软件和硬件开放性,它能使人们自由的选择控制装置、伺服放大器、执行单元等,模块化开放式运动控制系统是当今运动精致技术的发展方向。基于PC和运动控制卡的伺服系统正演绎着一场工业自动化的革命。目前,常用的多轴控制系统主要分为3大块:基于PLC的多轴定位控制系统,基于PC_based的多轴控制系统和基于总线的多轴控制系统。由于PC机在各种工业现场的广泛应用,先进控制理论和DSP技术实现手段的并行发展,各种工业设备的研制和改造中急需一个运动控制模块的硬件平台,以及为了满足新型数控系统的标准化,柔性化,开放性等要求,使得基于PC和运动控制卡的伺服系统备受青睐。采用PC运动控制卡作为上位控制可充分利用计算机资源,用于运动过程、运动轨迹都比较复杂,且柔性比较强的机器和设备。从用户使用的角度来看,基于PC机的运动控制卡主要是硬件接口(输入输出信号的种类、性能)和软件接口(运动控制函数库的功能函数)的差异。运动控制卡是基于PC机各种总线的步进电机或数字式伺服电机的上位控制单元,总线形式也是多种多样。由于计算机主板的更新换代,ISA插槽都越来越少了,PCI总线的运动控制卡应该是目前的主流。卡上专用CPU与PC机CPU构成主从式双CPU控制模式。PC机CPU可以专注于人机界面、实时监控和发送指令等系统管理工作;卡上专用CPU来处理所有运动控制的细节升降速计算、行程控制、多轴插补等,无需占用PC机资源。同时随卡还提供功能强大的运动控制软件库语言运动库、Windows DLL动态链接库等,让用户更快、更有效地解决复杂的运动控制问题。运动函数库为单轴及多轴的步进或伺服控制提供了许多运动函数,如单轴运动、多轴独立运动、多轴插补运动等等。另外,为了配合运动控制系统的开发,还提供了一些辅助函数,如中断处理、编码器反馈、间隙补偿,运动中变速等。利用Visual C+在Windows平台上,扩展运动控制卡,可以方便地开发数控系统,检测设备、自动生产线等。由于运动控制卡的运动函数库能够完成与运动控制有关的复杂细节,比如升降速直线插补、圆弧插补等,这样可以大大缩短控制系统的开发周期。以运动控制平台的激光喷丸机正在不断的运用到实际中,试样在多轴的运动平台上运动,能够达到材料表面强度的不同要求,多轴运动平台在激光喷丸设备中得到了广泛的运用,其多方位多角度的运动方式适应了材料为满足不同要求而选择不同的激光脉冲频率,使其有不同深度的残余压应力,已满度不同的强度要求。因激光喷丸的速度和精度要求相对来说不是很高,所以现在的多轴运动平台一般用的都是步进电机控制,其速度方面和激光脉冲频率相对来说比较匹配,适用于各种场合,控制卡中的运动函数比较强大,适用范围很广,调用起来方便,柔性也好,对于激光喷丸的研究具有深远意义。结论,根据所查得的一些文献资料,激光喷丸机的三轴运动控制平台的运动速度不能与激光脉冲很好的匹配,对一些曲面零件的喷丸实验不好实施,对激光喷丸技术的研究有一定的局限性,依据现有激光器的脉冲频率,进行四轴运动控制平台的设计,使其运动速度能与激光冲脉实现匹配,以达到使用特定能量和频率的激光脉冲对试样进行喷丸的目的,这对激光喷丸技术的研究是非常有益的。参考文献:1Preventing Fatigue Failures with Laser Peening, MFN (Metal Finishing News),Vo18 January Issue year 20072 Interview, Laser Peening-An Affordab1e So1ution to Metal Fatigue, MFN (Meta1 Finishing News), Vo17 November Issue year 20063 Laser Peening, Meta1 Improvement Company4刘蕾,唐为义,原所先.基于VC+与PMAC的机器人控制软件的开发,微计算机信息,2008,24(2-2);203-2055张建民.基于工控PC和Windows98的四轴位置控制系统的设计j.工业控制计算机,2002,15(4):35-376王家畴,位在林,宋方.基于PMAC运动控制器的开放式数控系统研究J.哈尔滨理工大学学报,2004,10.JINGJIANG COLLEGE OF J I A N G S U U N I V E R S I T Y本本 科科 毕毕 业业 论论 文文 激光喷丸系统运动控制软件编制及喷丸改性实验激光喷丸系统运动控制软件编制及喷丸改性实验Establishment of the Motion Control Software of Laser Shot Peening System and Shot Peening Modification Experiments学生学号: 学生姓名: 专业班级: 指导教师姓名: 指导教师职称: 2012 年 6 月I激光喷丸系统运动控制软件编制及喷丸改性实验激光喷丸系统运动控制软件编制及喷丸改性实验专业班级:J 机械 0804学生姓名:吴天成指导教师:周建忠职称:教授摘要: 本文在分析了国内外多种类型的运动控制平台的基础上,设计并制作了一台适合激光喷丸系统的四轴运动控制平台。主要设计内容有:对运动控制系统中的上位机控制和伺服驱动等关键技术进行深入剖析根据激光喷丸系统要求进行机械和电气部分的设计和制作,搭建激光喷丸运动控制平台,使运动控制系统和激光发射系统集成在同一个平台中。利用研华 PCI-1240 运动控制卡进行运动控制部分的设计,采用 Visual C+软件调用运动控制卡中的运动函数库进行编程,使平台实现四根轴(X,Y,Z,U)各自的正反转运动,点动和联动功能,并可以按喷丸要求的轨迹移动。利用 PCI-1761DI/O 卡的数字量输出功能进行激光控制部分的编程,数字量输出一个字节的数,这个输出信号输入到单片机中作为单片机的输入信号,控制激光能量和频率。编制一个 RS232 串口程序,为今后实现工控机与电机的通信做准备。利用设计的软件对 ZCuSn10P1 铜合金进行喷丸实验,验证此系统的可行性,并对喷丸后的试样进行性能测试,包括残余应力测试和纳米压痕实验,并对测试结果进行分析,得出结论。本课题设计的激光喷丸运动控制系统一方面解决了喷丸平台的运动控制,另一方面可控制激光器的参数,使喷丸系统形成一个整体,而且具有较高的柔性。关键字: 运动控制;激光喷丸;运动控制卡;喷丸实验IIestablishment of the motion control software of Laser shot peening system and shot peening modification experimentsAbstract: Based on the analysis of many types of motion control platform of the domestic and foreign, designed and produced a four axis motion control platform ,its suited for laser shot peening system. The main design content are: To analysis control system of PC control and servo drive on the key techniques. According to the laser shot peening systems requirements, design and manufacture the mechanical and electrical parts, building the laser shot peening motion control platform, make the motion control system and the laser emission system integrate in the same platform. With advantechs PCI-1240 movement control card, designing motion control part ,with Visual C+ software calls the movement control cards movement function library, make the platform have the four axises (X, Y, Z, U) positive and negative movement, the point move function, and can according to the requirements of the shot peenings track move. With PCI-1761 DI/O cards digital output function for laser control part of the programming, digital output a bytes of data, the output signal is input to the single chip microcomputer ,the data as the single chip microcomputer input signal, control the laser energy and gram a serial port software, realizeing serial communication for the industrial PC. Doing the copper alloy shot peening experiments with the software,to prove the feasibility of the system.and do the performance tests for the specimens of shock peening, Residual stress test and nano creasing experment, analyse the result of the test ,and draw the conclusion.This laser shot peening motion control system,on the one hand, solved the shot peening platform movement control, on the other hand, it can control the parameters of the laser machine, this make the shot peening system as a whole, and with high flexibility.Key words motion control; laser shot peening; motion control card;peening experimentIII目 录第一章第一章 绪绪 论论11.1 运动控制概念的提出11.2 运动控制器的现状及发展趋势11.3 本课题研究的意义和主要内容5第二章第二章 运动控制平台的结构方案设计运动控制平台的结构方案设计62.1 电气部分的设计62.2 四轴运动平台的设计92.2.1 角度调节台的设计92.2.2 四轴平台的总体设计112.3 本章小结12第三章第三章 运动控制平台的软件编制运动控制平台的软件编制133.1 RS232 串口通讯程序的编制133.1.1 RS232 串口的简介133.1.2 RS232 的程序编制143.2 运动控制软件的编制153.2.1 运动控制卡的介绍153.2.2 PC+运动控制卡的控制方案介绍153.2.3 系统中 PCI-1240 运动控制卡和 PCI-1761 卡的介绍163.2.4 基于 Visual C+的运动控制软件的开发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参考文献参考文献37IV附录附录 A A39附录附录 B B43第 1 页共 89 页 第一章第一章 绪绪 论论1.11.1 运动控制概念的提出运动控制概念的提出随着现代科学技术的进步,电机在实际应用中,过去是以简单的启停控制,提供动力为主要目的,现在上升到对其速度,位移,转矩等进行精确的控制,使被驱动的机械运动符合预想的要求。特别是在工业自动化,办公室自动化和家庭住宅自动化方面使用的大量控制电机,几乎都采用电力电子器件进行控制。在这种情况下,原先的“电机控制” , “电气传动”已发展到“运动控制”新阶段。“运动控制” (Motion Control)是近十年来国际上流行的一种新的技术,通常是指在复杂条件下,将预定的控制方案、规划指令转变成期望的机械运动。按照国际运动控制工程师协会的定义:“运动控制是指应用一个可控制的力的作用实现机电系统有效运动的技术,这个机电系统可以使以电气、液压、气动或其他形式驱动的。 ”运动控制系1统对被控机械运动实现精确的位置控制、速度控制、加速度控制、转矩控制或力的控制,以及这些被控量的综合控制。运动控制器的主要任务是根据作业的要求和传感器件的信号进行必要的逻辑/数学运算,为电机驱动装置提供正确的控制信号。典型的运动控制器如图 1.1 所示。 操作界面主机控制器驱动器电机机械装置反馈图 1.1 运动控制系统框图1.21.2 运动控制器的现状及发展趋势运动控制器的现状及发展趋势运动控制器历经分立电子元件、集成电路(包括小、中、大、超大规模集成电路) ,直至微控制器的出现,使运动控制器发生了质的飞跃由硬件电路发展到软件控制。运动控制系统也随之进入了全数字化控制的新阶段。321、基于模拟电路基于模拟电路第 2 页共 89 页 早期的运动控制器一般采用运算放大器等分立元件,以模拟电路硬接线方式构成。这种运动控制方式具有以下优点:对输入信号进行实时处理,没有附加延时,响应速度快;由于采用硬接线方式可实现无限的采样频率,因此控制器的精度较高且具有较大的带宽。但是,模拟控制系统与数字控制系统相比,也有明显的缺点:老化和环境温度的变化对构成系统的元器件的参数影响很大:构成模拟系统需要的元器件较多,增加了系统的复杂性,最终使系统的可靠性降低;由于采用硬接线,系统设计安装完成后,几乎不可能修改系统的功能;受系统规模的限制,很难实现运算量大、精度高、性能更先进的复杂控制算法。目前在一些早期的系统和功能简单的系统中仍然采用这种控制方式。2、基于微控制单元基于微控制单元微控制单元(MCU, 即单片计算机) 将CPU、RAM、ROM或EPROM、CTC、I/ O 等集成在一块芯片上,具有集成度高、速度快、功耗低、抗干扰能力强、重量轻、体积小、功能强、价格低等诸多优点,并且微控制单元的功能愈来愈强,因而目前使用微控制单元为核心构成运动控制器非常普遍。这种运动控制方式具有以下优点:模拟电路实现逻辑控制需要许多分立电子元件,而在微控制单元中绝大多数控制逻辑可采用软件来实现,使电路更简单;微控制单元具有大容量的存储器和较强的逻辑功能,运算速度快、精度高,因此可以实现较复杂的控制运算; 由于微控制单元的控制方式主要通过软件来实现,需要改变控制规律时只需修改相应的软件即可,因而具有较强的灵活性和适应性;由于数字控制系统中一般不会出现模拟电路中的零点漂移问题,且控制器的字长一般可保证足够的控制精度,因而具有较高的控制精度;可设计友好的人机界面,实现多机联网工作。但是,由于般微控制单元集成度较低,片上不具备运动控制系统所需要的专用外设,使以微控制单元为核心的运动控制器仍然需要较多的周边元器件,如要加上存储器、编码器信号处理及D/ A 转换电路等,软硬件设计的工作量较大,并增加了系统硬件的复杂性,降低了系统的可靠性。同时,由于微控制单元一般采用冯- 诺依曼总线结构,使处理速度和能力有限,难以实现先进控制算法和满足运算量较大的实时信号处理的需要,不适用于高精度、高速度控制场合,只能应用在低速点位控制和对轨迹要求不高的轮廓运动控制场合。3、基于可编程逻辑控制器基于可编程逻辑控制器可编程逻辑控制器( PLC) 是以微处理器为基础,在硬件接线逻辑控制技术和计算机技第 3 页共 89 页 术的基础上发展起来的。它是将计算机技术与自动控制技术综合为一体的工业控制产品,由中央处理单元(CPU) 、存储器、输入/ 输出单元( I/ O) 、电源、编程器等组成,是专为在工业环境下应用而设计的一种工业控制计算机。可编程逻辑控制器一般都具有脉冲输出功能,以它作为运动控制器,可以控制接收脉冲和方向信号工作的电机,如步进电机和数字式交流伺服电机等。这种控制方式具有体积小、可靠性高,通用性强,成本较低,软、硬件开发周期短,安装维护简便,在工业现场抗干扰能力强等优点。但由于PLC 是以循环扫描方式工作,即每一次状态变化需要一个扫描周期,其扫描周期一般在几毫秒至几十毫秒之间(视PLC 工作速度和用户程序大小而定) 。由于受到PLC工作方式的限制以及扫描周期的影响,被控制电机不能在高频下工作,转速较慢,且不能实现复杂的运动关系,故一般只应用在点位控制和单轴运动控制等场合。4、基于通用计算机基于通用计算机在通用计算机上,利用高级语言编制相关的控制软件,配合与计算机进行信号交换的通信接口板和驱动电机的电路板,构成一个运动控制系统。这种实现方法利用计算机的高速度、强大运算能力和方便的编程环境,可以实现高性能、高精度、复杂的控制算法,并且控制软件的修改也很方便。但是,由于通用计算机本身的限制,难以实现实时性要求高的信号处理算法;同时,系统体积过大,难以应用于工业现场。因此,这种实现方法一般用作上位机,与下层的实时系统一起构成两级或多级运动控制系统。5、基于专用运动控制芯片基于专用运动控制芯片基于专用运动控制芯片的运动控制系统是将实现电机控制所需的各种逻辑功能做在一块专用集成电路内,并提供一些专用的控制指令,同时具有一些诸如限位开关、零位开关处理、电机使能、报警等必须的辅助功能, 使用户的软件设计工作减少到最小程度。对于伺服电机,用一个芯片即完成速度曲线规划、PID 伺服控制算法、编码器信号的处理等多种功能。一些需要用户经常更改的参数如电机位置、速度、加速度、PID 参数等均在芯片内部的RAM区内, 可由计算机用指令很方便地修改。这种方法具有系统使用元件少、集成度高、可靠性好等优点,同时又保持了模拟控制系统的快速响应能力。专用运动控制芯片价格便宜,使系统成本较低。但由于受专用运动控制芯片本身的限制,这种方法也有一些缺点:为了保证较高的系统响应速度而将软件算法固化在芯片内部,降低了系统的灵活性,不具有扩展能力;受芯片制作工艺的限制,现有的芯片很难实现复杂的控制算法和功能;用户不能对芯片进行编程,很难实现系统的升级;由于芯第 4 页共 89 页 片本身算法的限制,系统的控制精度较低,难以实现高性能、高精度的应用场合。6、基于可编程逻辑器件基于可编程逻辑器件由于现场可编程门阵列( FPGA) / 复杂可编程逻辑器件(CPLD) 具有用户可编程的特性,使得用户可以利用系统开发软件或VHDL 等开发语言,通过软件编程实现运动控制算法,并将这些算法下载到相应的可编程逻辑器件中,从而最终以硬件的方式实现运动控制。这种方法的优点是: 系统的主要功能都可在单片FPGA/ CPLD 器件中实现,减少了所需的元器件个数,缩小了系统体积;由于可编程器件具有系统可编程的特性,因而具有较好的扩展性和可维护性,通过修改软件即可实现系统的升级;系统以硬件实现,响应速度快,可实现并行处理;容易开发,通用性强。但是由于使用可编程逻辑器件实现的控制算法越复杂,器件内部需要的晶体管门数就越多,成本就越高,因此一般使用可编程逻辑器件实现较简单的控制算法,构成较简单的运动控制系统。7、基于数字信号处理器基于数字信号处理器数字信号处理器(DSP) 是微处理器的一种,它除具备普通微处理器的高速运算和控制功能外,针对高数据传输速率、数值运算密集的实时数字信号处理操作,在处理器结构、指令系统和指令流程设计等方面都做了较大的改进。特别是随着运动控制领域对嵌入式DSP 控制器的市场需求的不断增大,DSP 厂商为此推出各种运动控制专用DSP,且成本不断下降,因此数字信号处理器是单片机的理想替代品,采用DSP 芯片为核心来实现电机的运动控制已经是一个必然趋势。由于DSP的高速运算能力使很多复杂的控制算法和功能都得以实现,且DSP 将实时处理能力和控制的外设功能集于一身,基于DSP 构成的运动控制器是一个单片系统,大幅度减少了外部元器件的数量,增加了系统的可靠性;同时, 由于各种性能通过软件编程来实现,系统开放性、扩展性、维护性都很好。这种方法的优点是:对输入和反馈信号的处理可以消除噪声污染或不精确的数据,从而可以去掉昂贵或不可靠的传感器;在实现特殊输入轨迹时,应用微处理器的控制经常是通过查表产生控制输入,DSP 可以用专门的函数和算法代替这些表和插补过程,因而可以使用更加复杂的多变量函数,减少对存储器的要求,提供最优的函数,且系统运行更加平稳,能耗更低,并提高驱动装置的可靠性;DSP 能实时实现许多先进的复杂控制算法,如自适应和最优多变量控制、重复控制、学习算法、神经网络、遗传算法、模糊逻辑控制和其它控制方法都可以借助DSP 的速度和性能得以实时实现;运动控制系统通常用PWM技术控制开关功率整流器,而通过DSP 来实现产生PWM和电子换向可第 5 页共 89 页 以去掉D/ A 转换器,因而与电流驱动的双极功率晶体管相比,减少了元件数目以及功耗和驱动系统的体积,这种方法提高了供给电压的利用率,同时降低了电动机电流中的谐波分量;在运动控制系统中系统运行中的故障诊断和处理是处理器的重要任务之一,而DSP 能够方便地实现实时监控,且DSP 除了作为数字控制器之外,还可以用来处理非控制问题,包括与上位主机的通信、数字滤波和数据总线控制协议等。1.31.3 本课题研究的意义和主要内容本课题研究的意义和主要内容随着社会的不断发展,运动控制技术也由面向传统的数控加工行业专用运动控制技术而发展为具有开放结构、能结合具体应用要求而快速重组的先进运动控制技术。运动控制器已经从以单片机或微处理器作为核心的运动控制器和以专用芯片(ASIC)作为核心处理器的运动控制器,发展到了基于 PC 总线的以 DSP 和 FPGA 作为核心处理器的开放式运动控制器。54本课题主要研究对象是 4 轴运动控制平台的设计与控制软件的编制。设计依据是Innolas 激光器主要技术参数,上海联谊生产的运动轴及研华 PCI-1240 四轴运动控制卡和 PCI-1761DI/O 卡,光学精密平台及现有光路系统。系统提出的研华工业控制计算机,PCI-1240 运动控制卡与伺服电机的控制方式实现了功能完善的运动控制功能,并结合PCI-1761 卡的数字量输出功能将数字信号输入到单片机,由单片机控制激光器激光的能量和激光的频率,使平台的运动控制和激光器具有一定的同步性和可调性。该系统可应用于目前材料强化的实验当中。具有非常高的应用价值和市场前景。本课题完成的主要工作有:1、对四轴运动控制平台进行机械和电气部分的设计,使之能够满足激光喷丸系统运动控制方面的要求。2、完成四轴平台的搭建,并把平台与激光器部分连接起来。3、完成控制系统软件的编制,其中包括平台的运动控制、激光能量参数和频率参数的输出功能。4、对设计平台进行调试,并对 ZCuSn10P1 铜合金进行激光喷丸实验,并对喷丸后的试样进行性能测试,达到预期的效果。第 6 页共 89 页 第二章第二章 运动控制平台的结构方案设计运动控制平台的结构方案设计2.12.1 电气部分的设计电气部分的设计伺服电机的控制方式伺服电机的控制方式分为位置控制,速度控制,转矩控制,分别介绍如下:8761、转矩控制:转矩控制方式是通过外部模拟量的输入或直接的地址的赋值来设定电机轴对外的输出转矩的大小,具体表现为例如 10V 对应 5Nm 的话,当外部模拟量设定为5V 时电机轴输出为 2.5Nm:如果电机轴负载低于 2.5Nm 时电机正转,外部负载等于 2.5Nm时电机不转,大于 2.5Nm 时电机反转(通常在有重力负载情况下产生) 。可以通过即时的改变模拟量的设定来改变设定的力矩大小,也可通过通讯方式改变对应的地址的数值来实现。应用主要在对材质的受力有严格要求的缠绕和放卷的装置中,例如饶线装置或拉光纤设备,转矩的设定要根据缠绕的半径的变化随时更改以确保材质的受力不会随着缠绕半径的变化而改变。2、位置控制:位置控制模式一般是通过外部输入的脉冲的频率来确定转动速度的大小,通过脉冲的个数来确定转动的角度,也有些伺服可以通过通讯方式直接对速度和位移进行赋值。由于位置模式可以对速度和位置都有很严格的控制,所以一般应用于定位装置。3、速度模式:通过模拟量的输入或脉冲的频率都可以进行转动速度的控制,在有上位控制装置的外环 PID 控制时速度模式也可以进行定位,但必须把电机的位置信号或直接负载的位置信号给上位反馈以做运算用。位置模式也支持直接负载外环检测位置信号,此时的电机轴端的编码器只检测电机转速,位置信号就由直接的最终负载端的检测装置来提供了,这样的优点在于可以减少中间传动过程中的误差,增加整个系统的定位精度。因为激光喷丸系统在喷丸过程中根据喷丸的需要应进行定位控制,所以本系统采用位置控制方式控制伺服驱动,通过外部输入脉冲确定速度和位移。此系统要求运动控制和激光发射的同步性,用位置控制方式可以精确控制轴的转动和速度。位置控制模式的接线图如图 2.1 所示。脉冲输入方式采用长线驱动器输入,接线端用 44,45,46,47 接口,脉冲输入也比较稳定。伺服驱动器上连接器 X4 处有五十针的插口,引出的线通过接线端子板与 PCI-1240 控制卡相连,并接 24V 外接电源,制作此接线头采第 7 页共 89 页 用 20 芯的屏蔽线,把线用电烙铁焊接在接线头子上,焊接时应严格要求 PCI-1240 与伺服电机的接线图焊接。接好后应在伺服驱动器上设置好长线驱动的参数值和脉冲输出方向等参数,再利用研华公司提供的调试软件进行调试,看是否接线正确。图 2.1 位置控制模式接线图第 8 页共 89 页 图 2.2 伺服电机与 PCI-1240 控制卡的接线图伺服驱动器与 PCI-1240 控制卡端子板的接线如图 2.2 所示。电气部分整体布局如图2.3 所示。第 9 页共 89 页 人机界面PCI-1240运动控制卡PCI-1761脉冲数字量 I/O 卡X、Y、Z、U四轴运动平台单片机脉冲输入激光器数字量研华工控机图 2.3 激光喷丸系统总体原理图通过设计的人机界面一方面通过 PCI-1240 运动控制卡控制四根轴的移动,另一方面通过 PCI-1761DI/O 卡输出数字量信号,数字信号通过单片机控制激光器,因此系统同时控制四轴运动控制平台的运动和设置激光器激光的能量选择,达到运动速度和激光脉冲相匹配的效果。第 10 页共 89 页 2.22.2 四轴运动平台的设计四轴运动平台的设计.1 角度调节台的设计角度调节台的设计9角度调节台原理:通过伺服电机控制轴的旋转,由联轴器带动涡轮蜗杆转动,通过涡轮蜗杆传动从而使平台转动起来。其结构图如图 2.4 所示,其内部结构如图 2.5 所示。图 2.4 角度调节台三维示意图第 11 页共 89 页 图 2.5 角度调节台爆炸图1,底盘 2,轴承 3,涡轮 4,蜗杆 5,铜套 6,转台座 7,线盒 8,支架 9,电机 10,手拨螺母 11,插座 12,联轴器 13,螺母 14,轴承涡轮蜗杆主要技术参数:1110安装中心距:23amm=蜗杆轴面模数(涡轮端面模数):0.35xm =蜗杆头数:11z =涡轮齿数:2120z =蜗杆分度圆直径:14dmm=涡轮分度圆直径:242dmm=齿顶圆直径:124 24.742 242.7aadmmmdmmm= +=+=齿根圆直径:124 2*1.23.1642 2*1.241.16ffdmmmdmmm= -=-=第 12 页共 89 页 蜗杆材料:45#钢 涡轮材料:灰铸铁轴承的选用:61807-RS 内径 35mm,外径 47mm,厚度 7mm618/5 内径 11mm,外径 11mm,厚度 3mm.2 四轴平台的总体设计四轴平台的总体设计三个平动轴的安装如图 2.6 所示。图 2.6 三轴平移台的装配图角度平移台安装在 Z 轴的平台上,这样就形成了 4 轴运动平台,三个平动加一个转动。喷丸试样放在角度调节台上,对试样进行喷丸时可对 X,Y,Z,U 轴进行点动和按轨迹运动。2.32.3 本章小结本章小结本章完成了运动控制系统机械部分和电气部分的设计,对控制平台进行装配,并完成了工业控制计算机控制卡和伺服驱动的接线工作。总体上实现了运动控制平台硬件的连接,使整个系统硬件部分形成一个整体,为下面完成软件的编制做好铺垫。第 13 页共 89 页 第三章第三章运动控制平台的软件编制运动控制平台的软件编制3.13.1 RS232RS232 串口的编制串口的编制.1 RS232RS232 串口的简介串口的简介RS-232-C 接口(又称 EIA RS-232-C)是目前最常用的一种串行通讯接口。它是在1970 年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标 准。它的全名是“数据终端设备(DTE)和数据通讯设第 14 页共 89 页 备(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 串口通信部分。串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。同步操作时,API 函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API 函数会立即返回,操作在后台进行,避免线程的阻塞。12无论那种操作方式,一般都通过四个步骤来完成:(1) 打开串口(2) 配置串口(3) 读写串口(4) 关闭串口.2 RS232RS232 的程序编制的程序编制图 3.1 是为本系统编制的 RS232 串口通讯部分,经过调试适用于本系统的串口传输。1712第 15 页共 89 页 图 3.1 RS232 串口界面串口号设置为 COM2,波特率选为 9600,数据位为 8,校验位为 None,停止位为 1。程序如附录 A 所示。此串口部分是用来监控伺服驱动器的一些信息的,数字量输入为 4 个16 进制数,且最后四位为 FFFF 时输入时转化为十进制输入,否则不输入值。此串口还未加入到运动控制软件中,在下一阶段的工作中会完成工控机的串口通讯,实现对伺服电机的实时监控。3.23.2 运动控制软件的编制运动控制软件的编制.1 运动控制卡的介绍运动控制卡的介绍目前国外己有很多著名的大公司开发出了功能多样的运动控制卡, 其中可编程多轴运动控制器PMAC(programmable Multi-Axes Controller)是一个很有代表性的产品。国内针对运动控制器的研究起步较晚,主要是高校或科研院所为自己设计的基于PC的数控系统的运动控制卡,并没有形成一种通用的、系列化的供应于市场的产品。根据实现控制方法的不同大致分为以下几种:基于大规模集成电路。利用其内部的计数器功能,通过编码器改变其脉冲输出频率,实现步进电机的速度和位置控制;基于微处理器。此方案使用元器件较多,可靠性不高,运行速度慢,控制精度不高,软硬件配置灵活性差;基于专用集成电路ASIC。该方案采用一块芯片就可以完成PID控制算法、编码器信号的处理等多种功能,并且其硬件电路的配置具有一定的灵活性,但由于受运算速度的限第 16 页共 89 页 制,复杂的控制算法和功能在该系统中难以实现;基于DSP型。此方案如果将DSP和PC机结合起来,可充分利用PC机现有的操作环境和资源,同时利用DSP运算速度快的优势,使PC机从大量复杂的运算中解脱出来做其它工作。这是未来运动控制卡的发展趋势。13.2 PC+PC+运动控制卡的控制方案介绍运动控制卡的控制方案介绍采用PC+运动控制卡作为上位控制,可充分利用计算机资源,用于比较复杂,且柔性比较强的设备。从用户使用的角度来看,基于PC机的运动控制卡主要是硬件接口(输入/输出信号的种类、性能)和软件接口(运动控制函数库的功能函数)的差异。运动控制卡是基于PC机各种总线的步进电动机或数字式伺服电动机的上位控制单元,总线形式也是多种多样。由于计算机主板的更新换代,ISA插槽越来越少,PCI总线的运动控制卡应该是目前的主流。卡上专用CPU与PC机CPU构成主从式双CPU控制模式。PC机CPU可以专注于人机界面、实时监控和发送指令等系统管理工作;卡上专用CPU用来处理所有运动控制的细节:升降速计算、行程控制、多轴插补等,无需占用PC机资源。同时随卡还提供功能强大的运动控制软件库:C语言运动库、Windows DLL动态链接库等,让用户更快、更有效地解决复杂的运动控制问题。运动控制卡采用了开放式结构,使用简便,功能丰富,可靠性高。若采用PC机的PCI总线方式,卡上无需进行任何跳线设置,所有资源自动配置,并且所有的输入、输出信号均用光电隔离,提高了控制卡的可靠性和抗干扰能力;在软件方面提供了丰富的运动控制函数库,以满足不同的应用要求。用户只需根据控制系统的要求编制人机界面,并调用控制卡运动函数库中的指令函数,就可以开发出既满足要求又成本低廉的多轴运动控制系统。运动函数库为单轴及多轴的步进或伺服控制提供了许多运动函数,如单轴运动、多轴独立运动、多轴插补运动等等。另外,为了配合运动控制系统的开发,还提供了一些辅助函数,如中断处理、编码器反馈、间隙补偿及运动中变速等。正是由于运动控制卡的开放式结构,强大而丰富的软件功能,对于使用者来说,进行二次开发的设计周期缩短了,开发手段增多了,针对不同的数控设备,其柔性化、模块化、高性能的优势被充分利用。14.3 系统中系统中 PCI-1240PCI-1240 运动控制卡和运动控制卡和 PCI-1761PCI-1761 卡的介绍卡的介绍PCI-1240 4 轴步进轴步进/ /脉冲伺服马达控制卡脉冲伺服马达控制卡的设计,适用于通用型极端动作应用。15PCI-1240 为PCI 总线用高速4 轴动作控制卡,可简化步进式及脉冲式伺服马达控制,并充分发挥马达潜能。本卡使用NOVA MCX314 动作ASIC芯片,内建多种动作控制函数,第 17 页共 89 页 如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=16 MHz)。驱动时可自由改变脉冲输出的驱动速度。位置控制:每一轴配备一个32-位逻辑位置计数器和一个32-位真实位置计数器。逻辑位置计数器累计输出脉冲数。真实位置计数器则累计来自外部编码器或线性量尺的回授脉冲数。开发环境Windows应用程序设计的最大特点就是消息处理。所有的Windows应用程序都是基于消息的,每一个Windows程序都要求有一个消息循环,应用程序中的每一个窗口都要求有一个消息处理器。不论什么时候,只要出现一个事件,Windows系统就会产生一条消息。因此,Windows应用程序设计的核心就是传递消息,读入消息,处理消息。Windows系统是多任务系统,如果有消息要处理,它就占用CPU处理消息,如果一个程序不再有要处理的消息,系统就询问其他正在运行的程序是否有消息要处理,并把控制权转给有消息要处理的应用程序。Visual C+是一个在Windows环境下的程序开发工具,它是可视化的,面向对象的,采用事件驱动的。它屏蔽了Windows环境下程序设计的复杂性,使Windows应用程序设计变得简单、方便、快捷。利用PCI-1240卡的动态链接库DLL可以很快地开发出Windows平台下的运动控制系统。PCI-1240卡动态链接库是标准第 18 页共 89 页 的Windows 32位动态链接库,选用的开发工具应支持Windows 标准的32 位DLL调用。动态链接库函数调用方法在VC中调用动态链接库DLL中函数有两种方法。隐式调用需要DLL函数声明头文件ADVMOT.H;编译连接时用的导入库文件ADVMOT.lib;动态链接库文件ADVMOT.dll;设备驱动程序ADVMOT.sys。当建立工程之后,在VC集成环境中点击“/project/settings”菜单,弹出“project settings”对话框。选“Link”选项卡,在“object/library modules”栏内输入导入库文件名ADVMOT.lib,单击“OK”按钮。在调用DLL函数的源代码文件开始处包含ADVMOT.h头文件。之后则可以按照调用内部函数一样调用DLL函数。显式调用只需要如下文件动态链接库文件ADVMOT.DLL和设备驱动程序ADVMOT.sys。显式调用方法需要调用Windows API函数加载和释放动态链接库。17此软件运用隐式调用链接库的方法调用PCI-1240控制卡运动函数的方法,编程时应把研华提供的几个头文件复制到编程目录中,这几个头文件分别是AdvMotApi.h、AdvMotDev.h、AdvMotDrv.h、AdvMotErr.h、AdvMotPropID.h,头文件和.lib文件路径定义好后进行运动控制软件的编程。控制运动函数的用法20PCI-1240控制卡的函数库中提供常用的单轴运动、多轴独立运动控制、多轴插补运动控制、多轴联动的函数。函数的含义和类型可参考PCI-1240手册,上面例举了运动函数库所有函数的用法。例如: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所示第 19 页共 89 页 图3.2 设置变量名PCI-1761DI/OPCI-1761DI/O卡卡是一款PCI总线的继电器输出及隔离数字量输入板卡。它提供16路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控制卡头文件中重复定义的宏应进行重定义,结构体重复定义的应进行添加命名空间,防止编译时产生错误,在编程过程共会用到以下重要函数:LRESULT DRV_DeviceGetList ( DEVLIST * DeviceList, SHORT MaxEntries, SHORT * OutEntries );用途:返回已安装设备的设备列表(DeviceList) ,该列表将在后续操作中使用。请注意安装在串口(COM ports)或CAN端口的子设备不包含在该列表中。第 20 页共 89 页 LRESULT DRV_DioWriteBit ( LONG DriverHandle, LPT_DioWriteBit lpDioWriteBit );用途:在设备句柄 DriverHandle 指向的设备上,向某个DO (Digital Output)端口(Port)写一个位的数据。LRESULT DRV_DioWritePortByte ( LONG DriverHandle, LPT_DioWritePortByte lpDioWritePortByte );用途:在设备句柄DriverHandle 指向的设备上,向某个DO端口写一个字节的数据。LRESULT DRV_DioGetCurrentDOByte ( LONG DriverHandle, LPT_DioGetCurrentDOByte lpDioGetCurrentDOByte );用途:在设备句柄DriverHandle 指向的设备上,从相应的寄存器里,读取某数字量输出端口(Port)的状态,返回一个字节的数据。如果设备没有输出状态的寄存器,驱动将回返一个自身维护的之前用户设定的输出状态。两张卡应集成在一个界面上,同时控制平台的运动和激光器激光的参数选择与激光发射,轴在运动过程中应显示其具体的位置,从而进行精确定位,保证喷丸位置的精确度。集成过程的.lib文件的路径都放在LINK的“object/library modules”中,用双引号隔开,达到同时调用这两张卡的链接库。调用方式如图3.3所示。18第 21 页共 89 页 图3.3 调用.lib文件.4 基于基于 Visual C+的运动控制软件的开发的运动控制软件的开发编程时首先设计好界面的功能,首先界面需有点动和连续运动的功能,同时还具有根据喷丸路径所设计的运动路径,喷丸时速度按照激光参数而定,界面如图 3.4 所示。设计号界面后根据要求设置好消息响应函数,并设置好变量名和变量类型,再把变量初始化,准备工作结束后,在消息响应函数中添加所需要的函数,一些运动函数可参考PCI-1240 用户手册,根据这些函数去设计所需要的运动功能,在轴的运动过程中应显示出轴的状态和运动时轴的反馈值,有助于判断轴当前所在位置,在编程中应添加OnTimer 时间相应函数,可方便的观察到轴的状态和当前位置。在打开控制卡之后轴就应该在准备运动状态,但是,在伺服准备输出时轴才会运动,编程时必须注意这几个问题。根据激光器的参数要求应把 PCI-1761 卡的数字量输出功能集成在一个界面上,使激光器与运动控制平台的同步性增强,提高喷丸的精确度。两张卡合成在一个界面上时需注意宏的重定义与变量的重定义问题。第 22 页共 89 页 图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控制卡输出口的状态从而实现单片机输入口状态的第 23 页共 89 页 改变,进而实现对激光器控制脉冲形式的更改。设搭接率为a,光斑直径为d(0.5mm1.5mm),激光频率为n,激光频率和激光能量由D2D7端口设置,这部分参数由PCI-1761卡控制输出,通过单片机控制激光频率和能量。X、Y轴按设定的喷丸轨迹运动,Z轴调整激光的焦距,U轴运用于对柱面类零件的喷丸中。在喷丸过程中X和Y轴的速度由搭接率、光斑直径和激光频率三个参数而定,在选好参数后进行按横向或纵向的喷丸方式运动,速度是:,且sndav/mm) 1-()01. 0-1 (=两轴的速度相同,喷丸中X,Y轴相互切换,形成一个矩形喷丸区域。程序如附录B所示。喷丸轨迹如图3.5所示,激光频率和激光能量的设定如表3.1所示。图3.5 喷丸轨迹图表3.1 激光参数选择表p1.7P1.6P1.5P1.4P1.3P1.2控制内容000000激光器关闭000能量1001能量2第 24 页共 89 页 010能量3011能量4100能量5101能量6110能量7111001单次喷丸能量8000能量1001能量2010能量3011能量4100能量5101能量6110能量7111011频率10HZ能量8000能量1001能量2010能量3011能量4100能量5101能量6110能量7111100频率5HZ能量8000能量1001能量2010能量3011能量4100能量5101能量6110001频率2HZ能量7第 25 页共 89 页 111能量8000能量1001能量2010能量3011能量4100能量5101能量6110能量7111001频率1HZ能量83.33.3 本章小结本章小结本章进行了运动控制软件的编程,结合激光喷丸的要求进行功能设计,实现了 PCI-1240 运动控制卡和 PCI-1761DI/O 卡的功能集成,使软件具有运动控制和数字量输出功能,并设计了一个可用于对电机实现实时监控的 RSR232 串口通讯软件,用在后续工作的对软件的完善中。第 26 页共 89 页 第四章第四章激光喷丸改性实验激光喷丸改性实验4.14.1 激光喷丸激光喷丸技术简介技术简介激光喷丸技术(Laser Shock Peening)是利用高功率密度、短脉冲的激光束诱导的高压冲击冲击波对金属零部件进行表面改性的一种技术,冲击波产生的机械“冷作”作用达到材料被压缩的效果。由于激光束对零件表面不产生加热效应,因此在整个过程中金属零件的表面是不会被加热的。事实上,在激光喷丸过程中零件是处在“微锻”状态, 高能脉冲激光是一点接一点地作用在临界区域上的。激光喷丸原理示意图见图 4.1。在进行激光喷丸工艺处理前,要在需处理的表面上敷设上一层不透明的涂敷层(典型的如黑漆或胶带)和一层约束层(典型的如流动的水)。激光脉冲通过约束层并作用在不透明的涂敷层上,使其部分蒸发。蒸汽吸收剩余的激光并产生急剧膨胀的等离子流。膨胀的等离子流被限定在零件表面和约束层之间,并产生一个急速增大的高压冲击波传入金属内。当冲击波的波峰强度高于金属的冲击屈服强度时,金属产生屈服,金属的表面被“冷作”或发生塑性变形。222120图4.1 激光喷丸原理示意图4.24.2 铜合金的激光喷丸实验铜合金的激光喷丸实验.1 材料选择与试样制备材料选择与试样制备1.材料的选择试样材料为 ZCuSn10P1 铜合金,其化学成分和机械性能参数如表 4.1 所示。第 27 页共 89 页 ZCuSn10P1 是典型的锡磷青铜,是以电解铜为原料,经高温烧结,通过气压离心铸造加工而成。该材料可用于制造在重载、高速、较高温条件下工作的受强烈摩擦的零件,如滑动轴承、连杆衬套、齿轮、蜗轮等,这些产品被广泛应用于纺织机械、注塑机械、矿山机械、工程机械、汽车工业等领域。表 4.1 ZCuSn10P1 合金的化学成分和机械性能成分ZnPSnFeSbMnPbNiCu含量(%)0.050.051.09.050.050.250.10其余b(MPa)s(MPa)(%)E(GPa)(kg/m3)机 械性 能330170511087600.332.试样的制备试样经激光线切割加工而成,尺寸为直径 30 mm、厚度 4 mm。如图 4.2,所有试样的表面均经过 5001200的砂纸打磨,采用颗粒直径 0.5 nm 的抛光粉和抛光剂在金相试样磨抛机进行抛光处理,抛光 2 小时成镜面,抛光后表面粗糙度为 0.05 m。然后用丙酮进行超声波清洗后,放入干燥箱进行保存,最后经过一定时间的自然时效处理,试样中由机加工引起的残余应力达到最低水平。同时要保证上下表面的平行度。试样表面覆盖一定厚度的吸收层,紧贴吸收层的是约束层,然后固定靶材进行激光冲击实验。 图 4.2 抛光试样 图 4.3 SpitLight2000 型 Nd:YAG 激光器系统第 28 页共 89 页 图 4.4 SpitLight2000 型 Nd:YAG 激光器系统.2 实验装置及仪器实验装置及仪器激光冲击实验在江苏大学激光研究所进行。本实验采用德国 InnoLas 公司生产的SpitLight2000 型脉冲 Nd:YAG 固体激光器。该激光器脉宽为 8 ns,可选波长为 1064 nm 、532 nm、355 nm,脉冲重复频率为 110 Hz,能量稳定性2.5 %,出口光斑大小 9 mm,发散角0.5 mrad,指向稳定性25 umrad。图 4.4 为所用激光器系统。激光器的输出能量大小可以通过控制器来调节,激光能量的具体数值采用激光功率计进行测量,最大激光脉冲能量为 2 J。表 4.2 为本实验所用到的激光参数。表 4.2 SpitLight2000 型激光器的技术参数 工作物质Nd:YAG重复频率(Hz)8激光波长(nm)1064光斑能量分布高斯单脉冲能量(J)2光斑形状圆形激光脉冲宽度(ns)8光斑直径(m)100500第 29 页共 89 页 图 4.5 激光工艺参数控制界面.3 实验参数方案实验参数方案表 4.3 中列出了本实验中用到的激光参数,本实验采用激光单次冲击,选择黑漆为吸收层。由于激光能量和光斑直径很小,故约束层选择声阻抗高、约束刚性较好的 4 mm 厚 K9 玻璃。K9 玻璃与水相比,更能提高冲击波峰值压力,增加强化效果。激光器出口光斑直径在 9 mm,经过一系列的透镜聚焦后照射到试样上。在激光冲击试验前,将光斑直径调到所需的大小,在感光纸上测得的光斑直径为 400 m。冲击区为 2010 mm2的矩形区域,以便进行后续的性能测试。表 4.3 激光冲击试验参数试样编号光斑间距(mm)激光能量(mJ)试样编号光斑间距(mm)激光能量(mJ)10.575540.510202175551102031.575561.51020.4 后续性能测试后续性能测试1.1.表面形貌表面形貌图中是激光能量为 755 mJ 下,不同光斑间距下的表面形貌。第 30 页共 89 页 (a)间距 0.5 mm (b) 间距 1 mm (c) 间距 1.5 mm图 4.6 激光能量为 755 mJ 时的形貌2.2.残余应力测试残余应力测试残余应力的测量方法可以分为有损和无损两大类。有损测试方法就是应力释放法,也可以称为机械的方法;无损方法就是物理的方法。机械方法目前用得最多的是钻孔法,其次还有针对一定对象的环芯法。物理方法中用得最多的是X射线衍射法,其他主要物理方法还有中子衍射法、磁性法和超声法。X射线衍射法依据X射线衍射原理,即布拉格定律。布拉格定律把宏观上可以准确测定的衍射角同材料中的晶面间距建立确定的关系。材料中的应力所对应的弹性应变必然表征为晶面间距的相对变化。当材料中有应力存在时,其晶面间距d必然因晶面与应力相对取向的不同而变化,按照布拉格定律,衍射角2也会相应改变。因此可以通过测量衍射角2随晶面取向不同而发生的变化来求得应力。28本实验采用 X 射线衍射法测定,X 射线不属于硬射线,在金属表面的有效穿透深度通常为几微米至几十微米,因此测得的应力是该深度方向应力的加权平均值。显然试样的表面状态对测量结果有决定性影响。激光冲击微凹坑试验结束,用脱漆剂去除表面的黑漆,使表面无黑漆残留,防止影响测量效果。激光冲击微凹坑前后的残余应力测试采用邯郸爱斯特应力技术有限公司的 X-350A 型 X 射线应力测定仪,测试设备如图 4.7 所示。第 31 页共 89 页 图 4.7 X-350A 型 X 射线应力测定仪测试方法采用侧倾固定法,交相关法定峰;采用Crk辐射, (211)晶面衍射,衍射峰在144.4左右,X光管电压20 KV,管电流5.0 mA,应力常数180 MPa/度,侧倾角分别取0、24、35、45,扫描起始和终止角分别为150和138,2角扫描步距0.10,计数时间1.00 s,准直管直径2 mm。激光冲击前后ZCuSn10P1铜合金试样的残余应力测试报告如下:(a)未冲击区第 32 页共 89 页 (b)激光能量 755 mJ, 间距 0.5 mm, 冲击后图 4.8 残余应力测试结果图 4.8 为激光能量 755 mJ、光斑间距 0.5 mm 的试样的残余应力测试结果,由图4.8(a)和图 4.8(b)可得,在未冲击区域的应力值为260 MPa,呈现压应力状态,经分析是由于打磨和抛光过程中产生了较大的残余压应力,而冲击区域即微凹坑造型处的残余应力值为360 MPa,激光冲击微凹坑后产生的应力100 MPa。同样激光能量 1020 mJ、光斑间距 0.5 mm 冲击后产生了170 MPa 的残余压应力。3.纳米压痕实验材料的力学性能是评价材料质量的重要指标之一,而材料的微观力学性能(主要是弹性模量和硬度)的理论研究主要有以下几种方法:经典力学方法、应变梯度塑性理论、Hainsworth 方法、体积比重法和分子动力学模拟方法。材料力学性能测量实验,一类是简单应力状态的实验,如单轴拉伸、压缩和扭转等,主要获得材料的应力应变等数据;另一类是复杂应力状态的接触实验,如硬度实验,主要用来检验产品的质量和制定合理的加工工艺,用以表征材料抵抗局部变形的能力,是衡量材料硬度的一种性能指标。由于微凹坑造型特征尺寸小,对于尺度在几百 m 量级及以下的样品,用常规的硬度测试方法比较困难。与之相比,接触实验在微尺度之下更为方便和有效。例如压入测试能提供硬度和弹性模量等,划入测试能提供诸如断裂起始的时效机理和区分韧性和脆性断裂方式等的定量信息。A.W. Warren 等人模拟了纳米压痕实验对材料表面完整性和尖端几何形貌的影响,取得了一系列的成果。纳米压痕测试技术已日渐成熟,成为微纳米尺度力学测量主要的测试方式之一。第 33 页共 89 页 3.1 纳米压痕测试的基本思想和理论基础纳米压痕测试的基本思想和理论基础 材料基本性能参数的计算材料基本性能参数的计算纳米压痕采用连续测量加载和卸载过程中的位移、载荷作为已知量,计算出硬度和弹性模量。实验中使用玻氏压针可以获得如图 4.9(a)所示的典型的载荷位移曲线。图4.9(b)为加载过程中 压针压入剖面的示意图。加载过程中,被测试样表面会产生和压针形状相同的压痕,关键参数有压入接触深度和接触半径。卸载过程中,可从最大cha压力、最大压入深度、卸载后的残余深度和卸载曲线的顶部斜率(弹性接触fh/SdP dh=刚度)中获得硬度和弹性模量。2930(a)载荷位移曲线 (b)纳米压痕测试原理图图 4.9 纳米压痕载荷位移曲线和原理图纳米硬度()定义为:H3132 (3.1)maxcPHA=其中是纳米压痕过程中的最大载荷,是最大载荷时接触面积的投影。maxPcA弹性模量由压头的形状函数和载荷位移曲线(载荷 P,位移 h)确定:cA (3.2)22111tEEErtnn-=+其中是简约弹性模量(又称折合模量或复合模量) ,Er (3.3)122ccdpSErdhAAppb=第 34 页共 89 页 和,和分别是试样和压头材料的泊松比与弹性模量。对于金刚石压头,取tEEtEt114 0GPa,取 0.07。大多数的金属材料,的取值范围是 0.250.35,而当t0.250.1 时,压入模量的估算误差在 5.3 %以内,因此,通常取为 0.25。式E(3.3)中,S 为图 4.9(a)中载荷位移曲线图中卸载曲线的斜率。是与压针形状有关的常数:玻氏压针1.034,圆柱压针1.000,维式压针1.012,该式普遍适用于任意一种轴对称形状的压针,也适用于弹塑性接触,且不受材料凹陷和凸起的影响。 纳米硬度与宏观硬度的比较纳米硬度与宏观硬度的比较纳米压痕测试与以往的宏观硬度和显微硬度测试不同。测量宏观及显微硬度时,卸载后可直接观测试样表面留下的压痕接触面积。在微/纳米级,材料弹性变形比例显著增大,卸载后材料表面留下的压痕面积将小于在最大载荷时试样与压头的接触面积,也就是说,测试材料纳米硬度时,同时考虑了弹性变形与塑性变形。在纯弹性接触过程中,残余接触面积非常小,显微压入硬度的定义将导致压入硬度无穷大。这种微小的差异对使用球形压针压入的纳米压痕实验特别重要,因为在使用球形压针时,材料更容易发生纯弹性变形。其他类型的压针端部同样存在一定的曲率半径,在很小的压入深度下产生弹性变形。在这些情况下,显微压入硬度定义的值会比纳米硬度定义值大。3.2 激光冲击微凹坑的纳米压痕实验激光冲击微凹坑的纳米压痕实验硬度测试实验所用装置为原位纳米力学测试系统,如图 4.10 所示。该装置可以实现多种加载模式(准静态 Quasistatic、动态 Dynamic、超声态 Acoustic) ,一般使用的是准静态测量,加载载荷范围为:1 N-1 mN。可以在光镜模式(图 4.11(a) )以及原位成像模式(图 4.11(b) )下对材料表面进行压痕实验获得材料的弹性模量及硬度值。本次试验加载力为 1000 N。第 35 页共 89 页 图 4.10 原位纳米力学测试系统 (a) 光镜模式下 (b) 原位成像模式下图 4.11 微冲击后试样表面压痕实验图 4.12 不同激光能量下凹坑中心处的压深加卸载曲线第 36 页共 89 页 由于微凹坑的直径比较小,通过常规的 X 射线衍射仪测得的残余应力值仅是表层的平均残余应力,测量的误差较大,所以凹坑内部的残余应力可由纳米力学测试系统得到的载荷压深加卸载曲线判断。如图 4.12 为光斑直径 400 m,光斑中心距 0.5 mm,激光能量 755 mJ、1020 mJ 下凹坑中心处的压痕加载曲线对比。可见激光能量增加后,凹坑中心的纳米硬度也随之增大。激光能量 1020 mJ 下的压深加卸载曲线在激光能量为 755 mJ的压深加卸载曲线的左侧。.5 实验结论实验结论从测定的残余应力可以看出,经过激光喷丸后的残余压应力值增加,且激光能量越大材料的表面残余压应力越高。从纳米压痕实验可以看到喷丸后的硬度也有所增加,且激光能量越大冲击后材料表面的硬度就越高。从而可以得出结论:激光冲击技术可以在铜合金试样的表层形成一定厚度的残余压应力,从而能够提高铜合金的硬度、强度和使用寿命。4.34.3 本章小结本章小结本章对编制的运动控制系统进行调试,对铜合金进行了激光喷丸实验,并对冲击后试样的残余应力和纳米硬度进行了测试,详细叙述了实验原理、过程和结论,因实验的复杂性,作者未对其进行深入的分析。本章通过对铜合金试样的激光冲击实验,验证了激光喷丸技术可以在材料表面产生残余压应力,从而可以提高铜合金的硬度、强度和使用寿命。第 37 页共 89 页 结结 论论本文对激光喷丸系统运动平台进行机械部分与电气部分合理的设计,并且运用研华PCI-1240 四轴运动控制卡和 PCI-1761DI/O 卡进行喷丸系统控制软件的编制,运动控制卡控制四轴平台的运动,PCI-1761 卡控制激光器激光参数的选择,达到平台的运动和激光喷丸具有较高的同步性,按照激光参数的不同,平台运行的速度也会做出相应的调整,分为横向喷丸和纵向喷丸两种喷丸方式,从而完成了激光喷丸所需要的软件平台控制系统。机械部分的三平动一转动的设计很好的实现了柱面类零件喷丸的要求,喷丸时也可以精确的定位,此系统的精度和柔性也有了很大的改进,对于激光喷丸实验具有重要意义。经过后续的对铜合金的喷丸实验验证了此运动控制系统能够完成激光喷丸的一系列要求。本文所设计的软件目前只适用于平面类零件的喷丸实验,但在柱面类零件的喷丸轨迹的设定还有待设计和编制,此软件也未把串口通信这一块加进去,只是单独的编制了一个 RS232 串口程序,在今后的工作中希望能在这几个方面能有所提高,编制出一个能够即适用于平面类又适用于柱面类零件的运动控制软件,并且能够实现工控机的串口通信。第 38 页共 89 页 致致 谢谢毕业论文即将完稿之际,我的心情起伏难平。学海无涯,孤舟难行,每每想起鼓励我前行和成长的师长、同学,我内心就充满了感激。这篇论文的顺利完成,离不开他们几个月来一贯的支持、关心和帮助。我要衷心感谢我的导师周建忠老师和陈寒松老师。在他们的精心指导和亲切关怀下,学生才能够克服种种困难,顺利完成毕业设计和论文撰写工作。导师渊博的学识、严谨的治学态度、敏锐的科学洞察力、宽厚平易的仁者风范和对科学的不懈追求、对事业的忘我奉献精神都无时无刻不令学生感动和鼓舞,并激励学生在以后的学习、生活中不畏艰险、拼搏进取。在此,我还要感谢在同一组一起做毕业设计的同学,正是由于你们的帮助和支持,我才能克服一个一个的困难和疑惑,直至本文的顺利完成。最后,向百忙之中参加论文评审和论文答辩的各位专家、教授表示衷心的谢意!第 39 页共 89 页 参考文献参考文献1 王家军,齐东莲. 运动控制系统的发展与展望. 电气时代,2004.10.2 吴宏,蒋仕龙,龚小云等. 运动控制器的现状与展望. 制造技术与机床.2004.1.3 张春雷,运动控制新技术研究,2000.64 闫砺锋.四川大学硕士学位论文,运动控制技术研究及运动控制板卡开发.2001.5.5 孔慧勇.四川大学硕士学位论文,基于运动控制卡的全闭环控制系统研究.2003.56 邓星钟等.机电传动控制(第四版).武汉:华中科技大学出版社.2006.10.7 秦曾煌.电工学(第七版)(下册)电子技术.北京:高等教育出版社.2009.6.8 松下公司.松下 MINAS A5 系列交流伺服马达使用说明书.2010.2.9 黄卫东,任国栋.Pro/ENGINEER Wildfire2.0.北京:中国林业大学出版社;北京大学出版社.2006.7.10 马履中.机械原理与设计(上册).北京:机械工业出版社.2009.2.11 申永胜.机械原理教程(第 2 版).北京:清华大学出版社.2005.12.12 龚建伟,熊光明. Visual C+/Turbo C 串口通信编程实践.北京:电子工业出版社,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 Preventing Fatigue Failures 第 40 页共 89 页 with Laser Peening, MFN(Metal Finishing News), Vol.8 January Issue year 2007.22 Interview, Laser Peening An Affordable Solution to Metal Fatigue, MFN (Metal Finishing News), Vol.7 November Issue year 2006.23 P.Peyer, R. Fabbro. Laser shock processing: a review of the physics and applicationJ. Optical and Quantum Electronics,1995,27:1213121924 邹鸿承,戴蜀娟,徐明英等.激光冲击处理提高铝合金性能的研究J.中国激光,1995,A22(6):476-48025 张永康.激光冲击强化效果的直观判别与控制方法研究J.中国激光,1997,A24(5):467-471.26 Y.Zhang,S.Zang,X.Zang et al.Investigation of the surface qualities of laser shock processed zones and the effect on fatigue life of aluminum alloy J.Surface and Coatings Technology,1997,92:10410927 Chang Ye,Sergey Suslov,Bong Joong Kim,Eric A.Stach,Gary J.Cheng.Fatigue performance improvement in AISI 4140 steel by dynamic strain aging and dynamic precipitation during warm laser shock peening.ScienceDirect Acta Materialia 59(2011) 1014-102528 袁发荣.残余应力测试与计算.湖南大学出版社,198729 L Angrisani, P Daponte, A Pietrosanto, C Liguori. An image based measurement system for the characterization of automotive gaskets. Measurement 25(1999):16918130 李庆利,张少军,李忠富等.一种基于多项式插值改进地亚像素细分算法.北京科技大学学报,2003,25(3):28028331 黎明,温诗铸.纳米压痕技术理论基础.机械工程学报.2003.332 Johnson K L. Contact Mechanics. Cambridge University Press,1985第 41 页共 89 页 附录附录 A ARS232RS232 串口通信的程序:串口通信的程序:BOOL CRS232CommDlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization herem_mscom.SetCommPort(2);/串口 2m_mscom.SetInBufferSize(1024);/设置输入缓冲区的大小,Bytesm_mscom.SetOutBufferSize(1024);/设置输出缓冲区的大小,Bytes第 42 页共 89 页 if(!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);/设置当前接收区数据长度为 0return TRUE; / return TRUE unless you set the focus to a controlHCURSOR CRS232CommDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CRS232CommDlg:OnSendButton() / TODO: Add your control notification handler code hereUpdateData(true);CByteArray sendArr; WORD wLength;wLength=m_send.GetLength();sendArr.SetSize(wLength);for(int i=0;iwLength;i+)sendArr.SetAt(i,m_send.GetAt(i);m_mscom.SetOutput(COleVariant(sendArr);void CRS232CommDlg:OnClearButton() / TODO: Add your control notification handler code herem_send=;UpdateData(false);BEGIN_EVENTSINK_MAP(CRS232CommDlg, CDialog) /AFX_EVENTSINK_MAP(CRS232CommDlg)ON_EVENT(CRS232CommDlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnCommMscomm1, VTS_NONE)/AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()void CRS232CommDlg:OnOnCommMscomm1() 第 43 页共 89 页 / TODO: Add your control notification handler code hereUpdateData(true);VARIANT variant_inp;COleSafeArray safearray_inp;long i=0,j,k;int len;int a;char b;CString recv;CString recv1;CString recv2;unsigned long value;char rxdata1000;CString tmp;m_recv=;m_recv1=;UpdateData(FALSE);switch (m_mscom.GetCommEvent()case 2:variant_inp=m_mscom.GetInput();safearray_inp=variant_inp;len=safearray_inp.GetOneDimSize();for(i=0;ilen;i+)safearray_inp.GetElement(&i,&rxdatai); rxdatai=0; recv=rxdata;m_recv+=recv;/一般输出for(i=4;i8;i+)recv2+=rxdatai;if(recv2=FFFF) for(i=0;i4;i+)recv1=0;recv1=rxdatai; sscanf(recv1,%x,&value);/将 CString 表示的十六进制字符串转化为十六进制数第 44 页共 89 页 tmp.Format(%ld,value);/将十六进制数转化为十进制字符串 m_recv1+=tmp; UpdateData(false);else /m_recv=;m_recv1=0;UpdateData(false);break;default:break;第 45 页共 89 页 附录附录 B B运动控制软件程序:运动控制软件程序:BOOL CCompareDlg:OnInitDialog()U32Result;ULONGi=0,deviceNumber=0;CStringstrTemp;CDialog:OnInitDialog();/ TODO: Add extra initialization hereResult = Acm_GetAvailableDevs(m_avaDevs,MAX_DEVICES,&deviceNumber);if (Result!=SUCCESS)MessageBox(no available device in system,Compare,MB_OK);return TRUE;m_AvailableDevice.Clear();for (i=0;ideviceNumber;i+)m_AvailableDevice.AddString(m_avaDevsi.szDeviceName);m_AvailableDevice.SetCurSel(0);m_dwDevNum=m_avaDevs0.dwDeviceNum;ProcessInit();ProcessInit1();return TRUE; / return TRUE unless you set the focus to a controlvoid CCompareDlg:OnBtnOpen() 第 46 页共 89 页 / TODO: Add your control notification handler code hereULONGi=0;U32Result;HAND Devhand;F64CurPos;ULONGslaveDevs16;CString strTemp;ULONGbuffLen=64,AxisPerDev=0,AxisNumber=0;UpdateData(TRUE);sscanf(LPCSTR)m_StrDevNumber, %8x, &m_dwDevNum);Result = Acm_DevOpen(m_dwDevNum, &m_Devhand);if (Result != SUCCESS)MessageBox(Open Device Failed,Compare,MB_OK);return;buffLen=4;Result = Acm_GetProperty(m_Devhand,FT_DevAxesCount,&AxisPerDev,&buffLen);if (Result!=SUCCESS)Acm_DevClose(&Devhand);MessageBox(get axis number error,Compare,MB_OK);return;AxisNumber=AxisPerDev;buffLen=64;ZeroMemory(slaveDevs,sizeof(slaveDevs);Result = Acm_GetProperty(m_Devhand,CFG_DevSlaveDevs,slaveDevs,&buffLen);if (Result = SUCCESS)i=0;while (slaveDevsi != 0)AxisNumber+=AxisPerDev;i+;m_ulAxisCount=AxisNumber;for(AxisNumber=0;AxisNumberm_ulAxisCount;AxisNumber+)第 47 页共 89 页 /Open every Axis and get the each Axis Handle/And Initial property for each Axis /Open Axis Result =Acm_AxOpen(m_Devhand, (USHORT)AxisNumber, &m_AxishandAxisNumber);if(Result != SUCCESS)MessageBox(Open Axis Failed,Compare,MB_OK);return;Acm_AxSetCmdPosition(m_AxishandAxisNumber, 0);Result =Acm_AxGetCmdPosition(m_Axishand0,&CurPos);if (Result=SUCCESS)strTemp.Format(%.0f,CurPos);m_editXCmdCnt.SetWindowText(strTemp);Result =Acm_AxGetActualPosition(m_Axishand0,&CurPos);if (Result=SUCCESS)strTemp.Format(%.0f,CurPos);m_editXActCnt.SetWindowText(strTemp);Result =Acm_AxGetCmdPosition(m_Axishand1,&CurPos);if (Result=SUCCESS)strTemp.Format(%.0f,CurPos);m_editYCmdCnt.SetWindowText(strTemp);Result =Acm_AxGetActualPosition(m_Axishand1,&CurPos);if (Result=SUCCESS)strTemp.Format(%.0f,CurPos);m_editYActCnt.SetWindowText(strTemp);Result =Acm_AxGetCmdPosition(m_Axishand2,&CurPos);第 48 页共 89 页 if (Result=SUCCESS)strTemp.Format(%.0f,CurPos);m_editZCmdCnt.SetWindowText(strTemp);Result =Acm_AxGetActualPosition(m_Axishand2,&CurPos);if (Result=SUCCESS)strTemp.Format(%.0f,CurPos);m_editZActCnt.SetWindowText(strTemp);Result =Acm_AxGetCmdPosition(m_Axishand3,&CurPos);if (Result=SUCCESS)strTemp.Format(%.0f,CurPos);m_editUCmdCnt.SetWindowText(strTemp);Result =Acm_AxGetActualPosition(m_Axishand3,&CurPos);if (Result=SUCCESS)strTemp.Format(%.0f,CurPos);m_editUActCnt.SetWindowText(strTemp); m_bInit=TRUE;m_XbInit = TRUE;m_YbInit = TRUE;m_ZbInit = TRUE;m_UbInit = TRUE;SetTimer(1, 100,NULL);void CCompareDlg:OnBtnClose() / TODO: Add your control notification handler code hereUSHORT usAxisState32;UINT AxisNum;/Stop Every Axesif (m_bInit = TRUE)for (AxisNum=0;AxisNumm_ulAxisCount;AxisNum+)第 49 页共 89 页 Acm_AxGetState(m_AxishandAxisNum, &usAxisStateAxisNum);if(usAxisStateAxisNum=STA_AX_ERROR_STOP)Acm_AxResetError(m_AxishandAxisNum);Acm_AxStopDec(m_AxishandAxisNum);/Close Axesfor(AxisNum=0;AxisNumm_ulAxisCount;AxisNum+)Acm_AxClose(&m_AxishandAxisNum);/Close DeviceAcm_DevClose(&m_Devhand);KillTimer(1);m_bInit = FALSE;m_XbInit = FALSE;m_YbInit = FALSE;m_ZbInit = FALSE;m_UbInit = FALSE;m_editXCmdCnt.SetWindowText();m_editXActCnt.SetWindowText();m_editXState.SetWindowText();m_editYCmdCnt.SetWindowText();m_editYActCnt.SetWindowText();m_editYState.SetWindowText();m_editZCmdCnt.SetWindowText();m_editZActCnt.SetWindowText();m_editZState.SetWindowText();m_editUCmdCnt.SetWindowText();m_editUActCnt.SetWindowText();m_editUState.SetWindowText();USHORT usAxisState32;/UINT AxisNum;/Stop Every Axesif (m_XbInit = TRUE)Acm_AxGetState(m_Axishand0, &usAxisState0);if(usAxisState0=STA_AX_ERROR_STOP)第 50 页共 89 页 Acm_AxResetError(m_Axishand0);Acm_AxStopDec(m_Axishand0);/Close AxesAcm_AxClose(&m_Axishand0);/Close DeviceAcm_DevClose(&m_Devhand);KillTimer(1);m_XbInit = FALSE;/m_cmbAxis.ResetContent();m_editXCmdCnt.SetWindowText();m_editXActCnt.SetWindowText();m_editXState.SetWindowText();if (m_YbInit = TRUE)Acm_AxGetState(m_Axishand1, &usAxisState1);if(usAxisState1=STA_AX_ERROR_STOP)Acm_AxResetError(m_Axishand1);Acm_AxStopDec(m_Axishand1);/Close AxesAcm_AxClose(&m_Axishand1);/Close DeviceKillTimer(1);m_YbInit = FALSE;m_editYCmdCnt.SetWindowText();m_editYActCnt.SetWindowText();m_editYState.SetWindowText();if (m_ZbInit = TRUE)Acm_AxGetState(m_Axishand2, &usAxisState2);if(usAxisState2=STA_AX_ERROR_STOP)Acm_AxResetError(m_Axishand2);Acm_AxStopDec(m_Axishand2);/Close AxesAcm_AxClose(&m_Axishand2);/Close DeviceKillTimer(1);m_ZbInit = FALSE;第 51 页共 89 页 m_editZCmdCnt.SetWindowText();m_editZActCnt.SetWindowText();m_editZState.SetWindowText();if (m_UbInit = TRUE)Acm_AxGetState(m_Axishand3, &usAxisState3);if(usAxisState3=STA_AX_ERROR_STOP)Acm_AxResetError(m_Axishand3);Acm_AxStopDec(m_Axishand3);/Close AxesAcm_AxClose(&m_Axishand3);/Close DeviceKillTimer(1);m_UbInit = FALSE;m_editUCmdCnt.SetWindowText();m_editUActCnt.SetWindowText();m_editUState.SetWindowText();void CCompareDlg:OnBtnServo() / TODO: Add your control notification handler code hereUINT AxisNum;U32 Result;CString strString;/Check the servoOno flag to decide if turn on or turn off the ServoOn output.if (m_bServoOn=false)for(AxisNum=0;AxisNumm_ulAxisCount;AxisNum+)Result=Acm_AxSetSvOn(m_AxishandAxisNum,1);if(Result != SUCCESS)strString.Format(Servo On Failed with Error Code:%x,Result);MessageBox(strString,Compare,MB_OK);return;m_bServoOn=true;m_btnServoOn.SetWindowText(Servo Off);第 52 页共 89 页 elsefor(AxisNum=0;AxisNumEnableWindow(TRUE);pEdit = (CEdit *)GetDlgItem(IDC_EDIT_XActCnt);pEdit-EnableWindow(TRUE);m_XbIsRunning =FALSE;Result =Acm_AxGetCmpData(m_Axishand0,&CurCmpData);if (Result = SUCCESS)strTemp.Format(%.0f,CurCmpData);if (m_YbInit)Result =Acm_AxGetCmdPosition(m_Axishand1,&CurPos);if (Result=SUCCESS)strTemp.Format(%.0f,CurPos);m_editYCmdCnt.SetWindowText(strTemp);Result =Acm_AxGetActualPosition(m_Axishand1,&CurPos);if (Result=SUCCESS)strTemp.Format(%.0f,CurPos);m_editYActCnt.SetWindowText(strTemp);Result =Acm_AxGetState(m_Axishand1,&State);if (Result=SUCCESS)switch(State)case 0:第 55 页共 89 页 strTemp.Format(STA_AX_DISABLE);break;case 1:strTemp.Format(STA_AX_READY);break;case 2:strTemp.Format(STA_AX_STOPPING);break;case 3:strTemp.Format(STA_AX_ERROR_STOP);break;case 4:strTemp.Format(STA_AX_HOMING);break;case 5:strTemp.Format(STA_AX_PTP_MOT);break;case 6:strTemp.Format(STA_AX_CONTI_MOT);break;case 7: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_Axishand1,&CurCmpData);if (Result = SUCCESS)strTemp.Format(%.0f,CurCmpData);if (m_ZbInit)Result =Acm_AxGetCmdPosition(m_Axishand2,&CurPos);第 56 页共 89 页 if (Result=SUCCESS)strTemp.Format(%.0f,CurPos);m_editZCmdCnt.SetWindowText(strTemp);Result =Acm_AxGetActualPosition(m_Axishand2,&CurPos);if (Result=SUCCESS)strTemp.Format(%.0f,CurPos);m_editZActCnt.SetWindowText(strTemp);Result =Acm_AxGetState(m_Axishand2,&State);if (Result=SUCCESS)switch(State)case 0:strTemp.Format(STA_AX_DISABLE);break;case 1:strTemp.Format(STA_AX_READY);break;case 2:strTemp.Format(STA_AX_STOPPING);break;case 3:strTemp.Format(STA_AX_ERROR_STOP);break;case 4:strTemp.Format(STA_AX_HOMING);break;case 5:strTemp.Format(STA_AX_PTP_MOT);break;case 6:strTemp.Format(STA_AX_CONTI_MOT);break;case 7:strTemp.Format(STA_AX_SYNC_MOT);break;default:break;m_editZState.SetWindowText(strTemp);if (State = 1) | (State = 3) )第 57 页共 89 页 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_Axishand2,&CurCmpData);if (Result = SUCCESS)strTemp.Format(%.0f,CurCmpData);if (m_UbInit)Result =Acm_AxGetCmdPosition(m_Axishand3,&CurPos);if (Result=SUCCESS)strTemp.Format(%.0f,CurPos);m_editUCmdCnt.SetWindowText(strTemp);Result =Acm_AxGetActualPosition(m_Axishand3,&CurPos);if (Result=SUCCESS)strTemp.Format(%.0f,CurPos);m_editUActCnt.SetWindowText(strTemp);Result =Acm_AxGetState(m_Axishand3,&State);if (Result=SUCCESS)switch(State)case 0:strTemp.Format(STA_AX_DISABLE);break;case 1:strTemp.Format(STA_AX_READY);break;case 2:strTemp.Format(STA_AX_STOPPING);break;case 3:strTemp.Format(STA_AX_ERROR_STOP);break;第 58 页共 89 页 case 4:strTemp.Format(STA_AX_HOMING);break;case 5:strTemp.Format(STA_AX_PTP_MOT);break;case 6:strTemp.Format(STA_AX_CONTI_MOT);break;case 7:strTemp.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_Axishand3,&CurCmpData);if (Result = SUCCESS)strTemp.Format(%.0f,CurCmpData);CDialog:OnTimer(nIDEvent);void CCompareDlg:OnClose() / TODO: Add your message handler code here and/or call defaultUSHORT usAxisState32;/UINT AxisNum;/Stop Every Axesif (m_XbInit = TRUE)Acm_AxGetState(m_Axishand0, &usAxisState0);if(usAxisState0=STA_AX_ERROR_STOP)第 59 页共 89 页 Acm_AxResetError(m_Axishand0);Acm_AxStopDec(m_Axishand0);/Close AxesAcm_AxClose(&m_Axishand0);/Close DeviceAcm_DevClose(&m_Devhand);KillTimer(1);m_XbInit = FALSE;if (m_YbInit = TRUE)Acm_AxGetState(m_Axishand1, &usAxisState1);if(usAxisState1=STA_AX_ERROR_STOP)Acm_AxResetError(m_Axishand1);Acm_AxStopDec(m_Axishand1);/Close AxesAcm_AxClose(&m_Axishand1);/Close DeviceKillTimer(1);m_YbInit = FALSE;if (m_ZbInit = TRUE)Acm_AxGetState(m_Axishand2, &usAxisState2);if(usAxisState2=STA_AX_ERROR_STOP)Acm_AxResetError(m_Axishand2);Acm_AxStopDec(m_Axishand2);/Close AxesAcm_AxClose(&m_Axishand2);/Close DeviceKillTimer(1);m_ZbInit = FALSE;if (m_UbInit = TRUE)Acm_AxGetState(m_Axishand3, &usAxisState3);if(usAxisState3=STA_AX_ERROR_STOP)第 60 页共 89 页 Acm_AxResetError(m_Axishand3);Acm_AxStopDec(m_Axishand3);/Close AxesAcm_AxClose(&m_Axishand3);/Close DeviceKillTimer(1);m_UbInit = FALSE;CDialog:OnClose();void CCompareDlg:OnSelectdevice() / TODO: Add your control notification handler code hereU32Result;HAND Devhand;inti=0;CEdit* pEdit;ULONGslaveDevs16;CString strTemp;ULONGbuffLen=64,AxisPerDev=0,AxisNumber=0;UpdateData(TRUE);Result = Acm_DevOpen(m_dwDevNum, &Devhand);if (Result != SUCCESS)MessageBox(Open Device Failed,Compare,MB_OK);return;buffLen=4;Result = Acm_GetProperty(Devhand,FT_DevAxesCount,&AxisPerDev,&buffLen);if (Result!=SUCCESS)Acm_DevClose(&Devhand);MessageBox(get axis number error,Compare,MB_OK);return;AxisNumber=AxisPerDev;Result = Acm_GetProperty(Devhand,CFG_DevSlaveDevs,slaveDevs,&buffLen);if (Result = SUCCESS)i=0;第 61 页共 89 页 while (slaveDevsi != 0)AxisNumber+=AxisPerDev;i+;m_ulAxisCount=AxisNumber;Acm_DevClose(&Devhand);strTemp.Format(%x,m_dwDevNum);pEdit= (CEdit*)GetDlgItem(IDC_EDIT_DEVNUM);pEdit-SetWindowText(strTemp.GetBuffer(strTemp.GetLength();void CCompareDlg:OnSelchangeAvlaibledevice() / TODO: Add your control notification handler code herem_dwDevNum=m_avaDevsm_AvailableDevice.GetCurSel().dwDeviceNum;void CCompareDlg:OnBtnXneg() / TODO: Add your control notification handler code here U32 Result; CEdit *pEdit;CString strTemp; UpdateData(TRUE); Result= Acm_SetProperty(m_Axishand0, PAR_AxVelHigh, &m_VelHigh, sizeof(m_VelHigh); if (Result!=SUCCESS) MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK); return; Result= Acm_SetProperty(m_Axishand0, PAR_AxVelLow, &m_VelLow, sizeof(m_VelLow); if (Result!=SUCCESS) MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK); return; Result=Acm_AxMoveVel(m_Axishand0,1); if(Result != SUCCESS) strTemp.Format(Move failed with Error Code:%xh,Result); MessageBox(strTemp,Compare,MB_OK); return; 第 62 页共 89 页 m_XbIsRunning = TRUE; pEdit = (CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt); pEdit-EnableWindow(FALSE); pEdit = (CEdit *)GetDlgItem(IDC_EDIT_XActCnt); pEdit-EnableWindow(FALSE);return;void CCompareDlg:OnBtnXpos() / TODO: Add your control notification handler code here U32 Result; CEdit *pEdit;CString strTemp; UpdateData(TRUE); Result= Acm_SetProperty(m_Axishand0, PAR_AxVelHigh, &m_VelHigh, sizeof(m_VelHigh); if (Result!=SUCCESS) MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK); return; Result= Acm_SetProperty(m_Axishand0, PAR_AxVelLow, &m_VelLow, sizeof(m_VelLow); if (Result!=SUCCESS) MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK); return; Result=Acm_AxMoveVel(m_Axishand0,0); if(Result != SUCCESS) strTemp.Format(Move failed with Error Code:%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;void CCompareDlg:OnBtnXstop() / TODO: Add your control notification handler code here第 63 页共 89 页 USHORT usAxisState=0; CEdit *pEdit;m_XbIsRunning = FALSE; /if axis is in error state , reset it first. then Stop AxesAcm_AxGetState(m_Axishand0, &usAxisState); if(usAxisState=STA_AX_ERROR_STOP) Acm_AxResetError(m_Axishand0); Acm_AxStopDec(m_Axishand0); pEdit = (CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt); pEdit-EnableWindow(TRUE); pEdit = (CEdit *)GetDlgItem(IDC_EDIT_XActCnt); pEdit-EnableWindow(TRUE);/KillTimer(1); return;void CCompareDlg:OnBtnYneg() / TODO: Add your control notification handler code here U32 Result; CEdit *pEdit;CString strTemp; UpdateData(TRUE); Result= Acm_SetProperty(m_Axishand1, PAR_AxVelHigh, &m_VelHigh, sizeof(m_VelHigh); if (Result!=SUCCESS) MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK); return; Result= Acm_SetProperty(m_Axishand1, PAR_AxVelLow, &m_VelLow, sizeof(m_VelLow); if (Result!=SUCCESS) MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK); return; Result=Acm_AxMoveVel(m_Axishand1,1); if(Result != SUCCESS) strTemp.Format(Move failed with Error Code:%xh,Result); MessageBox(strTemp,Compare,MB_OK); return; 第 64 页共 89 页 m_YbIsRunning = TRUE; pEdit = (CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt); pEdit-EnableWindow(FALSE); pEdit = (CEdit *)GetDlgItem(IDC_EDIT_YActCnt); pEdit-EnableWindow(FALSE);return;void CCompareDlg:OnBtnYpos() / TODO: Add your control notification handler code here U32 Result; CEdit *pEdit;CString strTemp; UpdateData(TRUE); Result= Acm_SetProperty(m_Axishand1, PAR_AxVelHigh, &m_VelHigh, sizeof(m_VelHigh); if (Result!=SUCCESS) MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK); return; Result= Acm_SetProperty(m_Axishand1, PAR_AxVelLow, &m_VelLow, sizeof(m_VelLow); if (Result!=SUCCESS) MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK); return; Result=Acm_AxMoveVel(m_Axishand1,0); if(Result != SUCCESS) strTemp.Format(Move failed with Error Code:%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;void CCompareDlg:OnBtnYstop() / TODO: Add your control notification handler code here第 65 页共 89 页 USHORT usAxisState=0; CEdit *pEdit;m_YbIsRunning = FALSE; /if axis is in error state , reset it first. then Stop AxesAcm_AxGetState(m_Axishand1, &usAxisState); if(usAxisState=STA_AX_ERROR_STOP) Acm_AxResetError(m_Axishand1); Acm_AxStopDec(m_Axishand1); pEdit = (CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt); pEdit-EnableWindow(TRUE); pEdit = (CEdit *)GetDlgItem(IDC_EDIT_YActCnt); pEdit-EnableWindow(TRUE);return;void CCompareDlg:OnBtnZneg() / TODO: Add your control notification handler code here U32 Result; CEdit *pEdit;CString strTemp; UpdateData(TRUE); Result= Acm_SetProperty(m_Axishand2, PAR_AxVelHigh, &m_VelHigh, sizeof(m_VelHigh); if (Result!=SUCCESS) MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK); return; Result= Acm_SetProperty(m_Axishand2, PAR_AxVelLow, &m_VelLow, sizeof(m_VelLow); if (Result!=SUCCESS) MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK); return; Result=Acm_AxMoveVel(m_Axishand2,1); if(Result != SUCCESS) strTemp.Format(Move failed with Error Code:%xh,Result); MessageBox(strTemp,Compare,MB_OK); return; m_ZbIsRunning = TRUE;第 66 页共 89 页 pEdit = (CEdit*)GetDlgItem(IDC_EDIT_ZCmdCnt); pEdit-EnableWindow(FALSE); pEdit = (CEdit *)GetDlgItem(IDC_EDIT_ZActCnt); pEdit-EnableWindow(FALSE);return;void CCompareDlg:OnBtnZpos() / TODO: Add your control notification handler code here U32 Result; CEdit *pEdit;CString strTemp; UpdateData(TRUE); Result= Acm_SetProperty(m_Axishand2, PAR_AxVelHigh, &m_VelHigh, sizeof(m_VelHigh); if (Result!=SUCCESS) MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK); return; Result= Acm_SetProperty(m_Axishand2, PAR_AxVelLow, &m_VelLow, sizeof(m_VelLow); if (Result!=SUCCESS) MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK); return; Result=Acm_AxMoveVel(m_Axishand2,0); if(Result != SUCCESS) strTemp.Format(Move failed with Error Code:%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;void CCompareDlg:OnBtnZstop() / TODO: Add your control notification handler code here第 67 页共 89 页 USHORT usAxisState=0; CEdit *pEdit;m_ZbIsRunning = FALSE; /if axis is in error state , reset it first. then Stop AxesAcm_AxGetState(m_Axishand2, &usAxisState); if(usAxisState=STA_AX_ERROR_STOP) Acm_AxResetError(m_Axishand2); Acm_AxStopDec(m_Axishand2); pEdit = (CEdit*)GetDlgItem(IDC_EDIT_ZCmdCnt); pEdit-EnableWindow(TRUE); pEdit = (CEdit *)GetDlgItem(IDC_EDIT_ZActCnt); pEdit-EnableWindow(TRUE); return;void CCompareDlg:OnBtnUneg() / TODO: Add your control notification handler code here U32 Result; CEdit *pEdit;CString strTemp; UpdateData(TRUE); Result= Acm_SetProperty(m_Axishand3, PAR_AxVelHigh, &m_VelHigh, sizeof(m_VelHigh); if (Result!=SUCCESS) MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK); return; Result= Acm_SetProperty(m_Axishand3, PAR_AxVelLow, &m_VelLow, sizeof(m_VelLow); if (Result!=SUCCESS) MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK); return; Result=Acm_AxMoveVel(m_Axishand3,1); if(Result != SUCCESS) strTemp.Format(Move failed with Error Code:%xh,Result); MessageBox(strTemp,Compare,MB_OK); return; 第 68 页共 89 页 m_UbIsRunning = TRUE; pEdit = (CEdit*)GetDlgItem(IDC_EDIT_UCmdCnt); pEdit-EnableWindow(FALSE); pEdit = (CEdit *)GetDlgItem(IDC_EDIT_UActCnt); pEdit-EnableWindow(FALSE);return;void CCompareDlg:OnBtnUpos() / TODO: Add your control notification handler code here U32 Result; CEdit *pEdit;CString strTemp; UpdateData(TRUE); Result= Acm_SetProperty(m_Axishand3, PAR_AxVelHigh, &m_VelHigh, sizeof(m_VelHigh); if (Result!=SUCCESS) MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK); return; Result= Acm_SetProperty(m_Axishand3, PAR_AxVelLow, &m_VelLow, sizeof(m_VelLow); if (Result!=SUCCESS) MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK); return; Result=Acm_AxMoveVel(m_Axishand3,0); if(Result != SUCCESS) strTemp.Format(Move failed with Error Code:%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;void CCompareDlg:OnBTNXCmdResetERR() / TODO: Add your control notification handler code here第 69 页共 89 页 if (m_XbInit = TRUE) Acm_AxResetError(m_Axishand0); void CCompareDlg:OnBTNYCmdResetERR() / TODO: Add your control notification handler code here if (m_YbInit = TRUE) Acm_AxResetError(m_Axishand1); void CCompareDlg:OnBTNZCmdResetERR() / TODO: Add your control notification handler code here if (m_ZbInit = TRUE) Acm_AxResetError(m_Axishand2); void CCompareDlg:OnBTNUCmdResetERR() / TODO: Add your control notification handler code here if (m_UbInit = TRUE) Acm_AxResetError(m_Axishand3); void CCompareDlg:OnBtnUstop() / TODO: Add your control notification handler code here USHORT usAxisState=0; CEdit *pEdit;m_UbIsRunning = FALSE; /if axis is in error state , reset it first. then Stop AxesAcm_AxGetState(m_Axishand3, &usAxisState); if(usAxisState=STA_AX_ERROR_STOP) Acm_AxResetError(m_Axishand3); Acm_AxStopDec(m_Axishand3); pEdit = (CEdit*)GetDlgItem(IDC_EDIT_UCmdCnt); pEdit-EnableWindow(TRUE); pEdit = (CEdit *)GetDlgItem(IDC_EDIT_UActCnt);第 70 页共 89 页 pEdit-EnableWindow(TRUE);return;void CCompareDlg:OnBtnXptp() / TODO: Add your control notification handler code hereU32 Result;CEdit *pEdit;double CfgMaxVel;CString strTemp;UpdateData(TRUE);if (m_VelHigh 8000.0)CfgMaxVel = m_VelHigh +100.0;elseCfgMaxVel = 8000.0;Result= Acm_SetProperty(m_Axishand0, CFG_AxMaxVel, &CfgMaxVel, sizeof(CfgMaxVel);if (Result!=SUCCESS)MessageBox(Set Property-AxMaxVel Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand0, PAR_AxVelLow, &m_VelLow, sizeof(m_VelLow);if (Result!=SUCCESS)MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand0, PAR_AxVelHigh, &m_VelHigh, sizeof(m_VelHigh);if (Result!=SUCCESS)MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK);return;Result=Acm_AxMoveRel(m_Axishand0,m_XPos);if(Result != SUCCESS)strTemp.Format(PTP Move failed with Error Code:%xh,Result);MessageBox(strTemp,Compare,MB_OK);第 71 页共 89 页 return;m_XbIsRunning = TRUE;pEdit = (CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt);pEdit-EnableWindow(FALSE);pEdit = (CEdit *)GetDlgItem(IDC_EDIT_XActCnt);pEdit-EnableWindow(FALSE);return;void CCompareDlg:OnBtnYptp() / TODO: Add your control notification handler code hereU32 Result;CEdit *pEdit;double CfgMaxVel;CString strTemp;UpdateData(TRUE);if (m_VelHigh 8000.0)CfgMaxVel = m_VelHigh +100.0;elseCfgMaxVel = 8000.0;Result= Acm_SetProperty(m_Axishand1, CFG_AxMaxVel, &CfgMaxVel, sizeof(CfgMaxVel);if (Result!=SUCCESS)MessageBox(Set Property-AxMaxVel Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand1, PAR_AxVelLow, &m_VelLow, sizeof(m_VelLow);if (Result!=SUCCESS)MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand1, PAR_AxVelHigh, &m_VelHigh, sizeof(m_VelHigh);if (Result!=SUCCESS)MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK);return;第 72 页共 89 页 Result=Acm_AxMoveRel(m_Axishand1,m_YPos);if(Result != SUCCESS)strTemp.Format(PTP Move failed with Error Code:%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;void CCompareDlg:OnBtnZptp() / TODO: Add your control notification handler code hereU32 Result;CEdit *pEdit;double CfgMaxVel;CString strTemp;UpdateData(TRUE);if (m_VelHigh 8000.0)CfgMaxVel = m_VelHigh +100.0;elseCfgMaxVel = 8000.0;Result= Acm_SetProperty(m_Axishand2, CFG_AxMaxVel, &CfgMaxVel, sizeof(CfgMaxVel);if (Result!=SUCCESS)MessageBox(Set Property-AxMaxVel Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand2, PAR_AxVelLow, &m_VelLow, sizeof(m_VelLow);if (Result!=SUCCESS)MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK);return;第 73 页共 89 页 Result= Acm_SetProperty(m_Axishand2, PAR_AxVelHigh, &m_VelHigh, sizeof(m_VelHigh);if (Result!=SUCCESS)MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK);return;Result=Acm_AxMoveRel(m_Axishand2,m_ZPos);if(Result != SUCCESS)strTemp.Format(PTP Move failed with Error Code:%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;void CCompareDlg:OnBtnUptp() / TODO: Add your control notification handler code hereU32 Result;CEdit *pEdit;double CfgMaxVel;CString strTemp;UpdateData(TRUE);if (m_VelHigh 8000.0)CfgMaxVel = m_VelHigh +100.0;elseCfgMaxVel = 8000.0;Result= Acm_SetProperty(m_Axishand3, CFG_AxMaxVel, &CfgMaxVel, sizeof(CfgMaxVel);if (Result!=SUCCESS)MessageBox(Set Property-AxMaxVel Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand3, PAR_AxVelLow, &m_VelLow, 第 74 页共 89 页 sizeof(m_VelLow);if (Result!=SUCCESS)MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand3, PAR_AxVelHigh, &m_VelHigh, sizeof(m_VelHigh);if (Result!=SUCCESS)MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK);return;Result=Acm_AxMoveRel(m_Axishand3,m_UPos);if(Result != SUCCESS)strTemp.Format(PTP Move failed with Error Code:%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;void CCompareDlg:OnButtonStart() / TODO: Add your control notification handler code hereU32 Result;CEdit *pEdit;CString d;U16 State;int i;double CfgMaxVel;double Vel;double Vel1;double Xdistance;double Ydistance;double VelLow;CString strTemp;CString str;UpdateData(true);m_byOutData = 0 ;第 75 页共 89 页 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 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;i8000.0)CfgMaxVel = Vel1 +100.0;elseCfgMaxVel = 8000.0;Result= Acm_SetProperty(m_Axishand0, CFG_AxMaxVel, &CfgMaxVel, sizeof(CfgMaxVel);if (Result!=SUCCESS)MessageBox(Set Property-AxMaxVel Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand1, CFG_AxMaxVel, &CfgMaxVel, 第 76 页共 89 页 sizeof(CfgMaxVel);if (Result!=SUCCESS)MessageBox(Set Property-AxMaxVel Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand0, PAR_AxVelLow, &VelLow, sizeof(VelLow);if (Result!=SUCCESS)MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand1, PAR_AxVelLow, &VelLow, sizeof(VelLow);if (Result!=SUCCESS)MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand0, PAR_AxVelHigh, &Vel1, sizeof(Vel1);if (Result!=SUCCESS)MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand1, PAR_AxVelHigh, &Vel1, sizeof(Vel1);if (Result!=SUCCESS)MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK);return;Result=Acm_AxMoveRel(m_Axishand0,Xdistance);if(Result != SUCCESS)strTemp.Format(PTP Move failed with Error Code:%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)第 77 页共 89 页 Acm_AxGetState(m_Axishand0,&State); if(State=1) break;Result=Acm_AxMoveRel(m_Axishand1,Ydistance);if(Result != SUCCESS)strTemp.Format(PTP Move failed with Error Code:%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_Axishand1,&State); if(State=1) break;Acm_AxMoveRel(m_Axishand0,-Xdistance);if(Result != SUCCESS)strTemp.Format(PTP Move failed with Error Code:%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_Axishand0,&State); if(State=1) break;Result=Acm_AxMoveRel(m_Axishand1,Ydistance);if(Result != SUCCESS)strTemp.Format(PTP Move failed with Error Code:%xh,Result);MessageBox(strTemp,Compare,MB_OK);return;pEdit = (CEdit*)GetDlgItem(IDC_EDIT_YCmdCnt);pEdit-EnableWindow(FALSE);第 78 页共 89 页 pEdit = (CEdit *)GetDlgItem(IDC_EDIT_YActCnt);pEdit-EnableWindow(FALSE); /激光频率1HZ 时的程序else if(m_frequence=1)Vel=(1-0.01*m_dajielv)*m_diameter;Vel1=Vel*5000;VelLow=1000;Xdistance=m_distance*5000;Ydistance=(1-(0.01*m_dajielv)*m_diameter*5000;for(i=1;i8000.0)CfgMaxVel = Vel1 +100.0;elseCfgMaxVel = 8000.0;Result= Acm_SetProperty(m_Axishand0, CFG_AxMaxVel, &CfgMaxVel, sizeof(CfgMaxVel);if (Result!=SUCCESS)MessageBox(Set Property-AxMaxVel Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand1, CFG_AxMaxVel, &CfgMaxVel, sizeof(CfgMaxVel);if (Result!=SUCCESS)MessageBox(Set Property-AxMaxVel Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand0, PAR_AxVelLow, &VelLow, sizeof(VelLow);if (Result!=SUCCESS)MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand1, PAR_AxVelLow, &VelLow, sizeof(VelLow);if (Result!=SUCCESS)第 79 页共 89 页 MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand0, PAR_AxVelHigh, &Vel1, sizeof(Vel1);if (Result!=SUCCESS)MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand1, PAR_AxVelHigh, &Vel1, sizeof(Vel1);if (Result!=SUCCESS)MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK);return;Result=Acm_AxMoveRel(m_Axishand0,Xdistance);if(Result != SUCCESS)strTemp.Format(PTP Move failed with Error Code:%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_Axishand0,&State); if(State=1) break;Result=Acm_AxMoveRel(m_Axishand1,Ydistance);if(Result != SUCCESS)strTemp.Format(PTP Move failed with Error Code:%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);第 80 页共 89 页 while(1) Acm_AxGetState(m_Axishand1,&State); if(State=1) break;Acm_AxMoveRel(m_Axishand0,-Xdistance);if(Result != SUCCESS)strTemp.Format(PTP Move failed with Error Code:%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_Axishand0,&State); if(State=1) break;Result=Acm_AxMoveRel(m_Axishand1,Ydistance);if(Result != SUCCESS)strTemp.Format(PTP Move failed with Error Code:%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 时的程序void CCompareDlg:OnButtonStart1() / TODO: Add your control notification handler code hereU32 Result;CEdit *pEdit;CString d;U16 State;int i;第 81 页共 89 页 double CfgMaxVel;double Vel;double Vel1;double Xdistance;double Ydistance;double VelLow;CString strTemp;CString str;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 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;i8000.0)CfgMaxVel = Vel1 +100.0;else第 82 页共 89 页 CfgMaxVel = 8000.0;Result= Acm_SetProperty(m_Axishand0, CFG_AxMaxVel, &CfgMaxVel, sizeof(CfgMaxVel);if (Result!=SUCCESS)MessageBox(Set Property-AxMaxVel Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand1, CFG_AxMaxVel, &CfgMaxVel, sizeof(CfgMaxVel);if (Result!=SUCCESS)MessageBox(Set Property-AxMaxVel Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand0, PAR_AxVelLow, &VelLow, sizeof(VelLow);if (Result!=SUCCESS)MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand1, PAR_AxVelLow, &VelLow, sizeof(VelLow);if (Result!=SUCCESS)MessageBox(Set Property-AxVelLow Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand0, PAR_AxVelHigh, &Vel1, sizeof(Vel1);if (Result!=SUCCESS)MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK);return;Result= Acm_SetProperty(m_Axishand1, PAR_AxVelHigh, &Vel1, sizeof(Vel1);if (Result!=SUCCESS)MessageBox(Set Property-AxVelHigh Failed,Compare,MB_OK);return;Result=Acm_AxMoveRel(m_Axishand1,Ydistance);if(Result != SUCCESS)第 83 页共 89 页 strTemp.Format(PTP Move failed with Error Code:%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) Acm_AxGetState(m_Axishand1,&State); if(State=1) break;Result=Acm_AxMoveRel(m_Axishand0,Xdistance);if(Result != SUCCESS)strTemp.Format(PTP Move failed with Error Code:%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_Axishand0,&State); if(State=1) break;Acm_AxMoveRel(m_Axishand1,-Ydistance);if(Result != SUCCESS)strTemp.Format(PTP Move failed with Error Code:%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_Axishand1,&State); if(State=1) break;第 84 页共 89 页 Result=Acm_AxMoveRel(m_Axishand0,Xdistance);if(Result != SUCCESS)strTemp.Format(PTP Move failed with Error Code:%xh,Result);MessageBox(strTemp,Compare,MB_OK);return;/m_YbIsRunning = TRUE;pEdit = (CEdit*)GetDlgItem(IDC_EDIT_XCmdCnt);pEdit-EnableWindow(FALSE);pEdit = (CEdit *)GetDlgItem(IDC_EDIT_XActCnt);pEdit-EnableWindow(FALSE);/return; /激光频率1HZ 时的程序else if(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;i8000.0)CfgMaxVel = Vel1 +100.0;elseCfgMaxVel = 8000.0;Result= Acm_SetProperty(m_Axishand0, CFG_AxMaxVel, &CfgMaxVel, sizeof(CfgMaxVel);if (Result!=SUCCESS)MessageBox(Set Property-AxMax
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:激光喷丸系统运动控制软件编制及喷丸改性实验【机+电】【SolidWorks三维】【4张图纸】【优秀】
链接地址:https://www.renrendoc.com/p-271356.html

官方联系方式

2:不支持迅雷下载,请使用浏览器下载   
3:不支持QQ浏览器下载,请用其他浏览器   
4:下载后的文档和图纸-无水印   
5:文档经过压缩,下载后原文更清晰   
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

网站客服QQ:2881952447     

copyright@ 2020-2025  renrendoc.com 人人文库版权所有   联系电话:400-852-1180

备案号:蜀ICP备2022000484号-2       经营许可证: 川B2-20220663       公网安备川公网安备: 51019002004831号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!