我正在尝试修改此处给出的示例以创建动态屏蔽子系统,我想在其中将导入和输出的数量动态更改为 S-Function。
我有一个用 C 语言实现的非常简单的 S-Function(它是文档中的timestwo示例),我希望用户能够在掩码中定义输入的数量和输出的数量。然后,在 S 函数中,意图是操纵接收到的输入值并写入输出值。S-Function 最终会做一些相当复杂的事情,我在 Simulink 中需要它的多个实例,因此我希望它在库中定义。
我已将 S-Function 放入库中并通过选择解锁它Diagram->Unlock Library
。
我已经定义了 2 个变量,numInports
并且numOutports
在Parameters & 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 没有被删除,因此我试图重新插入它。