0

我正在尝试修改此处给出的示例以创建动态屏蔽子系统,我想在其中将导入和输出的数量动态更改为 S-Function。

我有一个用 C 语言实现的非常简单的 S-Function(它是文档中的timestwo示例),我希望用户能够在掩码中定义输入的数量和输出的数量。然后,在 S 函数中,意图是操纵接收到的输入值并写入输出值。S-Function 最终会做一些相当复杂的事情,我在 Simulink 中需要它的多个实例,因此我希望它在库中定义。

我已将 S-Function 放入库中并通过选择解锁它Diagram->Unlock Library

我已经定义了 2 个变量,numInports并且numOutportsParameters & Dialog掩码编辑窗口的窗格中。

然后我将以下内容添加到Initialization窗格中:

blocks = find_system(gcb,...
          'LookUnderMasks','on',...
          'FollowLinks','on',...
          'RegExp', 'on',...
          'BlockType', 'port');

if ~isempty(blocks)
   Simulink.SubSystem.deleteContents(gcb);
end

for n=0:(numInports - 1)
    label = sprintf('/In%d', n);
    add_block('built-in/Inport',[gcb,label]);
end

for n=0:(numOutports - 1)
    label = sprintf('/Out%d', n);
    add_block('built-in/Outport',[gcb,label]);
end

目的是在参数更改时初始化删除所有导入和导出,然后重新创建它们。然后我将模型保存在库中。

find_system() 命令应该按照此处此处的建议查找并删除类型中具有端口的所有块。

我创建了一个使用这个库模型 S 函数实现的模型。但是,当我更新参数时,出现错误:

Error in 'MyModel/MyLibrarySFunction': Initialization commands cannot be evaluated. Caused by:
    A new block named 'MyModel/MyLibrarySFunction/In0' cannot be added.

谁能告诉我这里出了什么问题?

编辑:

文档find_system()具有作为all有效参数值,而不是on我使用的并且在文档示例中,但是当我更改它时这似乎没有效果。我补充说:

msg = sprintf('Num blocks: %d', numel(blocks));
disp(msg);

就在find_system()调用之后,找到的块数为 0,所以我猜问题可能是 In0 没有被删除,因此我试图重新插入它。

4

0 回答 0