systemcomposer.arch.Architecture

Класс, который представляет архитектуру в модели

Описание

The Architecture класс представляет архитектуру в модели. Этот класс получают из systemcomposer.arch.Element.

Создание

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

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

Свойства

расширить все

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

Пример: 'archModel'

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

Тип определения архитектуры, заданный как ArchitectureDefintion перечисление composition, behavior, или view.

Типы данных: ArchitectureDefinition enum

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

Дочерние компоненты архитектуры, заданные как массив systemcomposer.arch.Component объекты.

Архитектурные порты архитектуры, заданные как массив systemcomposer.arch.ArchitecturePort объекты.

Коннекторы, которые соединяют дочерние компоненты этой архитектуры, заданные как массив systemcomposer.arch.Connector объекты.

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

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

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

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

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

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

Указатель на Simulink для архитектуры, заданный как double. Это свойство необходимо для нескольких связанных с Simulink рабочих процессов и для использования Simulink Requirement APIs.

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

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

Указатель на Simulink в родительскую модель архитектуры, заданный как double. Это свойство необходимо для нескольких связанных с Simulink рабочих процессов и для использования Simulink Requirement APIs.

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

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

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

addComponentДобавление компонентов в архитектуру
addVariantComponentДобавление исполнительных компонентов к архитектуре
addPortДобавьте порты к архитектуре
connectСоздайте соединения модели архитектуры
applyStereotypeПрименить стереотип к элементу модели архитектуры
getStereotypesПолучите стереотипы, примененные к элементу модели архитектуры
removeStereotypeУдалите стереотип из элемента модели
batchApplyStereotypeПрименить стереотип ко всем элементам архитектуры
iterateИтерация над элементами модели
instantiateСоздайте образец анализа из спецификации
setPropertyУстановите значение свойства, соответствующее стереотипу, примененному к элементу
getPropertyПолучите значение свойства, соответствующее стереотипу, примененному к элементу
getPropertyValueПолучите значение свойства архитектуры
getEvaluatedPropertyValueПолучите оцененное значение свойства из компонента
getStereotypePropertiesПолучите имена свойства стереотипа для элемента
removeProfileУдалите профиль из модели
applyProfileПрименить профиль к модели

Примеры

свернуть все

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

Подготовьте рабочую область

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

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');

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

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

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

save(model)

Откройте модель

open_system(gcs);

Расположить размещение можно с помощью pressв Ctrl + сдвиг + 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)

Расположить размещение можно с помощью pressв Ctrl + сдвиг + 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')

Расположить размещение можно с помощью pressв Ctrl + сдвиг + 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