В этом примере показано, как импортировать технические требования архитектуры в System Composer с помощью systemcomposer.io.modelBuilder () служебный класс. Эти технические требования архитектуры могут быть заданы во внешнем источнике, таком как файл Excel.
В системном компоновщике архитектура полностью задана тремя наборами информации:
Компоненты и его положение в иерархии архитектуры
Порты и его отображение с компонентами
Связи между компонентами через порты В этом примере, мы также импортируем интерфейсные определения данных из внешнего источника.
Интерфейсы в моделях архитектуры и ее отображении с портами
Этот пример использует systemcomposer.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
Технические требования архитектуры de таблицы Create 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);