Векторы DWork являются блоками памяти, которую S-функция просит, чтобы механизм Simulink® выделил каждому экземпляру S-функции в модели. Если несколько экземпляров вашей S-функции могут произойти в модели, ваша S-функция должна использовать векторы DWork вместо глобальной памяти или статического ЗУ, чтобы сохранить специфичные для экземпляра значения переменных S-функции. В противном случае ваша S-функция рискует данными о перезаписи экземпляра, необходимыми другому экземпляру, заставляя симуляцию привести к сбою или привести к неправильным результатам. Способность отслеживать несколько экземпляров S-функции называется повторной входимостью.
Можно создать S-функцию, которая повторно используема при помощи векторов DWork, которыми механизм управляет для каждого конкретного экземпляра S-функции.
Векторы DWork имеют несколько преимуществ:
Обеспечьте специфичное для экземпляра устройство хранения данных для переменных в блоках
Поддержка, с плавающей точкой, целочисленная, указатель и общие типы данных
Устраните статические и глобальные переменные
Взаимодействуйте непосредственно с механизмом Simulink, чтобы выполнить выделение памяти, инициализацию и освобождение
Упростите встраивание S-функции во время генерации кода
Обеспечьте больше управления тем, как данные появляются в сгенерированном коде
Примечание
Векторы DWork являются наиболее обобщенным и универсальным типом вектора работы и особого внимания следующих разделов на их использовании. Продукт Simulink обеспечивает дополнительные элементарные типы векторов работы, которые поддерживают с плавающей точкой, целочисленный, указатель и данные о режиме. Можно найти, что обсуждение их работает векторы в Элементарных Векторах работы.
Векторы DWork обеспечивают наибольшую гибкость для установки типов данных, имен, и т.д., данных в симуляции и во время генерации кода. Следующий список описывает все свойства, которые можно установить на векторе DWork:
Тип данных
Размер
Числовой тип, или действительный или комплексный
Имя
Тип использования (см. Типы Векторов DWork),
Идентификатор Simulink Coder™
Класс памяти Simulink Coder
Simulink Coder C вводит спецификатор
Смотрите, Как Использовать Векторы DWork для получения инструкций относительно того, как установить эти свойства. Три свойства Simulink Coder принадлежат только генерации кода и не оказывают влияния в процессе моделирования.
Следующие шаги показывают, как инициализировать и использовать векторы DWork в S-функциях Level 2 MATLAB®. Эти шаги используют 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
перечислите свойства, можно установить для Уровня 2 MATLAB векторы S-function DWork.
Инициализируйте векторные значения 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. 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;
Примечание
Уровень 2 S-функции MATLAB не поддерживают разреженные матрицы MATLAB. Поэтому вы не можете присвоить разреженную матрицу значению вектора DWork. Например, следующая строка кода производит ошибку
block.Dwork(1).Data = speye(10);
где speye
команда производит разреженную единичную матрицу.
S-функция в качестве примера msfcn_varpulse.m
моделирует генератор импульса переменной ширины. S-функция использует два вектора DWork. Первый вектор DWork хранит значение ширины импульса, которое изменяется на каждом главном временном шаге в Update
метод. Второй вектор DWork хранит указатель импульсного блока генератора в модели Simulink. Значение этого вектора DWork не изменяется в течение симуляции.
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;
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;
Outputs
метод использует указатель, сохраненный во втором векторе DWork, чтобы обновить ширину импульса блока Pulse Generator.
function Outputs(block) % Update the pulse width value set_param(block.Dwork(2).Data, 'PulseWidth', num2str(block.InputPort(1).data));
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