Векторы 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 является их связь с движком Simulink. В ходе симуляции двигатель снимает S-функцию со всех задач управления памятью, связанных с векторами DWork.
Чтобы увидеть, как это соединение полезно, рассмотрите S-функцию, которая использует глобальную переменную для хранения данных. Если в модели существует более одной копии S-функции, каждый образец S-функции должен тщательно выделять, манипулировать и освобождать каждый используемый фрагмент памяти.
В S-функции, которая использует векторы DWork, механизм, а не S-функция, управляет памятью для вектора DWork. В начале симуляции механизм выделяет память, необходимую для каждого образца S-функции, на основе размера и типа данных содержимого вектора DWork. В конце симуляции двигатель автоматически отключает память.
Примечание
Вы не имеете никакого контроля над тем, как механизм выделяет память для векторов DWork во время симуляции. При использовании программного обеспечения Simulink Coder можно использовать классы памяти для настройки выделения памяти во время генерации кода. См. ssSetDWorkRTWStorageClass
Страница с описанием для получения дополнительной информации об использовании классов памяти.
Двигатель также выполняет специальные задачи на основе типа вектора DWork, используемого в S-функции. Для примера он включает векторы DWork, которые хранят информацию о дискретном состоянии в векторе состояния всей модели и делают их доступными во время логгирования состояния.
Векторы DWork позволяют вам настроить, как данные появляются в сгенерированном коде. Когда код генерируется, генератор кода Simulink Coder включает вектор DWork в структуру данных для модели. Вектор DWork управляет именем поля, используемым в структуре. Векторы DWork также управляют классом памяти и квалификатором типа C, используемыми в сгенерированном коде. См. sfun_rtwdwork.c
например, пример.