Создайте модель архитектуры из командной строки

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

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

systemcomposer.profile.Profile.closeAll;

Создайте модель

Добавьте компоненты, порты и связи

model = systemcomposer.createModel('mobileRobotAPI');
arch = model.Architecture;
components = addComponent(arch,{'Sensor','Planning','Motion'});
sensorPorts = addPort(components(1).Architecture,{'MotionData','SensorData'},{'in','out'});
planningPorts = addPort(components(2).Architecture,{'Command','SensorData','MotionCommand'},{'in','in','out'});
motionPorts = addPort(components(3).Architecture,{'MotionCommand','MotionData'},{'in','out'});
c_sensorData = connect(arch,components(1),components(2));
c_motionData = connect(arch,components(3),components(1));
c_motionCommand = connect(arch,components(2),components(3));

Добавьте и соедините порт архитектуры

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

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

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

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

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

save(model)

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

open_system(gcs);

Расположите размещение pressıng Ctrl+Shift+A или использование следующей команды.

Simulink.BlockDiagram.arrangeSystem('mobileRobotAPI'); 

Создайте и примените профиль и стереотипы

Профилями является xml файлы, которые могут быть применены к любой модели.

Создайте профиль и добавьте стереотипы

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

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

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

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

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

Установите свойства связей быть идентичными:

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

Создайте интерфейс

Создайте словарь данных и добавьте интерфейс:

dictionary = systemcomposer.createDictionary('SensorInterfaces.sldd');
interface = addInterface(dictionary,'GPSInterface');

Соедините интерфейс с моделью:

linkDictionary(model,'SensorInterfaces.sldd');

Идентифицируйте интерфейс в словаре:

interface_GPS = getInterface(model.InterfaceDictionary,'GPSInterface');

Установите интерфейс для порта:

setInterface(sensorPorts(2),interface_GPS);

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

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

dictionary.save(); 

Очистка

Не прокомментируйте следующий код и запуск, чтобы очистить артефакты, созданные этим примером:

% bdclose('mobileRobotAPI');
% systemcomposer.profile.Profile.closeAll;
% delete('SensorInterfaces.sldd');
Для просмотра документации необходимо авторизоваться на сайте