exponenta event banner

systemcomposer.arch. VariantComponent

Класс, представляющий компонент варианта в модели System Composer

Описание

VariantComponent класс представляет компонент исполнения, который позволяет создать несколько альтернатив конструкции для компонента. Этот класс наследует от systemcomposer.arch.BaseComponent. Этот класс является производным от systemcomposer.arch.Element.

Создание

Создайте компонент варианта.

varComp = addVariantComponent(archObj,'compName');

addVariantComponent метод создает systemcomposer.arch.VariantComponent объект.

Свойства

развернуть все

Имя компонента варианта, заданного как символьный вектор.

Типы данных: char

Положение компонента на холсте, заданного как вектор координат, в пикселях [left top right bottom].

Архитектура, которой принадлежит компонент варианта, указанный как systemcomposer.arch.Architecture объект.

Архитектура активного варианта, указанного как systemcomposer.arch.Architecture объект.

Порты ввода и вывода компонента варианта, указанные как systemcomposer.arch.ComponentPort объекты.

Архитектура, принадлежащая компоненту варианта, заданному как systemcomposer.arch.Architecture объект.

Массив портов компонента, указанный как массив systemcomposer.arch.ComponentPort объекты.

Универсальный уникальный идентификатор компонента модели, заданный как символьный вектор.

Пример: '91d5de2c-b14c-4c76-a5d6-5dd0037c52df'

Типы данных: char

Уникальный внешний идентификатор, указанный как символьный вектор. Внешний идентификатор сохраняется в течение срока службы элемента и во всех операциях, которые сохраняют UUID.

Типы данных: char

Родительская модель компонента, заданная как systemcomposer.arch.Model объект.

Дескриптор Simulink для компонента, заданный как числовое значение. Это свойство необходимо для нескольких рабочих потоков, связанных с Simulink, и для использования API требований Simulink.

Пример: handle = get(object,'SimulinkHandle')

Типы данных: double

Дескриптор Simulink для родительской модели компонента, заданный как числовое значение. Это свойство необходимо для нескольких рабочих потоков, связанных с Simulink, и для использования API требований Simulink.

Пример: handle = get(object,'SimulinkModelHandle')

Типы данных: double

Функции объекта

addChoiceДобавление вариантов в компонент исполнения
setConditionЗадать условие при выборе варианта
setActiveChoiceЗадать активный выбор для компонента варианта
getChoicesПолучение доступных вариантов в компоненте исполнения
getActiveChoiceПолучить активный выбор для компонента варианта
getConditionВозврат элемента управления вариантом при выборе в компоненте варианта
applyStereotypeПрименение стереотипа к элементу модели архитектуры
getStereotypesПрименить стереотипы к элементу архитектурной модели
removeStereotypeУдаление стереотипа из элемента модели
getPortПолучить порт из компонента
getPropertyValueПолучение значения свойства architecture
getEvaluatedPropertyValueПолучение вычисленного значения свойства из компонента
getStereotypePropertiesПолучение имен свойств стереотипа для элемента
getPropertyПолучение значения свойства, соответствующего стереотипу, применяемому к элементу
setPropertyУстановка значения свойства, соответствующего стереотипу, применяемому к элементу
isReferenceНайти, является ли компонент ссылкой на другую модель
destroyУдалить элемент модели

Примеры

свернуть все

В этом примере показано, как построить архитектурную модель с помощью системного API Composer™.

Подготовка рабочей области

Очистить все профили из рабочего пространства.

systemcomposer.profile.Profile.closeAll;

Построение модели

Чтобы построить модель, добавьте словарь данных с интерфейсами и элементами интерфейса, затем добавьте компоненты, порты и соединения. После создания модели можно создать пользовательские представления, чтобы сосредоточиться на конкретной задаче. Можно также запросить модель для сбора различных элементов модели в соответствии с указанными критериями.

Добавление компонентов, портов и соединений

Создайте модель и извлеките ее архитектуру.

model = systemcomposer.createModel('mobileRobotAPI');
arch = model.Architecture;

Создайте словарь данных и добавьте интерфейс. Свяжите интерфейс с моделью.

dictionary = systemcomposer.createDictionary('SensorInterfaces.sldd');
interface = addInterface(dictionary,'GPSInterface');
interface.addElement('Mass');
linkDictionary(model,'SensorInterfaces.sldd');

Добавление компонентов, портов и соединений. Установите интерфейс для портов, которые будут подключены позже.

components = addComponent(arch,{'Sensor','Planning','Motion'});
sensorPorts = addPort(components(1).Architecture,{'MotionData','SensorData'},{'in','out'});
sensorPorts(2).setInterface(interface);

planningPorts = addPort(components(2).Architecture,{'Command','SensorData1','MotionCommand'},{'in','in','out'});
planningPorts(2).setInterface(interface);

