exponenta event banner

systemcomposer.allocation. AllocationScenario

Класс, представляющий сценарий распределения

    Описание

    systemcomposer.allocation.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 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 является компонентом, который имеет свойство budget.

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

      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