Импорт архитектуры System Composer с помощью Model Builder

В этом примере показано, как импортировать спецификации архитектуры в 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.

Шаг 1. Создайте экземпляр класса Model Builder

Можно создать экземпляр класса конструктора модели с именем профиля.

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

Шаг 2. Построение определений данных интерфейсов

Чтение информации во внешнем исходном файле 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

Шаг 3. Спецификации архитектуры сборки

Спецификации архитектуры создаются таблицами 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

Шаг 3. Метод сборки Builder импортирует модель из заполненных таблиц

[model,importReport] = builder.build(modelName);

Закройте модель

bdclose(modelName);

См. также

| |

Похожие темы