matlab不显示变量,Matlab代码看不到Simulink模型中函数内部定义的变量
我对模拟Simulink模型的Matlab代码有疑问。例如,我的系统现在包含一些不同的子系统/代码:
主脚本–为模拟Simulink模型设置初始条件,还保存并绘制一些输出(主代码)。
模仿我的系统操作的Simulink模型。
子脚本,它是Simulink模型中的功能块。在这种情况下,此块可得出仿真期间在模型中使用的某些值(子代码)。
现在,我正在尝试在Simulink的一个子系统中引入一个附加块。为了简化起见,它是一个带有变量" V"的常量块。我在子代码中分配V的初始值。但是,当我运行将执行模型的Main代码(内部有一个恒定块V)时,它给我的错误是未定义V。如果我在主代码中初始化V,它将具有声明的值,而不管对子代码中的V进行任何操作。
希望我或多或少很好地描述了这个问题,因为我无法在此处发布模型。先感谢您。
这不是一个好的解决方案,因此我不会给出答案,但是您是否尝试过将其声明为全局变量?我只是记得,我不确定Simulink变量的范围,将变量推入主工作区或从主工作区推入是很痛苦的。
嗨,我已经仔细检查了。在Simulink中用数据存储器存储块声明为全局变量,但结果相同。一旦我从Main Code中删除了变量,就不会编译模型。
simulink模型要求在初始化期间所有数据均可用。通常,在使用V的常量块被初始化之前,您需要初始化"子脚本"(这是一个非常不好的名字)(并因此在工作区中创建变量V)。但是,从根本上讲,您根本不应该使用工作区来执行此操作,并且您当然不应该基于在另一个块中执行的代码来初始化一个块。但是,如果不确切知道您要使用此配置真正实现的目标,就无法告诉您应该如何完成配置
Sub脚本在现实生活中称为MechAccDerivation。它提供任何有用的信息吗?不要这样这就是为什么不使用本网站的真实姓名而是同时提供简短且具有描述性的信息是常识。要点是,当通过主脚本初始化V时,即使它应由子脚本覆盖,它也不会更改其值。
还不清楚您的设置是什么。我可以想到几种方法来实现您所描述的内容。主脚本是常规的matlab脚本吗?子脚本怎么称呼,我知道它是一个fcn块?您在使用回调函数吗?这些决定了变量的范围以及Phil Goddard所指的东西。这是我们需要知道的,以适当地帮助您。
@Efim Sturov,我知道代码的名称实际上不是" sub Script"。我是说将其称为"子脚本"是不好的:它根本不是脚本,而是功能。术语"脚本"在MATLAB中具有非常特殊的含义。根据Crown42s的评论,您没有提供足够的信息以了解您实际上要做什么,任何人都可以知道建议。
@crown 42,主要代码是常规的m脚本。下脚本-fcn块。我确实使用它们来初始化模型中使用的一些参数。但是我不在那里使用" V"参数...
@菲尔·戈达德,我明白你的意思,我的错。谢谢你的澄清。说到...在此函数中定义了一些全局变量(而不是在主脚本中)。我在Simulink模型中确实有用于它们的数据存储内存块。它不会对仿真造成任何问题。但是,当" V"用作常量块的值时(即使也将其定义为全局变量),也会给我"未定义的变量"错误。
好的,在您澄清之后,让我在这里回答一下。
首先,要初始化您的数据:
回到我在Simulink上课时,他们告诉我们通过Callbacks进行初始化。具体来说,您有一个块,可能以某种方式突出显示了,您可以通过右键单击来访问回调。在这里,您可以找到InitFcn,然后在其中键入一些常量,或者在同一文件夹中输入脚本的名称。
然后,当您运行模型时,将对其进行初始化,并调用回调函数,并在"模型"工作区中定义变量。
顺便说一句,您可以在模型资源管理器中检查模型(和函数)工作空间,可通过库旁边的按钮进行访问。
现在通过功能进行更新。我仍然不确定你到底是怎么做到的。除非您已经做过,否则我建议使用Matlab function块,该块带有Matlab图标,它更加灵活和强大。
无论如何,我怀疑以下情况。与普通的matlab一样,在函数中定义或更改的变量不会离开其工作空间,该工作空间与常规模型工作空间是分开的。只有显式的输出才能在函数调用的末尾幸免。
我在这里看到一些选择。首先是将变量定义为全局变量。为此,您需要在每个需要的上下文中将其定义为全局。因此,您在主脚本和函数(sub_script)中都需要一个global x。
另外,如果要将变化的变量视为信号,则可以根据功能的不同,在函数和数据存储块或From / GoTo块中添加其他输入和输出。
谢谢您的意见。 我已经使用Simulink和Simscape大约8年了。 我通常不使用InitFcn,除非它不是Simulink模型。 在这种情况下,由于使用了模拟模型的脚本,因此我倾向于在脚本中定义变量。 是的,我正在使用Matlab功能块。 我在函数中有一些全局定义的变量,它们工作得很好。 From / Goto是没有任何问题的有效解决方案。 Ive创建了一个数据存储读取块,该块替换了该常量" V"块。 在这种情况下,V在下标中全局定义。 谢谢。
更多推荐



所有评论(0)