systemcomposer.allocation.AllocationSet

Управляйте набором сценариев выделения

Описание

AllocationSet задает набор сценариев выделения между двумя моделями.

Создание

Создайте набор выделения и просмотрите его.

% Create the allocation set with name MyNewAllocation.
systemcomposer.allocation.createAllocationSet('MyNewAllocation', ...
     'Source_Model_Allocation','Target_Model_Allocation');

% Open the allocation editor 
systemcomposer.allocation.editor()

Свойства

развернуть все

Имя выделения определяется в виде вектора символов.

Пример: 'MyNewAllocation'

Типы данных: char

Исходная модель для выделения в виде systemcomposer.arch.Model объект.

Целевая модель для выделения в виде systemcomposer.arch.Model объект.

Сценарии выделения в виде массива systemcomposer.allocation.AllocationScenario объекты.

Описание выделения установлено в виде вектора символов.

Типы данных: char

Устарел ли набор выделения с источником и/или целевой моделью в виде логической единицы (true) или 0 (false).

Типы данных: логический

Имеет ли набор выделения несохраненные изменения в виде логической единицы (true) или 0 (false).

Типы данных: логический

Универсальный уникальный идентификатор для выделения установлен в виде вектора символов.

Пример: '91d5de2c-b14c-4c76-a5d6-5dd0037c52df'

Типы данных: char

Функции объекта

createScenarioСоздайте новый пустой сценарий выделения
getScenarioПолучите сценарий выделения
deleteScenarioУдалите сценарий выделения
findНайдите загруженный набор выделения
saveСохраните набор выделения
closeЗакройте набор выделения
closeAllЗакройте все открытые наборы выделения

Примеры

свернуть все

В этом примере показано, как использовать выделения, чтобы анализировать систему мониторинга давления воздуха в шине.

Обзор

В системном проектировании распространено описать систему на разных уровнях абстракции. Например, можно описать систему в терминах ее высокоуровневых функций. Эти функции не могут иметь никакого поведения, сопоставленного с ними, но скорее всего проследить до некоторых эксплуатационных требований, которые должна выполнить система. Мы обращаемся к этому слою (или архитектура) как функциональная архитектура. В этом примере автомобильная система мониторинга давления воздуха в шине описана в трех различных архитектурах:

  1. Функциональная архитектура — Описывает систему в терминах своих высокоуровневых функций. Связи показывают зависимости между функциями.

  2. Логическая архитектура — Описывает систему в терминах своих логических компонентов и как данные переданы между ними. Кроме того, эта архитектура задает поведения для симуляции модели.

  3. Архитектура платформы — Описывает физическое оборудование, необходимое для системы на высоком уровне.

Процесс выделения задан как соединение этих трех архитектур, которые полностью описывают систему. Соединяющиеся получения информация о каждом архитектурном слое и делают его доступным для других.

Используйте эту команду, чтобы открыть проект.

  scExampleTirePressureMonitorSystem

Откройте FunctionalAllocation.mldatx файл, который отображает выделения от TPMS_FunctionalArchitecture к TPMS_LogicalArchitecture. Элементы TPMS_FunctionalArchitecture отображены в первом столбце и элементах TPMS_LogicalArchitecture отображены в первой строке. Стрелки указывают на выделения между элементами модели.

Этот рисунок отображает выделения на архитектурном уровне компонента. Стрелы отображают выделенные компоненты в модели. Можно наблюдать выделения для каждого элемента в иерархии модели.

Остальная часть примера показывает, как можно использовать эту информацию о выделении, чтобы далее анализировать модель.

Функциональный к логическому выделению и анализу покрытия

Этот раздел показывает, как выполнить анализ покрытия, чтобы проверить, что все функции были выделены. Этот процесс требует использования информации выделения, указанной между функциональными и логическими архитектурами.

Чтобы запустить анализ, загрузите набор выделения.

  allocSet = systemcomposer.allocation.load('FunctionalAllocation');
  scenario = allocSet.Scenarios;

Проверьте, что каждая функция в системе выделяется.

  import systemcomposer.query.*;
  [~, allFunctions] = allocSet.SourceModel.find(HasStereotype(IsStereotypeDerivedFrom("TPMSProfile.Function")));
  unAllocatedFunctions = [];
  for i = 1:numel(allFunctions)
      if isempty(scenario.getAllocatedTo(allFunctions(i)))
          unAllocatedFunctions = [unAllocatedFunctions allFunctions(i)];
      end
  end

  if isempty(unAllocatedFunctions)
      fprintf('All functions are allocated');
  else
      fprintf('%d Functions have not been allocated', numel(unAllocatedFunctions));
  end
All functions are allocated

Результат отображает All functions are allocated проверять, что все функции в системе выделяются.

Анализируйте поставщиков, обеспечивающих функции

