华科机械综合测试实验球杆实验报告_第1页
华科机械综合测试实验球杆实验报告_第2页
华科机械综合测试实验球杆实验报告_第3页
华科机械综合测试实验球杆实验报告_第4页
华科机械综合测试实验球杆实验报告_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE28球杆控制定位系统实验报告实验小组成员:周开城u200910555机械0902班张伟u200910571机械0902班一实验目的(1)掌握对实际物理模型的建模方法。(2)掌握在Matlab中利用Simulink等工具对系统进行模型分析的方法。(3)掌握PID控制算法的原理和实际应用。(4)学习PID参数的调节方法。二实验系统及实验原理(一)球杆系统的特点球杆系统是一个典型的非线性系统,理论上而言,它是一个真正意义上的非线性系统,其执行机构还具有很多非线性特性,包括:♦死区♦直流马达和带轮的传动非线性。♦位置测量的不连续性。♦导轨表面不是严格的光滑表面,产生非线性阻力。这些非线性因素对于传统意义上的测量和建模造成很大的影响,并对系统的控制性能造成非常大的影响,怎样去设计一个鲁棒的控制系统,是现代控制理论的一个重要问题。固高科技提供的球杆系统既可以用于研究控制系统运行的非线性动力学,也可以用于研究控制系统的非线性观测器等,是一个较为通用的实验设备。因为系统机械结构的特点,球杆系统具有一个最重要的特性——不稳定性,对于传统的实验方法,存在一些实验的难处,不稳定的系统容易对实验人员产生危险或是不可预料的伤害,球杆系统相对而言,机械比较简单,结构比较紧凑,安全性也比较高,是一个可以避免这些危险和伤害的实验设备。采用智能伺服驱动模块和直观的Windows程序界面,是控制系统实验的一个理想的实验设备。(二)球杆系统如图1所示,包括控制计算机、IPM100伺服驱动器、球杆本体和光电码盘、线性传感器、伺服电机和球杆装置等部分,组成一个闭环系统。光电码盘将杠杆臂与水平方向的夹角、角速度通过RS232接口与计算机通信。在控制系统中,输入钢球的控制位置和控制参数,通过控制决策计算输出电机转动方向、转动速度、加速度等,并由智能伺服驱动器产生相应的控制量,发出模拟信号使电机转动,带动杠杆臂运动从而控制球的位置。本系统为一个单输入(电机转角θ)、单输出(钢球位置x)系统。其中,θ由伺服电机的角度编码器测定,输出量x由轨道上电位器输出的电压信号获得。系统的控制框,如图1所示。整个机构运行如图2所示:球杆系统主要由以下几部分组成,如图所示。(三)机械部分:机械部分包括底座、小球、横杆、减速皮带轮、支撑部分、马达等。小球可以在横杆上自由的滚动,横杆的一端通过转轴固定,另一端可以上下转动,通过控制直流伺服电机的位置,带动皮带轮转动,通过传动机构就可以控制横杆的倾斜角。直流伺服电机带有增量式编码器(1000P/R),可以检测电机的实际位置,在横杆上的凹槽内,有一线性的传感器用于检测小球的实际位置,两个实际位置的信号都被传送给控制系统,构成一个闭环反馈系统。当带轮转动角度θ,横杆的转动角度为α,当横杆偏离水平的平衡位置后,在重力作用下,小球开始沿横杆滚动。(四)电气部分球滚动时位移的测量:直线位移传感器。线性轨道传感器接+5V电压。轨道两边测得的电压作为IPM100控制卡A/D输入口的信号。当小球在轨道上滚动时,通过不锈钢杆上输出的电压信号的测量可得到小球在轨道上的位置。伺服输出角度的测量:采用IPM100控制器,电机驱动齿轮转动时通过电机实际位置转换得到角度θ。(五)智能伺服驱动电机的运动通过IPM100智能伺服驱动器进行控制,IPM100是一个智能的高精度、全数字的控制器,内嵌100W的驱动电路,适合于有刷和无刷电机。基于反馈控制原理,在得到传感器信号后,对信号进行处理,然后给电机绕组施加适当的PWM电压信号,这样,一个相应的扭矩作用于电机轴,使电机开始运动,扭矩的大小决定于用户程序中的控制算法。IPM100是一款智能的控制器,它除了板载的用于放大控制信号的驱动放大器和PWM调制电路,还有一个全数字的DSP处理芯片,内存以及其它逻辑元件,有了这些,就可以实现先进的运动控制技术和PLC的功能,它产生实时的轨迹路径,实现闭环伺服控制,执行上位机的操作命令,完成板载IO信号的处理,所有这些都依照储存器的程序指令或是主机的在线命令执行,这种嵌入式的智能控制可以提供一个实时性非常好的控制效果,即使因为PC的非实时操作系统而产生延时的情况下。因为控制器可以独立运行,也可以采用从动模式,本手册介绍的球杆系统将采用两种模式。IPM100安装于控制箱内部,通过RS232和上位计算机进行通讯,直流电源也置于控制箱内部。(六)球杆系统的数学模型建立实际上使小球在导轨上加速滚动的力是小球的重力在同导轨平行方向上的分力同小球受到的摩擦力的合力。考虑小球滚动的动力学方程,小球在V型杆上滚动的加速度:(1-1)其中m——小球质量;J——小球的转动惯量;R——小球半径;r——小球位置偏移;g——重力加速度;α——轨道杆与水平面之间的夹角;θ——电动机转角;又有:由于实际摩擦力较小,忽略摩擦力,并由于较小,因此可以忽略此项的影响,其基本的数学模型转换成如下方式:(1-2)当α<<1时,将上式线性化,得到传递函数如下

