CMEXS函数制作流程.doc_第1页
CMEXS函数制作流程.doc_第2页
CMEXS函数制作流程.doc_第3页
CMEXS函数制作流程.doc_第4页
CMEXS函数制作流程.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

C MEX S函数制作流程 S-Function 可以使用MATLAB,C,C+,Ada,或Fortran 语言来编写。使用MEX 实用工具,将C,C+,Ada,和Fortran 语言的S-Function 编译成MEX-文件,在需要的时候,它们可与其它的MEX-文件一起动态地连接到MATLAB 中。如果要与其他进程通讯或驱动外部硬件接口,则要调用API函数,这样就需要用C语言来开发S函数。 由于实验室需要,从去年年底开始学习S函数的编写,用的是C语言,说实话,没有高深的东西,都是API,而且有固定的格式,自己要填的就是初始化参数和最后的输出算法部分。但是对于刚接触这东西的人来说,要想在短时间内完成一个具有特定数据处理功能或者数据通信功能的模块还是要颇费周章的。度娘上的东西也不过是介绍其大概,提纲挈领,语焉不详。笔者有心将这两个月的学习结果整理成文,捭其后来者能直会其意,节省时间,仅此而已,请勿拍砖。 很多控制系统在设计完成后先要进行仿真,验证控制算法的正确性。而Simulink中现有的模块并不能完全满足仿真需求,因此需要我们自行制作一些Simulink模块,这就用到了S-Function的编写。用C语言编写的S函数,就是C MEX S函数。关于C MEX S函数的编写规范以及相关例程可以去问度娘,会给出满意的答复。这里假设一个*.c格式的C MEX S函数已经编写完成。#define S_FUNCTION_NAME test#define S_FUNCTION_LEVEL 2#includesimstruc.hfloat global_var;static void mdlInitializeSizes(SimStruct *S) ssSetNumSFcnParams(S,3); if(ssGetNumSFcnParams(S)!=ssGetSFcnParamsCount(S) return ; ssSetNumContStates(S,0); ssSetNumDiscStates(S,0); if(!ssSetNumInputPorts(S,1) return ; ssSetInputPortWidth(S,0,2); ssSetInputPortRequiredContiguous(S,0,true); ssSetInputPortDirectFeedThrough(S,0,1); if(!ssSetNumOutputPorts(S,2) return ; ssSetOutputPortWidth(S,0,1); ssSetOutputPortWidth(S,1,1); ssSetNumSampleTimes(S,1); ssSetNumRWork(S,0); ssSetNumIWork(S,0); ssSetNumPWork(S,0); ssSetNumModes(S,0); ssSetNumNonsampledZCs(S,0); ssSetOptions(S,0); global_var=1;static void mdlInitializeSampleTimes(SimStruct *S) ssSetSampleTimes(S,0,CONTINUOUS_SAMPLE_TIME); ssSetOffsetTime(S,0,0.0); #define MDL_INITIALIZE_CONDITIONS#if defined(MDL_INITIALIZE_CONDITIONS)static void mdlInitializeConditions(SimStruct *S)#endif#define MDL_START#if defined(MDL_START)static void mdlStart(SimStruct *S) #endifstatic void mdlOutputs(SimStruct *S,int_T tid) real_T *para1=mxGetPr(ssGetSFcnParam(S,0); real_T *para2=mxGetPr(ssGetSFcnParam(S,1); real_T *para3=mxGetPr(ssGetSFcnParam(S,2); const real_T *u=(const real_T*) ssGetInputPortSignal(S,0); real_T *y1=ssGetOutputPortSignal(S,0); real_T *y2=ssGetOutputPortSignal(S,1); y10=u0*para10+u1*para20; y20=u1*para30+u0*para10; #define MDL_UPDATE#if defined(MDL_UPDATE)static void mdlUpdate(SimStruct *S,int_T tid) #endif#define MDL_DERIVATIVES#if defined(MDL_DERIVATIVES)static void mdlDerivatives(SimStruct *S)#endifstatic void mdlTerminate(SimStruct *S)#ifdef MATLAB_MEX_FILE#includesimulink.c#else#includecg_sfun.h#endif1. 先配置编译环境:在Matlab 命令框里键入 mex -setup。选择y后会出现:Select a compiler:1 Lcc-win32 C 2.4.1 in D:PROGRA1MATLABR2008asyslccbin2 Microsoft Visual C+ 6.0 in C:Program FilesMicrosoft Visual Studio0 None选1,就是matlab自带的lcc编译器,选2,就是使用微软的vc编译器。此处选择1。2. 打开simulink,在Simulink Library Browser中选取S-Function Examples,在sfundemos中选择C-Files选择Basic C-Mex Template,另存一份,文件命名与FUNCTION_NAME相同。3. 打开这个文件,将里面的代码清空,将自己写的S函数代码粘到里边,保存。将文件扩展名改一下,改成 *.c。4. 加入保存的文件名为test.c,则在matlab命令窗口中键入mex test.c,这是就会对文件进行编译,如果编译成功,则会生成一个 *.mexw32格式的文件,在matlab较低版本中,生成的是一个动态链接库 *.dll文件。5. 在Simulink Library Browser中选取S-Function,建立一个新模型,双击此模型,弹出对话框,在name一栏中填入函数名称,在parameters中按照自己在S函数源程序中定义的参数的次序填入参数的初始数值,参数与参数之间以空格隔开。6. OK。右键此模块,选择mask,还可以对其进行封装。7. 右键点击S函数模块,选择MASK选项,弹出封装编辑框,在这里有四个栏,分别为图标、参数、初始化、文档。其中参数最为重要。图标即模块上显示的图形,可以编辑自己需要的文字,也可以用图片包装模块。初始化可以对模块参数进行默认设置,文档中可以编写模块说明和帮助链接。而最重要的参数栏中,要把模块对应的S函数的参数列出来,每一个参数有三种形式:编辑、下拉框、复选框。如果是下拉框形式,要编辑对应的选项。如果S函数需要响应不同操作,可以对每一个参数选择编写对应的回调函数。值得一提的是,可以用set_param()函数直接对封装模块进行操作,可以实现更加灵活的封装。8. 封装编辑好后,右键点击S函数模块选择LOOK UNDER MASK选项,在弹出的对话框中,首先填写原文件,把编译过的文件(mexw32)放置在当前目录下,在对话框中正确填写文件名(不写后缀),然后再把封装时定义的参数变量按顺序写在参数框中,每个参数用逗号隔开,注意变量名必须与封装填写的名称一致,且数目相同。最有一个框不用填写。点击OK。则完成了对S函数的模块封装。9. 完成上述两个步骤之后,即完成了自定义的Simulink驱动模块,这时要做的工作是对该模块经行测试。若测试通过,可以将该模块添加进Simulink模块库,和Simulink提供的模块并没有任何的区别,方便以后工作中的重复利用。若测试未通过,则返回S函数编写工作中,重新编写S函数,重复上述步骤。由于

温馨提示

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

评论

0/150

提交评论