Набор сценариев выделения
AllocationSet
объект задает набор сценариев выделения между двумя моделями System Composer™.
Создайте набор выделения и просмотрите его.
% 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Устарел ли набор выделения с исходной моделью, целевой моделью или обоими в виде логического.
Типы данных: логический
Dirty
— Имеет ли выделение несохраненные измененияtrue
или 1 | false
или 0Имеет ли набор выделения несохраненные изменения в виде логического.
Типы данных: логический
UUID
— Универсальный уникальный идентификаторУниверсальный уникальный идентификатор для выделения установлен в виде вектора символов.
Пример: '91d5de2c-b14c-4c76-a5d6-5dd0037c52df'
Типы данных: char
createScenario | Создайте новый пустой сценарий выделения |
getScenario | Получите сценарий выделения |
deleteScenario | Удалите сценарий выделения |
synchronizeChanges | Синхронизируйте изменения моделей в наборе выделения |
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 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
Термин | Определение | Приложение | Больше информации |
---|---|---|---|
выделение | Выделение является направленным отношением от элемента в одной модели к элементу в другой модели. | Основанное на ресурсе выделение позволяет вам выделять функциональные архитектурные элементы логическим архитектурным элементам и логическим архитектурным элементам к физическим архитектурным элементам. | Выделите архитектуры в системе мониторинга давления воздуха в шине |
сценарий выделения | Сценарий выделения содержит набор выделений между входной и выходной моделью. | Выделите между элементами модели в рамках выделения в сценарии выделения. Сценарий выделения по умолчанию называется Scenario 1 . | Создайте и справьтесь с выделениями |
выделение установлено | Набор выделения состоит из еще одного выделения сценарии, которые описывают различные выделения между входной и выходной моделью. | Создайте набор выделения со сценариями выделения. | Создайте и справьтесь с выделениями |
systemcomposer.allocation.Allocation
| systemcomposer.allocation.AllocationScenario
| editor
| createAllocationSet
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.