Simulink一些知识总结.docx

上传人:b****3 文档编号:12927996 上传时间:2023-04-22 格式:DOCX 页数:12 大小:175.52KB
下载 相关 举报
Simulink一些知识总结.docx_第1页
第1页 / 共12页
Simulink一些知识总结.docx_第2页
第2页 / 共12页
Simulink一些知识总结.docx_第3页
第3页 / 共12页
Simulink一些知识总结.docx_第4页
第4页 / 共12页
Simulink一些知识总结.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

Simulink一些知识总结.docx

《Simulink一些知识总结.docx》由会员分享,可在线阅读,更多相关《Simulink一些知识总结.docx(12页珍藏版)》请在冰豆网上搜索。

Simulink一些知识总结.docx

Simulink一些知识总结

一、set_param函数的应用

(一)函数调用格式:

set_param(object,param,value),其中object为模块句柄,param为参数,value为参数值。

(二)举例

(1)启动模型仿真

set_param(gcs,'SimulationCommand','start')

(2)精确控制模型仿真步长

set_param(gcs,'SimulationCommand','step'),step为仿真步长数。

(3)设置模块在模型中的位置

set_param('mymodel/Gain','Position',[50250125275])

(4)设置模块的回调函数

set_param('mymodel/Gain','OpenFcn','my_open_cb')

(5)设置模块的朝向

set_param('mymodel/Gain','Orientation','left')

二、实时改变模块的参数

单步仿真一次,改变一次参数的值,代码如下:

set_param(gcs,'SimulationCommand','start')

while1

set_param(gcs,'SimulationCommand','pause')

set_param(你的模块名,'Resistance',你想改变的值);%这一句你替换一下参数即可

set_param(gcs,'SimulationCommand','step')

end

三、上次末状态作为本次初始状态进行仿真

问:

已经建立好一个数据仿真模型现在想单独改变一个参数去观察参数扰动对结果的影响,例如参数变化范围是1000到1500,每7s的时间让参数变化100,用什么方法可以实现

答:

分次仿真,每次仿真保存末状态,下一次仿真前更改参数,再倒入上次仿真的末状态作为初始状态,设置如下图:

四、模型加上标题

问:

怎么给模型加上标题

答:

双击模型空白位置,即可输入text文本,并可以设置字体大小颜色等。

五、模型仿真时间与实际运行时间

Simulink在Normal模式下的仿真时间是非实时的,如果希望得知自己的模型转换为实际产品时的运行时间,需要将模型生成C代码,下载到硬件目标中去运行并使用ProfilerTimer进行时间的记录。

如处理器在环仿真ProcessorintheLoop可以测出模型实际的运行时间。

六、关于模块参数和模型解算配置的问题

(一)模块参数的配置:

根据用户算法要求来配置,具体参数意义与使用方法可以双击模块打开对话框后在help按钮获取详细帮助。

(二)模型结算方法配置:

运行仿真的算法一般由解算器提供,分为变步长解算器和固定步长解算器。

默认模型选择变步长解算器的ode45算法,能够适应大多数模型应用场景。

如果用户求解刚性模型,需要使用ode23s之类算法。

如果用户是使用simulink进行控制算法建模,那么用户一般使用固定步长解算器以模拟与硬件芯片相同的时钟频率。

七、激活stateflow状态图方法

(一)方法一:

通过模型的调度时间周期性激活;

(二)方法二:

通过trigger信号去激活。

八、simulink中过零问题讨论

问:

simulink中有哪些过零检测方法是否有专门的过零检测模块

答:

只有自适应与非自适应两种选择,没有专门模块,但是很多模块里有是否使用过零检测的checkbox,如RelationalOperator,switch模块等。

九、模块采样时间与系统solver最大步长关系

当模块的Sampletime设置为-1时表示继承父层的采样时间,如果模块在子系统里就继承子系统的采样时间,如果模块在最上层模型,就继承系统solver的步长作为采样时间间隔了。