В этом примере показано, как идентифицировать, какие функции будут обеспечены который поставщики, использующие заданные выделения. Информация о поставщике хранится в логической модели, поскольку это компоненты, которые поставщики будут поставлять системному интегратору.

  suppliers = {'Supplier A', 'Supplier B', 'Supplier C', 'Supplier D'};
  functionNames = arrayfun(@(x) x.Name, allFunctions, 'UniformOutput', false);
  numFunNames = length(allFunctions);
  numSuppliers = length(suppliers);
  allocTable = table('Size', [numFunNames, numSuppliers], 'VariableTypes', repmat("double", 1, numSuppliers));
  allocTable.Properties.VariableNames = suppliers;
  allocTable.Properties.RowNames = functionNames;
  for i = 1:numFunNames
      elem = scenario.getAllocatedTo(allFunctions(i));
      for j = 1:numel(elem)
          elemSupplier = elem(j).getEvaluatedPropertyValue("TPMSProfile.LogicalComponent.Supplier");
          allocTable{i, strcmp(elemSupplier, suppliers)} = 1;
      end

  end

Таблица показывает, какие поставщики ответственны за соответствующие функции.

  allocTable
allocTable=8×4 table
                                    Supplier A    Supplier B    Supplier C    Supplier D
                                    __________    __________    __________    __________

    Measure rotations                   0             1             0             0     
    Calculate Tire Pressure             0             1             0             0     
    Calculate if pressure is low        1             0             0             0     
    Report Tire Pressure Levels         1             0             0             0     
    Measure temprature of tire          0             0             0             1     
    Measure Tire Pressure               0             0             0             0     
    Measure pressure on tire            0             0             1             0     
    Report Low Tire Pressure            1             0             0             0     

Анализируйте стратегии развертывания программного обеспечения

Можно определить, имеет ли Блок управления двигателем (ECU) достаточно возможности содержать все компоненты программного обеспечения. Компоненты программного обеспечения выделяются самим ядрам, но ECU является компонентом, который имеет бюджетное свойство.

Получите архитектуру платформы.

  platformArch = systemcomposer.loadModel('PlatformArchitecture');

Загрузите выделение.

  softwareDeployment = systemcomposer.allocation.load('SoftwareDeployment');

  frontECU = platformArch.lookup('Path', 'PlatformArchitecture/Front ECU');
  rearECU = platformArch.lookup('Path', 'PlatformArchitecture/Rear ECU');

  scenario1 = softwareDeployment.getScenario('Scenario 1');
  scenario2 = softwareDeployment.getScenario('Scenario 2');
  frontECU_availMemory = frontECU.getEvaluatedPropertyValue("TPMSProfile.ECU.MemoryCapacity");
  rearECU_availMemory = rearECU.getEvaluatedPropertyValue("TPMSProfile.ECU.MemoryCapacity");

  frontECU_memoryUsed1 = getUtilizedMemoryOnECU(frontECU, scenario1);
  frontECU_isOverBudget1 = frontECU_memoryUsed1 > frontECU_availMemory;
  rearECU_memoryUsed1 = getUtilizedMemoryOnECU(rearECU, scenario1);
  rearECU_isOverBudget1 = rearECU_memoryUsed1 > rearECU_availMemory;

  frontECU_memoryUsed2 = getUtilizedMemoryOnECU(frontECU, scenario2);
  frontECU_isOverBudget2 = frontECU_memoryUsed2 > frontECU_availMemory;
  rearECU_memoryUsed2 = getUtilizedMemoryOnECU(rearECU, scenario2);
  rearECU_isOverBudget2 = rearECU_memoryUsed2 > rearECU_availMemory;

Создайте таблицу, чтобы продемонстрировать результаты.

  softwareDeploymentTable = table([frontECU_memoryUsed1;frontECU_availMemory; ...
      frontECU_isOverBudget1;rearECU_memoryUsed1;rearECU_availMemory;rearECU_isOverBudget1], ...
      [frontECU_memoryUsed2; frontECU_availMemory; frontECU_isOverBudget2;rearECU_memoryUsed2; ...
      rearECU_availMemory; rearECU_isOverBudget2], ...
      'VariableNames',{'Scenario 1','Scenario 2'},...
      'RowNames', {'Front ECUMemory Used (MB)', 'Front ECU Memory (MB)', 'Front ECU Overloaded', ...
      'Rear ECU Memory Used (MB)', 'Rear ECU Memory (MB)', 'Rear ECU Overloaded'})
softwareDeploymentTable=6×2 table
                                 Scenario 1    Scenario 2
                                 __________    __________

    Front ECUMemory Used (MB)       110            90    
    Front ECU Memory (MB)           100           100    
    Front ECU Overloaded              1             0    
    Rear ECU Memory Used (MB)         0            20    
    Rear ECU Memory (MB)            100           100    
    Rear ECU Overloaded               0             0    

  function memoryUsed = getUtilizedMemoryOnECU(ecu, scenario)

Для каждого из компонентов в ECU накопите бинарный размер, требуемый для каждого из выделенных компонентов программного обеспечения.

  coreNames = {'Core1','Core2','Core3','Core4'};
  memoryUsed = 0;
  for i = 1:numel(coreNames)
      core = ecu.Model.lookup('Path', [ecu.getQualifiedName '/' coreNames{i}]);
      allocatedSWComps = scenario.getAllocatedFrom(core);
      for j = 1:numel(allocatedSWComps)
          binarySize = allocatedSWComps(j).getEvaluatedPropertyValue("TPMSProfile.SWComponent.BinarySize");
          memoryUsed = memoryUsed + binarySize;
      end
  end

  end

Больше о

развернуть все

Введенный в R2020b