【问题标题】:handing string to MATLAB function in Simulink在 Simulink 中将字符串传递给 MATLAB 函数
【发布时间】:2017-01-16 04:03:56
【问题描述】:

在我的 Simulink 模型中,我有一个 MATLAB 函数 this_function,它使用 Simulink 模型的名称 modelname 作为一个参数。该名称在一个额外的参数文件中定义,其中包含所需的所有其他参数。加载参数文件会将modelname 加载到工作区中。现在的问题是,this_function 无法访问工作区中的modelname,因此模型无法运行。

我尝试将 modelname 用作 this_function 的常量输入源,我之前曾将其用作解决方法,但 Simulink 不接受字符/字符串作为信号。此外,将modelname 设置为全局也不起作用。

有没有办法将modelname保留在参数文件中,而不是直接写入this_function

【问题讨论】:

    标签: matlab function simulink


    【解决方案1】:

    Simulink 不支持字符串。就像,任何地方。这真的很糟糕,我不知道为什么会存在这种限制——这对我来说似乎是一个非常糟糕的设计选择。

    我找到了以下解决此限制的方法:

    脏铸造

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

    在 Simulink 模块中成为您的 MATLAB 函数,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 应该开始原生支持字符串,我的意思是,加油

    【讨论】:

    • 所以我使用了脏铸造选项。那行得通,我可以使用char() 从数组中提取字符串。它并不漂亮,但可以达到目的。
    猜你喜欢
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 2013-11-18
    • 2016-01-28
    • 2013-12-11
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多