В этом примере показано, как импортировать спецификации архитектуры в System Composer™ с помощью systemcomposer.io.modelBuilder
класс утилиты. Эти спецификации архитектуры могут быть определены во внешнем источнике, таком как файл Excel ®.
В System Composer архитектура полностью определяется четырьмя наборами информации:
Компоненты и их положение в иерархии архитектуры.
Порты и их отображение с компонентами.
Соединения между компонентами через порты. В этом примере мы также импортируем определения данных интерфейса из внешнего источника.
Интерфейсы в моделях архитектуры и их отображение портам.
Этот пример использует systemcomposer.io.modelBuilder
Класс для прохождения всей вышеуказанной информации об архитектуре и импорта модели System Composer.
В этом примере архитектурная информация небольшой системы БПЛА определяется в электронной таблице Excel и используется для создания модели архитектуры System Composer.
Architecture.xlsx
Этот файл Excel содержит иерархическую информацию модели архитектуры. Этот пример сопоставляет внешние исходные данные с элементами модели System Composer. Ниже приведено отображение информации в именах столбцов с элементами модели System Composer.
# Element : Name of the element. Either can be component or port name. # Parent : Name of the parent element. # Class : Can be either component or port(Input/Output direction of the port). # Domain : Mapped as component property. Property "Manufacturer" defined in the profile UAVComponent under Stereotype PartDescriptor maps to Domain values in excel source file. # Kind : Mapped as component property. Property "ModelName" defined in the profile UAVComponent under Stereotype PartDescriptor maps to Kind values in excel source file. # InterfaceName : If class is of port type. InterfaceName maps to name of the interface linked to port. # ConnectedTo : In case of port type, it specifies the connection to other port defined in format "ComponentName::PortName".
DataDefinitions.xlsx
Этот файл Excel содержит определения интерфейсных данных модели. Этот пример принимает нижеследующее отображение между определениями данных в исходном файле Excel и иерархией интерфейсов в System Composer.
# Name : Name of the interface or element. # Parent : Name of the parent interface Name(Applicable only for elements) . # Datatype : Datatype of element. Can be another interface in format Bus: InterfaceName # Dimensions : Dimensions of the element. # Units : Unit property of the element. # Minimum : Minimum value of the element. # Maximum : Maximum value of the element.
Можно создать экземпляр класса конструктора модели с именем профиля.
[stat,fa] = fileattrib(pwd); if ~fa.UserWrite disp('This script must be run in a writable directory'); return; end % Name of the model to build. modelName = 'scExampleModelBuider'; % Name of the profile. profile = 'UAVComponent'; % Name of the source file to read architecture information. architectureFileName = 'Architecture.xlsx'; % Instantiate the ModelBuilder. builder = systemcomposer.io.ModelBuilder(profile);
Чтение информации во внешнем исходном файле DataDefinitions.xlsx
, мы создаем модель данных интерфейса.
Создайте таблицы MATLAB ® из исходного файла Excel.
opts = detectImportOptions('DataDefinitions.xlsx'); opts.DataRange = 'A2'; % force readtable to start reading from the second row. definitionContents = readtable('DataDefinitions.xlsx',opts); % systemcomposer.io.IdService class generates unique ID for a % given key idService = systemcomposer.io.IdService(); for rowItr =1:numel(definitionContents(:,1)) parentInterface = definitionContents.Parent{rowItr}; if isempty(parentInterface) % In case of interfaces adding the interface name to model builder. interfaceName = definitionContents.Name{rowItr}; % Get unique interface ID. getID(container,key) generates % or returns (if key is already present) same value for input key % within the container. interfaceID = idService.getID('interfaces',interfaceName); % Builder utility function to add interface to data % dictionary. builder.addInterface(interfaceName,interfaceID); else % In case of element read element properties and add the element to % parent interface. elementName = definitionContents.Name{rowItr}; interfaceID = idService.getID('interfaces',parentInterface); % ElementID is unique within a interface. % Appending 'E' at start of ID for uniformity. The generated ID for % input element is unique within parent interface name as container. elemID = idService.getID(parentInterface,elementName,'E'); % Datatype, dimensions, units, minimum and maximum properties of % element. datatype = definitionContents.DataType{rowItr}; dimensions = string(definitionContents.Dimensions(rowItr)); units = definitionContents.Units(rowItr); % Make sure that input to builder utility function is always a % string. if ~ischar(units) units = ''; end minimum = definitionContents.Minimum{rowItr}; maximum = definitionContents.Maximum{rowItr}; % Builder function to add element with properties in interface. builder.addElementInInterface(elementName,elemID,interfaceID,datatype,dimensions,units,'real',maximum,minimum); end end
Спецификации архитектуры создаются таблицами MATLAB из исходного файла Excel.
excelContents = readtable(architectureFileName); % Iterate over each row in table. for rowItr =1:numel(excelContents(:,1)) % Read each row of the excel file and columns. class = excelContents.Class(rowItr); Parent = excelContents.Parent(rowItr); Name = excelContents.Element{rowItr}; % Populating the contents of table using the builder. if strcmp(class,'component') ID = idService.getID('comp',Name); % Root ID is by default set as zero. if strcmp(Parent,'scExampleSmallUAV') parentID = "0"; else parentID = idService.getID('comp',Parent); end % Builder utility function to add component. builder.addComponent(Name,ID,parentID); % Reading the property values kind = excelContents.Kind{rowItr}; domain = excelContents.Domain{rowItr}; % *Builder to set stereotype and property values. builder.setComponentProperty(ID,'StereotypeName','UAVComponent.PartDescriptor','ModelName',kind,'Manufacturer',domain); else % In this example, concatenation of port name and parent component name % is used as key to generate unique IDs for ports. portID = idService.getID('port',strcat(Name,Parent)); % For ports on root architecture. compID is assumed as "0". if strcmp(Parent,'scExampleSmallUAV') compID = "0"; else compID = idService.getID('comp',Parent); end % Builder utility function to add port. builder.addPort(Name,class,portID,compID ); % InterfaceName specifies the name of the interface linked to port. interfaceName = excelContents.InterfaceName{rowItr}; % Get interface ID. getID() will return the same IDs already % generated while adding interface in Step 2. interfaceID = idService.getID('interfaces',interfaceName); % Builder to map interface to port. builder.addInterfaceToPort(interfaceID,portID); % Reading the connectedTo information to build connections between % components. connectedTo = excelContents.ConnectedTo{rowItr}; % connectedTo is in format: % (DestinationComponentName::DestinationPortName). % For this example, considering the current port as source of the connection. if ~isempty(connectedTo) connID = idService.getID('connection',connectedTo); splits = split(connectedTo,'::'); % Get the port ID of the connected port. % In this example, port ID is generated by concatenating % port name and parent component name. If port id is already % generated getID() function returns the same id for input key. connectedPortID = idService.getID('port',strcat(splits(2),splits(1))); % Using builder to populate connection table. sourcePortID = portID; destPortID = connectedPortID; % Builder to add connections. builder.addConnection(connectedTo,connID,sourcePortID,destPortID); end end end
[model,importReport] = builder.build(modelName);
bdclose(modelName);
exportModel
| importModel
| systemcomposer.io.ModelBuilder