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

Что DWork является Вектором?

Векторы 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 на Уровне 2 S-функции MATLAB

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

Следующие шаги показывают, как инициализировать и использовать векторы DWork в S-функциях Level 2 MATLAB®. Эти шаги используют 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 свойства можно установить для Уровня 2 MATLAB векторы S-function DWork.

  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;

Примечание

Уровень 2 S-функции MATLAB не поддерживают разреженные матрицы MATLAB. Поэтому вы не можете присвоить разреженную матрицу значению вектора DWork. Например, следующая строка кода производит ошибку

block.Dwork(1).Data = speye(10);

где команда speye производит разреженную единичную матрицу.

Уровень 2 MATLAB пример вектора S-функции DWork

Модели msfcn_varpulse.m S-функции в качестве примера генератор импульса переменной ширины. 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

Смотрите также

| | |

Похожие темы