另外,如果模块的采样时间设置为-1以外的值,如0表示连续采样,这种时刻需要solver解算器类型支持连续状态解算;当模块采样时间为这样的数字表示离散采样时间,每隔计算一次,这时要求模块的采样时间必须是solver计算步长的整数倍。

十、solver步长间隔对仿真的影响

在变步长解算器中,采样时间间隔(即步长)会根据前后两次计算值的误差动态改变。

如果设置了最大步长,那么每次的步长就不会超出设置的这个上限。

十一、关于arduino连接测温模块驱动的问题

问:

在arduino上连接一个测温模块(如DS18B20),查看DS18B20的技术手册,说是利用单总线通讯协议就可以读取温度,我想问问在有相关的库函数及读取温度C程序的情况下,怎么用simulink去驱动测温模块工作,并通过串口将温度传回PC

答:

有相关的库函数和C例程的前提下,就把DS18B20初始化的API在model_initialize()中调用,在model_step()中使用读取温度的API、当然,在文件中包含DS18B20库函数所需要的头文件。

十二、使用S-Function创建自定义模块如何避免重复初始化

问:

使用S-Function创建了一个自定义模块,编写了有关的模块TLC文件,并成功添加入Simulink函数库中,但是在使用时发现若同一模型文件中包含两个以上该模块,代码生成时会重复进行初始化,即TLC文件中%functionStart(block,system)Output中的内容,如何解决

答:

1.将这部分初始化放到BLockType的tlc函数中;

2.使用全局变量对Start中的TLC语句进行判断,仅第一次调用时生成,第二次以上屏蔽。

问:

必须要在Start中进行,全局变量怎么定义在模块TLC中进行定义吗

答:

是的,当这个变量为TLC_TRUE时则不再执行Start函数,直接跳出。

否则执行。

以保证此函数在整个编译过程中只执行一次。

十三、关于代码空间的讨论

问:

在生成代码后,如何查看代码大概会占用多少RAMROM,还有需要多少堆栈空间

答:

C代码看不出来的,在编译完之后生成了map文件,就可以看到了。

十四、EmbeddedCoder、SimulinkCoder的关系

问:

EmbeddedCoder和SimulinkCoder有什么关系

答:

如果你想将Simulink模型生成C代码,那么你需要使用SimulinkCoder,而SimulinkCoder的运行需要依赖MATLABCoder,所以,完整的讲,如果你需要将Simulink模型生成C代码,需要MATLABCoder+SimulinkCoder;如果你想将Simulink模型生成为嵌入式C代码,那么,除了上述两个Coder之外,你还需要EmbeddedCoder。

十五、关于测量算法在处理器上执行时间问题

问:

最近在看论文,看到作者利用示波器探针测量电机MTPA算法在DSP上在线计算时间。

我现在做了一个标幺化定点后的电流指令表,怎么用示波器测量算法在处理器上执行时间

答:

算法在目标处理器上的执行时间是一个非常重要的数据,我们更多时候关心这个数据的最大值,示波器测量的方式,我觉得不一定能采集到最长时间的情形。

在使用MBD开发软件的时候,建议使用PIL获取这个时间值,可以通过大量的测试用例,获得这个最大时间值。

答:

是的,matlab的help关于PIL的用处也讲到其中之一就是测量executiontime,把所需要的测量模块封装起来,给定一个输入向量,下载到目标板上,最后在matlab窗口上输入命令,能够以图像形式给出关于在此输入向量下averagetimemaximumtime。

十六、关于Simulink模型的比较

问:

在MBD项目的工程管理中,模型的比较和差分是一个常见的问题。

国外一些公司设计了专门用来对Simulink模型进行比较和充分的工具,比如德国的mediniunite。

我想请教一下,各位在进行MBD设计时,模型比较和差分的问题怎样解决,都有哪些好用的工具,是否有开放代码的工具。

答:

MATLAB产品提供了SimulinkReportGenerator,这个工具具有模型比较功能,也能实现一些模型合并。

十七、S-functionbuilder参数传递问题

问:

怎么把s-functionbuilder中定义的参数传递到所集成的C语言源文件中

答:

