我觉得这在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)
经过一个周末的实验,我想出了一个可行的解决方案:使用Simulink函数调用MATLAB函数,该函数使用";查找";命令在我的特定实例中,我将数据分配给data Store Memory,因此我可以将枚举索引和一个新值传递给这些块,但您也可以很容易地获得一个输出请求索引的输入块。(我的声誉仍然太低,无法发布图片,所以希望我的文字描述就足够了。(
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函数设置为无法在其中使用可变长度向量,只需替换";查找";用";ismember";作用在ismember中使用标量总是返回标量,MATLAB编译器不会抱怨它