工作空间,.m脚本和Simulink模型之间的关系是什么?如何有效地使用它们?

时间:2015-09-29 06:43:19

标签: matlab simulink

我使用了大量的MATLAB作为Control类,而且真的让我很难受。他们希望我们使用大量的Simulink,即使我发现视觉表示没有用,Simulink和MATLAB脚本之间的接口很难弄清楚。

所以我有一个模型,我为scopes添加了sinks,可以从Simulink运行时直接将数据保存到工作区。但是,当我在脚本中使用命令sim根据某些参数(stopTimesolving method等)直接使用模型时,结果会被隐藏在一个文档很少的对象中至少可以说我有:

simout = sim('lab','StopTime','100','Solver','ode1','FixedStep','2');

现在我的工作区中有一个对象,但要访问我想要的数据我需要去3,有时在simout的成员中有4层深。我的第一个问题是:

  1. 有没有办法直接访问或至少知道这些成员没有使用who的繁琐工作。

    我不想编译代码来访问其文档! help对这些情况并没有多大帮助。

  2. 为什么Simulink模型在调用sink属性中规定的时间时保存数据。我知道我提到的代码行覆盖了一些simulink块处方(例如使用的解决方法)。

  3. 如何知道simulink模型如何与matlab脚本交互,一般来说我是编码的菜鸟,但文档并没有真正告诉我模型的正式定义及其形式用于matlab。我在某些方面害怕' sim'的默认设置。将覆盖我在早期模型中设置的一些设置,这些设置将被证明是一个令人讨厌的调试。

  4. TL; DR 是否可以通过快速方式访问对象深埋的成员?例如,我现在必须这样做:

    simout = sim('lab','StopTime','100','Solver','ode1','FixedStep','2');
    who(simout)
    ScopeData = (simout.get('ScopeData'))
    signals = (ScopeData.signals)
    time = (ScopeData.time)
    

    我可以做一些(Simout->ScopeData).signals

    的C-ish

    最后,为什么MATLAB套件会被呈现为日常交易者的应用程序,因为EE人员通常需要知道他们的编码?为什么没有使用带有标题的库和有关您在代码中导入的内容的文档(例如boost,string等)?通过隐藏机制,最后一个选项可能不那么pretty,但是为了能够正确编写代码,我觉得我必须知道代码的大部分底层机制。

1 个答案:

答案 0 :(得分:2)

常规

简而言之,工作区是您正在使用的变量环境。如果您运行脚本,您的工作区为'base',这与控制台使用的相同。所以Matlab确实有不同的环境,一种是被称为路径的包含环境,另一种是变量,称为工作空间。

Simulink使用另一种方法,这可以防止我猜测阴影变量名称。

要检查当前工作区中的检查成员,请使用who

要将成员写入其他工作区,请使用assignin

要在指定的工作区中运行某些内容,请使用evalin

您的问题

<强> 1 谁列出了您不想要的当前工作空间中的所有变量。 整个simulink文档都不是那么好......

<强> 2 它确实......

第3 如果您运行脚本并定义变量,则会在base工作空间中定义它们。当您通过输入其名称(例如a)在simulink中指定变量时,它会从base工作空间加载它(因此这种方式没有任何问题)。 arround的另一种方式是使用给定的导出块,或者使用globalassignin在您自己的块中指定导出值。

<强> 4 如果打开示波器块并单击选项 - 按钮(小齿轮),则可以选择导出选项。您也可以指定您要使用的类型。你似乎使用带有时间选项的结构,这是具有最多lvls的结构,如果你的问题只是它是一个结构,我建议使用数组类型。 您也可以使用Outputblock指定导出类型和名称。

所以我选择:

sim('modelname');
signals=ScopeData.signals;
time=ScopeData.time;

或者当指定为数组时:

sim('modelname');
signals=ScopeData(:,2);
time=ScopeData(:,1);

在上面的示例中,我没有指定模型的运行方式,但您也可以在发布时指定它。