Simulink一些知识总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、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',[50 250 125 275])
(4)设置模块的回调函数
set_param('mymodel/Gain','OpenFcn','my_open_cb')
(5)设置模块的朝向
set_param('mymodel/Gain','Orientation','left')
二、实时改变模块的参数
单步仿真一次,改变一次参数的值,代码如下:
set_param(gcs,'SimulationCommand','start')
while 1
set_param(gcs,'SimulationCommand','pause')
set_param(你的模块名,'Resistance', 你想改变的值); %这一句你替换一下参数即可
set_param(gcs,'SimulationCommand','step')
end
三、上次末状态作为本次初始状态进行仿真
问:已经建立好一个数据仿真模型现在想单独改变一个参数去观察参数扰动对结果的影响,例如参数变化围是1000 到1500,每7s 的时间让参数变化100,用什么方法可以实现?
答:分次仿真,每次仿真保存末状态,下一次仿真前更改参数,再倒入上次仿真的末状态作为初始状态,设置如下图:
四、模型加上标题
问:怎么给模型加上标题?
答:双击模型空白位置,即可输入text 文本,并可以设置字体大小颜色等。
五、模型仿真时间与实际运行时间
Simulink 在Normal 模式下的仿真时间是非实时的,如果希望得知自己的模型转换为实际产品时的运行时间,需要将模型生成C 代码,下载到硬件目标中去运行并使用Profiler Timer 进行时间的记录。如处理器在环仿真Processor in the Loop 可以测出模型实际的运行时间。
六、关于模块参数和模型解算配置的问题
(一)模块参数的配置:根据用户算法要求来配置,具体参数意义与使用方法可以双击模块打开对话框后在help 按钮获取详细帮助。
(二)模型结算方法配置:运行仿真的算法一般由解算器提供,分为变步长解算器和固定步长解算器。默认模型选择变步长解算器的ode45 算法,能够适应大多数模型应用场景。如果用户求解刚性模型,需要使用ode23s 之类算法。如果用户是使用simulink 进行控制算法建模,那么用户一般使用固定步长解算器以模拟与硬件芯片相同的时钟频率。
七、激活stateflow 状态图方法
(一)方法一:通过模型的调度时间周期性激活;
(二)方法二:通过trigger 信号去激活。
八、simulink 中过零问题讨论
问:simulink 中有哪些过零检测方法?是否有专门的过零检测模块?
答:只有自适应与非自适应两种选择,没有专门模块,但是很多模块里有是否使用过零检测的checkbox,如Relational Operator,switch 模块等。
九、模块采样时间与系统solver 最大步长关系
当模块的Sample time 设置为-1 时表示继承父层的采样时间,如果模块在子系统里就继承子系统的采样时间,如果模块在最上层模型,就继承系统solver 的步长作为采样时间间隔了。另外,如果模块的采样时间设置为-1 以外的值,如0 表示连续采样,这种时刻需要solver 解算器类型支持连续状态解算;当模块采样时间为0.5 这样的数字表示离散采样时间,每隔0.5 计算一次,这时要求模块的采样时间必须是solver 计算步长的整数倍。
十、solver 步长间隔对仿真的影响
在变步长解算器中,采样时间间隔(即步长)会根据前后两次计算值的误差动态改变。如果设置了最大步长,那么每次的步长就不会超出设置的这个上限。
十一、关于arduino 连接测温模块驱动的问题
问:在arduino 上连接一个测温模块(如DS18B20),查看DS18B20 的技术手册,说是利用单总线通讯协议就可以读取温度,我想问问在有相关的库函数及读取温度C 程序的情况下,怎么用simulink去驱动测温模块工作,并通过串口将温度传回PC?
答:有相关的库函数和C 例程的前提下,就把DS18B20 初始化的API 在
model_initialize()中调用,在model_step()中使用读取温度的API、当然,在Model.c 文件中包含DS18B20 库函数所需要的头文件。
十二、使用S-Function 创建自定义模块如何避免重复初始化
问:使用S-Function 创建了一个自定义模块,编写了有关的模块TLC 文件,并成功添加入Simulink 函数库中,但是在使用时发现若同一模型文件中包含两个以上该模块,代码生成时会重复进行初始化,即TLC 文件中%functionStart(block, system) Output 中的容,如何解决?
答:1.将这部分初始化放到BLockType 的tlc 函数中;
2.使用全局变量对Start 中的TLC 语句进行判断,仅第一次调用时生成,第二次以上屏蔽。
问:必须要在Start 中进行,全局变量怎么定义?在模块TLC 中进行定义吗?
答:是的,当这个变量为TLC_TRUE 时则不再执行Start 函数,直接跳出。否则执行。以保证此函数在整个编译过程中只执行一次。
十三、关于代码空间的讨论