Класс, который представляет сценарий распределения
The systemcomposer.allocation.AllocationScenario
класс задает набор выделений между элементами в исходной модели элементам в целевой модели.
Создайте сценарий присвоения.
scenario = createScenario(myAllocationSet)
Name
- Имя сценария выделенияИмя сценария выделения, заданное как вектор символов.
Пример: 'Scenario 1'
Типы данных: char
Allocations
- Распределение в сценарииВыделения в сценарии, заданные как массив systemcomposer.allocation.Allocation
объекты.
AllocationSet
- Набор распределения, которому принадлежит сценарийНабор присвоений, которому принадлежит сценарий, заданный как systemcomposer.allocation.AllocationSet
объект.
Description
- Описание сценария распределенияОписание сценария выделения, заданное как вектор символов.
Типы данных: char
UUID
- Универсальный уникальный идентификаторУниверсальный уникальный идентификатор для сценария выделения, заданный как вектор символов.
Пример: '91d5de2c-b14c-4c76-a5d6-5dd0037c52df'
Типы данных: char
allocate | Создайте новое распределение |
deallocate | Удалить выделение |
getAllocation | Получите распределение между исходным и целевым элементами |
getAllocatedFrom | Получите источник выделения |
getAllocatedTo | Получите цель выделения |
destroy | Удаление сценария распределения |
В этом примере показано, как использовать выделения для анализа системы контроля давления в шинах.
Обзор
В системной инженерии часто можно описать систему на разных уровнях абстракции. Для примера можно описать систему с точки зрения ее функций высокого уровня. Эти функции могут не иметь никакого поведения, связанного с ними, но, скорее всего, возвращают к некоторым операционным требованиям, которые должна выполнять система. Мы называем этот слой (или архитектуру) функциональной архитектурой. В этом примере автомобильная система контроля давления в шинах описана в трех различных архитектурах:
Функциональная архитектура - описывает систему с точки зрения ее функций высокого уровня. Связи показывают зависимости между функциями.
Логическая архитектура - описывает систему с точки зрения ее логических компонентов и как данные обмениваются между ними. Кроме того, эта архитектура задает поведение для симуляции модели.
Архитектура платформы - описывает физическое оборудование, необходимое для системы на высоком уровне.
Процесс распределения определяется как связывание этих трех архитектур, которые полностью описывают систему. Связывание захватывает информацию о каждом архитектурном слое и делает его доступным для других.
Используйте эту команду, чтобы открыть проект.
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
Анализ стратегий развертывания программного обеспечения
Можно определить, имеет ли модуль управления Engine (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)
Для каждого из компонентов в блоке пиролиза накапливайте двоичный размер, требуемый для каждого из выделенных программных компонентов.
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
Термин | Определение | Приложение | Дополнительная информация |
---|---|---|---|
распределение | Распределение является направленной зависимостью от элемента в одной модели к элементу в другой модели. | Ресурсное выделение позволяет выделять функциональные архитектурные элементы логическим архитектурным элементам и логические архитектурные элементы физическим архитектурным элементам. | Распределение архитектур в системе контроля давления в шинах |
сценарий распределения | Сценарий распределения содержит набор распределений между исходной и целевой моделью. | Распределение между элементами модели в рамках распределения в сценарии распределения. Сценарий распределения по умолчанию называется Scenario 1 . | Создание и управление распределениями |
набор ассигнований | Набор распределения состоит из еще одного сценария распределения, который описывает различные распределения между исходной и целевой моделью. | Создайте набор присвоения со сценариями присвоения. | Создание и управление распределениями |
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.