exponenta event banner

systemcomposer.arch. ComponentPort

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

Описание

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

Создание

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

addPort(compObj.Architecture,'portName','in');
compPortObj = getPort(compObj,'portName');

Свойства

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

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

Пример: 'portName'

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

Направление порта, заданное как символьный вектор со значениями 'Input' и 'Output'.

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

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

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

Интерфейс, связанный с портом, указанный как systemcomposer.interface.SignalInterface объект.

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

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

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

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

Порт архитектуры в компоненте, который сопоставляется с портом, указанный как systemcomposer.arch.ArchitecturePort объект.

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

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

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

setNameЗадать имя порта
setInterfaceУстановка интерфейса для порта
createAnonymousInterfaceСоздание и установка анонимного интерфейса для порта
applyStereotypeПрименение стереотипа к элементу модели архитектуры
getStereotypesПрименить стереотипы к элементу архитектурной модели
removeStereotypeУдаление стереотипа из элемента модели
connectСоздание соединений модели архитектуры
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