在DataProperties的页面中定义参数的变量名何参数,如pvar。

然后在Outputs,DiscreteUpdate等子页面中都可以使用变量名和下标访问参数值,如pvar[0]。

使用这个变量名编写C代码,完成所有配置之后点击build,就可以将你写的C代码打包集成到生成的C文件中去了。

十八、快速原型和硬件在环的区别

问:

快速原型和硬件在环的区别

答:

快速原型,也就是控制器快速原型的简称,顾名思义,就是对Simulink算法进行控制器功能的快速实现。

一般来讲,你可以通过工控机,快速实现控制算法,而不必对控制算法进行代码生成相关的配置和设置。

然后,你可以用这个工控机实现的控制器和被控对象相连,形成闭环,实现在真实被控对象上对控制算法的验证或者参数调节。

硬件在环,是对控制器进行测试的一个环节,在实现了控制器软件和硬件的集成之后,这时候我们并不能确保控制器一定是正确的,如果这个时候直接把控制器和一些被控对象连接,可能造成财产或者人身伤害,在这种情况下,我们一般会通过工控机去模拟一个被控对象,然后把控制器和这个工控机相连,进行控制器相关测试。

十九、tlc文件该怎么编写

问:

tlc文件该怎么编写

答:

在SimulinkBrowser中搜索S-Function,从example模块中找到带有tlc的例子,参考编写即可。

另外可以阅读EmbeddedCoder的UserGuide里面详细介绍了tlc的编写方式。

二十、CMEXS-Function延时功能

问:

现在需要做一个PWM波形输出的S函数,想利用延时功能进行高低位的切换,但是不知道C-MEX的S函数怎么写延时。

答:

1、利用状态变量记录输入,在下几个采样时间后再输出;2、直接输出,使用unitdelay实现延时。

二十一、S-Function生成代码如何添加自定义的头文件

问:

我用S函数做了一个简单的s12xdp512的DigitalOutput的驱动模块,生成代码时一直报错Error:

28undeclaredidentifierPORTA'Error:

