Matlab 添加输入端口&;输出到Simulink C Mex S功能掩码

Matlab 添加输入端口&;输出到Simulink C Mex S功能掩码,matlab,simulink,mex,s-function,Matlab,Simulink,Mex,S Function,我试图修改创建动态屏蔽子系统的示例,在该子系统中,我希望动态更改S函数的导入和导出数量 我有一个用C实现的非常简单的S函数(这是文档中的示例),我希望用户能够定义掩码中的输入数和输出数。然后,在S函数中,操作接收的输入值并写入输出值。S函数最终会做一些相当复杂的事情,我需要Simulink中的多个实例,因此我希望在库中定义它 我已将S函数放入库中,并通过选择Diagram->Unlock library将其解锁 我在掩码编辑窗口的参数和对话框窗格中定义了两个变量,numinport和numout

我试图修改创建动态屏蔽子系统的示例,在该子系统中,我希望动态更改S函数的导入和导出数量

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

我已将S函数放入库中,并通过选择
Diagram->Unlock library
将其解锁

我在掩码编辑窗口的
参数和对话框
窗格中定义了两个变量,
numinport
numoutport

然后,我将以下内容添加到
初始化
窗格中:

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()命令应按照建议和删除类型中带有端口的所有块

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

Error in 'MyModel/MyLibrarySFunction': Initialization commands cannot be evaluated. Caused by:
    A new block named 'MyModel/MyLibrarySFunction/In0' cannot be added.
谁能告诉我这里出了什么问题

编辑:

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

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

就在
find_system()
调用并获取0以获取找到的块数之后,我想问题可能是In0没有被删除,因此我正在尝试重新插入它。

子系统中除了S功能块和输入输出块之外,还有什么吗?如果没有,那么为什么不屏蔽S功能块并消除添加/删除输入/输出块的需要。谢谢@PhilGoddard-不,系统中没有其他功能。如何屏蔽S功能块?我以为这就是我在编辑S函数掩码对话框中的
初始化
选项卡时所做的。John,您使用的术语可能有些混乱。如果希望s函数具有基于掩码值的端口数,可以使用ssSetNumInputPorts或其输出版本从s函数内部执行。您不需要使用掩码代码添加端口块。查看其他s函数示例,了解如何使用掩码参数和控制s函数行为。John,您的描述表明您不是直接屏蔽s函数块,而是将s函数放入子系统(以及输入和输出),然后屏蔽该子系统。您应该做的是屏蔽S函数,通过其参数列表将(用户指定的)所需端口数传递给S函数,然后(如@Navan所示)使用ssSetNumInputPorts和ssSetNumOutputPorts宏定义S函数所需的输入和输出数。