В этом примере показано, как создать модель архитектуры использование 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),'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
Создайте словарь данных и добавьте интерфейс:
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');