Векторы DWork являются блоками памяти, которые S-функция запрашивает Simulink® двигатель для выделения каждому образцу S-функции в модели. Если в модели может возникнуть несколько образцов вашей S-функции, ваша S-функция должна использовать векторы DWork вместо глобальной или статической памяти, чтобы хранить специфичные для экземпляра значения переменных S-функции. В противном случае ваша S-функция подвергается риску перезаписи данных одним образцом, необходимых другому образцу, что приводит к ошибке симуляции или образованию неправильных результатов. Возможность отслеживать несколько образцы S-функции называется reentrancy.
Можно создать S-функцию, которая перевходит с помощью векторов DWork, которыми механизм управляет для каждого конкретного образца S-функции.
Векторы DWork имеют несколько преимуществ:
Предоставьте специфичное для экземпляра хранилище для основных переменных
Поддержка типов данных с плавающей точкой, целого числа, указателя и общих типов
Исключение статических и глобальных переменных
Взаимодействуйте непосредственно с механизмом Simulink, чтобы выполнить выделение, инициализацию и деаллокацию памяти
Облегчите встраивание S-функции во время генерации кода
Предоставьте больше контроля над тем, как данные появляются в сгенерированном коде
Примечание
Векторы DWork являются наиболее обобщенным и универсальным типом рабочих векторов, и следующие разделы фокусируются на их использовании. Продукт Simulink предоставляет дополнительные элементарные типы рабочих векторов, которые поддерживают данные с плавающей точкой, целое число, указатель и режим. Обсуждение этих векторов работы можно найти в Элементарных Векторах Работы.
Векторы DWork обеспечивают наибольшую гибкость для настройки типов данных, имен и т.д. данных в симуляции и во время генерации кода. В следующем списке описываются все свойства, которые можно задать для вектора DWork:
Тип данных
Размер
Числовой тип, действительный или комплексный
Имя
Тип использования (см. Типы векторов DWork)
Идентификатор Simulink Coder™
Класс памяти Simulink Coder
Классификатор типа Simulink Coder C
Инструкции по установке этих свойств см. в разделе «Как использовать векторы DWork». Три свойства Simulink Coder относятся только к генерации кода и не имеют никакого эффекта во время симуляции.
Следующие шаги показывают, как инициализировать и использовать векторы DWork в Level-2 MATLAB® S-функции. Эти шаги используют S-функцию msfcn_unit_delay.m
.
В PostPropagationSetup
метод, инициализируйте количество векторов DWork и атрибуты каждого вектора. Для примера выполните следующее PostPropagationSetup
метод коллбэка конфигурирует один вектор DWork, используемый для хранения дискретного состояния.
function PostPropagationSetup(block) %% Setup Dwork block.NumDworks = 1; block.Dwork(1).Name = 'x0'; block.Dwork(1).Dimensions = 1; block.Dwork(1).DatatypeID = 0; block.Dwork(1).Complexity = 'Real'; block.Dwork(1).UsedAsDiscState = true;
Страницы с описанием для Simulink.BlockCompDworkData
и родительский класс Simulink.BlockData
перечислите свойства, которые можно задать для Level-2 векторов DWork S-функции MATLAB.
Инициализируйте значения векторов DWork в любом из Start
или InitializeConditions
методы. Используйте Start
метод для значений, которые инициализируются только в начале симуляции. Используйте InitializeConditions
метод для значений, которые необходимо повторно инициализировать, когда отключенная подсистема, содержащая S-функцию, снова включена.
Для примера выполните следующее InitializeConditions
метод инициализирует значение вектора DWork, сконфигурированного на предыдущем шаге, до значения первого параметра диалога S-функции.
function InitializeConditions(block) %% Initialize Dwork block.Dwork(1).Data = block.DialogPrm(1).Data;
В Outputs
, Update
, и т.д. методы, используйте или обновляйте значения векторов DWork, при необходимости. Для примера выполните следующее Outputs
метод устанавливает выход S-функции равным значению, сохраненному в векторе DWork. The Update
затем метод изменяет значение вектора DWork на текущее значение первого входного порта S-функции.
%% Outputs callback method function Outputs(block) block.OutputPort(1).Data = block.Dwork(1).Data; %% Update callback method function Update(block) block.Dwork(1).Data = block.InputPort(1).Data;
Примечание
Level-2 MATLAB S-функции не поддерживают разреженные матрицы MATLAB. Поэтому вы не можете назначить разреженную матрицу значению вектора DWork. Например, следующая строка кода вызывает ошибку
block.Dwork(1).Data = speye(10);
где speye
команда создает разреженную матрицу тождеств.
Пример S-функции msfcn_varpulse.m
моделирует импульсный генератор переменной ширины. S-функция использует два вектора DWork. Первый вектор DWork хранит значение ширины импульса, которое изменяется на каждом главном временном шаге в Update
способ. Второй вектор DWork сохраняет указатель блока импульсного генератора в модели Simulink. Значение этого вектора DWork не меняется в течение симуляции.
The PostPropagationSetup
метод, вызываемый DoPostPropSetup
в этой S-функции устанавливает два вектора DWork.
function DoPostPropSetup(block) % Initialize the Dwork vector block.NumDworks = 2; % Dwork(1) stores the value of the next pulse width block.Dwork(1).Name = 'x1'; block.Dwork(1).Dimensions = 1; block.Dwork(1).DatatypeID = 0; % double block.Dwork(1).Complexity = 'Real'; % real block.Dwork(1).UsedAsDiscState = true; % Dwork(2) stores the handle of the Pulse Geneator block block.Dwork(2).Name = 'BlockHandle'; block.Dwork(2).Dimensions = 1; block.Dwork(2).DatatypeID = 0; % double block.Dwork(2).Complexity = 'Real'; % real block.Dwork(2).UsedAsDiscState = false;
The Start
метод инициализирует значения векторов DWork.
function Start(block) % Populate the Dwork vector block.Dwork(1).Data = 0; % Obtain the Pulse Generator block handle pulseGen = find_system(gcs,'BlockType','DiscretePulseGenerator'); blockH = get_param(pulseGen{1},'Handle'); block.Dwork(2).Data = blockH;
The Outputs
метод использует указатель, сохраненный во втором векторе DWork, чтобы обновить ширину импульса блока Pulse Generator.
function Outputs(block) % Update the pulse width value set_param(block.Dwork(2).Data, 'PulseWidth', num2str(block.InputPort(1).data));
The Update
затем метод модифицирует первый вектор DWork с следующим значением для ширины импульса, заданным входным сигналом к блоку S-Function.
function Update(block) % Store the input value in the Dwork(1) block.Dwork(1).Data = block.InputPort(1).Data; %endfunction
Level-2 MATLAB S-Function | MATLAB Function | S-Function | S-Function Builder