在Simulink中将字符串传递给MATLAB函数

3
在我的Simulink模型中,我有一个MATLAB函数this_function,它使用Simulink模型的名称modelname作为其中一个参数。该名称在一个额外的参数文件中定义,并加载到工作区中。问题是this_function无法访问工作区中的modelname,因此模型无法运行。
我尝试将modelname用作this_function的常量输入源,这是我以前使用的解决方法,但是Simulink不接受字符/字符串作为信号。此外,将modelname设置为全局变量也无效。
是否有一种方法可以将modelname保留在参数文件中,而不是直接编写到this_function中?
1个回答

3

Simulink不支持字符串类型,这个限制非常糟糕,我也不知道为什么会有这样的限制存在。这对于设计来说似乎是一个相当糟糕的选择。

我发现了以下几种解决方案来规避这个限制:

脏强制转换

function yourFun(num_param1, num_param2, ..., str_param);

将您的MATLAB函数放在Simulink块内,使用str_param作为您想要作为字符串的参数,num_param[X]作为任何其他参数。然后像这样将字符串信号传递给函数:

yourFun(3, [4 5], ..., 'the_string'+0);

请注意末尾的'+0';这是将字符串强制转换为整数数组的简写,对应于字符串中每个字符的ASCII码。然后,在函数内部,通过执行反向操作,您可以将整数数组转换回字符串。
model = char(str_param);

但通常这会导致后续出现问题(例如不支持strcmp、不支持upper/lower等)。因此,您可以以类似的方式进行字符串比较(和类似操作):

isequal(str_param, 'comparison'+0);

这种方法具有字符串的所有好处,但实际上并不使用字符串。

当然,在常量块中也可以使用'+0'技巧,将工作区变量转换为preLoad,等等。

请注意,在MATLAB函数中必须启用对可变大小数组的支持。

固定选项集

您可以传递一个数字标量,而不是传递一个字符串,该数字标量对应于固定的硬编码选项列表中的选择:

function yourFun(..., option)

    ...

    switch (option)
        case 1 
            model = 'model_idealised';
        case 2
            model = 'model_with_drag';
        case 3
            model = 'model_fullscale';
        otherwise
            error('Invalid option.');
    end

    ...

end

两种替代方案都不理想,都是人为的,都容易出现错误和/或具有重用性和可扩展性问题。这真的很无望。

Simulink应该开始本地支持字符串,我的意思是,得了吧。


1
所以我使用了不太好的转换选项。这个方法可以工作,我可以用char()从数组中提取字符串。虽然不够优美,但能达到预期的效果。 - fukurai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接