我有一个Simulink模型,目前正在从脚本(即不是函数)运行 . 该脚本将变量值写入MATLAB工作空间,运行模型模拟(使用这些值),然后模型将其他值写入工作空间 . 如果我尝试将脚本转换为函数(即将 function [output] = runSim()
放在文件的顶部),那么Simulink会抱怨它不知道变量,可能是因为它们不在MATLAB工作区中,而是它们在功能范围 .
是否有一种优雅的方式来提供Simulink模型的输入并从Simulink模型中获取输出而不是将它们粘贴到工作区中?
4 回答
这并不明显,但是您可以输入/输出
sim()
命令中的数据,并且在调用函数之前完成它并在工作中有一个示例但是在周一之前无法到达验证 . 但是,请尝试列出的解决方案on Mathworks's site:...虽然由于与Parallel Computing Toolbox不兼容而显然在R2009b中被弃用了:(看起来正确的解决方案是使用assignin()明确地将变量推送到模拟的模型工作区(不同于基础工作区) .
http://www.mathworks.com/matlabcentral/newsreader/view_thread/292544
您可以使用evalin()函数从您自己的函数中执行特定工作空间中的MATLAB表达式(作为字符串),在您的情况下,SIMULINK的“基础”可以找到它们 . 但是,如果您不想直接使用工作区,则可以使用“从/到文件”块从/向MAT文件加载和保存信号或变量 .
简答:不 .
I could be wrong ,但是让我给你一些背景知识 . 我的Simulink模型非常庞大,我们已经开发了多年 . 到目前为止,我们仍然通过工作区加载所有必要的变量 . 这已经成为我的抱怨很长一段时间了,MathWorks甚至通过提供Simulink.save_vars功能解决了这个问题 . 听起来你已经用脚本/函数设置了变量,所以Simulink.save_vars对你没用多少 .
您可以通过使用某些变量的结构来清理工作区,大多数Simulink块不支持结构,但有些可以 . 此外,除了模型所需的变量之外,避免在工作空间中放置任何内容 .
好吧,我不知道如何从一个简单的函数中做到这一点,但从类函数(方法)中做到这一点真的很方便 . 它适用于版本2009b .
将代码放在文件Test.m中:
然后就是:
怎么了?您创建了对象测试,它定义了字段t和u . 然后在方法sim()中你说Simulink寻找输入'[test.t test.u]' . Simulink和方法sim()都可以访问这些变量(我相信这是最重要的事情) .
好吧它仍然有一个标有数字1的大缺点 . 您必须明确知道如何在工作区中命名类实例的引用(在本例中为'test') . 您可以通过在构造函数中传递名称来解决它,或者您可以使用静态变量和方法,但这种方式不允许您动态更改输入信号 .