41undeclaredidentifier`DDRA'。

显示的“PORTA”和“DDRA”都是在单片机的头文件""中完成定义的,如何在tlc文件中定义该头文件,以便生成代码时不会报错,代码生成后不用手动添加

答:

PORTA”和“DDRA”都是在单片机的头文件""中完成定义的,你的中有必要使用它们吗当生成代码时S函数主要完成将GUI用户设定参数通过一系列中介文件传递到tlc文件中去,最后生成的C文件跟已有头文件Merge之后再使用IDE编译生成目标文件下载到硬件中去。

二十二、PIL测试时主机和DSP的连接问题

问:

PIL测试时,主机和DSP的连接,到底是用串口,USB口,还是下载程序的JTAG口

答:

串口和USB口都是可以用的,串口的话需要

提供DSP的串口驱动代码,USB的话,PC端和DSP端的都需要编写,JTAG就不确定了。

二十三、simulink封装的模块Initialization有什么作用

问:

simulink封装模块Initialization有什么作用,如何写这个Initialization

答:

模块的InitializationCommands执行的时刻包括以下几个情况:

1、在IcondrawCommands或InitializationCommands里更改封装的参数时;

2、当IcondrawCommands有内容时,翻转或旋转模块;

3、双击打开模块的参数对话框或点击参数对话框上的Apply/OK/Cancel关闭对话框时。

二十四、simulink生成C代码的问题

问:

如果在simulink中通过将模型生成C代码,但又想通过其他软件如LabVIEW调用此C代码,那么在simulink中生成的C代码需要进行一些手动修改,还是说自动生成的C代码就可以进行使用

答:

在选择系统TLC文件时要根据你的需要进行选择。

如果是为了生成嵌入式C,则选择文件;如果是为了VC++环境使用,则选择(forVC++),Labview里面你要调用此代码,是指调用其中某个函数吧,如model_step(),将生成的代码放到可搜索路径下直接调用应该就可以了。

二十五、simulink生成C代码再转化为DLL文件的问题

问:

通过simulink中编写仿真模型,再将模型生成为C代码,在VC中生成DLL文件,最后通过LabVIEW调用DLL文件,以实现混合编程的目的,应该怎样实现

答:

系统目标选择,可以在生成代码的同时生成dll文件。

二十五、Simulink多个模块生成代码顺序问题

问:

在自动代码生成的时候,把一个模块的代码放到最前面,想知道模块生成代码的放置顺序是通过什么来配置的

答:

如果有信号线连接的话,执行顺序按照信号流向(前提是DirectFeedThrough设置正确)。

没有信号连接的模块,邮件属性可以设置Priority。

数字大表示优先级低。

二十六、如何封装手写底层代码

问:

有没有一种方法能够将手写的底层c代码封装在matlab的库中,以后可以与simulink自动生成的代码做接口的

答:

TSP开发比较花费时间。

LegacyCodeTool对既有驱动代码的耦合性有要求,太过复杂的结构无法直接应用LCT。

但是可以手动开发。

一般包括几个步骤:

1.模块和参数对话框制作

2.模块S函数开发

3.模块TLC文件开发

除了驱动模块之外,还有系统目标文件和一系列回调函数的开发。

共同构成支持某一个目标芯片的驱动库。

二十七、生成代码该注意什么问题

问:

生成代码该注意什么问题

答:

要生成代码必须使用支持生成代码的模块,连续模块一般不支持代码生成,示波器等显示模块也不行。

要生成代码,需要确定生成代码的类型,是嵌入式代码还是一般Windows应用程序代码或其他类型代码,可以选择对应的SystemTargetFile,嵌入式通用代码选择,快速原型代码使用.如果是为了使用各个芯片厂商提供的芯片,最好还要安装它们提供的TSP工具箱和工具链,那里面会有配套的tlc文件。

二十八、编写S函数时,采样时间的设计

问:

在编写S函数时,初始化模块有关采样时间ts=[x1x2],连续系统时设置为ts=[00];如果是离散系统,采样时间为h,那么可以写为ts=[h0]吗例如20us采样一次,该怎么设计呢

答:

系统solver设置为固定步长,设置为20us,

然后在S函数里设置采样ts=[-1,0]来继承系统采样时间。

二十九、连续状态是否支持自动代码生成

问:

连续状态是否支持自动代码生成

答1:

含有连续状态的模块不支持代码生成。

因为要生成代码解算器必须是固定步长的,但是此种解算器不支持连续状态解算。

答2:

定步长连续1阶积分好像可以生成代码,

刚开始用dSPACE的时候全选的是这个,后来才开始用离散。

答3:

是的,ode3等定步长算法也支持代码生成。

看来连续模块不能生成代码的原因还需要讨论。

三十、sinewave模块中Samplebased和Timebased的区别

问:

sinewave模块中SamplebasedTimebased的区别在哪里

答:

Samplebased基于采样,Timebased基于时间,两种计算正弦的数学公式,根据你使用情况需要选择,如果你只有输入时间t采用基于时间。

如果是离散系统,一般使用采样点的序号来计算正弦。

三十一、simulink中如何输入带参数的传递函数

问:

如何输入分子为s+a,分母为s^2+2bs+b^2的传递函数a,b其实不是变量,只是由其他模块计算而来的。

答:

transferfcn模块支持输入变量,变量只要定义在Workspace里即可。

三十二、rtw文件与tlc文件的生成顺序

问:

rtw文件与tlc文件的生成顺序是怎样的

答:

先写C文件,编译成mex之后才可以被模型调用,S函数模块里的参数配置要正确,之后build才能生产rtw。

tlc再从rtw里面获取信息,进行代码生成。

三十三、M语言编写的S函数是否支持代码生成

问:

M语言编写的S函数是否支持代码生成

答:

M语言编写的S函数也是有两种的,Level1和Level2,Level1仅支持仿真,不支持代码生成。

Level2支持代码生成。

三十四、如何在模型里面嵌入C代码

问:

某部分内容是c代码封装的,如何在代码生成时把该部分代码直接连接添加

答:

可以使用customcode模块,直接添加C代码到模型中并生成到指定的位置,不进行仿真也不确保代码正确性。

三十五、Stateflow如何代码生成共用体

问1:

stateflow的RTW自动代码生成,怎么设置才能生成c语言的共用体

答1:

楼主可以在Customcode里面定义共同体,将此文件作为头文件包含,然后在Stateflow模型里使用此共同体变量或其成员,生成代码时会自动Merge在一起。

问2:

Stateflow使用的时候,signal的属性怎么弄比如:

datatype。

答2:

Stateflow的运行都是要先生成C代码,再编译成动态链接库文件(mex),然后才能运行的。

所以,在customcode设置通过C代码或者C文件定义出来的函数或者变量,只要符合C语言语法规则,就可以被用到Stateflow模型的各种action里。

三十六、如何将simulink自动生成的代码中如何使用外部RAM

问:

因为程序太大,想在SIMULINK自动生成代码时直接将PAGE1定位到外部RAM,请问如何设置

答:

通过数据对象的方式定义各类数据,使其定义到期望的RAM区域。

在手工编码的时候,遇到你说的这种情况,我们一般会通过在link文件中定义RAM段,然后在C文件中定义变量的时候,通过pragma关键字,把这些变量定义到预先设定的地址段里。

所以,你做自动代码生成的时候,也需要生成出来通过pragma定义的变量,这需要你通过数据对象的方式实现,并且,这种情况下,需要自定义Package,以及package里的类,在类的属性storageclass里设置pragma。

然后生成的代码里,就可以有类似于以下的代码:

#pragmasection_Abegin

int8_Tvar1;

int16_Tvar2;

....

....

....

#pragmasection_Aend

这样var1、var2等就被定义到section_A存储区域了。

三十七、如何拆分生成的代码中里面定义的parameter结构体

问:

在使用simulinkembeddedcoder生成的代码中,会将模型中的lookuptable、constant常数等统一放在了一个叫parameter的结构体内(也就是在里面定义的数据)。

由于整个模型中的lookuptable很多,导致这个结构体及其庞大,初步估计有7Kbyte大小。

请问有没有办法拆分这个结构体的体积

答:

使用数据对象定义这些参数,就可以不用放到文件了。

三十八、目标文件与的区别

问:

grt与ert的区别在哪里各自作用如何

答:

grt中的g表示general,ert中的e表示embedded,两个文件都是系统目标文件,使用作为系统目标文件,生成的代码可以用作快速原型,而生成的代码可以用于嵌入式系统。

生成的是更高效的代码。

三十九、关于触发子系统的总结

当系统内部不存在积分环节时:

1.触发子系统内外不能使用goto和from模块传递信号,这是由atomic子系统属性决定的

2.触发子系统内的模块采样时间只能是inf或者-1,即继承采样时间;当子系统内部有信号源时需注意该点

3.触发子系统的工作特性是在触发的一瞬间输出系统内该时刻的值,然后保持;触发子系统只可选择held信号,而不能reset信号。

4.触发子系统有信号源与外界接入信号源效果是一致的,但是内部信号源要修改采样时间为-1

5.子系统内的信号显示很有意思,是第一次触发开始的值到最后一次触发结束的值;中间数值都是保持状态。

当系统内部存在积分环节时:

触发子系统内部有积分环节并且需要改变积分初值,这个问题没有解决例如testforsubsystems中triggeredsubsystem。

四十、关于使能子系统的总结

1.当系统内部不存在积分环节时:

使能触发子系统相当于一个触发子系统,使能环节的作用应包含在了触发子系统之内。

2.当系统内部存在积分环节时:

使能触发子系统解决了触发子系统的有积分环节时不能解决的问题。

四十一、switch的使用说明

该模块共有三个输入,其中第二个(即u2)为控制信号的输入,将其与阀值或者0进行判断,判断类型有:

大于等于阀值、大于阀值、不等于0三种类型,默认判断为真时输出第一个信号,否则输出第三个信号。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1