motionPorts = addPort(components(3).Architecture,{'MotionCommand','MotionData'},{'in','out'});

Соедините компоненты с помощью правила интерфейса. Это правило соединяет порты компонентов, совместно использующих один и тот же интерфейс.

c_sensorData = connect(arch,components(1),components(2),'Rule','interfaces');
c_motionData = connect(arch,components(3),components(1));
c_motionCommand = connect(arch,components(2),components(3));

Сохранить словарь данных

Сохраните изменения в словаре данных.

dictionary.save(); 

Добавление и подключение порта архитектуры

Добавьте порт архитектуры в архитектуру.

archPort = addPort(arch,'Command','in');

connect для команды требуется порт компонента в качестве аргумента. Получите порт компонента и подключите:

compPort = getPort(components(2),'Command');
c_Command = connect(archPort,compPort);

Сохраните модель.

save(model)

Открытие модели

open_system(gcs);

Упорядочьте макет, нажав клавиши Ctrl + Shift + A или используя следующую команду:

Simulink.BlockDiagram.arrangeSystem('mobileRobotAPI'); 

Создание и применение профиля и стереотипов

Профили: xml файлы, которые можно применить к любой модели. В профили можно добавлять стереотипы со свойствами, а затем заполнять свойства определенными значениями. Наряду со встроенными возможностями анализа System Composer, стереотипы могут направлять оптимизацию системы для обеспечения производительности, стоимости и надежности.

Создание профиля и добавление стереотипов

Создайте профиль.

profile = systemcomposer.createProfile('GeneralProfile');

Создайте стереотип, применимый ко всем типам элементов:

elemSType = addStereotype(profile,'projectElement');

Создание стереотипов для различных типов компонентов. Эти типы продиктованы потребностями проектирования и зависят от вашего усмотрения:

pCompSType = addStereotype(profile,'physicalComponent','AppliesTo','Component');
sCompSType = addStereotype(profile,'softwareComponent','AppliesTo','Component');

Создайте стереотип для соединений:

sConnSType = addStereotype(profile,'standardConn','AppliesTo','Connector');

Добавить свойства

Добавление свойств к стереотипам. Свойства можно использовать для сбора метаданных элементов модели и анализа нефункциональных требований. Эти свойства добавляются ко всем элементам, к которым применяется стереотип, в любой модели, импортирующей профиль.

addProperty(elemSType,'ID','Type','uint8');
addProperty(elemSType,'Description','Type','string');
addProperty(pCompSType,'Cost','Type','double','Units','USD');
addProperty(pCompSType,'Weight','Type','double','Units','g');
addProperty(sCompSType,'develCost','Type','double','Units','USD');
addProperty(sCompSType,'develTime','Type','double','Units','hour');
addProperty(sConnSType,'unitCost','Type','double','Units','USD');
addProperty(sConnSType,'unitWeight','Type','double','Units','g');
addProperty(sConnSType,'length','Type','double','Units','m');

Сохранить профиль

save(profile);

Применить профиль к модели

Примените профиль к модели:

applyProfile(model,'GeneralProfile');

Применять стереотипы к компонентам. Некоторые компоненты являются физическими компонентами, а другие - программными компонентами.

applyStereotype(components(2),'GeneralProfile.softwareComponent')
applyStereotype(components(1),'GeneralProfile.physicalComponent')
applyStereotype(components(3),'GeneralProfile.physicalComponent')

Применить стереотип соединителя ко всем соединениям:

batchApplyStereotype(arch,'Connector','GeneralProfile.standardConn');

Применение общего стереотипа элементов ко всем соединителям и портам:

batchApplyStereotype(arch,'Component','GeneralProfile.projectElement');
batchApplyStereotype(arch,'Connector','GeneralProfile.projectElement');

Задайте свойства для каждого компонента:

setProperty(components(1),'GeneralProfile.projectElement.ID','001');
setProperty(components(1),'GeneralProfile.projectElement.Description','''Central unit for all sensors''');
setProperty(components(1),'GeneralProfile.physicalComponent.Cost','200');
setProperty(components(1),'GeneralProfile.physicalComponent.Weight','450');
setProperty(components(2),'GeneralProfile.projectElement.ID','002');
setProperty(components(2),'GeneralProfile.projectElement.Description','''Planning computer''');
setProperty(components(2),'GeneralProfile.softwareComponent.develCost','20000');
setProperty(components(2),'GeneralProfile.softwareComponent.develTime','300');
setProperty(components(3),'GeneralProfile.projectElement.ID','003');
setProperty(components(3),'GeneralProfile.projectElement.Description','''Motor and motor controller''');
setProperty(components(3),'GeneralProfile.physicalComponent.Cost','4500');
setProperty(components(3),'GeneralProfile.physicalComponent.Weight','2500');

Задайте идентичные свойства соединений:

