我正在评估在Simulink环境中从现有.Net程序集重用.Net枚举。这应该可以防止在.Net环境中更改枚举,但不会在Simulink模型中更改。换句话说:当它们已经在.Net中定义并且可以重用时,不需要在matlab中定义枚举。
我的Simulink模型如下:
我有一个“分支”,它演示了一个带有double值的switch case,而另一个用于使用matlab中内置的枚举来表示它。
classdef (Sealed) mDayOfWeek < Simulink.IntEnumType
enumeration
mSunday(0)
mMonday(1)
mTuesday(2)
mWednesday(3)
mThursday(4)
mFriday(5)
mSaturday(6)
end
end
当我打开我的Simulink模型时,我已注册运行我的go.m(通过模型属性 - &gt;回调 - &gt; PreLoadFcn)。它使用默认值预填充变量Eingabe和mEingabe,如下所示:
if exist('Eingabe', 'var') == 0
Eingabe = 0;
end
if exist('mEingabe', 'var') == 0
mEingabe = mDayOfWeek.mSunday;
end
现在我想添加第三个分支,它应该使用来自mscorlib.dll的枚举System.DayOfWeek。初始化不是问题:
if exist('sEingabe', 'var') == 0
sEingabe = System.DayOfWeek.Sunday;
end
但是,我甚至没有成功配置System.DayOfWeek中具有常量值的常量块:
我有什么遗失的吗?有可能吗?我是否需要编写一些转换才能完成它?
答案 0 :(得分:1)
MathWorks支持告诉我,不支持在Simulink中使用.NET对象实例作为信号。我被鼓励使用“int32”函数将.NET枚举值强制转换为相应的整数值,方法是将常量块的值设置为
*** Settings ***
Library netmiko
Library Collections
*** Test Cases ***
My Test
${device}= Create Dictionary device_type cisco_ios
... ip 10.10.10.227
... username pyclass
... password password
Log Dictionary ${device}
ConnectHandler ${device}
并按如下方式配置SwitchCase块:
int32(System.DayOfWeek.Thursday)
但有人告诉我,这不能与Matlab / Simulink的任何代码生成功能结合使用。如果需要(就像在我的情况下),可以自动让Matlab在.NET反射的帮助下生成适当的Matlab枚举,以使枚举保持同步。这看起来像这样(未经测试):
{int32(System.DayOfWeek.Thursday), int32(System.DayOfWeek.Friday)}
最后我决定转而支持这种T4模板,这在我看来非常简单:
function genEnum(classname)
% Use .NET refection to get Type information
t = System.Type.GetType('System.DayOfWeek');
% Create a new M-file with the name of the Enum
f = fopen([char(t.Name) '.m'],'w');
% Write the classdef header with the name of the class
fprintf(f,'classdef %s < Simulink.IntEnumType\n',char(t.Name));
% Open enumeration
fprintf(f,'\tenumeration\n');
% Get all Enum Values
v = t.GetEnumValues;
for i=1:v.Length
% Add each value
fprintf(f,'\t\t%s(%d)\n',char(v(i)),int32(v(i)));
end
% Close the class and enum definitions
fprintf(f,'\tend\nend\n');
% Close the file
fclose(f);