Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 使用exist检查Simulink块是否有参数';采样时间';_Matlab_Parameter Passing_Simulink - Fatal编程技术网

Matlab 使用exist检查Simulink块是否有参数';采样时间';

Matlab 使用exist检查Simulink块是否有参数';采样时间';,matlab,parameter-passing,simulink,Matlab,Parameter Passing,Simulink,我想编写一个函数,自动将模型中所有块的参数SampleTime更改为特定值。我可以使用find_system查找所有块,然后我可以循环所有块并使用set_param('Blockpath','SampleTime','0.001')。但是如果我这样做,并且块没有名为SampleTime的参数,它将使我的程序崩溃。 所以我的问题是,在设置参数之前,如何确定参数是否存在?我尝试了类似于exist(['blockpath','/SampleTime']),但它没有达到我的预期。有什么想法吗?您可以使用

我想编写一个函数,自动将模型中所有块的参数
SampleTime
更改为特定值。我可以使用
find_system
查找所有块,然后我可以循环所有块并使用
set_param('Blockpath','SampleTime','0.001')
。但是如果我这样做,并且块没有名为
SampleTime
的参数,它将使我的程序崩溃。

所以我的问题是,在设置参数之前,如何确定参数是否存在?我尝试了类似于
exist(['blockpath','/SampleTime'])
,但它没有达到我的预期。有什么想法吗?

您可以使用
get_param('blockpath','ObjectParameters')
获取包含所有参数的结构,然后使用
isfield
检查是否可以找到
SampleTime

我认为你正在做的不是一个好主意。在典型的simulink模型中,采样时间只设置在很少的位置,使用继承的采样时间运行所有其他模型。在大多数情况下,改变这几个地方不是问题


如果必须使用多个块或频繁更改采样时间,最好使用工作空间变量或掩码参数。将所有块设置为具有采样时间
x
,并将
x=0.01
放在基本工作空间中,以设置所有块的采样时间。

您可以使用
get_param('blockpath','ObjectParameters')
获取包含所有参数的结构,然后使用
isfield
检查是否可以找到
SampleTime

我认为你正在做的不是一个好主意。在典型的simulink模型中,采样时间只设置在很少的位置,使用继承的采样时间运行所有其他模型。在大多数情况下,改变这几个地方不是问题


如果必须使用多个块或频繁更改采样时间,最好使用工作空间变量或掩码参数。将所有区块设置为具有采样时间
x
,并将
x=0.01
放在基本工作空间中,以设置所有区块的采样时间。

基于@Daniel的答案,如果您真的必须这样做,@Daniel答案注释中给出的原因是一个坏主意,那么最简单的方法是

% Define the new value as a string
>> newSampleTime = '10';
% Find all blocks in the model
>> allBlocks = find_system(gcs);
% Identify the blocks that have a SampleTime property
>> blockIdx = cellfun(@(c)isfield(get_param(c,'ObjectParameters'),'SampleTime'),allBlocks);
% Change the sample time
>> cellfun(@(c)set_param(c,'SampleTime',newSampleTime),allBlocks(blockIdx));

基于@Daniel的答案,如果你真的必须这样做,而@Daniel的答案评论中给出的理由是一个坏主意,那么最简单的方法是

% Define the new value as a string
>> newSampleTime = '10';
% Find all blocks in the model
>> allBlocks = find_system(gcs);
% Identify the blocks that have a SampleTime property
>> blockIdx = cellfun(@(c)isfield(get_param(c,'ObjectParameters'),'SampleTime'),allBlocks);
% Change the sample time
>> cellfun(@(c)set_param(c,'SampleTime',newSampleTime),allBlocks(blockIdx));

嗯,我应该把变量“sample_time”写进每个块中,我把它放进模型中。因为我懒得这么做,所以我希望在构建模型之后,能够将这个变量写入所有块中。我认为这将是一个很好和简单的方法来做这项工作,另外,它确保,我不会忘记设置任何块的采样时间。谢谢你的帮助@Daniel。编辑:我知道我可以只设置模型采样时间,但我应该这样做,我真的不知道为什么。大多数块的默认采样时间为
-1
,这意味着继承。这样,您只需要更改最上游块的采样时间,而不是所有块的采样时间。这是懒惰的正确方式@Max,无论是谁要求你按照你的方式来做,要么他不知道如何使用Simulink,要么他说“更改所有块采样时间”正在测试,以查看您是否知道如果将所有块采样时间设置为“继承”,并且仅更改了最上游的块,则所有块采样时间都已更改。若要验证所有块都使用相同的采样时间运行,请转到“显示->全部采样时间”。颜色将指示采样时间。更重要的是,图例不会显示其他采样时间。这样,您就知道在忘记更改的子系统中没有隐藏任何块。@PhilGoddard我完全了解这种行为。我已经和给我这个任务的人讨论过了,但他还是让我这样做。他的论点是关于用real-time Workshop将模型翻译成c代码,但正如我之前所说的,我并没有真正理解it@Max:没有理由不使用继承的采样时间。告诉您更改所有采样时间的人不知道继承的采样时间是如何工作的。继承的采样时间和显式配置的采样时间在代码生成过程中完全没有区别。好吧,我应该将变量“sample_time”写入每个块中,我将其放入模型中。因为我懒得这么做,所以我希望在构建模型之后,能够将这个变量写入所有块中。我认为这将是一个很好和简单的方法来做这项工作,另外,它确保,我不会忘记设置任何块的采样时间。谢谢你的帮助@Daniel。编辑:我知道我可以只设置模型采样时间,但我应该这样做,我真的不知道为什么。大多数块的默认采样时间为
-1
,这意味着继承。这样,您只需要更改最上游块的采样时间,而不是所有块的采样时间。这是懒惰的正确方式@Max,无论是谁要求你按照你的方式来做,要么他不知道如何使用Simulink,要么他说“更改所有块采样时间”正在测试,以查看您是否知道如果将所有块采样时间设置为“继承”,并且仅更改了最上游的块,则所有块采样时间都已更改。若要验证所有块都使用相同的采样时间运行,请转到“显示->全部采样时间”。颜色将指示采样时间。更重要的是,图例不会显示其他采样时间。这样,您就知道在忘记更改的子系统中没有隐藏任何块。@PhilGoddard我完全了解这种行为。我已经和给我这个任务的人讨论过了,但他还是让我这样做。他的论点是关于用real-time Workshop将模型翻译成c代码,但正如我之前所说的,我并没有真正理解it@Max:没有理由不使用继承的sa