(1-3)但是,在实际控制的过程中,杆的仰角α是由电动机的转角输出来实现的。影响电动机转角θ和杆仰角α之间关系的主要因素就是齿轮的减速比和非线性。因此,我们把该模型进一步简化:θ(s)=L/d•α(s)(1-4)把(1-4)式代入(1-3)式,我们可以得到另一个模型:得到球杆系统从齿轮角度θ(s)和小球位置(R(s))的传递函数:(1-5)因此,球杆系统实际上可以简化为一个二阶系统。(七)比例环节控制原理P控制分析对于具有比例控制作用的控制器,控制器的输出u(t)与误差作用信号e(t)之间的关系为:或者表示成拉普拉斯变换量的形式如下:式中Kp称为比例增益。无论是哪一种实际机构,也无论是哪一种形式的操作功率,比例控制器实质上是一种增益可调的放大器。控制系统如下图所示:球杆系统P控制器原理图可以得到单位负反馈系统的闭环传递函数为:可以看出是一个二阶系统(忽略了各种阻力)。(八)比例积分控制器原理PD控制器的控制作用可以由下列方程定义:其传递函数为:式中Kp为比例增益,而Td称为微分时间常数,Kp,Td都可以调节,微分控制作用也称为速率控制,它是控制器输出中与作用误差信号变化率成比例的一部分,微分时间Td是速率控制作用超前于比例控制作用效果的时间间隔,微分控制作用具有预测的优点,但是它也具有缺点,因为它放大了噪声信号,并且还可能在执行器中造成饱和效应。微分控制作用不能单独使用,因为它仅仅在瞬态过程中才是有效的。控制系统如下图所示:图3-1球杆系统PD控制器原理图可以得到单位负反馈系统的闭环传递函数为:(九)PID控制原理比例控制作用、积分控制作用和微分控制作用的组合叫做比例-加-积分-加-微分控制作用,这种组合具有三种控制作用的优点,具有这种组合作用的控制器方程为:即其传递函数为:式中Kp为比例增益,Ti为积分时间,Td为微分时间。控制系统如下图所示:图4-1球杆系统PID控制器原理图可以得到单位负反馈系统的闭环传递函数为:按照齐格勒-尼赫尔斯法则设计PID控制器,因为含有积分器,所以按照第二法设计,首先假设Ki=0,Kd=0,增加Kp直到呈现周期振荡,取呈现周期振荡的最小的Kp=Kcr,设周期振荡的周期为Pcr,按下表计算PID参数:控制器类型KpKiKdP0.5Kcr00PI0.45Kcr1.2/Pcr0PID0.6Kcr2/Pcr0.125Pcr(十)PID参数调节方法(1)经验法:又叫现场凑试法,即先确定一个调节器的参数值PB和Ti,通过改变给定值对控制系统施加一个扰动,现场观察判断控制曲线形状。若曲线不够理想,可改变PB或Ti,再画控制过程曲线,经反复凑试直到控制系统符合动态过程品质要求为止,这时的PB和Ti就是最佳值。如果调节器是PID三作用式,那么要在整定好的PB和Ti的基础上加进微分作用。由于微分作用有抵制偏差变化的能力,所以确定一个Td值后,可把整定好的PB和Ti值减小一点再进行现场凑试,直到PB、Ti和Td取得最佳值为止。显然用经验法整定的参数是准确的。但花时间较多。为缩短整定时间,应注意以下几点:①根据控制对象特性确定好初始的参数值PB、Ti和Td。可参照在实际运行中的同类控制系统的参数值,或参照表所给的参数值,使确定的初始参数尽量接近整定的理想值。这样可大大减少现场凑试的次数。②在凑试过程中,若发现被控量变化缓慢,不能尽快达到稳定值,这是由于PB过大或Ti过长引起的,但两者是有区别的:PB过大,曲线漂浮较大,变化不规则,Ti过长,曲线带有振荡分量,接近给定值很缓慢。这样可根据曲线形状来改变PB或Ti。③PB过小,Ti过短,Td太长都会导致振荡衰减得慢,甚至不衰减,其区别是PB过小,振荡周期较短;Ti过短,振荡周期较长;Td太长,振荡周期最短。④如果在整定过程中出现等幅振荡,并且通过改变调节器参数而不能消除这一现象时,可能是阀门定位器调校不准,调节阀传动部分有间隙(或调节阀尺寸过大)或控制对象受到等幅波动的干扰等,都会使被控量出现等幅振荡。这时就不能只注意调节器参数的整定,而是要检查与调校其它仪表和环节。(2)衰减曲线法:是以4:1衰减作为整定要求的,先切除调节器的积分和微分作用,用凑试法整定纯比例控制作用的比例带PB(比同时凑试二个或三个参数要简单得多),使之符合4:1衰减比例的要求,记下此时的比例带PBs和振荡周期Ts。如果加进积分和微分作用,可按表给出经验公式进行计算。若按这种方式整定的参数作适当的调整。对有些控制对象,控制过程进行较快,难以从记录曲线上找出衰减比。这时,只要被控量波动2次就能达到稳定状态,可近似认为是4:1的衰减过程,其波动一次时间为Ts。(3)临界比例带法,用临界比例带法整定调节器参数时,先要切除积分和微分作用,让控制系统以较大的比例带,在纯比例控制作用下运行,然后逐渐减小PB,每减小一次都要认真观察过程曲线,直到达到等幅振荡时,记下此时的比例带PBk(称为临界比例带)和波动周期Tk,然后按表3-4-3给出的经验公式求出调节器的参数值。按该表算出参数值后,要把比例带放在比计算值稍大一点的值上,把Ti和Td放在计算值上,进行现场观察,如果比例带可以减小,再将PB放在计算值上。这种方法简单,应用比较广泛。但对PBk很小的控制系统不适用。(4)反应曲线法,前三种整定调节器参数的方法,都是在预先不知道控制对象特性的情况下进行的。如果知道控制对象的特性参数,即时间常数T、时间迟延ξ和放大系数K,则可按经验公式计算出调节器的参数。利用这种方法整定的结果可达到衰减率φ=0.75的要求三实验内容及实验过程(一)实验步骤(1)认真观察球杆控制定位系统,指出系统的各个部分,打开后盖,认知相关的电气控制部分及机械传动部分,并做好记录。(2)安装好后盖,将电源线,通讯线与电源箱,电脑正常连接。(3)接通电源,打开测试软件。(4)在matlab下打开QGTEST.MDL进入测试界面。(5)点击运行(6)设置运动位置POS,观察球杆运动情况。(7)切换伺服开关,运动,停止开关,测试硬件响应。(8)改变运动速度,加速度及位置,观察运动情况。(9)打开各个示波器(10)用手轻拨钢球,让钢球在滑道上缓慢滚动,观察采集到钢球的位置数据。(11)停止实时仿真,观察各示波器数据,并保存到相应的文件。(二)控制系统的搭建(1)通过改变三个输入常量的值,改变曲柄的运动速度,加速度和最终停留位置Move_Abs的创建A在桌面上新建一个文件夹,如:“班号组号”。B打开matlab.点击simulink图标。新建一个文件。C将User-DefinedFunctions/S-Function拖入新建文件中,改名为Init。D将一个Source/Constant拖入新建文件中,并打开。E将Com输出端连接Init输入端。F将Port&Subsystems/EnabledSubsystem拖入新建文件中,并打开。G将其中的“In1—Out1”删掉。H将User-DefinedFunctions/S-Function拖入EnabledSubsystem中,改名为move_absolute。I将三个Source/Const拖入新建文件中。J将文件mcqg.out,IPM100.CFG,Move_Abs.h,InitIPM_RAM.h,InitIPM_RAM.cpp,TMLcommn.dll,TML_lid.dll,TML_lib.h,TML_lib.lib,文件复制到班号组号中。K在Init框图上点击右键/S-FunctionParameters.将S-FunctionName改为InitIPM_RAM并确定。I在move_absolute。框图上点击右键/S-FunctionParameters.将S-FunctionName改为move_Abs.并确定。M将matlab的命令输入窗口上的CurrentDirectory的路径设为“班号组号”的路径。N在命令输入窗口中依次输入mexMove_Abs.cpp,mexInitIPM_RAM.cpp。这是可以看到move_absolute框图输入端口为3个。输出为零。O将三个Constant与move_absolute3个输出端口相连。P保存新建文件取名为Move_Abs1.存入“班级组号”中。运行,观察曲柄的运行速度,加速度和最终停留位置。(2)小球在球杆上位置数据采集Get_AD的创建A在桌面上新建一个文件夹,如:“班号组号”。B打开matlab.点击simulink图标。新建一个文件。C将User-DefinedFunctions/S-Function拖入新建文件中,改名为Init。D将一个Source/Constant拖入新建文件中,并打开。E将Com输出端连接Init输入端。F将Port&Subsystems/EnabledSubsystem拖入新建文件中,并打开。G将其中的“In1—Out1”删掉。H将User-DefinedFunctions/S-Function拖入EnabledSubsystem中,改名为Get_ADI另将一个Source/Constant拖入子系统中。J在子系统中拖入一个示波器scop。K将Constant的值改为5.名称改为AD_NO。L将AD_NO的输出端与Get_AD的输出端相连,将Get_AD的输出端与示波器scop的输入端相连。M在Get_AD框图上点击右键/S-FunctionParameters.将S-FunctionName改为Get_AD并确定。N将Get_AD.cpp,Get_AD.h复制到文件夹“班号组号”中。O在命令输入窗口输入mexGet_AD.cpp。P将所搭建的模块另存到12中。取名为GetAD.用手使小球在球杆上移动,用示波器上显示出小球运动位置的变化轨迹。(3)伺服控制stopandservo的创建A在桌面上新建一个文件夹,如:“班号组号”。B打开matlab.点击simulink图标。新建一个文件。C将User-DefinedFunctions/S-Function拖入新建文件中,改名为Init。D将一个Source/Constant拖入新建文件中,并打开。E将Com输出端连接Init输入端。F将Port&Subsystems/EnabledSubsystem拖入新建文件中,并打开。G将其中的“In1—Out1”删掉。H将两个User-DefinedFunctions/S-Function拖入EnabledSubsystem中,分别改名为stop和servo。I将两个SignalRouting/ManualSwitch(分别取名为ManualSwitch1和ManualSwitch2)和4个Source/Constant拖入Sbsystem中。J将ManualSwitch1和ManualSwitch2的两个输入端分别与两个Constant相连。K将ManualSwitch1的输出端与stop相连。将ManualSwitch2的输出端与servo相连。L与ManualSwitch1相连的两个Constant分别取值-1,改名continue和3,改名为stop.与ManualSwitch2相连的两个Constant分别取值0,改名POWEROFF和1,改名为POWERON。M将Stop.cpp,Stop.h,Servo.cpp,Servo.h复制粘贴到“班号组号”中。N在命令输入窗口中一次输入mexStop.cpp,mexServo.cpp。O将所搭建的模块另存到“班号组号”中。取名为stoppandservo.运行:若将stop与-1连接,servo与1连接。则运行时,曲柄将运动到特定位置后停止运动;若在中途改变stop与3连接,则曲柄立即停止运动;若没有上一步,将servo改为与0相连,则曲柄立即自然下垂到初始位置,再将servo改为与1相连,则曲柄立即又回到目标位置。(4)根据球杆系统的模型,建立PID控制器,控制球在球杆某个位置的simulink控制模型。A在桌面上新建一个文件夹,如:“班号组号”。B打开matlab.点击simulink图标。新建一个文件。C将User-DefinedFunctions/S-Function拖入新建文件中,改名为Init。D将一个Source/Constant拖入新建文件中,并打开。E将Com输出端连接Init输入端。F将Port&Subsystems/EnabledSubsystem拖入新建文件中,并打开。G将其中的“In1—Out1”删掉。H创建子系统如下图所示,离散PID控制器如下图所示。图(a)图(b)图(c)(三)实验C代码及相关函数说明(1)球杆模型c代码Get_AD.cpp/*Copyright2003-2004TheMathWorks,Inc.*///*******************************************************************//****Tobuildthismexfunctionuse:mexMytst.cpp****//*******************************************************************#include"Get_AD.h"#defineWIN32//#ifndefWIN32//#error"OnlyWIN32versionisavailable"//#endif#include"windows.h"#defineS_FUNCTION_LEVEL2#defineS_FUNCTION_NAMEGet_AD//Needtoincludesimstruc.hforthedefinitionoftheSimStructand//itsassociatedmacrodefinitions.#include"simstruc.h"#include"TML_lib.h"//#include"TML_lib_compact.h"#pragmacomment(lib,"TML_lib.lib")#pragmawarning(disable:4761)#defineIS_PARAM_DOUBLE(pVal)(mxIsNumeric(pVal)&&!mxIsLogical(pVal)&&\!mxIsEmpty(pVal)&&!mxIsSparse(pVal)&&!mxIsComplex(pVal)&&mxIsDouble(pVal))//Function:mdlInitializeSizes===============================================//Abstract://ThesizesinformationisusedbySimulinktodeterminetheS-function//block'scharacteristics(numberofinputs,outputs,states,etc.).staticvoidmdlInitializeSizes(SimStruct*S){//NoexpectedparametersssSetNumSFcnParams(S,0);//ParametermismatchwillbereportedbySimulinkif(ssGetNumSFcnParams(S)!=ssGetSFcnParamsCount(S)){return;}//SpecifyI/O//if(!ssSetNumInputPorts(S,0))return;if(!ssSetNumInputPorts(S,1))return;ssSetInputPortWidth(S,0,DYNAMICALLY_SIZED);ssSetInputPortDirectFeedThrough(S,0,1);if(!ssSetNumOutputPorts(S,1))return;ssSetOutputPortWidth(S,0,DYNAMICALLY_SIZED);ssSetNumSampleTimes(S,1);//ReserveplaceforC++objectssSetNumPWork(S,1);ssSetOptions(S,SS_OPTION_WORKS_WITH_CODE_REUSE|SS_OPTION_EXCEPTION_FREE_CODE|SS_OPTION_USE_TLC_WITH_ACCELERATOR);}//Function:mdlInitializeSampleTimes=========================================//Abstract://Thisfunctionisusedtospecifythesampletime(s)foryour//S-function.Youmustregisterthesamenumberofsampletimesas//specifiedinssSetNumSampleTimes.staticvoidmdlInitializeSampleTimes(SimStruct*S){ssSetSampleTime(S,0,CONTINUOUS_SAMPLE_TIME);//INHERITED_SAMPLE_TIMEssSetOffsetTime(S,0,0.0);ssSetModelReferenceSampleTimeDefaultInheritance(S);}//Function:mdlStart=======================================================//Abstract://Thisfunctioniscalledonceatstartofmodelexecution.Ifyou//havestatesthatshouldbeinitializedonce,thisistheplace//todoit.#defineMDL_STARTstaticvoidmdlStart(SimStruct*S){//StorenewC++objectinthepointersvectorDoubleAdder*da=newDoubleAdder();//InputRealPtrsTypeuPtrs=ssGetInputPortRealSignalPtrs(S,0);ssGetPWork(S)[0]=da;}//Function:mdlOutputs=======================================================//Abstract://Inthisfunction,youcomputetheoutputsofyourS-function//block.Generallyoutputsareplacedintheoutputvector,ssGetY(S).staticvoidmdlOutputs(SimStruct*S,int_Ttid){//RetrieveC++objectfromthepointersvector//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//GetdataaddressesofI/OInputRealPtrsTypeu=ssGetInputPortRealSignalPtrs(S,0);real_T*y=ssGetOutputPortRealSignal(S,0);////CallAddTomethodandreturnpeakvalue//y[0]=da->AddTo(*u[0]);//shortval_ad;shortAD_No;WORDadr_AD;AD_No=*u[0];adr_AD=0;if(AD_No==2)adr_AD=0x23e;if(AD_No==5)adr_AD=0x241;if(adr_AD!=0){TS_GetIntVariable(adr_AD,val_ad);*y=400.00*((float)(unsignedshort)val_ad/65535.00);}//}//Function:mdlTerminate=====================================================//Abstract://Inthisfunction,youshouldperformanyactionsthatarenecessary//attheterminationofasimulation.Forexample,ifmemorywas//allocatedinmdlStart,thisistheplacetofreeit.staticvoidmdlTerminate(SimStruct*S){//RetrieveanddestroyC++object//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//deleteda;}//RequiredS-functiontrailer#ifdefMATLAB_MEX_FILE/*IsthisfilebeingcompiledasaMEX-file?*/#include"simulink.c"/*MEX-fileinterfacemechanism*/#else#include"cg_sfun.h"/*Codegenerationregistrationfunction*/#endifInitIPM_RAM.cpp/*Copyright2003-2004TheMathWorks,Inc.*///*******************************************************************//****Tobuildthismexfunctionuse:mexMytst.cpp****//*******************************************************************#include"InitIPM_RAM.h"#defineWIN32//#ifndefWIN32//#error"OnlyWIN32versionisavailable"//#endif#include"windows.h"#defineS_FUNCTION_LEVEL2#defineS_FUNCTION_NAMEInitIPM_RAM//Needtoincludesimstruc.hforthedefinitionoftheSimStructand//itsassociatedmacrodefinitions.#include"simstruc.h"#include"TML_lib.h"//#include"TML_lib_compact.h"#pragmacomment(lib,"TML_lib.lib")#pragmawarning(disable:4761)#defineIS_PARAM_DOUBLE(pVal)(mxIsNumeric(pVal)&&!mxIsLogical(pVal)&&\!mxIsEmpty(pVal)&&!mxIsSparse(pVal)&&!mxIsComplex(pVal)&&mxIsDouble(pVal))//Function:mdlInitializeSizes===============================================//Abstract://ThesizesinformationisusedbySimulinktodeterminetheS-function//block'scharacteristics(numberofinputs,outputs,states,etc.).staticvoidmdlInitializeSizes(SimStruct*S){//NoexpectedparametersssSetNumSFcnParams(S,0);//ParametermismatchwillbereportedbySimulinkif(ssGetNumSFcnParams(S)!=ssGetSFcnParamsCount(S)){return;}//SpecifyI/O//if(!ssSetNumInputPorts(S,0))return;if(!ssSetNumInputPorts(S,1))return;ssSetInputPortWidth(S,0,DYNAMICALLY_SIZED);ssSetInputPortDirectFeedThrough(S,0,1);if(!ssSetNumOutputPorts(S,1))return;ssSetOutputPortWidth(S,0,DYNAMICALLY_SIZED);ssSetNumSampleTimes(S,1);//ReserveplaceforC++objectssSetNumPWork(S,1);ssSetOptions(S,SS_OPTION_WORKS_WITH_CODE_REUSE|SS_OPTION_EXCEPTION_FREE_CODE|SS_OPTION_USE_TLC_WITH_ACCELERATOR);}//Function:mdlInitializeSampleTimes=========================================//Abstract://Thisfunctionisusedtospecifythesampletime(s)foryour//S-function.Youmustregisterthesamenumberofsampletimesas//specifiedinssSetNumSampleTimes.staticvoidmdlInitializeSampleTimes(SimStruct*S){ssSetSampleTime(S,0,INHERITED_SAMPLE_TIME);ssSetOffsetTime(S,0,0.0);ssSetModelReferenceSampleTimeDefaultInheritance(S);}//Function:mdlStart=======================================================//Abstract://Thisfunctioniscalledonceatstartofmodelexecution.Ifyou//havestatesthatshouldbeinitializedonce,thisistheplace//todoit.#defineMDL_STARTstaticvoidmdlStart(SimStruct*S){//StorenewC++objectinthepointersvector//DoubleAdder*da=newDoubleAdder();shortrtn;InputRealPtrsTypeuPtrs=ssGetInputPortRealSignalPtrs(S,0);//ssGetPWork(S)[0]=da;//FILE*pfile;DWORDnBaud=115200;BYTEnHostID=255;BYTEnRSType=SERIAL_RS232;BYTEnPort=1;WORDstart_address;//pfile=fopen("rtn.txt","wt");nPort=*uPtrs[0];rtn=TS_OpenSerialPort(nRSType,nPort,nHostID,nBaud);//fprintf(pfile,"TS_OpenSerialPort:%d\n",rtn);rtn=TS_SetupAxis(255,"IPM100.cfg");//fprintf(pfile,"TS_SetupAxis:%d\n",rtn);rtn=TS_SelectAxis(255);//fprintf(pfile,"TS_SelectAxis:%d\n",rtn);rtn=TS_Reset();Sleep(100);////¹¤×÷·½Ê½Ñ¡Ôñ_20060917//Downloadthe"Ex29RAM.out"fileonthedriveTS_DownloadProgram("mcqg.out",start_address);//Afterthefiledownload,executethedownloadedcodeTS_GOTO(start_address);//gotothestartaddressofthesetupprogram//Afterthis,youcanstartsendingon-linecommandstowardsthedrive//rtn=TS_Power(POWER_ON);//fprintf(pfile,"TS_Power:%d\n",rtn);//rtn=TS_MoveVelocity(2,0.64,MOVE_IMMEDIATE,FROM_REFERENCE);rtn=TS_MoveAbsolute(4420,5,1,UPDATE_IMMEDIATE,FROM_REFERENCE);//fprintf(pfile,"TS_MoveVelocity:%d\n",rtn);//fclose(pfile);Sleep(100);}//Function:mdlOutputs=======================================================//Abstract://Inthisfunction,youcomputetheoutputsofyourS-function//block.Generallyoutputsareplacedintheoutputvector,ssGetY(S).staticvoidmdlOutputs(SimStruct*S,int_Ttid){//RetrieveC++objectfromthepointersvector//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//GetdataaddressesofI/O//InputRealPtrsTypeu=ssGetInputPortRealSignalPtrs(S,0);real_T*y=ssGetOutputPortRealSignal(S,0);//CallAddTomethodandreturnpeakvalue//y[0]=da->AddTo(*u[0]);///*WORDadr_APOS=0x228;//addressoftheAPOSTMLvariable-measuredpositionlongi_APOS=0;//variablestoringtheactualpositionreadfromthedriveTS_GetLongVariable(adr_APOS,i_APOS);//readtheactualpositionif(i_APOS<(4420-10))*y=1;//*/////Sleep(50);*y=1;}//Function:mdlTerminate=====================================================//Abstract://Inthisfunction,youshouldperformanyactionsthatarenecessary//attheterminationofasimulation.Forexample,ifmemorywas//allocatedinmdlStart,thisistheplacetofreeit.staticvoidmdlTerminate(SimStruct*S){//RetrieveanddestroyC++object//TS_MoveAbsolute(0,3,0.1,UPDATE_IMMEDIATE,FROM_REFERENCE);//FROM_MEASURE//Sleep(200);//TS_MoveVelocity(0,0.1,MOVE_IMMEDIATE,FROM_REFERENCE);TS_Power(POWER_OFF);TS_CloseSerialPort();//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//deleteda;}//RequiredS-functiontrailer#ifdefMATLAB_MEX_FILE/*IsthisfilebeingcompiledasaMEX-file?*/#include"simulink.c"/*MEX-fileinterfacemechanism*/#else#include"cg_sfun.h"/*Codegenerationregistrationfunction*/#endifMove_AbS.cpp/*Copyright2003-2004TheMathWorks,Inc.*///*******************************************************************//****Tobuildthismexfunctionuse:mexMytst.cpp****//*******************************************************************#include"Move_Abs.h"#defineWIN32//#ifndefWIN32//#error"OnlyWIN32versionisavailable"//#endif#include"windows.h"#defineS_FUNCTION_LEVEL2#defineS_FUNCTION_NAMEMove_Abs//Needtoincludesimstruc.hforthedefinitionoftheSimStructand//itsassociatedmacrodefinitions.#include"simstruc.h"#include"TML_lib.h"//#include"TML_lib_compact.h"#pragmacomment(lib,"TML_lib.lib")#pragmawarning(disable:4761)#defineIS_PARAM_DOUBLE(pVal)(mxIsNumeric(pVal)&&!mxIsLogical(pVal)&&\!mxIsEmpty(pVal)&&!mxIsSparse(pVal)&&!mxIsComplex(pVal)&&mxIsDouble(pVal))//Function:mdlInitializeSizes===============================================//Abstract://ThesizesinformationisusedbySimulinktodeterminetheS-function//block'scharacteristics(numberofinputs,outputs,states,etc.).staticvoidmdlInitializeSizes(SimStruct*S){//Noexpectedparametersinti;ssSetNumSFcnParams(S,0);//ParametermismatchwillbereportedbySimulinkif(ssGetNumSFcnParams(S)!=ssGetSFcnParamsCount(S)){return;}//SpecifyI/Oif(!ssSetNumInputPorts(S,3))return;for(i=0;i<3;i++){ssSetInputPortWidth(S,i,1);//DYNAMICALLY_SIZEDssSetInputPortDirectFeedThrough(S,i,1);}if(!ssSetNumOutputPorts(S,0))return;//ssSetOutputPortWidth(S,0,DYNAMICALLY_SIZED);ssSetNumSampleTimes(S,1);//ReserveplaceforC++objectssSetNumPWork(S,1);ssSetOptions(S,SS_OPTION_WORKS_WITH_CODE_REUSE|SS_OPTION_EXCEPTION_FREE_CODE|SS_OPTION_USE_TLC_WITH_ACCELERATOR);}//Function:mdlInitializeSampleTimes=========================================//Abstract://Thisfunctionisusedtospecifythesampletime(s)foryour//S-function.Youmustregisterthesamenumberofsampletimesas//specifiedinssSetNumSampleTimes.staticvoidmdlInitializeSampleTimes(SimStruct*S){ssSetSampleTime(S,0,CONTINUOUS_SAMPLE_TIME);//INHERITED_SAMPLE_TIMEssSetOffsetTime(S,0,0.0);ssSetModelReferenceSampleTimeDefaultInheritance(S);}//Function:mdlStart=======================================================//Abstract://Thisfunctioniscalledonceatstartofmodelexecution.Ifyou//havestatesthatshouldbeinitializedonce,thisistheplace//todoit.#defineMDL_STARTstaticvoidmdlStart(SimStruct*S){//StorenewC++objectinthepointersvectorDoubleAdder*da=newDoubleAdder();InputRealPtrsTypeuPtrs=ssGetInputPortRealSignalPtrs(S,0);ssGetPWork(S)[0]=da;}//Function:mdlOutputs=======================================================//Abstract://Inthisfunction,youcomputetheoutputsofyourS-function//block.Generallyoutputsareplacedintheoutputvector,ssGetY(S).staticvoidmdlOutputs(SimStruct*S,int_Ttid){//RetrieveC++objectfromthepointersvector//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//GetdataaddressesofI/OInputRealPtrsTypeu=ssGetInputPortRealSignalPtrs(S,0);real_T*y=ssGetOutputPortRealSignal(S,0);////CallAddTomethodandreturnpeakvalue//y[0]=da->AddTo(*u[0]);//shortrtn;FILE*pfile;pfile=fopen("rtn.txt","wt");fprintf(pfile,"*u[0]:%ld\n",*u[0]);fprintf(pfile,"*u[1]:%f\n",*u[1]);fprintf(pfile,"*u[2]:%f\n",*u[2]);rtn=TS_MoveAbsolute(*u[0],*u[1],*u[2],UPDATE_IMMEDIATE,FROM_REFERENCE);//rtn=TS_MoveAbsolute(2000,5,0.01,UPDATE_IMMEDIATE,FROM_REFERENCE);fprintf(pfile,"TS_MoveAbsolute:%d\n",rtn);fclose(pfile);//}//Function:mdlTerminate=====================================================//Abstract://Inthisfunction,youshouldperformanyactionsthatarenecessary//attheterminationofasimulation.Forexample,ifmemorywas//allocatedinmdlStart,thisistheplacetofreeit.staticvoidmdlTerminate(SimStruct*S){//RetrieveanddestroyC++object//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//deleteda;}//RequiredS-functiontrailer#ifdefMATLAB_MEX_FILE/*IsthisfilebeingcompiledasaMEX-file?*/#include"simulink.c"/*MEX-fileinterfacemechanism*/#else#include"cg_sfun.h"/*Codegenerationregistrationfunction*/#endif(1)Get_ADA函数功能:采集AD数据(对于球杆系统为采集小球位置);B函数实现描述:定义AD采样端口的值、地址、AD端口号等变量对他们赋初始值IPM100运动控制器有两个10位的模拟量输入端口,AD2和AD5,该函数中对AD端口号AD_No(系统默认为5)进行判断并读取该端口模拟量的值,并赋给变量val_ad。再通过读取内存中模拟量输入端口对应地址单元内的值,根据*y=400.00*((float)(unsignedshort)val_ad/65535.00)计算出小球的实际位置(单位毫米)。其中400为整个位移传感器的长度(400毫米),65535(1111111111111111)B为小球位置为400mm时对应的值。备注:AD转换结果有10位的分辨率,并左移6位。这样AD转换后的值在内存中为16位。该函数的输入是AD输入通道模拟量经转换后在内存中的值,输出为计算出来的小球的实际位置。C使用说明:1个输入:AD端口号1个输出:经过换算出来的小球的位置Y(2)Move_Abs函数功能:绝对运动命令:控制电机运动函数实现描述:输入电机的目标位置、目标速度和目标加速度,使电机运动到设定的目标位置使用说明:3个输入:设定运动的速度和加速度及目标位置(3)Stop函数功能:运动停止命令函数函数实现描述:读入电机停车的方式(默认STOP_3系统以设定的加减速度使用说明:一个输入:设定停止模式(4)Servo_on函数功能:电机伺服控制函数实现描述:读

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论