您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > 综合测控实验Simulink-2015
综合测控实验(下)主讲人:黄弢、王峻峰主要内容:•Matlab、Simulink测控系统应用:Matlab、Simulink调用*.dll,结合PID算法,实现对外部设备的闭环控制其它控制系统软件平台:•组态软件在控制系统的应用•DR-Link•VisualC++,VisualBasic•51单片机、ARM控制实验内容Matlab/SimulinkPLC组态软件DR-LinkVC++/VB51单片机变频器直流电机调速器步进电机驱动器伺服电机驱动器可控硅调功器三相交流异步电机直流电机步进电机伺服电机发热元件Gc(s)G(s)R(s)C(s)+-em(t)换算算法输出电流电压PWMPID算法被控对象课程内容•PWM脉宽调制实现调压——直流斩波调压直流斩波调压:将一个量值的直流电变为另一个量值的直流电,也称DC/DC变换利用C写的S-Function执行步骤•mdlInitializeSizes是Simulink与S-function交互时调用的第一个方法。随后Simulink将调用其他S-function方法(都以mdl开头)。仿真结束时,Simulink调用mdlTerminate。•注意:Simulink仿真时直接在适当的时间调用每个回调方法,利用C写的S-Function仿真步骤如图4.1所示:2019年12月17日星期二SIMULINK自定义模块1.CommonlyUsedBlocks(公共模块库)2.Continuous(连续模块库)3.Discrete(离散模块库)4.Logic&BitOperation(逻辑与位操作模块库)5.Ports&Subsystems(端口与子系统模块库)6.MathOperation(数学模块库)7.Function&Tables(函数与表格模块)8.Ports&Subsystems9.SignalAttributes(信号与系统模块库)10.Sinks(接收器模块库)11.Sources(输入源模块库)12.User-DefinedFunctions2019年12月17日星期二Simulinks-Functuion应用•在MATLAB环境下使用MEX命令将已编译好的C文件(通过SIMULINK编译)转换成DLL文件,然后再结合S-FUNCTION,调用该DLL文件。•首先在MATLAB的COMMAND窗口中输入:•mex-setup•会出现:•Selectacompiler:•[1]LccCversion2.4inF:\MATLAB\sys\lcc•[2]MicrosoftVisualC/C++version6.0inC:\ProgramFiles\MicrosoftVisualStudio•[0]None•即选择一个编译器。在这里一般选择VC++选项,直接在命令窗口中敲击编译器编号的数字键,然后回车即可。S-Function模板创建DLL•新建一个文件夹,选择为当前目录•打开simulink,选择User-DefinedFunctions/S-FunctionExamples/C-filesS-Function//BasicC-MEXTemplate,根据所定义模块的功能,将该自动生成的文件重命名,并存入你指定的文件夹中•将模版的c文件另存,文件名自定义,如MyOn.cpp。将Function改成和文件名一样,如图4.5所示。•在mdlOutputs(SimStruct*S,int_Ttid)函数中进行修改,将•real_T*y=ssGetOutputPortSignal(S,0);•替换为real_T*y=ssGetOutputPortRealSignal(S,0);•Matlab命令窗口,输入:mexMyOn.cpp,可以看到出现了一个MyOn.dll文件•在simulink窗口下,新建一个mdl文件(可为mytemp1,mdl的文件名不能与sfunction的名字相同,即不能为MyOn,否则会出现命名冲突。)),向其中添加一个S-Function模块,双击模块,将其中的S-FunctionName改为dll的文件名(不加后缀,也就是MyOn)。相同输入输出设置及采集编程•以下编程均在MyOn.cpp文件中标注输入输出设置:三个接口没有任何,这样我们就不清楚道理每个接口作用。为此,我们可以在图4.10所示的模块上单击右键,然后选择MaskS-Function,•在该cpp文件mdlStart(SimStruct*S)函数中添加采集卡初始化以及开启采集任务。•constreal_T*u1=(constreal_T*)ssGetInputPortRealSignalPtrs(S,0);•constreal_T*u2=(constreal_T*)ssGetInputPortRealSignalPtrs(S,1);•constreal_T*u3=(constreal_T*)ssGetInputPortRealSignalPtrs(S,2);•doubleFs=u1[0];//采样频率•if(ADCardInit()!=1)//采集卡初始化•{•ssSetErrorStatus(S,Can'tfindtheDAQCard!);•}•DAQ1(0x1,5000,1024*4,buffer);//开启采集Fs=5000•pnum=0;//初始化buf指针位置采集卡初始化及开启数据采集:•if(u2[0]==1)•DAQ1(0x1,Fs,1024,buffer);•elseif(u2[0]==2)•DAQ1(0x2,Fs,1024,buffer);•elseif(u2[0]==3)•DAQ1(0x4,Fs,1024,buffer);•elseif(u2[0]==4)•DAQ1(0x8,Fs,1024,buffer);•elseif(u2[0]==5)•DAQ1(0x10,Fs,1024,buffer);•elseif(u2[0]==6)•DAQ1(0x20,Fs,1024,buffer);•elseif(u2[0]==7)•DAQ1(0x40,Fs,1024,buffer);•elseif(u2[0]==8)•DAQ1(0x80,Fs,1024,buffer);•else•ssSetErrorStatus(S,channelnumberiswrong!);•ADCardInit()是采集卡DLL函数,作用是初始化采集卡。如果初始化成功则返回1,用于判断是否连上采集卡。•DAQ1()函数为采集卡DLL单通道采样函数,作用是启动采集卡进行单通道数据采集。参数1为采样通道,是以8位2进制数表示各个通道是否开启,如对通道1进行采集,该参数即为:00000001;同理,对3通道进行采集,其参数为00000100。各通道对应关系分别为:•0x1:通道10x2:通道20x4:通道3•0x8:通道40x10:通道50x20:通道6•0x40:通道70x80:通道8•DAQ2(ch,Fs,len,buffer1,buffer2)为双通道采样函数,第一个参数为通道号,和DAQ1一样,同样是以2进制数表示,如对1,2通道进行采集,该参数即为00000011;对3,4通道进行采集,即为00001100;下面是几组通道的对应关系•0x3:通道1、20x0A:通道2、40x0C:通道3、4•0x11:通道1、50x12:通道2、50x22:通道2、6•程序中使用位操作,首先获取采样通道号,例如1和2,将通道变量置0,即程序中的:•unsignedcharchannel=0x00;//初始化采集通道•用位操作方法,设置channel的第0位、第1位为1:•channel|=(1ch1);//设置采样通道1(该例子中ch1为0)•channel|=(1ch2);//设置采样通道2(该例子中ch2为1)•第二个参数Fs为采样频率;第三个参数len为采样长度;第四、五个参数为两个通道的缓存区指针。数据输出•数据输出在mdlOutputs()函数内实现。•intLength=1024*4;//读取的buffer长度•constreal_T*u2=(constreal_T*)ssGetInputPortRealSignalPtrs(S,1);•ReadDaq(u2[0],Length,buffer);//从采集卡读取buffer•real_T*y=ssGetOutputPortRealSignal(S,0);//获取输出指针•if(pnum=Length)pnum=0;//判断指针是否已满•*y=buffer[pnum];//输出第pnum个点的值•pnum++;//指针加1••函数ReadDaq()作用是读取下位机buf里的采样数据。•参数1为通道号,分别为1-8;•参数2为buffer长度;•参数3为保存的buffer指针。•退出采集卡:函数ADCardQuit()是采集卡dll函数,其作用是退出采集卡。•staticvoidmdlTerminate(SimStruct*S)•{•ADCardQuit();•}•再次在MATLAB的CommandWindow中输入mexMyOn.cpp,完成数据采集卡的程序编写。•打开测试实验平台上的直流电源,打开通道1的信号源,返回使用该模块形成的mytemp1.mdl文件,将运行时间改为inf,点击菜单栏上的“保存”图标,点击菜单栏上的“运行”图标,进行执行。双击Scope可以查看采集的信号波形。调用界面设计•clfreset•set(gcf,'menubar','none')•set(gcf,'unit','normalized','position',[0.2,0.2,0.5,0.35]);•set(gcf,'defaultuicontrolunits','normalized')•%设置用户缺省控件单位属性值•h_axes1=axes('position',[0.05,0.55,0.6,0.4]);•h_axes2=axes('position',[0.05,0.05,0.6,0.4]);•有两轴对象和两个按钮对象。•hpush1=uicontrol(gcf,'Style','push',...•%制作“采集”按钮•'position',[0.8,0.25,0.18,0.15],'string','采集');•hpush2=uicontrol(gcf,'Style','push',...•%制作“停止”按钮•'position',[0.8,0.05,0.18,0.15],'string','停止');•%首先让我们先前建立的mytemp1mdl文件运行•%“采集”按键引起的回调•set(hpush1,'callback',[...'set_param(''mytemp1'',''SimulationCommand'',''start''),',...'t=timer(''TimerFcn'',''getdata'',''Period'',1,''ExecutionMode'',''fixedSpacing'',''TasksToExecute'',inf),',...%设置定时器,运行getdata文件,与上面是一行。•'pause(2);start(t);',...%暂停2秒并启动定时器•]);•%“停止”按键引起的回调•hpush2=uicontrol(gcf,'Style','push',...•'position',[0.8,0.05,0.18,0.15],'string','停止');%制作“停止”按钮•set(hpush2,'callback','stop(t);set_param(''mytemp2'',''SimulationCommand'',''stop'');');•%停止定时器,mdl文件停止运行。回调属性球杆定位控制系统实验电机简单运动控制Qtest.mdl的Matlab模型结构如下图所示:模型主要由一个常量模块——COM,代表使用
本文标题:综合测控实验Simulink-2015
链接地址:https://www.777doc.com/doc-2067043 .html