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

Что такое DWork Vector?

Векторы DWork являются блоками памяти, которые S-функция запрашивает Simulink® двигатель для выделения каждому образцу S-функции в модели. Если в модели может возникнуть несколько образцов вашей S-функции, ваша S-функция должна использовать векторы DWork вместо глобальной или статической памяти, чтобы хранить специфичные для экземпляра значения переменных S-функции. В противном случае ваша S-функция подвергается риску перезаписи данных одним образцом, необходимых другому образцу, что приводит к ошибке симуляции или образованию неправильных результатов. Возможность отслеживать несколько образцы S-функции называется reentrancy.

Можно создать S-функцию, которая перевходит с помощью векторов DWork, которыми механизм управляет для каждого конкретного образца S-функции.

Векторы DWork имеют несколько преимуществ:

  • Предоставьте специфичное для экземпляра хранилище для основных переменных

  • Поддержка типов данных с плавающей точкой, целого числа, указателя и общих типов

  • Исключение статических и глобальных переменных

  • Взаимодействуйте непосредственно с механизмом Simulink, чтобы выполнить выделение, инициализацию и деаллокацию памяти

  • Облегчите встраивание S-функции во время генерации кода

  • Предоставьте больше контроля над тем, как данные появляются в сгенерированном коде

Примечание

Векторы DWork являются наиболее обобщенным и универсальным типом рабочих векторов, и следующие разделы фокусируются на их использовании. Продукт Simulink предоставляет дополнительные элементарные типы рабочих векторов, которые поддерживают данные с плавающей точкой, целое число, указатель и режим. Обсуждение этих векторов работы можно найти в Элементарных Векторах Работы.

Векторы DWork обеспечивают наибольшую гибкость для настройки типов данных, имен и т.д. данных в симуляции и во время генерации кода. В следующем списке описываются все свойства, которые можно задать для вектора DWork:

  • Тип данных

  • Размер

  • Числовой тип, действительный или комплексный

  • Имя

  • Тип использования (см. Типы векторов DWork)

  • Идентификатор Simulink Coder™

  • Класс памяти Simulink Coder

  • Классификатор типа Simulink Coder C

Инструкции по установке этих свойств см. в разделе «Как использовать векторы DWork». Три свойства Simulink Coder относятся только к генерации кода и не имеют никакого эффекта во время симуляции.

Как использовать DWork Vectors в Level-2 MATLAB S-Functions

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

Следующие шаги показывают, как инициализировать и использовать векторы 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 перечислите свойства, которые можно задать для Level-2 векторов DWork 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. The 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 MATLAB S-функции не поддерживают разреженные матрицы MATLAB. Поэтому вы не можете назначить разреженную матрицу значению вектора DWork. Например, следующая строка кода вызывает ошибку

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

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

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

Пример S-функции msfcn_varpulse.m моделирует импульсный генератор переменной ширины. S-функция использует два вектора DWork. Первый вектор DWork хранит значение ширины импульса, которое изменяется на каждом главном временном шаге в Update способ. Второй вектор DWork сохраняет указатель блока импульсного генератора в модели Simulink. Значение этого вектора DWork не меняется в течение симуляции.

The 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;

The 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;

The Outputs метод использует указатель, сохраненный во втором векторе DWork, чтобы обновить ширину импульса блока Pulse Generator.

function Outputs(block)

% Update the pulse width value
set_param(block.Dwork(2).Data, 'PulseWidth', num2str(block.InputPort(1).data));

The Update затем метод модифицирует первый вектор DWork с следующим значением для ширины импульса, заданным входным сигналом к блоку S-Function.

function Update(block)

% Store the input value in the Dwork(1)
block.Dwork(1).Data = block.InputPort(1).Data;

%endfunction

См. также

| | |

Похожие темы