S-Function(MATLAB)之C++编程一、S-Function仿真之前提条件1.需要安装MATLAB、Visualstudioc++软件,软件版本随自己喜欢2.需要使用mex–setup或者mbuild–setup命令配置编译环境,具体方法百度很多3.会简单的C/C++编程,会基本的simulink仿真二、S-Function仿真之仿真原理1.Simulink的仿真本质是在执行一些列的回调函数,仿真开始时首先执行各个模块的初始化化调函数。2.Simulink是单线程仿真的,在某一时刻simulink只可能在执行某一个模块的功能回调函数,也就是说simulink的仿真是一个个模块依次获得执行权去执行,完成一个周期后又循环进行。3.S-Funtion是simulink中的用户自定义模块,其功能完全由用户编程实现。三、S-Function仿真之回调函数1.初始化回调函数:staticvoidmdlInitializeSizes(SimStruct*S),主要是完成端口数据类型、端口帧长度、输入输出端口个数的初始化。2.采样时间设置回调函数:staticvoidmdlInitializeSampleTimes(SimStruct*S),主要是完成模块采样时间的设置。3.仿真开始前回调函数:staticvoidmdlStart(SimStruct*S),主要完成在开始仿真之前的一些准备工作,与mdlInitializeSizes不同的是mdlStart只是在仿真的时候才会执行,而mdlInitializeSizes在编译和仿真时都会执行。4.模块功能实现函数:staticvoidmdlOutputs(SimStruct*S,int_Ttid),主要完成模块的功能代码,仿真一旦初始化完成并且开始后,那么每次仿真执行权轮到该模块时都是执行该回调函数。5.仿真结束回调函数:staticvoidmdlTerminate(SimStruct*S),主要是完成资源的释放。四、S-Function仿真之常用功能函数1.boolssSetNumPOutputPorts(S,NUM_INPUTS),设置输出端口个数。2.voidssSetOutputPortFrameData(S,nPort,FRAME_YES),设置输出端口为帧类型。3.voidssSetOutputPortWidth(S,nPort,frameLength),设置输出端口帧长度。4.voidssSetOutputPortDataType(S,ix,dataTypeId),设置输出端口数据类型,dataTypeId为数据类型ID,通过ssRegisterDataTypeFxpBinaryPoint函数返回。5.void*ssGetOutputPortRealSignal(S,nPort),得到输出端口数据缓冲区地址。6.上诉所有函数同样适用于输入端口,即将函数名中的Output改为Input即可。五、S-Function仿真之参数传递用户可以通过S-Funtion模块的参数传递功能向各个回调函数传递参数,在任一回调函数中可以通过mxGetData(PARAM_DEFX(S))来获得参数缓冲区地址,其中X代表参数序号。参数支持的数据类型有int32,uint32,int16,uint16,int8,uin8,double,single,但是遗憾的是似乎不支持字符串。参数可通过模块的s-funtionparameters传入,如图:六、结束由于篇幅和时间的原因,这里的介绍比较粗略,还有很多来不及讲解,比如如何根据前级模块自动获取数据类型和帧长度、如何获得仿真模块的父对象、如何进行simulink和以太网的数据交互。如果需要详细的设计方法和参考资料,可在论坛中提问,将尽快帮你解决。个人邮箱:zhaoshengdw@qq.com