在Simulink中创建一个掩码,编辑字段为枚举

时间:2016-02-19 14:39:57

标签: matlab simulink mask enumeration

我想在子系统上创建一个掩码,比如Enumerated Constant的掩码(如下所示)。正如您在蓝色圆圈中看到的那样,可以使用下拉列表列出值。枚举常数

Mask of Enumerated Constant

如果创建一个蒙版,确实可以制作一个Popup而不是Edit,但问题是需要在蒙版内手动创建可能的选择列表。我想要的是,此Edit值仅显示我想要仅指定的枚举的可能选择。 Enumerated Constant掩码使用Edit类型执行此操作,但即使这样也可以。

当然我试图从这个块中对此进行逆向工程,但我无法找到Matlab是如何做到的。

3 个答案:

答案 0 :(得分:1)

如果我现在阅读,我不确定我最初的问题是否很清楚。枚举应选自数据字典中的枚举类型。因此,根据朱利安(Julian)和DrBuck的回答,我可以回答自己的问题。

我首先从数据字典中获取枚举类型。

% set name of DD and type
DDName = 'types.sldd';
EventType = 'Dem_EventIdType';
% Get DD entry
myDictionaryObj = Simulink.data.dictionary.open(DDName);
dDataSectObj = getSection(myDictionaryObj,'Design Data');
entryObj = getEntry(dDataSectObj,EventType,'DataSource',DDName);
entryValue = getValue(entryObj);

然后我得到枚举并将事件类型添加到其中。这将用于填充弹出选项。

% Get enumerals
NoOfEvents = length(entryValue.Enumerals);
for i = 1:NoOfEvents
    EventIDs{i,1} = [EventType '.' entryValue.Enumerals(i).Name];
end

此后,我使用上面建议的代码来操作数据字典中的枚举所创建的弹出菜单。

maskObj= Simulink.Mask.get(gcb);
par_name = 'Value_eventID'; % name
par_idx  = find(strcmp({maskObj.Parameters.Name},par_name)); % index of parameter
maskObj.Parameters(par_idx).TypeOptions = EventIDs; % enum options

我不是在“初始化命令”中而是在“刷新事件”按钮的回调函数中执行此操作。从库中添加块时,它仅包含INVALID_EVENT。刷新后,它会进行全新的查找并将当前枚举添加到列表中。

我的最终结果:

enter image description here

答案 1 :(得分:0)

我无法弄清楚如何做到这一点,但希望这个答案能让你走上正轨。

在面具上创建两个弹出窗口,例如'popup1'和'popup2'。将您的类型选项硬编码为popup1,并将popup2保留为空白并禁用(因为它取决于您使用popup1选择的内容)。然后,您可以在popup1上使用回调来在单击第一个时填充popup2。你的回调看起来像这样:

% Grab the value selected from popup1
value = get_param(gcb, 'popup_1');

% Do some sort of check/switch statement to set your options
if value == 1 
    % Enable popup2
    set_param(gcb, 'MaskEnables', {'on', 'on'});
    % Set the type options for popup2
    set_param(gcb, 'MaskStyleString', 'popup(1|2|3|4|5),popup(my|new|options)');
end if

在Matlab / Simulink文档中查看thisthis。如果有点不直观,get_paramset_param会很有用。在Simulink的更高版本中,您可以使用maskObj = Simulink.Mask.create(gcb);方法来执行此类操作,这可能更容易。

答案 2 :(得分:0)

当DrBuck起来时,你应该使用maskObj = Simulink.Mask.create(gcb)为当前选定的块(gcb)创建一个掩码,或者通过maskObj=Simulink.Mask.get(gcb)选择一个已存在的掩码。然后,向其添加参数:

par_name   = 'foo'; % name
par_prompt = 'This is my enum constant'; %prompt
maskObj.addParameter('Prompt',par_prompt,'Name',par_name); % add parameter

您要查找的字段名为TypeOptions,但首先您必须找到正确的参数编号。

par_idx  = find(strcmp({maskObj.Parameters.Name},par_name)); % index of parameter

将mask参数设置为'popup'并创建枚举值:

maskObj.Parameters(par_idx).Type = 'popup'; % type
maskObj.Parameters(par_idx).TypeOptions = {'Option1','Option2'}; % enum options

你有;)

HTH Julian