Import System Composer Architecture Using ModelBuilder
Class
Import architecture specifications into System Composer™ using the systemcomposer.io.ModelBuilder
utility class. These architecture specifications can be defined in an external source, such as an Excel® file.
In System Composer, an architecture is fully defined by four sets of information:
Components and their position in the architecture hierarchy
Ports and their mapping to components
Connections among components through ports - In this example, we also import interface data definitions from an external source.
Interfaces in architecture models and their mapping to ports
This example uses the systemcomposer.io.ModelBuilder
class to pass all of the above architecture information and import a System Composer model.
In this example, architecture information of a small UAV system is defined in an Excel spreadsheet and is used to create a System Composer architecture model.
External Source Files
Architecture.xlsx
— This Excel file contains hierarchical information of the architecture model. This example maps the external source data to System Composer model elements. This information maps in column names to System Composer model elements.
# 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
— This Excel file contains interface data definitions of the model. This example assumes this mapping between the data definitions in the Excel source file and interfaces hierarchy in 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.
Step 1. Instantiate the ModelBuilder
Class
You can instantiate the ModelBuilder
class with a profile name.
[stat,fa] = fileattrib(pwd); if ~fa.UserWrite disp('This script must be run in a writable directory'); return; end
Specify the name of the model to build.
modelName = 'scExampleModelBuilder';
Specify the name of the profile.
profile = 'UAVComponent';
Specify the name of the source file to read architecture information.
architectureFileName = 'Architecture.xlsx';
Instantiate the ModelBuilder
.
builder = systemcomposer.io.ModelBuilder(profile);
Step 2. Build Interface Data Definitions
Reading the information in the external source file DataDefinitions.xlsx
to build the interface data model.
Create MATLAB® tables from the Excel source file.
opts = detectImportOptions('DataDefinitions.xlsx'); opts.DataRange = 'A2';
Force readtable
to start reading from the second row.
definitionContents = readtable('DataDefinitions.xlsx',opts);
The 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 the case of interfaces, add the interface name to the model builder.
interfaceName = definitionContents.Name{rowItr};
Get the 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);
Use builder.addInterface
to add the interface to the data dictionary.
builder.addInterface(interfaceName,interfaceID);
else
In the case of an element, read the element properties and add the element to the parent interface.
elementName = definitionContents.Name{rowItr};
interfaceID = idService.getID('interfaces',parentInterface);
The ElementID
is unique within a interface. Append E
at the start of an ID
for uniformity. The generated ID
for an input element is unique within parent interface name as a container.
elemID = idService.getID(parentInterface,elementName,'E');
Set the data type, dimensions, units, minimum, and maximum properties of the 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};
Use builder.addElementInInterface
to add an element with properties in the interface.
builder.addElementInInterface(elementName,elemID,interfaceID,datatype,dimensions,... units,'real',maximum,minimum); end end
Step 3. Build Architecture Specifications
Architecture specifications are created by MATLAB tables from the Excel source file.
excelContents = readtable(architectureFileName);
Iterate over each row in the 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};
Populate the contents of the table.
if strcmp(class,'component') ID = idService.getID('comp',Name);
The Root ID
is by default set as zero.
if strcmp(Parent,'scExampleSmallUAV') parentID = "0"; else parentID = idService.getID('comp',Parent); end
Use builder.addComponent
to add a component.
builder.addComponent(Name,ID,parentID);
Read the property values.
kind = excelContents.Kind{rowItr}; domain = excelContents.Domain{rowItr};
Use builder.setComponentProperty
to set stereotype and property values.
builder.setComponentProperty(ID,'StereotypeName','UAVComponent.PartDescriptor',... 'ModelName',kind,'Manufacturer',domain); else
In this example, concatenation of the 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, the compID
is assumed as 0
.
if strcmp(Parent,'scExampleSmallUAV') compID = "0"; else compID = idService.getID('comp',Parent); end
Use builder.addPort
to add a port.
builder.addPort(Name,class,portID,compID );
The InterfaceName
specifies the name of the interface linked to the port.
interfaceName = excelContents.InterfaceName{rowItr};
Get the interface ID.
getID
will return the same IDs already generated while adding interface in Step 2.
interfaceID = idService.getID('interfaces',interfaceName);
Use builder.addInterfaceToPort
to map interface to port.
builder.addInterfaceToPort(interfaceID,portID);
Read the ConnectedTo
information to build connections between components.
connectedTo = excelContents.ConnectedTo{rowItr};
ConnectedTo
is in the format:
(DestinationComponentName::DestinationPortName)
For this example, consider 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 the port name and the parent component name. If the port ID is already generated, the getID
function returns the same ID for the input key.
connectedPortID = idService.getID('port',strcat(splits(2),splits(1)));
Populate the connection table.
sourcePortID = portID; destPortID = connectedPortID;
Use builder.addConnection
to add connections.
builder.addConnection(connectedTo,connID,sourcePortID,destPortID); end end end
Step 3. Import Model from Populated Tables with builder.build
Function
[model,importReport] = builder.build(modelName);
Clean up artifacts.
cleanUp
Copyright 2020 The bat365, Inc.
See Also
systemcomposer.io.ModelBuilder
| importModel
| exportModel