Векторы 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
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
Уровень 2 S-функция MATLAB | Функция MATLAB | S-функция | Разработчик S-функции