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