connections = [c_sensorData c_motionData c_motionCommand  c_Command];
for k = 1:length(connections)
    setProperty(connections(k),'GeneralProfile.standardConn.unitCost','0.2');
    setProperty(connections(k),'GeneralProfile.standardConn.unitWeight','100');
    setProperty(connections(k),'GeneralProfile.standardConn.length','0.3');
end

Добавить иерархию

Добавить два компонента с именем Controller и Scope внутри Motion компонент. Определите порты. Подключите их к архитектуре и друг к другу, применив стереотип соединителя. Иерархия в схеме архитектуры создает дополнительный уровень детализации, определяющий внутреннее поведение компонентов.

motionArch = components(3).Architecture;
motion = motionArch.addComponent({'Controller','Scope'});

controllerPorts = addPort(motion(1).Architecture,{'controlIn','controlOut'},{'in','out'});
controllerCompPortIn = motion(1).getPort('controlIn');
controllerCompPortOut = motion(1).getPort('controlOut');

scopePorts = addPort(motion(2).Architecture,{'scopeIn','scopeOut'},{'in','out'});
scopeCompPortIn = motion(2).getPort('scopeIn');
scopeCompPortOut = motion(2).getPort('scopeOut');

c_planningController = connect(motionPorts(1),controllerCompPortIn);
c_planningScope = connect(scopeCompPortOut,motionPorts(2));
c_planningConnect = connect(controllerCompPortOut,scopeCompPortIn,'GeneralProfile.standardConn');

Сохраните модель.

save(model)

Упорядочьте макет, нажав клавиши Ctrl + Shift + A или используя следующую команду:

Simulink.BlockDiagram.arrangeSystem('mobileRobotAPI/Motion');

Создание ссылки на модель

Ссылки на модели полезны для иерархической организации больших моделей и позволяют определить архитектуры или поведение один раз и повторно использовать их. Когда компонент ссылается на другую модель, все существующие порты компонента удаляются, а порты, существующие в ссылочной модели, появляются на компоненте.

Создайте новую модель System Composer. Преобразовать Sensor в ссылочный компонент для привязки к новой модели. Добавление дополнительных портов в Sensor компонент, необходимо обновить ссылочную модель mobileSensor.

newModel = systemcomposer.createModel('mobileSensor');
newArch = newModel.Architecture;
newComponents = addComponent(newArch,'ElectricSensor');
save(newModel);

linkToModel(components(1),'mobileSensor');

Применение стереотипа к архитектуре и компоненту связанной ссылочной модели.

referenceModel = get_param('mobileSensor','SystemComposerModel');
referenceModel.applyProfile('GeneralProfile');
referenceModel.Architecture.applyStereotype('GeneralProfile.softwareComponent');
batchApplyStereotype(referenceModel.Architecture,'Component','GeneralProfile.projectElement')

Добавьте порты и соединения к ссылочному компоненту.

sensorPorts = addPort(components(1).Architecture,{'MotionData','SensorData'},{'in','out'});
sensorPorts(2).setInterface(interface)
connect(arch,components(1),components(2),'Rule','interfaces');
connect(arch,components(3),components(1));

Сохраните модели.

save(referenceModel)
save(model)

Создание компонента исполнения

Можно преобразовать Planning в компонент исполнения с использованием makeVariant функция. Исходный компонент встраивается в компонент исполнения в качестве одного из доступных вариантов исполнения. Можно создать другие варианты исполнения в компоненте исполнения и переключить активный вариант. Компоненты вариантов позволяют программно выбирать поведенческие конструкции в архитектурной модели для выполнения торговых исследований и анализа.

[variantComp,choice1] = makeVariant(components(2));

Добавление дополнительного варианта с именем PlanningAlt. Второй аргумент определяет имя, а третий - метку. Метка определяет выбор. Активным выбором управляет метка.

choice2 = addChoice(variantComp,{'PlanningAlt'},{'PlanningAlt'});

Создание необходимых портов на PlanningAlt.

setActiveChoice(variantComp,choice2)
planningAltPorts = addPort(choice2.Architecture,{'Command','SensorData1','MotionCommand'},{'in','in','out'});
planningAltPorts(2).setInterface(interface);

Сделать PlanningAlt активный вариант.

setActiveChoice(variantComp,'PlanningAlt')

Упорядочьте макет, нажав клавиши Ctrl + Shift + A или используя следующую команду:

Simulink.BlockDiagram.arrangeSystem('mobileRobotAPI/Planning');

Сохраните модель.

save(model)

Очистить

Раскомментируйте следующий код и запустите для очистки артефактов, созданных в этом примере:

% bdclose('mobileRobotAPI')
% bdclose('mobileSensor')
% Simulink.data.dictionary.closeAll
% systemcomposer.profile.Profile.closeAll
% delete('Profile.xml')
% delete('SensorInterfaces.sldd')

Подробнее

развернуть все

Представлен в R2019a