systemcomposer.allocation.AllocationScenario

Сценарий выделения

    Описание

    AllocationScenario объект задает набор выделений между элементами в исходной модели к элементам в целевой модели.

    Создание

    Создайте сценарий выделения.

    scenario = createScenario(myAllocationSet)

    Свойства

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

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

    Пример: 'Scenario 1'

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

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

    Набор выделения, которому сценарий принадлежит в виде systemcomposer.allocation.AllocationSet объект.

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

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

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

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

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

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

    allocateСоздайте новое выделение
    deallocateУдалите выделение
    getAllocationПолучите выделение между входными и выходными элементами
    getAllocatedFromПолучите источник выделения
    getAllocatedToПолучите цель выделения
    destroyУдалите сценарий выделения или выделение

    Примеры

    свернуть все

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

    Обзор

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

    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 Tire Pressure               0             0             0             0     
        Measure pressure on tire            0             0             1             0     
        Report Low Tire Pressure            1             0             0             0     
        Measure temprature of tire          0             0             0             1     
    
    

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

    Можно определить, имеет ли Блок управления двигателем (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