如何在Simulink中使用.Net枚举?

时间:2015-09-15 12:26:56

标签: .net matlab simulink

我正在评估在Simulink环境中从现有.Net程序集重用.Net枚举。这应该可以防止在.Net环境中更改枚举,但不会在Simulink模型中更改。换句话说:当它们已经在.Net中定义并且可以重用时,不需要在matlab中定义枚举。

我的Simulink模型如下:

Simulink model

我有一个“分支”,它演示了一个带有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中具有常量值的常量块:

Setting a .Net enum value as the value of a constant block in Simulink fails

我有什么遗失的吗?有可能吗?我是否需要编写一些转换才能完成它?

1 个答案:

答案 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);