exponenta event banner

systemcomposer.profile. Стереотип

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

Описание

Stereotype класс представляет архитектурные стереотипы в профиле.

Создание

Добавление стереотипа к профилю.

addStereotype(profile,'name')

Свойства

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

Имя стереотипа, определяемого как вектор символа.

Пример: 'HardwareComponent'

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

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

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

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

Пример: 'default'

Пример: 'application'

Пример: 'channel'

Пример: 'controller'

Пример: 'database'

Пример: 'devicedriver'

Пример: 'memory'

Пример: 'network'

Пример: 'plant'

Пример: 'sensor'

Пример: 'subsystem'

Пример: 'transmitter'

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

Стереотип, от которого стереотип наследует свойства, указанные как systemcomposer.profile.Stereotype объект.

Тип элемента, к которому можно применить стереотип, определяемый как вектор символов следующих параметров: 'Component', 'Port', 'Connector', или 'Interface'.

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

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

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

Квалифицированное имя стереотипа, указанное как вектор символов в форме '<profile>.<stereotype>'.

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

Цвет заголовка компонента, заданный как 1x4 uint32 вектор строки в форме Red Green Blue Alpha Alpha значение определяет прозрачность.

Пример: 206 232 246 255

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

Цвет линии соединителя, заданный как 1x4 uint32 вектор строки в форме Red Green Blue Alpha Alpha значение определяет прозрачность.

Пример: 206 232 246 255

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

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

Пример: 'Default'

Пример: 'Dot'

Пример: 'Dash'

Пример: 'Dash Dot'

Пример: 'Dash Dot Dot'

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

Стереотип, от которого стереотип наследует свойства, указанные как systemcomposer.profile.Profile объект.

Свойства, содержащиеся в этом стереотипе и унаследованные от базовой иерархии стереотипа, определяемые как массив ячеек векторов символов.

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

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

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

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

addPropertyОпределение пользовательского свойства для стереотипа
removePropertyУдалить свойство из стереотипа
findНайти стереотип по имени
setDefaultComponentStereotypeЗадание стереотипа по умолчанию для компонентов
setDefaultConnectorStereotypeУстановка стереотипа по умолчанию для соединителей
setDefaultPortStereotypeУстановка стереотипа по умолчанию для портов
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