exponenta event banner

Использование векторов DWork в S-функциях

Что такое вектор DWork?

Векторы 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 S-функциях MATLAB

Использование векторов DWork в Level-2 S-функциях MATLAB

Следующие шаги показывают, как инициализировать и использовать векторы DWork в Level-2 MATLAB ® S-функциях. Эти шаги используют S-функциюmsfcn_unit_delay.m.

  1. В 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.

  2. Инициализируйте значения вектора DWork в Start или InitializeConditions методы. Используйте Start для значений, инициализированных только в начале моделирования. Используйте InitializeConditions метод для значений, которые необходимо повторно инициализировать при каждом повторном включении отключенной подсистемы, содержащей S-функцию.

    Например, следующее: InitializeConditions метод инициализирует значение вектора DWork, сконфигурированного на предыдущем шаге, до значения первого параметра диалогового окна S-функции.

    function InitializeConditions(block)
    
      %% Initialize Dwork
      block.Dwork(1).Data = block.DialogPrm(1).Data;
  3. В 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 создает разреженную единичную матрицу.

Level-2 Пример вектора DWork S-функции MATLAB

Пример 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

См. также

| | |

Связанные темы