exponenta event banner

systemcomposer.arch. Компонент

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

Описание

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

Создание

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

model = systemcomposer.createModel('archModel');
arch = get(model,'Architecture');
component = addComponent(arch,'newComponent');

Свойства

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

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

Пример: 'newComponent'

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

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

Архитектура, определяющая структуру компонента, заданную как systemcomposer.arch.Architecture объект. Для компонента, ссылающегося на другую архитектурную модель, это свойство возвращает дескриптор корневой архитектуре этой модели. Для компонентов вариантов архитектура является архитектурой активного варианта.

Архитектура, которой принадлежит компонент, указанная как systemcomposer.arch.Architecture объект. Для компонентов, ссылающихся на архитектуру, это свойство пусто. Для исполнительных компонентов это свойство является архитектурой, в которой находятся отдельные исполнительные компоненты.

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

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

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

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

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

Является ли компонент блоком адаптера, указанным как логический 1 (true) или 0 (false).

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

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

Пример: '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

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

saveAsModelСохранение архитектуры компонента в отдельной модели
createSimulinkBehaviorСоздание поведения Simulink и связь с компонентом
createStateflowChartBehaviorДобавление поведения диаграммы Stateflow к компоненту
linkToModelСвязывание компонента с моделью
inlineComponentВстроенная ссылочная архитектура или поведение в модели
makeVariantПреобразовать компонент в вариант
isReferenceНайти, является ли компонент ссылкой на другую модель
connectСоздание соединений модели архитектуры
getPortПолучить порт из компонента
applyStereotypeПрименение стереотипа к элементу модели архитектуры
getStereotypesПрименить стереотипы к элементу архитектурной модели
removeStereotypeУдаление стереотипа из элемента модели
setPropertyУстановка значения свойства, соответствующего стереотипу, применяемому к элементу
getPropertyПолучение значения свойства, соответствующего стереотипу, применяемому к элементу
getPropertyValueПолучение значения свойства architecture
getEvaluatedPropertyValueПолучение вычисленного значения свойства из компонента
getStereotypePropertiesПолучение имен свойств стереотипа для элемента
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