- 2022-09-27 发布 |
- 37.5 KB |
- 80页
申明敬告: 本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
文档介绍
毕业设计(论文)-牛头刨床六杆机构运动分析
河南理工大学本科毕业设计(论文)摘要在工程技术领域,经常会遇到一些需要反复操作,重复性很高的工作,如果能有一个供反复操作且操作简单的专用工具,图形用户界面就是最好的选择。如在本设计中对于牛头刨床平面六杆机构来说,为了保证结构参数与运动参数不同的牛头刨床的运动特性,即刨刀在切削过程中接近于等速运动从而保证加工质量和延长刀具寿命,以及刀具的急回性能从而提高生产率,这样的问题如果能够通过设计一个模型平台,之后只需改变参量就可以解决预期的问题,这将大大的提高设计效率。本设计中正是通过建立牛头刨床六杆机构的数学模型,然后用MATLAB程序设计出一个友好的人机交互的图形界面,并将数学模型参数化,使用户只需改变牛头刨床的参数就可以方便的实现运动分析和运动仿真,用户可以形象直观地观察到牛头刨床的运动轨迹、速度变化及加速度变化规律。关键词:牛头刨床六杆机构MATLAB运动仿真程序开发80\n河南理工大学本科毕业设计(论文)AbstractIntheengineeringarea,oftenrepeatedlyencounteredsomeoperationalneeds,repetitivehighly,andiftheoperationcanberepeatedforasimpleoperationanddedicatedtoolgraphicaluserinterfaceisthebestchoice.Asintheplanergraphicdesignforsixpolebodies,andcampaignstoensurethestructuralparametersofdifferentparametersplanermovementcharacteristics,planningtoolintheprocessofcuttingclosetoequalcampaigntoensureprocessingqualityandextendedlifecutleryandcutleryrushbacktotheperformanceenhancingproductivity,Ifsuchissuescanbeadoptedtodesignamodelplatformparametercanbechangedonlyaftertheexpectedsettlement,whichwillgreatlyenhancetheefficiencyofthedesign.Itisthroughtheestablishmentofthisdesignplanersixpolebodiesmathematicalmodel,andthenuseMATLABtodeviseproceduresofafriendlyaircraftintheworldgraphicsinterface,andmathematicalmodelsoftheparameters,sothatusersonlyneedtochangetheparametersplanercanfacilitatetherealizationofmovementanalysisandsportssimulation,Userscanvisualimageobservedinplanermovementtrajectories,speedchangesandaccelerationchanges.Keywords:Planer6polebodiesMATLABCampaignsimulationProceduredevelopment.80\n河南理工大学本科毕业设计(论文)目录1绪论...............................................................42牛头刨床六杆机构运动分析程序设计2.1MATLAB介绍................................................52.2MATLAB的特点..............................................62.3用MATLAB处理工程问题优缺点................................73牛头刨床运动分析的模型3.1基本概念与原理...............................................93.2牛头刨床六杆机构的数学模型.................................94图形用户界面GUI4.1界面设计的原则.............................................134.2功能要求..................................................164.3界面结构设计................................................174.4程序框图的设计.............................................195运动仿真程序界面设计与编程实现5.1句柄图形体系.................................................215.1.1图形对象、对象句柄和句柄图形树结构.....................225.1.2对象属性..............................................235.1.3对象句柄的获取方法.....................................235.1.4对象句柄的获取和设置...................................255.2主界面参数含义.............................................275.3界面制作步骤................................................276总结.............................................................497致谢..............................................................508参考书目..........................................................519附录程序源代码....................................................5280\n河南理工大学本科毕业设计(论文)1绪论1.1本课题的意义机构运动分析是不考虑引起机构运动的外力的影响,而仅从几何角度出发,根据已知的原动件的运动规律(通常假设为匀速运动),确定机构其它构件上各点的位移、速度、加速度,或构件的角位移、角速度、角加速度等运动参数。无论是分析研究现有机械的工作性能,还是优化综合新机械,机构运动分析都是十分重要的。通过对机构的位移和轨迹分析,可以考察某构件能否实现预定的位置、构件上某点能否实现预定的轨迹要求,可以确定从动件的行程或所需的运动空间,据此判断运动中是否发生碰撞干涉或确定机构的外形轮廓尺寸。通过速度和加速度分析可以了解机构从动件的速度、加速度的变化规律能否达到工作要求。而在本设计课题中通过对机构的加速度和速度分析,就可以在设计牛头刨床的导杆机构时保证刨刀在切削过程中接近于等速运动,从而保证加工质量和延长刀具寿命;此外还保证了刀具的急回性能,从而提高了生产率。1.2六杆机构的研究现状:以机电一体化为核心的现代机械系统不断创新,推动着现代机构学不断发展。平面连杆机构运动综合在工程应用中有重要的意义,一直为机构学领域的经典课题之一。较早时人们主要用几何图解法,但是其求解精度和适用范围都受到了极大的限制。随着计算机技术的发展,在轨迹综合中引入了计算机,并开始出现代数法和优化法,把机构学问题转化为数学问题。1.3本课题的目的本课题的目的是通过编制MATLAB程序,从而设计出一个用户界面,用户可以通过对界面上面参数的操作而实现对牛头刨床运动分析和运动仿真,以此观察牛头刨床的运动特性是否合乎要求。80\n河南理工大学本科毕业设计(论文)2MATLAB软件介绍2.1MATLAB软件介绍如今,计算机技术已经被应用于各行各业,科研和工程计算领域也不例外。对于经常需要大量数据进行分析处理或者对复杂问题进行计算求解的科研工作者来说,计算机技术的引入大大的降低了工作强度,是原本复杂的工作变得简单,从而极大的提高了工作效率。随着科学研究的不断深入,以及工程应用不断朝着专业化、精确化方向发展,科研工作者以及工程技术人员对计算机技术的要求也越来越高。面对越来越繁重的科学以及工程计算任务,虽然用传统的c或Fortran语言也能完成任务,但是程序设计者所承担的编程工作是极为繁重的,而且要求程序设计者对算法有比较深入的理解,这就使工作人员不得不将大量的时间和精力放在与研究课题关系不大的计算编程上来。为了减轻科技工作者的压力,使工作人员将时间和精力更多的放在建立模型等关键性的工作中,许多公司相继开发了一系列的数学应用软件,如MATHEMATICA、Maple、MATHCAD以及MATLAB等,其中MATLAB以其强大的功能和极高的编程效率吸引了众多的用户。MATLAB是MATRIXLABORATORY(“矩阵实验室”)的缩写,是由美国MATHWORKS公司开发的集数值计算、符号计算和图形可视化三大基本功能于一体的,功能强大、操作简单的语言。是国际公认的优秀数学应用软件之一。20世纪80年代初期,CleveMoler与JohnLittle等利用C语言开发了新一代的MATLAB语言,此时的MATLAB语言已同时具备了数值计算功能和简单的图形处理功能。1984年,CleveMoler与JohnLittle等正式成立了MATHWORKS公司,把MATLAB语言推向市场,并开始了对MATLAB工具箱等的开发设计。1993年,MATHWORKS公司推出了基于个人计算机的MATLAB4.0版本,到了1997年又推出了MATLAB5.X版本(Release11),并在2000年又推出了最新的MATLAB80\n河南理工大学本科毕业设计(论文)6版本(Release12),如今,MATLAB7.0已经问世。现在,MATLAB已经发展成为适合多学科的大型软件,在世界各高校,MATLAB已经成为线性代数、数值分析、数理统计、优化方法、自动控制、数字信号处理、动态系统仿真等高级课程的基本教学工具。特别是最近几年,MATLAB在我国大学生数学建模竞赛中的应用,为参赛者在有限的时间内准确、有效的解决问题提供了有力的保证。2.2MATLAB软件的特点MATLAB是一种高度集成化的科学计算环境,是集数值计算和图形处理等功能于一体的工程计算应用软件。MATLAB不仅可以处理代数问题和数值分析问题,而且还具有强大的图形处理和仿真模拟等功能。MATLAB能够很好的帮助工程师及科学家解决实际问题,它经过20多年来的不断完善和改进,已经成为公认的优秀的数学应用软件之一。概括地讲,整个MATLAB系统由两部分组成,即MATLAB内核及辅助工具箱,两者的调用构成了MATLAB的强大功能。MATLAB语言以数组为基本数据单位,包括控制流语句、函数、数据结构、输入输出及面向对象等特点的高级语言,它具有以下主要特点:1)MATLAB的程序设计语言编程效率较高,运算符和库函数极其丰富,语言简洁,编程效率高,MATLAB除了提供和C语言一样的运算符号外,还提供广泛的矩阵和向量运算符。利用其运算符号和库函数可使其程序相当简短,两三行语句就可实现几十行甚至几百行C或FORTRAN的程序功能,从而极大的简化了线性运算,而线性运算是整个数值计算的基础,所以以矩阵作为基本语言要素可以提高数值计算的编程效率。MATLAB本身拥有丰富的库函数,并具有结构化的流程控制语句和运算符,用户可以在使用的过程中方便自如的使用。2)既具有结构化的控制语句(如for循环、while循环、break语句、if语句和switch语句),又有面向对象的编程特性。80\n河南理工大学本科毕业设计(论文)3)图形功能强大。它既包括对二维和三维数据可视化、图像处理、动画制作等高层次的绘图命令,也包括可以修改图形及编制完整图形界面的、低层次的绘图命令。4)功能强大的工具箱。工具箱可分为两类:功能性工具箱和学科性工具箱。功能性工具箱主要用来扩充其符号计算功能、图示建模仿真功能、文字处理功能以及与硬件实时交互的功能。而学科性工具箱是专业性比较强的,如优化工具箱、统计工具箱、控制工具箱、小波工具箱、图象处理工具箱、通信工具箱等。5)易于扩充。除内部函数外,所有MATLAB的核心文件和工具箱文件都是可读可改的源文件,用户可修改源文件和加入自己的文件,它们可以与库函数一样被调用。当然,任何事物都不是十全十美的。与C、Fortran等传统的程序设计语言相比,MATLAB的程序设计语言的一个显著缺点即使循环代码执行效率较低,这是与其执行方式直接相关的。MATLAB编写的程序在应用的过程中为解释执行,既不需要编译生成也不生成可执行文件,而是解释一句,执行一句,其速度是可想而知的了。当然这个问题也不是不可以解决的,由于MATLAB以矩阵作为基本的程序设计语言要素,对于在c、Fortran的那个编程语言中需要使用循环来解决的问题,MATLAB程序设计语言中巧妙的利用矩阵的特点,就可以避免使用循环代码。所以,通过对MATLAB的深入学习,提高编程技巧,完全可以做到扬长避短,并充分发挥MATLAB语言的强大功能。目前,MATLAB已经成为国际上公认的优秀数学应用软件之一。2.3用MATLAB处理工程问题优缺点MATLAB是MATHWOTKS公司于1982年推出的一套高性能的数值计算和可视化软件。它集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一个方便、界面友好的用户环境。它还包括了TOOLBOX(工具箱)的各类问题的求解工具,可用来求解特定学科的问题。其特点是:80\n河南理工大学本科毕业设计(论文)(1)可扩展性:MATLAB最重要的特点是易于扩展,它允许用户自行建立指定功能的M文件。对于一个从事特定领域的工程师来说,不仅可利用MATLAB所提供的函数及基本工具箱函数,还可方便地构造出专用的函数,从而大大扩展了其应用范围。当前支持MATLAB的商用Toolbox(工具箱)有数百种之多。而由个人开发的Toolbox则不可计数。(2)易学易用性:MATLAB不需要用户有高深的数学知识和程序设计能力,不需要用户深刻了解算法及编程技巧。(3)高效性:MATLAB语句功能十分强大,一条语句可完成十分复杂的任务。如FFT语句可完成对指定数据的快速傅立叶变换,这相当于上百条C语言语句的功能。它大大加快了工程技术人员从事软件开发的效率。据MATHWOKS公司声称,MATLAB软件中所包含的MATLAB源代码相当于70万行C代码。由于MATLAB具有如此之多的特点,在欧美高等院校,MATLAB已成为应用于线性代数、自动控制理论、数理统计、数字信号处理、时间序列分析、动态系统仿真等高级课程的基本教学工具;在研究单位、工业部门,MATLAB也被广泛用于研究和解决各种工程问题。当前在全世界有超过40万工程师和科学家使用它来分析和解决问题。然而MATLAB自身所存在的某些缺点限制了它的应用范围。 (1)MATLAB是一种解释性语言,因此它的实时效率是相当差的。(2)MATLAB程序不能脱离其环境运行,因为MATLAB不是计算机语言,虽然如今它已经可以进行编译,但是还不太方便。80\n河南理工大学本科毕业设计(论文)3牛头刨床运动分析的模型3.1基本概念与原理机构运动分析的任务是在已知机构尺寸及原动件运动规律的情况下,确定机构中其他构件上某些点的轨迹、位移、速度、加速度和构件的角位移、角速度及角加速度。上述这些内容,不论是设计新的机器,还是为了了解现有机械的运动性能,都是十分必要的,而且它还是研究机械动力性能的必要基础和前提。对于牛头刨床来说,其刨刀在工作行程中应该接近等速,,而回程速度却应高于前者速度,从而提高效率。为了确定牛头刨床的设计是否满足要求,就必须对其进行运动分析。机构运动分析的方法很多,主要有图解法和解析法。当需要简捷直观地了解机构的某个或某几个位置的运动特性时,采用图解法比较方便,而且精度也能满足实际问题的要求。而当需要精确地知道或要了解机构在整个运动循环过程中的运动特性时,采用解析法并借助于计算机,不仅可以获得很高的计算精度及一系列位置的分析结果,并能绘出机构相应的运动线图,同时还可以把机构分析和机构综合问题联系起来,以便于机构的优化设计。本设计正是基于这些用MATLAB编程实现牛头刨床的运动分析以及图解法无法实现的运动仿真。3.2牛头刨床的数学模型如下图所示为牛头刨床的机构简图。设已知结构参数为:L1,L3,L5,G,H,原动件的转角φ1和转速n1。解:如图,先建立一个直角坐标系,并标出各杆矢及其方位角。其中有四个未知变量φ3,φ5,P及S。为求解需建立两个封闭矢量方程,为此需利用两个封闭图形ABDA及DEFD。1)求φ3、ω3及α3由封闭形ABDA可得80\n河南理工大学本科毕业设计(论文)………………………………………(1)分别用i和j点积上式两端,有联解上面两个式子可得:图3—1牛头刨床结构模型式(1)对时间t求导数,注意P为变量,有…………………………(2)80\n河南理工大学本科毕业设计(论文)可用点积上式两端以消去,并利用矢量方程解析法,有用点积(2)两端可消去,并注意到,则再将式(2)对时间t求导,则有可分别用和点积上式两端,以消去和,注意,则得=2)求s、、由封闭图形DEFAD可得………………………………(3)分别用i和j点积上面的式子两端,有有上面第二个式子可得由上面第一个式子可得80\n河南理工大学本科毕业设计(论文)对上面的(3)式对时间t取导可得…………………………..(4)分别用j、点积上式,可得(4)式对时间t求导可得分别用就j和点积上面的式子可得80\n河南理工大学本科毕业设计(论文)4图形用户界面GUI用户界面或接口是指:人与机器之间或程序之间交互作用的工具和方法。如、键盘、鼠标、跟踪球、话筒都可以成为与计算机交换信息的接口。图形用户界面(GUI:GraphicUserInterface)则是指有窗口、光标、按键、菜单、文字说明等对象构成的一个用户界面。用户通过一定的方法(如鼠标或键盘)选择、激活这些图形对象,使计算机产生某种动作或变化,比如实现计算、绘图等。4.1界面设计的原则GUI的设计包括编写源代码之前的所有工作。设计者必须重视设计工作,不能急于编写源代码。否则,编程员思路不清晰,开发过程中回走很多弯路,因而开发的效率低下,并且设计出的GUI也不一定让人满意。那么如何进行成功的设计,就应该从以下两个方面予以考虑:(1)GUI设计的指导原则(2)GUI设计应遵循的步骤。指导原则:可以用就个字来概括优秀的设计标准:简洁性、一致性、熟悉性。简洁性意味着界面简单明了,直接清晰。拥护可以很快的提取出对自己有用的信息。熟悉性意味着系统设计时尽量保持与该类流行界面的相似,比如VC的对话框风格、视图的风格、MATLAB的Figure风格。这样用户操作起来就容易上手,误操作率比较低。以上三点也许过于抽象,具体过程中不宜操作。其实,只要在设计整个过程中贯穿以人为本的设计理念,设计出的界面自然会达到以上要求。设计者应该经常考虑以下两个问题:(1)用户在没有熟悉界面之前,完成一个操作需要多长时间?80\n河南理工大学本科毕业设计(论文)(2)用户在熟悉界面后,完成一个普通操作需要多长时间?简洁性、一致性、熟悉性围绕着上述两个问题展开。它们有时也存在着矛盾的地方,比如会为了一致性而牺牲简洁性。这种取舍的标准应着眼于用户,要看是否便于用户操作。用户应该是设计者心中的上帝。1)简洁性:简洁是一种直观的美,它是设计者所要达到的主要目标,通过GUIDE,我们很容易向界面添加许多功能。但是功能强大并不一定代表成功,有时增加一些功能反而显得画蛇添足。GUI本来是从图像的角度帮助用户理解客观世界的,但是缤纷芜杂的表面想象却很容易掩盖事物的真相,影响拥护做出正确的判断,这当然是不可取的。设计者一定要警惕这种盲目追求强大的心理。a注重形式图像往往给人一种直观的感受,告诉人们事物发展的趋势,数字有助于将这种趋势量化,增强人们对发展趋势的认识。但是并不意味着图像必须借助于数字。b缩小交互区域如果能在一个界面中完成的事情坚决不要放在两个界面中完成。这也上操作简洁性的一种间接体现。这样除了增加图形的可读性,还减轻了不同截面之间数据的传递负担。关于这一点在本设计中就有涉及。比较以下两个设计:80\n河南理工大学本科毕业设计(论文)图4—1多界面窗口图4—2单界面窗口结果由以上两个设计不难发现在第二种设计中只需要通过按钮就可以实现预期的功能,而无须像第一种设计中那样在不同的界面中进行切换。c用图形输入代替数值输入80\n河南理工大学本科毕业设计(论文)对于用户来说,在图形用户界面下,图形输入比数值输入更加方便。为了从各个角度来观察一个三维几何形体,我们需要不断地进行坐标系的转化。用数值输入的方法,困难程度难以想象,其复杂性会让用户望而却步,而图形输入的方式则能很好地解决上述问题。2)一致性:一致性的含义很广泛,既包括操作指令的前后一致,也包括操作界面中各种图形对象摆放位置的一致性。这个原则基于以下认识,即用户的操作经验应有助于用户完成后面的操作;设计者不应该给用户太多意外,否则会让用户一头雾水;前面执行这个命令是一种用法,于是产生了歧义。优秀的界面设计往往注重这个问题。3)熟悉性。设计遵循的步骤:图4—3设计遵循的步骤4.2功能要求本次论文的结果是设计出如上述4—2所示的图形用户界面,该界面应该具有以下功能:1)在编辑框中输入牛头刨床的参数后,点击“运算”按钮,实现后台的运算,并把运算的结果存储在数据文件mydata.mat中。80\n河南理工大学本科毕业设计(论文)2)在1)完成后,用户点击“数据显示”按钮,弹出“数据显示”窗口,并显示牛头刨床运动分析的结果数据。3)同上,在完成1)后,用户点击“运动线图”按钮,弹出“运动线图”窗口,并在窗口中分别显示牛头刨床刨头的“位移——曲柄转角”、“速度——曲柄转角”、“加速度——曲柄转角”的曲线图。4)同上,在完成1)后,用户点击“运动仿真”按钮,弹出“运动仿真”窗口,并在窗口中显示牛头刨床动态仿真的结果。4.3界面结构设计根据上述4.1和4.2,在本设计的界面设计中确立以下思路:由于本设计是对牛头刨床进行运动分析和运动仿真,所以在界面中应该首先创建五个框架区,分别显示结构参数,结构模型,初始数据,运动参数和命令按钮;然后在相应的框架区中分别创建text文本和edit编辑框以及命令按钮,以使用户可以通过对参数的改变来实现相应的控制;最后,除“运算”和“退出”按钮在后台操作外,其它的按钮“数据显示”、“运动分析”、“运动仿真”被按下都会弹出相应的操作界面。以下是预期的界面:80\n河南理工大学本科毕业设计(论文)图4—4预期主界面图4—5预期数据结果显示界面窗口80\n河南理工大学本科毕业设计(论文)图4—6预期的运动分析界面窗口图4—7预期运动仿真界面4.4程序框图的设计程序框图如下所示:80\n河南理工大学本科毕业设计(论文)图4—8程序框图以上既是总界面的结构,也是软件的总结构,也同时是程序流程图。80\n河南理工大学本科毕业设计(论文)5运动仿真程序界面设计与编程实现界面制作包括界面设计和程序实现。具体制作步骤如下:1)分析界面所要求实现的主要功能,明确设计任务;2)在稿纸上面绘出界面草图,并站在使用者的角度来审查草图;3)按构思的草图,上机制作(静态)界面,并检查之;4)编写界面动态功能的程序,对功能进行逐项检查。以上过程,仅仅是一般原则。在设计中,步骤之间也许要交叉执行或复合执行;设计和实现过程往往不是一步到位的,可能需要反复修改,才能获得满意的界面。在MATLAB软件中,所提供的界面的基本设计方法共有两种:一种是用户自己编写并调用函数生成界面;另一种是直接使用MATLAB提供的GUI设计工具。第二种方法虽然简单,但是不利于我们更加熟悉MATLAB的编程语言以及锻炼我们的思维和设计能力,加上逻辑性紊乱,所以本设计中的四个界面全是采用第一种方法制作,也就是编写函数。在这四个界面的实现中,大体又可分为两类:一、主界面的实现。二、功能界面的实现。在本章内容展开之前,有必要介绍句柄图形的知识,因为这是MATLAB可视化的内核,与本章界面的制作关系密切。5.1句柄图形体系句柄图形是一种面向对象的绘图系统。该系统提供创建计算机图形所必需的各种软件。它所支持的指令,80\n河南理工大学本科毕业设计(论文)可直接创建线、文字、网线、面以及图形用户界面。MATLAB的各种高层图形指令如:plot,mesh等都是以句柄图形软件为基础写成的,因此句柄图形被称为低层图形。这也是在这里要首先介绍句柄图形的原因所在。5.1.1图形对象、对象句柄和句柄图形树结构(1)图形对象MATLAB把用于数据可视化和界面制作的基本绘图要素成为句柄图形对象。构成MATLAB句柄图形对象体系的11个图形对象如图5—1中方块所示每个图形对象都可以独立操作。在MATLAB中生成的每个具体图形,由若干个不同对象构成。每个图形对象不必包含全部对象,但是每个图形必须具备根屏幕和图形窗。图5—1句柄图形树结构(2)句柄每个具体对象都有一个“与生俱来、终生不变”的身份,即句柄。句柄的存取图形对象惟一规范识别符。不同对象的句柄不可能重复和混淆。每个计算机,根对象只有一个,即屏幕。它的句柄值总是0。而简称为图的图形窗的句柄总是正整数,它是用来标示图形窗序号。除以上两种对象外,其余对象句柄则是双精度浮点数。80\n河南理工大学本科毕业设计(论文)(3)句柄图形的结构在句柄图形体系中,各图形对象并非平等,它们之间的关系可用图5—1的树层次结构表示。5.1.2对象属性(1)属性所有对象都有一组定义和刻画其外貌和性状的属性(Properties)。属性有两部分组成:属性名和属性值,即属性二元对(Property_Name,Property_Value)。在创建和修改属性的指令中,属性名和属性值总是成对出现。属性名是英文词组字符串。该英文词组字符串每个单词的第一个字母大写,而单词间没有空格,;例如‘LineStyle’,‘ColorMap’等。这样书写的目的是便于阅读。至于在指令中援引属性名时,为用户输入的方便,MATLAB采取了两个措施:第一,不分字母大小写,都同样识别;第二,只要不引起歧义,属性名不必全写。不同的属性值将使对象有不同的表现。(2)缺省属性在创建图形对象时,MATLAB并不需要用户对每个属性加以定义。因为倘若用户不对属性加以定义,MATLAB总会自动给对象的每个属性赋予厂家定义的属性。当然用户如果希望创建具有个性的图形,那么就可以通过指令对某些属性进行定义。5.1.3对象句柄的获取方法要设置图形对象属性值,首先要知道该对象的句柄。因此,掌握对象句柄的获取方法十分重要。1)基本方法(1)从图形创建指令获得句柄所有高层或低层指令都能通过以下格式产生句柄。H_GC=GraphicCommand(……)绘图同时给出句柄的调用指令H_GC。80\n河南理工大学本科毕业设计(论文)本设计中主程序创建主界面窗口并获取其句柄的程序代码如下:h1=figure('position',[2020800600],...'name','牛头刨床运动分析',...'numbertitle','off',...%不显示标题数目'defaultuicontrolfontsize',6,...'defaultuicontrolunits','normalized',...'menubar','none',...%隐去菜单条以便接下来自己制作菜单'resize','off');%主窗口的大小不能改变(2)追溯法获取图柄若一个对象的句柄已知,那么可用以下格式追溯获得其“父”或“子”的句柄。H_pa=get(H_known,’Parent’)获取H_known句柄对象之“父”的句柄H_ch=get(H_known,’Children’)获取H_known句柄对象之“子”的句柄本设计中主程序创建主界面“初始数据”框架后,可利用上述格式获取其“父”句柄:h1_framec=uicontrol(...'parent',h1,...'style','frame',...'position',[0.050.050.30.3],...'foregroundcolor','b');H_pa=get(h1_framec,’Parent’)H_pa=h1获取h1_framec句柄对象之“父”的句柄为h1。(3)当前对象句柄的获取80\n河南理工大学本科毕业设计(论文)MATLAB有以下三种专用获取图柄的指令:前两个是直接指令式的;后一个必须与鼠标配合使用。gcf返回当前图形窗口的句柄gca返回当前轴的句柄gco返回“被鼠标最近点击”的图形对象的句柄本设计中在计算程序caculate1函数中,从主程序当中读取句柄值handles=guihandles(gcf);(4)根据图形对象特性获取句柄利用对象特性搜索对象句柄可以得到较高的搜索速度。具体指令如下:H=findobj(H_ori,PN,PV)在H_ori指定对象上,寻找与属性(PN,PV)匹配的对象句柄。(5)根据对象“标签”获取句柄用户可以通过“Tag”属性,给对象一个“标签”。此后,就可以通过“标签”获取该对象的句柄。设置“标签”的两个方法:第一,创建时赋名第二,用set赋名据标签获取对象句柄:如果屏幕上有多个图形窗,且有的窗口又有多个子图,那么获取带“标签”对象句柄的简捷指令是:hax=findobj(0,‘Tag’,‘A4’)。本设计中在计算程序caculate1函数中,从主程序当中读取牛头刨床参量L1的句柄值L1=get(handles.hL1,'string');L1=str2num(L1);%%把字符转换为数值5.1.4对象句柄的获取和设置(1)创建对象时设置属性H_GC=GraphicCommand(……,PN,PV)利用“属性对”设置的绘图指令80\n河南理工大学本科毕业设计(论文)H_GC=GraphicCommand(……,PS)利用“构架”进行属性设置的绘图指令[说明]1)GraphicCommand代表所有合法的MATLAB高层或低层绘图命令2)(PN,PV)是属性名、属性值构成的属性对。属性对的数目没有限制3)PS是域名为属性名的构架数组(2)get和setget(H)获取H句柄对象所有属性的当前值get(H,PN)获取H句柄对象由PN指定属性的当前值set(H)显示H句柄对象所有可设置属性名和全部供选属性值set(H,PN)显示H句柄对象由PN指定属性的全部供选属性值set(H,PN,PV,。。。)设置H句柄对象的PN属性名取PV属性值set(H,PS)利用构架数组设置H的属性值[说明]1)(PN,PV)是属性名、属性值构成的属性对。属性对的数目没有限制2)PS是域名为属性名的构架数组(3)对象属性设置示例本设计中数据显示窗口中创建显示数据的listbox时,把listbox的‘string’属性设置为‘vars1’的程序如下:h2_zhuanjiaoslist=uicontrol(...'parent',h2,...'style','listbox',...'position',[0.100.100.200.75],...'fontsize',14);vars1=phi1';80\n河南理工大学本科毕业设计(论文)set(h2_zhuanjiaoslist,'string',vars1);5.2主界面参数含义在主界面中参数的含义如下表所示:表5—1主界面参数含义参数名称参数含义L1原动件AB的长度L3从动件DE的长度L5从动件EF的长度HAD的长度G刨头距离底座的竖直高度从动件DE的转角P滑块2到底座的距离从动件EF的转角S滑块6的位移原动件AB的转速原动件AB的转角转向原动件AB的转向5.3界面制作步骤5.3.1创建主界面窗口创建窗口的函数为figure,它有两种调用形式:(1)figure,单独的figure创建一个新的窗口,并且返回它的句柄值。(2)figure(H),使H为当前的窗口,强制它在屏幕其他窗口的上面;假如H窗口不存在,同时H为整数,这是将创建句柄为H的窗口,如下例。80\n河南理工大学本科毕业设计(论文)本设计中主程序创建主界面窗口的程序代码如下:h1=figure('position',[2020800600],...'name','牛头刨床运动分析',...'numbertitle','off',...%不显示标题数目'defaultuicontrolfontsize',6,...'defaultuicontrolunits','normalized',...'menubar','none',...%隐去菜单条以便接下来自己制作菜单'resize','off');%主窗口的大小不能改变5.3.2创建主界面自制菜单PC平台上,缺省情况下产生的MATLAB图形窗总有一个顶层菜单条,它包含五个标准菜单项:文件(file)、编辑(edit)、工具(tools)、窗口(windows)和帮助(help)。每个菜单项在点击的时候都回产生一个下拉菜单(Pull-downmenu)。这标准菜单受界面菜单‘MenuBar’属性管理。该属性有两个取值[none|figure]。当属性值取‘none’时,图形窗不出现标准菜单(及工具条);当属性取‘figure’时,图形窗显示标准菜单,如图5—2所示。如上面例子隐去缺省菜单条的目的正是为了制作自制菜单,自制用户菜单,通过uimenu指令创建。其典型的调用格式为:图5—2缺省的菜单条Hm=uimenu('PropertyName1',value1,'PropertyName2',value2,...)80\n河南理工大学本科毕业设计(论文)[说明]1)Hm为该用户菜单的句柄。H_parent为其父对象的句柄。该父对象只能是图形窗对象,或另一用户菜单对象。假如H_parent输入宗量缺省,那么菜单项将建立在当前图形窗的顶层菜单条上。2)‘PropertyName’和‘PropertyValue’构成属性二元对,它们定义用户菜单的属性。本设计中主程序创建主界面窗口自制菜单的程序如下:h1_file_menu=uimenu(h1,'label','文件');h1_save_menu=uimenu(h1_file_menu,'label','保存');h1_exit_menu=uimenu(h1_file_menu,'label','退出','callback','closeall');h1_help_menu=uimenu(h1,'label','帮助','callback','msgbox(''-360度<=φ1<=360度'',''help'',''modal'');');h1_about_menu=uimenu(h1,'label','关于','callback','msgbox(''作者:河南理工大学邵翔宇杨广磊email:sxy@163.com2006年五月版权所有'',''about'',''modal'');');h1_acknowledge_menu=uimenu(h1,'label','支持','callback','msgbox(''在毕业设计的过程中得到了王小林院长和谢刚老师的耐心指导和大力支持非常感谢!'',''acknowledge'',''modal'');');本例的结果如图5—3所示:在上例中用到了消息显示对话框msgbox,从本质上说,对话框也是一类窗口;而从功能上说,对话框是用来要求用户输入某些信息或给用户提供某些信息而暂时出现的一个窗口。即对话框是用户与计算机之间进行交互操作的一种手段,通过对话框,用户可以通知计算机一些用户所做的选择,也可以输入一些参数给计算机,并且计算机功能也给用户提供一些信息或各种运行结果等。msgbox的调用格式为:msgbox(Message)80\n河南理工大学本科毕业设计(论文)msgbox(Message,Title)msgbox(Message,Title,Icon)msgbox(Message,Title,'custom',IconData,IconCMap)msgbox(Message,...,CreateMode)图5—3自制菜单结果此外,在主界面的设计中还用到了warndlg,它的调用格式为:Handle=warndlg(Warnstring,DlgTitle)产生警告信息框并返回其句柄[说明]1)参数Warnstring是一个字符串变量,他表示了在对话框中要显示的警告信息内容2)参数DlgTitle是一个字符串变量,它表示对话框的名称本设计中主程序创建主界面窗口自制警告信息对话框的程序如下:warndlg('欢迎你使用牛头刨床六杆机构运动分析程序','!!!hello!!!','modal');图5—4信息框的设计结果5.3.3创建主界面的五个框架,各个编辑框、静态文本和按钮在MATLAB系统中,共定义了9种不同类型的控件。这9种控件分别为:命令按钮(PushButton)、单选按钮(RadioButton)、检查框(Check80\n河南理工大学本科毕业设计(论文)Box)、列表框(ListBox)、下拉式菜单(PopupMenu)、滑块(Slider)、编辑框(EditBox)、静态文字(StaticText)、框架(Frame)。控件是MATLAB所定义的10个基本图形对象之一,在某一图形窗口中的各种控件都是uicontrol命令实现的。它的调用格式:hcontrol=uicontrol('PropertyName1',value1,'PropertyName2',value2,...)[功能]:在句柄为handle的图形窗口中实现一个控件,并返回该控件的句柄到hControl变量。[说明]:1)在所实现的控件中,其PropertyName1属性的属性值为value1;PropertyName2属性的属性值为value22)该控件的“双亲”句柄为handle,若缺省该参数,则其“双亲”为当前窗口3)对于该命令所实现的控件,其属性值确定了该控件的外观显示特征及各种特点4)当某一控件的取值被改变之后,会导致系统去执行由其‘callback’属性所确定的一些响应序列5)属性‘style’确定了控件的基本外观特征。‘style’属性的取值及其所表示的控件种类见表5—2表5—2控件style属性取值及其对应的控件种类Style属性的取值控件种类Style属性的取值控件种类Pushbuttonpush命令按钮Popupmenu下拉式菜单Radiobutton,radio单选按钮Slider滑块Checkbox,check检查框Edit编辑框Listbox,list列表框Text静态文字Frame框架80\n河南理工大学本科毕业设计(论文)本设计中主程序创建主界面窗口框架的程序如下(因篇幅有限,只能列举两个框架的创建程序):h1_framec=uicontrol(...'parent',h1,...'style','frame',...'position',[0.050.050.30.3],...'foregroundcolor','b');h1_framej=uicontrol(...'parent',h1,...'style','frame',...'position',[0.050.450.30.50],...'foregroundcolor','b');图5—5主界面框架的设计结果80\n河南理工大学本科毕业设计(论文)本设计中在主窗口中创建编辑框和静态文本的程序如下(限于篇幅这里指列举部分程序):h1_jgtext=uicontrol(...'parent',h1,...'style','text',...'position',[0.050.950.150.05],...'string','结构参数',...'backgroundcolor','w',...'fontsize',16);h1_cstext=uicontrol(...'parent',h1,...'style','text',...'position',[0.050.350.150.05],...'string','初始数据',...'backgroundcolor','w',...'fontsize',16);h1_ydtext=uicontrol(...'parent',h1,...'style','text',...'position',[0.400.300.150.05],...'string','运动参数',...'backgroundcolor','w',...'fontsize',16);h1_jl1text=uicontrol(...80\n河南理工大学本科毕业设计(论文)'parent',h1,...'style','text',...'position',[0.100.870.050.05],...'string','L1');h1_jl1edit=uicontrol(...'tag','hL1',...'parent',h1,...'style','edit',...'string','125',...'position',[0.150.870.100.05],...'backgroundcolor','w',...'fontsize',6);h1_jl1htext=uicontrol(...'parent',h1,...'style','text',...'position',[0.260.870.050.05],...'string','mm',...'fontsize',8);本例的结果如图5—6所示80\n河南理工大学本科毕业设计(论文)图5—6静态文本和编辑框的设计结果本设计中在主窗口中创建命令按钮的程序如下(限于篇幅这里只举出部分程序):b=imread('saoxy','jpg');h1_mxjgbutton=uicontrol(...'parent',h1,...'style','push',...'cdata',b,...'position',[0.400.350.550.65],...'backgroundcolor','w',...'fontsize',8);h1_databutton=uicontrol(...80\n河南理工大学本科毕业设计(论文)'parent',h1,...'style','push',...'position',[0.800.230.150.05],...'string','数据显示',...'fontsize',12,...'backgroundcolor','w',...'callback','fig_data');%设置回调函数为fig_data本例的结果如下页图5—7所示:在本例中值得注意的是程序的设计过程当中遇到的最主要的问题是如何把牛头刨床的结构模型图读到主界面的特定位置。最初只是用imread把图像读进去,但是这是就出现了图像不能定位的问题。后来用imread与pushbutton结合,把pushbutton的“cdata”属性设置为图像的数据矩阵,就完美的解决了这个问题。另外,在本例中“运算”、“数据显示”、“运动分析”和“运动仿真”的“callback”除“运算”在后台操作外,其它都有“callback”生成相应子窗口。80\n河南理工大学本科毕业设计(论文)图5—7在主界面中读入结构模型并添加按钮的设计结果5.3.4创建数据显示窗口 在这个窗口的设计中,首先还是用figure生成窗口,然后用load从数据文件mydata.mat中读取变量值。接下来分别创建四个静态文本和列表框以显示数据,最后,创建“运动线图”和“退出”按钮。 在MATLAB中,利用save、load指令实现数据文件的存取是各版都采用的基本方法。它的具体调用格式如下: saveFileName把全部内存变量保存为FileName.mat文件 saveFileNamev1v2把变量v1,v2保存为FileName.mat文件saveFileNamev1v2-append把变量v1,v2添加到FileName.mat文件 saveFileNamev1v2-ascii把变量v1,v2保存为FileName8位ASCII文件 saveFileNamev1v2-ascii-double把变量v1,v2保存为FileName16位ASCII文件loadFileName把FileName.mat文件中的全部变量装入内存 loadFileName把FileName.mat文件中的变量v1,v2装入内存saveFileNamev1v2-ascii把FileNameASCII文件中的变量v1,v2装入内存 [说明]:v1,v2代表变量名;制定的变量个数不限,只要内存或文件存在;变量名与变量名之间必须以空格相分开。本设计中在数据显示窗口中读取变量值的程序如下: %从mydata.mat文件中读取phi1SVFaF loadmydataphi1SVFaF80\n河南理工大学本科毕业设计(论文)图5—8load命令的调用结果本设计中在数据显示窗口中为显示变量数据分别采用静态文本和列表框的结果的程序如下(部分):采用静态文本: h2_zhuanjiaotext=uicontrol(... 'parent',h2,... 'style','text',... 'position',[0.100.850.200.05],... 'string','AB转角φ1(转/秒)',... 'fontsize',12); h2_zhuanjiaostext=uicontrol(... 'parent',h2,... 'style','text',... 'position',[0.100.100.200.75],... 'fontsize',14);80\n河南理工大学本科毕业设计(论文) vars1=phi1'; set(h2_zhuanjiaoslist,'string',vars1);采用列表框: h2_zhuanjiaotext=uicontrol(... 'parent',h2,... 'style','text',... 'position',[0.100.850.200.05],... 'string','AB转角φ1(转/秒)',... 'fontsize',12); h2_zhuanjiaoslist=uicontrol(... 'parent',h2,... 'style','listbox',... 'position',[0.100.100.200.75],... 'fontsize',14); vars1=phi1'; set(h2_zhuanjiaoslist,'string',vars1);80\n河南理工大学本科毕业设计(论文)图5—9采用静态文本显示数据的结果5.3.5创建运动分析界面窗口运动分析界面窗口的设计也是先用figure命令创建界面窗口,然后创建“运动分析”和“退出”按钮,在此设置“运动分析”的“callback”为“graph”,至此运动分析界面窗口的设置结束。比较原动件的转速分别为30/pirad/s和100rad/s的牛头刨床运动分析曲线图,结果如下页图5—11和5—12所示。80\n河南理工大学本科毕业设计(论文)图5—10采用列表框显示数据的结果图5—11n1=30/rad/s时牛头刨床运动分析的结果80\n河南理工大学本科毕业设计(论文)图5—12n1=100rad/s时牛头刨床运动分析的结果由以上两个图片可清楚的看到牛头刨床在工作行程中的速度较为平稳,近似于等速,这就保证了刨刀的寿命和加工质量;另外可以清楚的看到牛头刨床在回程时速度变化很快,这正是牛头刨床的急回特性,从而提高了生产效率。通过比较两个结果还可以发现在原动件转速改变的情况下,牛头刨床的速度和位移曲线变化不大,而只有加速度的大小变化较大。5.3.6创建运动仿真界面窗口这个窗口的创建与其它窗口的创建大体相同,不过不同的是这里没有设置“callback”,而是直接把运动分析程序加在界面窗口的创建之后。需要注意的是这里实现运动仿真的时候采用了动画的实现的方法。在MATLAB中动画的实现有两种方式:1)影片动画(movie):预先制作图形,存放在图形缓冲区,然后逐祯播放。这种动画适用于难以实时快速绘制的复杂画面。这种方法计算量大、占用内存多。而快速回放,使人眼不感觉到停止的连贯程度,对计算机硬件业是不低的要求。80\n河南理工大学本科毕业设计(论文)2)实时动画:保持图形窗中大部分的像素颜色不变,而只是更新部分像素的颜色构成运动图像。这种动画适用于每次变化较少、图形精度要求不是很高的场合。在本篇设计中正是采用的这种方法,它的制作步骤为:(1)画出初始图形;(2)计算活动对象的新位置,并在新位置上将它显示出来;(3)擦除原来位置上原有对象,刷新屏幕;(4)重复前面两个步骤。按照上面的思路,首先在运动仿真窗口中绘制初始图形,这用到plot指令,它的调用格式为:plot(X,S)plot(X,Y,S)plot(X1,Y1,S1,X2,Y2,S2,X3,Y3,S3,...)其中s是用来指定线形、色彩、数据点形的选择字符串。它可以缺省。但是那个时候这些设置将由MATLAB的默认设置确定。在运动仿真窗口的设计中plot指令的应用举例:loadmydataAx=0;Ay=H;Bx11=Bx(1);By11=By(1);plot([Ax,Bx11],[Ay,By11],'g','linewidth',2);接下来计算活动对象对新位置时使用了for循环语句。它的语法结构为:forx=array(commands)end[说明]80\n河南理工大学本科毕业设计(论文)其中,for指令后的变量x称为循环变量,而for与end之间的组命令commands称为循环体。循环体被重复执行的次数是确定的,该次数由for指令后面的数组array的列数决定。换言之,循环变量依次取数组的各列,对于每个变量值,循环体被执行一次。在本设计实现运动仿真时的循环体如下:fmat=moviein(119);n=0;fori=1:3:357n=n+1;Bx11=Bx(i);By11=By(i);Ex11=Ex(i);Ey11=Ey(i);Fx11=Fx(i);Fy11=Fy(i);plot([Ex11,Fx11],[Ey11,Fy11],'r','linewidth',2);holdonplot([Dx,Ex11],[Dy,Ey11],'r','linewidth',2);plot([Ax,Bx11],[Ay,By11],'g','linewidth',2);plot(Dx,Dy,'ko','markersize',8,'markerfacecolor','y');plot(Bx11,By11,'ks','markersize',8,'markerfacecolor','y');plot(Ex11,Ey11,'ko','markersize',8,'markerfacecolor','y');plot(Ax,Ay,'ko','markersize',8,'markerfacecolor','y');plot(Fx11,Fy11,'ks','markersize',8,'markerfacecolor','y');plot(x1,y1,'r');80\n河南理工大学本科毕业设计(论文)plot(x2,y2,'r');holdoffdrawnowAxis(theAxes);%使用相同的坐标fmat(:,n)=getframe;end在以上这些步骤都完成之后要想把动画播放出来需要用到的是movie指令,它的调用格式为:M(i)=getframemovie(M,k)以不超过每秒12桢的速度把M中的动画播放K次在本例中实现播放动画的程序为:movie(fmat,10);图5—13运动仿真窗口设计结果5.3.7回调函数caculate1的设计80\n河南理工大学本科毕业设计(论文)回调函数caculate1负责着整个界面的后台数值运算和窗口之间数据的传递,占着举足轻重的地位。在这个程序的设计中先要从主程序中获取编辑框的句柄值,这点在4.1.4节中已经叙述过,这里不再赘述。然后把前面所述牛头刨床运动分析的数学模型程序化。值得注意的是这里的变量大多都是数组,因此在计算的过程中一定要分清变量的乘与数组乘,除与数组除。最后用save把变量数据值存储在数据文件mydata.mat中。5.3.8回调函数graph的设计在这程序的设计中先要用load把数据文件读入内存,然后用plot指令绘制运动线图。值得注意的是在运动分析窗口中要显示3个运动线图,即要对窗口进行分割,虽然我们可以通过坐标平移的方法达到这个要求,但是这种方法操作起来比较麻烦。对于这类问题,MATALB提供了两种方法:一种是使用同一个坐标系绘制多个图形;另一种是利用图形窗口的分割实现多幅图形的绘制。图形窗口分割函数subplot的调用格式为:subplot(m,n,p)[说明]1)各个绘图区域的编号原则是“先上后下,先左后右”即与矩阵元素下表的排列次序一致。2)MATLAB最多允许99的分割,并且它允许每个绘图区域都以不同的坐标系单独绘制图形。3)如我们用了subplot命令后又想使用MATLAB缺省的一幅图一个图形窗口的方式,则必须执行subplot(1,1,1)指令,或者执行清除窗口分割命令clf在本设计中设计graph函数时分割窗口的程序举例:loadmydataphi1SVFaF;%把phi1由弧度转化成度phi1=phi1*180/pi;80\n河南理工大学本科毕业设计(论文)%画位移曲线subplot(3,1,1);plot(phi1,S);v=axis;v(2)=450;axis(v);ylabel('s(m)');title('刨头F点的位移曲线');%画速度曲线subplot(3,1,2);plot(phi1,VF);v=axis;v(2)=450;axis(v);ylabel('v(m/s)');title('刨头F点的速度曲线');%画加速度曲线subplot(3,1,3);plot(phi1,aF);v=axis;v(2)=450;axis(v);xlabel('\phi_1(degrees)');ylabel('a(m/s^2)');title('刨头F点的加速度曲线');80\n河南理工大学本科毕业设计(论文)至此牛头刨床运动分析与运动仿真的界面制作与程序设计结束,遗憾的是在运动仿真的实现过程中出现的屏幕闪的问题没有能够解决。80\n河南理工大学本科毕业设计(论文)5、总结假如说,在20世纪90年代,控制类相关学科新旧教材的区别性标志是“教材是否包含MATLANB内容”,那么进入21世纪后,MATLAB对教材的影响以崭新的形式出现:新教材正在更彻底地摒弃那些手工计算、计算尺计算、手摇或电动计算机、电子模拟计算机时代建立的“老的但是长久被当作经典的”表述、分析和计算方法,而逐步地建立以现代计算工具(包括软硬件)为平台的新表述、分析和计算方法,其中包括采用交互式图形用户界面去完成各种表述、分析和计算目的。通过本次毕业设计的制作,使我对MATLAB有了更深刻的了解。它精确的数值计算,强大的绘图功能,为我们问题的处理带来了极好的效果极大的方便。它那简洁的程序,让我们不再为编程而头痛。通过毕业设计对MATLAB的使用,有以下几点感触:一、MATLAB的程序代码编写相对简单,可以通过MATLAB自带的函数按数学表达式直接编写以完成工程计算问题。二、MATLAB直接对矩阵和数组操作,这样省去了烦人的循环,加快了程序的运行速度。三、在整个设计的过程中,程序的调试占着举足轻重的地位。对于初学者来说,初期程序难免有错误之处,这时如何找到错误所在并纠正错误,无疑成为整个程序编写过程中的重要环节,因此在一个完整的设计中,程序编写完毕只是完成整个工作量的60%左右。80\n河南理工大学本科毕业设计(论文)6致谢本篇论文是在王小林院长和谢刚老师的支持、指导和鼓励下完成的,他们对本人的设计提出了很多可具操作性和实用性的意见和建议。曾经为一个问题未能解决而通宵达旦,然而到了老师那里就轻而易举的解决,因此,没有他们的教诲,本人的毕业设计是不可能完成的,在此对王小林院长和谢刚老师表示最诚挚的感谢!另外感谢答辩组的老师们在百忙之中,对我的论文进行指正,祝你们工作愉快。80\n河南理工大学本科毕业设计(论文)7参考书目[1]孙恒编著《机械原理》北京:高教出版社2004.5[2]师忠秀等编著《机械原理课程设计》北京:机械工业出版社2003.5[3]张志勇等编著《精通MATLAB6.5版》北京:北航出版社2003.3[4]高会生等译《MATLAB原理与工程应用》 北京:电子工业出版社2002.6[5]Stephen J.chapman著《MATLAB编程》北京:科学出版社2003[6]周明等著《MATLAB图形技术》 西安:西北工业大学出版社1999.11 [7]陈扬等著《MATLAB6.x图形编程与图像处理》 西安:西安电子科技大学出版社2002.10[8]云舟工作室编著《MATLAB6.5数学建模基础教程》北京:人民邮电出版社2001.7[9]网冠科技编著《MATLAB时尚创作100例》北京:机械工业出版社2002.6[10]楼顺天等编著《MATLAB5.x程序设计语言》西安:西安电子科大学出版社2000.4[11]陆钟吕等编著《平面连杆机构综合》哈尔滨:哈尔滨船舶工程学院出版社1992.4[12]江见鲸主编《高等学校毕业设计(论文)指导手册》北京:高等教育出版社1992.2[13]王洪欣主编《机械原理课程上机指导与实践》南京:东南大学出版社200580\n河南理工大学本科毕业设计(论文)8附录程序源代码1)主程序%主程序functionflgofniutoubaochuang%创建主窗口%screensize=get(0,'screensize');h1=figure('position',[2020800600],...'name','牛头刨床运动分析',...'numbertitle','off',...%不显示标题数目'defaultuicontrolfontsize',6,...'defaultuicontrolunits','normalized',...'menubar','none',...%隐去菜单条以便接下来自己制作菜单'resize','off');%主窗口的大小不能改变%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%在主窗口中添加菜单h1_file_menu=uimenu(h1,'label','文件');h1_save_menu=uimenu(h1_file_menu,'label','保存');h1_exit_menu=uimenu(h1_file_menu,'label','退出','callback','closeall');h1_help_menu=uimenu(h1,'label','帮助','callback','msgbox(''-360度<=φ1<=360度'',''help'',''modal'');');h1_about_menu=uimenu(h1,'label','关于','callback','msgbox(''作者:河南理工大学邵翔宇杨广磊email:sxy@163.com2006年五月版权所有'',''about'',''modal'');');80\n河南理工大学本科毕业设计(论文)h1_acknowledge_menu=uimenu(h1,'label','支持','callback','msgbox(''在毕业设计的过程中得到了谢刚老师的耐心指导和大力支持非常感谢!'',''acknowledge'',''modal'');');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%分别创建结构参数,初始数据,结构模型和运动参数框架h1_framec=uicontrol(...'parent',h1,...'style','frame',...'position',[0.050.050.30.3],...'foregroundcolor','b');h1_framej=uicontrol(...'parent',h1,...'style','frame',...'position',[0.050.450.30.50],...'foregroundcolor','b');h1_framey=uicontrol(...'parent',h1,...'style','frame',...'position',[0.400.050.350.25],...'foregroundcolor','b');h1_framemx=uicontrol(...'parent',h1,...'style','frame',...'position',[0.400.350.550.65],...'foregroundcolor','b');80\n河南理工大学本科毕业设计(论文)h1_framemingling=uicontrol(...'parent',h1,...'style','frame',...'position',[0.7870.1050.1750.24],...'foregroundcolor','b');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%创建静态文本和编辑框h1_jgtext=uicontrol(...'parent',h1,...'style','text',...'position',[0.050.950.150.05],...'string','结构参数',...'backgroundcolor','w',...'fontsize',16);h1_cstext=uicontrol(...'parent',h1,...'style','text',...'position',[0.050.350.150.05],...'string','初始数据',...'backgroundcolor','w',...'fontsize',16);h1_ydtext=uicontrol(...'parent',h1,...'style','text',...'position',[0.400.300.150.05],...80\n河南理工大学本科毕业设计(论文)'string','运动参数',...'backgroundcolor','w',...'fontsize',16);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%创建静态文本和编辑框h1_jl1text=uicontrol(...'parent',h1,...'style','text',...'position',[0.100.870.050.05],...'string','L1');h1_jl1edit=uicontrol(...'tag','hL1',...'parent',h1,...'style','edit',...'string','125',...'position',[0.150.870.100.05],...'backgroundcolor','w',...'fontsize',6);h1_jl1htext=uicontrol(...'parent',h1,...'style','text',...'position',[0.260.870.050.05],...'string','mm',...'fontsize',8);80\n河南理工大学本科毕业设计(论文)h1_jl3text=uicontrol(...'parent',h1,...'style','text',...'position',[0.100.770.050.05],...'string','L3',...'fontsize',8);h1_jl3edit=uicontrol(...'tag','hL3',...'parent',h1,...'style','edit',...'string','600',...'position',[0.150.770.100.05],...'backgroundcolor','w',...'fontsize',6);h1_jl3htext=uicontrol(...'parent',h1,...'style','text',...'position',[0.260.770.050.05],...'string','mm',...'fontsize',8);h1_jl5text=uicontrol(...'parent',h1,...'style','text',...'position',[0.100.670.050.05],...'string','L5',...80\n河南理工大学本科毕业设计(论文)'fontsize',8);h1_jl5edit=uicontrol(...'tag','hL5',...'parent',h1,...'style','edit',...'string','150',...'position',[0.150.670.100.05],...'backgroundcolor','w',...'fontsize',6);h1_jl5htext=uicontrol(...'parent',h1,...'style','text',...'position',[0.260.670.050.05],...'string','mm',...'fontsize',8);h1_jhtext=uicontrol(...'parent',h1,...'style','text',...'position',[0.100.570.050.05],...'string','H',...'fontsize',8);h1_jhedit=uicontrol(...'tag','hH',...'parent',h1,...'style','edit',...80\n河南理工大学本科毕业设计(论文)'string','275',...'position',[0.150.570.100.05],...'backgroundcolor','w',...'fontsize',6);h1_jhhtext=uicontrol(...'parent',h1,...'style','text',...'position',[0.260.570.050.05],...'string','mm',...'fontsize',8);h1_jGtext=uicontrol(...'parent',h1,...'style','text',...'position',[0.100.470.050.05],...'string','G',...'fontsize',8);h1_jGedit=uicontrol(...'tag','hG',...'parent',h1,...'style','edit',...'string','575',...'position',[0.150.470.100.05],...'backgroundcolor','w',...'fontsize',6);80\n河南理工大学本科毕业设计(论文)h1_jGhtext=uicontrol(...'parent',h1,...'style','text',...'position',[0.260.470.050.05],...'string','mm',...'fontsize',8);h1_cphi3text=uicontrol(...'parent',h1,...'style','text',...'position',[0.100.280.050.05],...'string','φ3',...'fontsize',8);h1_cphi3edit=uicontrol(...'tag','hphi3',...'parent',h1,...'style','edit',...'string','69.712',...'position',[0.150.280.100.05],...'backgroundcolor','w',...'fontsize',6);h1_cphi3htext=uicontrol(...'parent',h1,...'style','text',...'position',[0.260.280.050.05],...'string','度',...80\n河南理工大学本科毕业设计(论文)'fontsize',8);h1_cPtext=uicontrol(...'parent',h1,...'style','text',...'position',[0.100.210.050.05],...'string','P',...'fontsize',8);h1_cPedit=uicontrol(...'tag','hP',...'parent',h1,...'style','edit',...'string','338.8',...'position',[0.150.210.100.05],...'backgroundcolor','w',...'fontsize',6);h1_cPhtext=uicontrol(...'parent',h1,...'style','text',...'position',[0.260.210.050.05],...'string','mm',...'fontsize',8);h1_cphi5text=uicontrol(...'parent',h1,...'style','text',...'position',[0.100.140.050.05],...80\n河南理工大学本科毕业设计(论文)'string','φ5',...'fontsize',8);h1_cphi5edit=uicontrol(...'tag','hphi5',...'parent',h1,...'style','edit',...'string','175.327',...'position',[0.150.140.100.05],...'backgroundcolor','w',...'fontsize',6);h1_cphi5htext=uicontrol(...'parent',h1,...'style','text',...'position',[0.260.140.050.05],...'string','度',...'fontsize',8);h1_cStext=uicontrol(...'parent',h1,...'style','text',...'position',[0.100.070.050.05],...'string','S',...'fontsize',8);h1_cSedit=uicontrol(...'tag','hS',...'parent',h1,...80\n河南理工大学本科毕业设计(论文)'style','edit',...'string','58.54',...'position',[0.150.070.100.05],...'backgroundcolor','w',...'fontsize',6);h1_cShtext=uicontrol(...'parent',h1,...'style','text',...'position',[0.260.070.050.05],...'string','mm',...'fontsize',8);h1_yn1text=uicontrol(...'parent',h1,...'style','text',...'position',[0.450.230.050.05],...'string','n1',...'fontsize',8);h1_yn1edit=uicontrol(...'tag','hn1',...'parent',h1,...'style','edit',...'string','30/pi',...'position',[0.500.230.100.05],...'backgroundcolor','w',...'fontsize',6);80\n河南理工大学本科毕业设计(论文)h1_yn1htext=uicontrol(...'parent',h1,...'style','text',...'position',[0.630.230.100.05],...'string','rad/s',...'fontsize',8);h1_phi1text=uicontrol(...'parent',h1,...'style','text',...'position',[0.450.160.050.05],...'string','φ1',...'fontsize',8);h1_yphi1edit=uicontrol(...'tag','hphi1',...'parent',h1,...'style','edit',...'string','0',...'position',[0.500.160.100.05],...'backgroundcolor','w',...'fontsize',6);h1_yphi1htext=uicontrol(...'parent',h1,...‘style','text',...'position',[0.630.160.100.05],...'string','度',...80\n河南理工大学本科毕业设计(论文)'fontsize',8);h1_ymtext=uicontrol(...'parent',h1,...'style','text',...'position',[0.430.090.070.05],...'string','转向',...'fontsize',4);h1_ymcombox=uicontrol(...'parent',h1,...'tag','zhuanxiang',...'style','popupmenu',...'backgroundcolor','w',...'string','顺时针|逆时针|',...'position',[0.500.090.150.05]);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%添加命令按钮%把结构模型读入界面当中b=imread('saoxy','jpg');h1_mxjgbutton=uicontrol(...'parent',h1,...'style','push',...'cdata',b,...'position',[0.400.350.550.65],...'backgroundcolor','w',...'fontsize',8);80\n河南理工大学本科毕业设计(论文)h1_caculatebutton=uicontrol(...'parent',h1,...'style','push',...'position',[0.800.290.150.05],...'string','运算',...'fontsize',12,...'backgroundcolor','w',...'callback','caculate1');%设置回调函数为caculate1h1_databutton=uicontrol(...'parent',h1,...'style','push',...'position',[0.800.230.150.05],...'string','数据显示',...'fontsize',12,...'backgroundcolor','w',...'callback','fig_data');%设置回调函数为fig_datah1_graphicbutton=uicontrol(...'parent',h1,...'style','push',...'position',[0.800.170.150.05],...'string','运动线图',...'fontsize',12,...'backgroundcolor','w',...'callback','fig_graphic');%设置回调函数为fig_graphic80\n河南理工大学本科毕业设计(论文)h1_simulationbutton=uicontrol(...'parent',h1,...'style','push',...'position',[0.800.110.150.05],...'string','运动仿真',...'fontsize',12,...'backgroundcolor','w',...'callback','fig_simulation');%设置回调函数为fig_simulationh1_tuichubutton=uicontrol(...'parent',h1,...'style','push',...'position',[0.800.020.150.05],...'string','退出',...'fontsize',12,...'backgroundcolor','w',...'callback','closeall');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%添加欢迎信息框warndlg('欢迎你使用牛头刨床六杆机构运动分析程序','!!!hello!!!','modal');%主程序结束%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2)数据显示窗口设计程序%创建数据显示窗口%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%functionfig_data80\n河南理工大学本科毕业设计(论文)h2=figure('position',[10020800600],...'name','数据显示',...'numbertitle','off',...'defaultuicontrolfontsize',6,...'defaultuicontrolunits','normalized',...'menubar','none');%从mydata.mat文件中读取phi1SVFaF%%%%%%%%%loadmydataphi1SVFaF;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%创建四个静态文本h2_zhuanjiaotext=uicontrol(...'parent',h2,...'style','text',...'position',[0.100.850.200.05],...'string','AB转角φ1(转/秒)',...'fontsize',12);h2_weiyitext=uicontrol(...'parent',h2,...'style','text',...'position',[0.300.850.200.05],...'string','刨头F点的位移(米)',...'fontsize',12);h2_sudutext=uicontrol(...'parent',h2,...'style','text',...80\n河南理工大学本科毕业设计(论文)'position',[0.500.850.200.05],...'string','刨头F点的速度(米/秒)',...'fontsize',12);h2_jiasudutext=uicontrol(...'parent',h2,...'style','text',...'position',[0.700.850.200.05],...'string','刨头F点的加速度(米/秒^2)',...'fontsize',12);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%创建四个listbox以分别显示转角、位移、速度和加速度数据h2_zhuanjiaoslist=uicontrol(...'parent',h2,...'style','list',...'position',[0.100.100.200.75],...'fontsize',14);vars1=phi1';set(h2_zhuanjiaoslist,'string',vars1);h2_weiyilist=uicontrol(...'parent',h2,...'style','list',...'position',[0.300.100.200.75],...'fontsize',14);vars2=S';80\n河南理工大学本科毕业设计(论文)set(h2_weiyilist,'string',vars2);h2_sudulist=uicontrol(...'parent',h2,...'style','list',...'position',[0.500.100.200.75],...'fontsize',14);vars3=VF';set(h2_sudulist,'string',vars3);h2_jiasudulist=uicontrol(...'parent',h2,...'style','list',...'position',[0.700.100.200.75],...'fontsize',14);vars4=aF';set(h2_jiasudulist,'string',vars4);%创建退出命令按钮h2_tuichubutton=uicontrol(...'parent',h2,...'style','push',...'position',[0.800.020.150.05],...'string','退出',...'fontsize',8,...'callback','close');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3)运动分析窗口设计程序80\n河南理工大学本科毕业设计(论文)%创建运动线图窗口functionfig_graphich3=figure('position',[10020800600],...'name','运动线图',...'numbertitle','off',...'defaultuicontrolfontsize',6,...'defaultuicontrolunits','normalized',...'menubar','none');%创建功能按钮%%%%%%%%%%%%%%%%%%%%%%%%%%%%%h3_graphicbutton=uicontrol(...'parent',h3,...'style','push',...'position',[0.630.010.150.05],...'string','运动线图',...'fontsize',8,...'callback','graph');%设置回调函数为graphh3_tuichubutton=uicontrol(...'parent',h3,...'style','push',...'position',[0.800.010.150.05],...'string','退出',...'fontsize',8,...'callback','close');4)运动仿真窗口程序%创建运动仿真窗口80\n河南理工大学本科毕业设计(论文)functionfig_simulationh4=figure('position',[10020800600],...'name','运动仿真',...'numbertitle','off',...'defaultuicontrolfontsize',6,...'defaultuicontrolunits','normalized',...'menubar','none');%创建命令按钮%%%%%%%%%%%h4_pausebutton=uicontrol(...'parent',h4,...'style','push',...'position',[0.620.020.150.05],...'string','暂停',...'fontsize',8,...'callback','pause(2)');%%%%暂停2秒h4_tuichubutton=uicontrol(...'parent',h4,...'style','push',...'position',[0.800.020.150.05],...'string','退出',...'fontsize',8,...'callback','close');loadmydata%%%%%读取数据文件%%%%%%%%%%%%%%%%画出原始结构图Dx=0;80\n河南理工大学本科毕业设计(论文)Dy=0;Ex11=Ex(1);Ey11=Ey(1);Ax=0;Ay=H;Bx11=Bx(1);By11=By(1);Fx11=Fx(1);Fy11=Fy(1);plot([Ax,Bx11],[Ay,By11],'g','linewidth',2);holdonplot([Dx,Ex11],[Dy,Ey11],'r','linewidth',2);axis([-600,600,-20,620]);axisequalplot([Ex11,Fx11],[Ey11,Fy11],'r','linewidth',2);plot(Dx,Dy,'ko','markersize',8,'markerfacecolor','y');plot(Bx11,By11,'ks','markersize',8,'markerfacecolor','y');plot(Ex11,Ey11,'ko','markersize',8,'markerfacecolor','y');plot(Ax,Ay,'ko','markersize',8,'markerfacecolor','y');plot(Fx11,Fy11,'ks','markersize',8,'markerfacecolor','y');x1=-450:450;y1=G;plot(x1,y1,'r');x2=0;80\n河南理工大学本科毕业设计(论文)y2=-20:610;plot(x2,y2,'r');theAxes=axis;%保持坐标系不变%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%创建一个保存动画的矩阵fmat=moviein(119);n=0;%创建运动循环数据fori=1:3:357n=n+1;Bx11=Bx(i);By11=By(i);Ex11=Ex(i);Ey11=Ey(i);Fx11=Fx(i);Fy11=Fy(i);plot([Ex11,Fx11],[Ey11,Fy11],'r','linewidth',2);holdonplot([Dx,Ex11],[Dy,Ey11],'r','linewidth',2);plot([Ax,Bx11],[Ay,By11],'g','linewidth',2);plot(Dx,Dy,'ko','markersize',8,'markerfacecolor','y');plot(Bx11,By11,'ks','markersize',8,'markerfacecolor','y');plot(Ex11,Ey11,'ko','markersize',8,'markerfacecolor','y');plot(Ax,Ay,'ko','markersize',8,'markerfacecolor','y');80\n河南理工大学本科毕业设计(论文)plot(Fx11,Fy11,'ks','markersize',8,'markerfacecolor','y');plot(x1,y1,'r');plot(x2,y2,'r');holdoffdrawnowAxis(theAxes);%使用相同的坐标fmat(:,n)=getframe;end%重复播放10次movie(fmat,10);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5)数据计算程序%参数调用程序functioncaculate%%%%%%%%%从主程序当中读取句柄值handles=guihandles(gcf);L1=get(handles.hL1,'string');L1=str2num(L1);%%把字符转换为数值L3=get(handles.hL3,'string');L3=str2num(L3);%%把字符转换为数值L5=get(handles.hL5,'string');L5=str2num(L5);%%把字符转换为数值H=get(handles.hH,'string');H=str2num(H);%%把字符转换为数值80\n河南理工大学本科毕业设计(论文)G=get(handles.hG,'string');G=str2num(G);%%把字符转换为数值phi3=get(handles.hphi3,'string');phi3=str2num(phi3);%%把字符转换为数值phi3=phi3*pi/180;P=get(handles.hP,'string');P=str2num(P);%%把字符转换为数值phi5=get(handles.hphi5,'string');phi5=str2num(phi5);%%把字符转换为数值phi5=phi5*pi/180;S=get(handles.hS,'string');S=str2num(S);%%把字符转换为数值n1=get(handles.hn1,'string');n1=str2num(n1);%%把字符转换为数值phi1=get(handles.hphi1,'string');phi1=str2num(phi1);%%把字符转换为数值phi1=phi1*pi/180;%把phi1转化为弧度%计算过程如下%位置点%phi1=phi1+[0:pi/180:2*pi];%phi11=phi1+[0:pi/180:(pi/2-pi/180)];phi12=[(pi/2+pi/180):pi/180:(pi-pi/180)];phi13=[(pi+pi/180):pi/180:(3*pi/2-pi/180)];80\n河南理工大学本科毕业设计(论文)phi14=[(3*pi/2+pi/180):pi/180:(2*pi-pi/180)];phi1=[phi11,phi12,phi13,phi14];phi31=atan((H+L1*sin(phi11))./(L1*cos(phi11)));phi32=pi+atan((H+L1*sin(phi12))./(L1*cos(phi12)));phi33=pi+atan((H+L1*sin(phi13))./(L1*cos(phi13)));phi34=atan((H+L1*sin(phi14))./(L1*cos(phi14)));phi3=[phi31,phi32,phi33,phi34];P1=abs(L1*cos(phi11)./cos(phi31));P2=abs(L1*cos(phi12)./cos(phi32));P3=abs(L1*cos(phi13)./cos(phi33));P4=abs(L1*cos(phi14)./cos(phi34));P=[P1P2P3P4];Bx1=P1.*cos(phi31);Bx2=P2.*cos(phi32);Bx3=P3.*cos(phi33);Bx4=P4.*cos(phi34);Bx=[Bx1Bx2Bx3Bx4];By1=P1.*sin(phi31);By2=P2.*sin(phi32);By3=P3.*sin(phi33);By4=P4.*sin(phi34);By=[By1By2By3By4];80\n河南理工大学本科毕业设计(论文)Ex1=L3.*cos(phi31);Ex2=L3.*cos(phi32);Ex3=L3.*cos(phi33);Ex4=L3.*cos(phi34);Ex=[Ex1Ex2Ex3Ex4];Ey1=abs(L3.*sin(phi31));Ey2=abs(L3.*sin(phi32));Ey3=abs(L3.*sin(phi33));Ey4=abs(L3.*sin(phi34));Ey=[Ey1Ey2Ey3Ey4];Fy1=G*ones(size(Ex1));Fy2=G*ones(size(Ex2));Fy3=G*ones(size(Ex3));Fy4=G*ones(size(Ex4));Fy=[Fy1Fy2Fy3Fy4];sq1=(sqrt(L5^2-(Fy1-Ey1).^2)).*ones(size(Ex1));sq2=(sqrt(L5^2-(Fy2-Ey2).^2)).*ones(size(Ex2));sq3=(sqrt(L5^2-(Fy3-Ey3).^2)).*ones(size(Ex3));sq4=(sqrt(L5^2-(Fy4-Ey4).^2)).*ones(size(Ex4));sq=[sq1sq2sq3sq4];Fx1=-sq1+Ex1;80\n河南理工大学本科毕业设计(论文)Fx2=-sq2+Ex2;Fx3=-sq3+Ex3;Fx4=-sq4+Ex4;Fx=[Fx1Fx2Fx3Fx4];S=Fx;%F点相对轴位移time=1:361;%速度计算omega1=n1*2*pi/60;VB=omega1*L1;VB2B3=-omega1*L1*sin(phi1-phi3);omega3=omega1*L1*cos(phi1-phi3)./P;VE=L3*omega3;phi5=asin((G-L3*sin(phi3))/L5);VF=-omega3.*L3.*sin(phi3-phi5)./cos(phi5);%加速度计算alpha3=(omega1^2*L1*sin(phi3-phi1)-2*omega3.*VB2B3)./P;omega4=-omega3*L3.*cos(phi3)./(L5*cos(phi5));aF=-(alpha3*L3.*sin(phi3-phi5)+omega3.^2*L3.*cos(phi3-phi5)+omega4.^2*L5)./cos(phi5);%保存计算结果在mydata.mat中savemydataL1L3L5HGPn1phi1phi3phi5SBxByExEyFxFyVFaF;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6)运动分析线图程序80\n河南理工大学本科毕业设计(论文)%运动线图函数%%%%%%%%%%%%%%%%%%%%%%%%functiongraph%从mydata中读取变量值%%%%%%%loadmydataphi1SVFaF;%把phi1由弧度转化成度%%%%%%%phi1=phi1*180/pi;%画位移曲线%%%%%%%%%%%%%%%%subplot(3,1,1);plot(phi1,S);v=axis;v(2)=450;axis(v);ylabel('s(m)');title('刨头F点的位移曲线');%画速度曲线%%%%%%%%%%%%%subplot(3,1,2);plot(phi1,VF);v=axis;v(2)=450;axis(v);ylabel('v(m/s)');title('刨头F点的速度曲线');%画加速度曲线%%%%%%%%%%%subplot(3,1,3);plot(phi1,aF);80\n河南理工大学本科毕业设计(论文)v=axis;v(2)=450;axis(v);xlabel('\phi_1(degrees)');ylabel('a(m/s^2)');title('刨头F点的加速度曲线');%%%%%%%%%%%%%%%%%%%%%%%%%80查看更多