matlab Simulink:将枚举用作索引

l2osamch  于 2022-11-24  发布在  Matlab
关注(0)|答案(1)|浏览(286)

我觉得这在C#中非常简单,但在Simulink中却不可能。我正在尝试使用枚举值作为数组索引。诀窍是:我有一个数组,其大小与枚举中的元素数对应,但它们的值是不连续的。因此,我希望定义的枚举和Simulink代码读取A(4)处的值。显然,它将读取A(999)。有什么方法可以获得我所寻找的行为吗?

classdef Example < Simulink.IntEnumType
    enumeration
        value1 (1)
        value2 (2)
        value13 (13)
        value999 (999)
    end
end

// Below in Simulink; reputation is not good enough to post images.
A = Data Store Memory
A.InitialValue = uint16(zeros(1, length(enumeration('Example'))))

// Do a Data Store Read with Indexing enabled; Index Option = Index vector (dialog)
A(Example.value999)
sh7euo9m

sh7euo9m1#

经过一个周末的试验,我想出了一个可行的解决方案:使用Simulink函数调用MATLAB函数,该函数使用“find”命令搜索正确的索引。在我的特定示例中,我将数据分配给数据存储内存,因此我能够将枚举索引和一个新值传递给这些块,但您也可以轻松地使用单个输入块来吐出所请求的索引。(我的声誉仍然太低,无法发布图片,所以希望我的文字描述足够了。)

Data Store Memory 'A': Data type = uint16, Dimensions = length(enumeration('RegisterList'))

Simulink Function: SetValueA(ExampleEnum, NewValue)
--> MATLAB Function: SetA_Val(ExampleEnum, NewValue)
    --> function SetModbusRegister(RegisterListEnum, NewValue)

        global A;

        if(isa(ExampleEnum, 'Example'))
            A(find(enumeration('Example') == ExampleEnum, 1)) = NewValue;
        end

从这里,您可以使用Simulink中的函数调用程序块,其中“函数原型”中填充了“SetValueA(ExampleEnum,NewValue)”的任何位置。如果您希望使用向量并一次写入多个值,则逻辑会变得更加复杂,但这至少是一个起点。只需修改Simulink和MATLAB函数,以允许矢量输入并在MATLAB函数中循环这些输入即可。

编辑1

轻微更新:如果你的MATLAB函数被设置成不能在其中使用变长向量,只需将“find”函数替换为“ismember”函数。在ismember中使用标量总是返回标量,MATLAB编译器不会抱怨它。

相关问题