Управление набором сценариев распределения
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()
Name - Наименование набора распределенияИмя набора распределения, указанного как символьный вектор.
Пример: 'MyNewAllocation'
Типы данных: char
SourceModel - Исходная модель для распределенияИсходная модель для распределения, указанная как systemcomposer.arch.Model объект.
TargetModel - Целевая модель для распределенияЦелевая модель для распределения, указанная как systemcomposer.arch.Model объект.
Scenarios - Сценарии распределенияСценарии распределения, указанные как массив systemcomposer.allocation.AllocationScenario объекты.
Description - Описание набора распределенияОписание набора распределения, заданного как символьный вектор.
Типы данных: char
NeedsRefresh - Устарел ли набор распределенийtrue или 1 | false или 0Является ли набор распределения устаревшим с исходной и/или целевой моделью, указанной как логический 1 (true) или 0 (false).
Типы данных: logical
Dirty - Имеет ли распределение несохраненные измененияtrue или 1 | false или 0Имеет ли набор распределения несохраненные изменения, указанное как логический 1 (true) или 0 (false).
Типы данных: logical
UUID - Универсальный уникальный идентификаторУниверсальный уникальный идентификатор для набора распределения, указанный как символьный вектор.
Пример: '91d5de2c-b14c-4c76-a5d6-5dd0037c52df'
Типы данных: char
createScenario | Создание нового пустого сценария распределения |
getScenario | Получить сценарий распределения |
deleteScenario | Удалить сценарий распределения |
find | Найти загруженный набор распределения |
save | Сохранить набор распределения |
close | Закрыть набор распределения |
closeAll | Закрыть все открытые наборы распределения |
В этом примере показано, как использовать распределения для анализа системы контроля давления в шинах.
Обзор
В системном проектировании обычно описывают систему на различных уровнях абстракции. Например, можно описать систему с точки зрения ее функций высокого уровня. Эти функции могут не иметь никакого поведения, связанного с ними, но, скорее всего, отслеживать некоторые операционные требования, которые должна выполнять система. Мы называем этот уровень (или архитектуру) функциональной архитектурой. В этом примере система контроля давления в автомобильных шинах описана в трех различных архитектурах:
Функциональная архитектура - описывает систему с точки зрения ее функций высокого уровня. Соединения показывают зависимости между функциями.
Логическая архитектура - описывает систему с точки зрения ее логических компонентов и способа обмена данными между ними. Кроме того, эта архитектура определяет поведение моделирования модели.
Архитектура платформы - описывает физическое оборудование, необходимое для системы на высоком уровне.
Процесс распределения определяется как связывание этих трех архитектур, которые полностью описывают систему. Связывание захватывает информацию о каждом архитектурном слое и делает его доступным для других.
Эта команда используется для открытия проекта.
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
| Термин | Определение | Приложение | Дополнительные сведения |
|---|---|---|---|
| распределение | Назначение - это направленное отношение между элементом в одной модели и элементом в другой модели. | Распределение на основе ресурсов позволяет распределять функциональные архитектурные элементы логическим архитектурным элементам, а логические архитектурные элементы - физическим архитектурным элементам. | Выделение архитектур в системе мониторинга давления в шинах |
| сценарий распределения | Сценарий соотнесения содержит набор соотнесений между исходной и целевой моделью. | Распределение между элементами модели в рамках распределения в сценарии распределения. Сценарий распределения по умолчанию называется Scenario 1. | Создание распределений и управление ими |
| набор распределения | Набор соотнесений состоит из еще одного сценария соотнесения, который описывает различные соотнесения между исходной и целевой моделью. | Создайте набор соотнесений со сценариями соотнесения. | Создание распределений и управление ими |
createAllocationSet | editor | systemcomposer.allocation.Allocation | systemcomposer.allocation.AllocationScenario
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.