S-функции являются важным классом системного целевого файла, для которого генератор кода может создавать код. Возможность инкапсулировать подсистему в S-функцию позволяет повысить её эффективность выполнения и облегчить повторное использование кода.
В следующих разделах описаны свойства целевых объектов S-функций и показано, как их создавать. Для получения дополнительной информации о структуре S-функций см. Основные сведения о C/C + + S-функциях.
С помощью цели S-функции можно построить компонент S-функции и использовать его как блок S-функции в другой модели. В следующих разделах описаны соображения по развертыванию целевого объекта S-функции.
'S-Function' значение для CodeFormat Переменная TLC, используемая целевым объектом S-функции, генерирует код, соответствующий интерфейсу прикладного программирования (API) Simulink ® C MEX S-функции. Приложения этого формата включают
Преобразование модели в компонент. Для модели можно создать S-функциональный блок. m1. Затем сгенерированный блок S-Function можно поместить в другую модель. m2. Регенерация кода для m2 не требует регенерации кода для m1.
Преобразование подсистемы в компонент. Извлекая подсистему в отдельную модель и генерируя блок S-Function из этой модели, можно создать повторно используемый компонент из подсистемы. Пример этой процедуры см. в разделе Создание S-функциональных блоков из подсистемы.
Ускорение моделирования. Часто S-функция, сгенерированная из модели, работает более эффективно, чем исходная модель.
Повторное использование кода. Можно включить несколько экземпляров одной модели в другую без репликации кода для каждого экземпляра. Каждый экземпляр продолжает сохранять свои уникальные данные.
Сгенерированный блок S-функции можно поместить в другую модель, из которой можно создать другую S-функцию. Этот подход допускает уровни вложенных S-функций. Ограничения, связанные с вложением, см. в разделе Вложение S-функций.
Примечание
При создании кода для моделируемого программного компонента используйте ссылочную модель вместо генерации S-функционального блока из подсистемы.
Примечание
Хотя цель S-функции может использоваться для развертывания прикладного компонента для повторного использования при защите его внутренней логики от проверки и модификации, предпочтительными решениями для защиты интеллектуальной собственности в распределенных компонентах являются:
Защищенная модель - ссылочная модель, скрывающая информацию о блоках и линиях. Дополнительные сведения см. в разделе Ссылки на защищенные модели от третьих лиц.
Целевой файл системы общей библиотеки, используемый для создания общей библиотеки для модели или подсистемы для использования в моделировании системы вне Simulink. Дополнительные сведения см. в разделе Код пакета как общие библиотеки.
Существуют различные файлы, необходимые для развертывания сгенерированного блока S-Function для моделирования и генерации кода.
Чтобы развернуть созданный блок S-Function для включения в другие модели моделирования, необходимо предоставить только двоичный объект MEX-файла, который был создан в текущей рабочей папке при создании блока S-Function. Требуемый файл:
subsys_sf.mexext
где - имя подсистемы и subsys является расширением MEX-файла, зависящим от платформы (см. mexextmexext). Например, SourceSubsys_sf.mexw64.
Чтобы развернуть созданный блок S-Function для включения в другие модели для создания кода, предоставьте файлы, которые были созданы в текущей рабочей папке при создании блока S-Function. Требуемые файлы:
или subsys_sf.c.cpp, где - имя подсистемы (например, subsysSourceSubsys_sf.c)
subsys_sf.h
, где subsys_sf.mexext является расширением MEX-файла, зависящим от платформы (см. mexextmexext)
Подпапка и его содержаниеsubsys_sfcn_rtw
Сгенерированный код S-функции использует значения параметров Configuration Parameters > Hardware Implementation, соответствующие хост-системе, на которой была создана функция. При использовании S-функции в модели для генерации кода убедитесь, что эти значения параметров для модели соответствуют значениям параметров S-функции.
Сформированный блок S-Function может наследовать время выборки из модели, в которую он помещается, если выполняются определенные критерии. Условия, регулирующие распространение времени выборки как для блоков модели, так и для сгенерированных блоков S-функций, описаны в разделах Ссылочное время выборки модели и S-функции, определяющие правила наследования времени выборки.
Чтобы создать S-функциональный блок, соответствующий критериям наследования времени выборки, необходимо ограничить решатель для модели, из которой создается S-функциональный блок. Задайте для параметра конфигурации модели Тип значение Fixed-step и Периодическая выборка временных ограничений Ensure sample time independent. Если модель не может наследовать примеры времени, этот параметр приводит к отображению в программе Simulink сообщения об ошибке при построении модели. Дополнительные сведения об этом параметре см. в разделе Временное ограничение периодической выборки.
В таблице показаны возможные комбинации типов решателей модели верхнего уровня, поскольку эти типы связаны с тем, имеет ли модель дискретное или непрерывное время выборки и типы решателей для сгенерированных S-функций.
Параметры и примеры времени решателя модели верхнего уровня
| Параметры конфигурации модели: конфигурация модели верхнего уровня | ||
|---|---|---|
| Время выборки | Параметры решателя, Тип: Шаг переменной | Параметры решателя, Тип: Фиксированный шаг |
| Дискретный | Сгенерированная S-функция требует решателя с переменным шагом | Сгенерированная S-функция может иметь решатель с переменным шагом или решатель с фиксированным шагом |
| Непрерывный | Сгенерированная S-функция требует решателя с переменным шагом | Сгенерированная S-функция требует решателя с фиксированным шагом |
S-функции, генерируемые подсистемой, имеют параметры, которые жестко кодируются в блок. Simulink вычисляет такие параметры, как время выборки, когда он генерирует блок, а не во время выполнения моделирования. Важно проверить, работает ли сгенерированный блок S-Function так, как ожидалось в целевой модели.
В этом разделе показано, как извлечь подсистему из модели и создать из нее повторно используемый компонент S-функции.
На следующем рисунке SourceModelпростая модель, которая вводит сигналы в подсистему. На следующем рисунке показана подсистема, SourceSubsys. Сигналы, которые имеют различную ширину и время выборки, являются:
Блок Step с временем выборки 1
Блок синусоидальной волны с временем выборки 0,5
Блок константы, значение которого является вектором [-2 3]
SourceModel

SourceSubsys

Цель состоит в извлечении SourceSubsys из модели и построить из нее блок S-Function, используя цель S-функции. Блок S-Function должен работать идентично подсистеме, из которой он был создан.
В этой модели SourceSubsys наследует время выборки и ширину сигнала из входных сигналов. Однако блоки S-Function, созданные из модели с использованием цели S-функции, имеют все атрибуты сигнала (такие как ширина сигнала или время выборки) с жесткой проводкой. (Единственное исключение из этого правила касается времени выборки, как описано в разделе Распространение времени выборки в сгенерированных S-функциях.)
В этом примере необходимо, чтобы блок S-Function сохранял свойства SourceSubsys как он существует в SourceModel. Поэтому перед построением подсистемы в виде отдельного компонента S-функции необходимо явно задать время и ширину выборки ввода. Кроме того, параметры решателя компонента S-функции должны совпадать с параметрами исходной модели. Сгенерированный компонент S-функции работает идентично исходной подсистеме (дополнительные сведения см. в разделе Выбор типа решателя).
Построить SourceSubsys как компонент S-функции,
Создание новой модели и копирование/вставка SourceSubsys в пустое окно.
Установка ширины сигнала и времени выборки входов внутри SourceSubsys таким образом, чтобы они соответствовали сигналам в исходной модели. Ввод 1, Filter, имеет ширину 1 и время выборки 1. Ввод 2, Xferfcn, имеет ширину 1 и время выборки 0,5. Ввод 3, offsets, имеет ширину 2 и время выборки 0,5.
Сгенерированный блок S-Function должен иметь три входа и один выход. Подключение портов ввода и порта вывода к SourceSubsys, как показано на следующем рисунке.

Ширина сигнала и время выборки распространяются на эти порты.
Задайте тип решателя, режим и другие параметры решателя таким образом, чтобы они были идентичны параметрам исходной модели. Это проще всего сделать, если используется обозреватель моделей.
Задайте для параметра конфигурации модели System target file значение rtwsfcn.tlc.
Выберите панель S-Function Target. Убедитесь, что выбрана опция Создать новую модель (Create new model), как показано на следующем рисунке:

При выборе этой опции процесс сборки создает новую модель после сборки компонента S-функции. Новая модель содержит блок S-функции, связанный с компонентом S-функции.
Нажмите кнопку «Применить».
Сохраните новую модель, содержащую подсистему, например, как SourceSubsys.
Создайте модель.
В процессе сборки создается компонент S-функции в рабочей папке. После построения отображается новое окно модели.

При необходимости можно сохранить созданную модель, например, как SourceSubsys_Sfunction.
Теперь можно скопировать блок S-Function, созданный из новой модели, и использовать его в других моделях или в библиотеке.
Примечание
Список файлов, необходимых для развертывания блока S-Function для моделирования или генерации кода, см. в разделе Необходимые файлы для развертывания S-Function.
На следующем рисунке показан блок S-Function, подключенный к исходной модели. При идентичных входных сигналах блок S-Function работает идентично исходной подсистеме.
Сгенерированная S-функция настроена как SourceModel

Скорость, с которой выполняется S-функциональный блок, обычно быстрее, чем исходная модель. Эта разница в скорости более выражена для более крупных и сложных моделей. Используя сгенерированные S-функции, можно повысить эффективность процесса моделирования.
Настраиваемые параметры можно использовать в сгенерированных S-функциях двумя способами:
Используйте функцию «Генерировать S-функцию» (см. раздел «Генерировать S-функцию из подсистемы»).
или
Используйте диалоговое окно «Конфигурация параметров модели» (см. раздел Объявление переменных рабочего пространства как перестраиваемых параметров с помощью диалогового окна «Конфигурация параметров модели»), чтобы объявить нужные параметры блока настраиваемыми.
Блокировать параметры, объявленные как настраиваемые с помощью auto класс хранения в исходной модели становится настраиваемым параметром генерируемой S-функции. Эти параметры не становятся частью сгенерированного (бывш. model_PrtP) структура данных параметров, как и в коде, сгенерированном из других целевых файлов системы. Вместо этого сгенерированный код получает доступ к этим параметрам с помощью вызовов MEX API, таких как mxGetPr или mxGetData. Код должен иметь такой же доступ к этим параметрам.
Дополнительные сведения о вызовах MEX API см. в разделах О C MEX S-функциях и Выбор MATLAB API для вашего приложения.
S-функциональные блоки, созданные с помощью цели S-функции, автоматически маскируются. Маска отображает каждый настраиваемый параметр в поле редактирования. По умолчанию в поле редактирования отображается параметр по имени переменной, как показано в следующем примере.

Можно выбрать отображение значения параметра, а не его имени переменной, выбрав параметр конфигурации модели Использовать значение для настраиваемых параметров.

При выборе этого параметра значение переменной (во время генерации кода) отображается в поле редактирования, как в следующем примере.

rtwsfcn.tlc системный целевой файл предусмотрен для использования с целевым файлом S-функции.
Генератор кода создает контрольную сумму для модели и использует контрольную сумму во время процесса сборки для повторного использования кода, ссылки на модель и функций внешнего режима.
Генератор кода вычисляет контрольную сумму модели по
S-функция может добавить дополнительную информацию, не собранную во время анализа свойств блока, к контрольной сумме путем вызова функции. ssSetChecksumVal. Для цели S-Function значение, добавляемое к контрольной сумме, является контрольной суммой модели или подсистемы, из которой генерируется S-функция.
Генератор кода применяет контрольные суммы подсистемы и модели следующим образом:
Повторное использование кода - если две подсистемы в модели имеют одинаковую контрольную сумму, генератор кода создает код только для одной функции.
Ссылка на модель - если текущая контрольная сумма модели совпадает с контрольной суммой при построении модели, процесс построения не восстанавливает ссылочные модели.
Внешний режим - если текущая контрольная сумма модели не совпадает с контрольной суммой кода, который выполняется на целевом оборудовании, процесс построения генерирует ошибку.
При построении S-функции MEX из модели генератор кода создает неинлинированную S-функцию уровня 2. Ограничения на перекрестное использование сгенерированного кода и двоичного файла MEX (например, *.mexw64) включают:
Целевой код S-функции, сгенерированный из предыдущей версии программного обеспечения MATLAB, несовместим с более новыми версиями. Не перекомпилируйте созданный код из предыдущей версии с помощью более новой версии программного обеспечения MATLAB. Для создания кода для цели S-функции и компиляции кода в файл MEX используется то же программное обеспечение MATLAB release.
Можно использовать двоичные MEX-файлы S-функций, созданные из предыдущей версии программного обеспечения MATLAB с теми же или более новыми версиями с теми же соображениями совместимости, что и рукописные S-функции. Дополнительные сведения см. в разделе Совместимость S-функций.
Генератор кода может генерировать код и создавать исполняемый файл из модели, содержащей сгенерированные S-функции. Эта поддержка требует, чтобы S-функции были построены с помощью того же программного обеспечения версии MATLAB, которое создает модель. Невозможно включить сгенерированный файл MEX S-функции из предыдущего программного обеспечения MATLAB в модель и создать модель с более новыми версиями.
Настройка блоков ввода и вывода с непрерывным временем выборки
Параметры времени выполнения и диагностика совместимости S-функций
Профилирование производительности кода с помощью функции TLC Hook не поддерживается
Невозможно указать параметры блока ввода или вывода через маску подсистемы
Щелчок правой кнопкой мыши метода построения для создания S-функции не сохраняет непрерывное время выборки для блоков Inport и Outport. Поскольку время выборки не сохраняется, может быть затронуто моделирование сгенерированного S-функционального блока.
Некоторые ограничения применяются к использованию настраиваемых переменных в выражениях. Когда генератор кода обнаруживает неподдерживаемое выражение при создании кода, появляется предупреждение, и в коде генерируется эквивалентное числовое значение. Список ограничений см. в разделе Настраиваемые ограничения выражения.
Блок S-Function не поддерживает настройку настраиваемых параметров с помощью:
Комплексные значения.
Значения или типы данных, преобразованные в константу (путем установки для параметра конфигурации модели Optimization > Поведение параметра по умолчанию значения Inlined).
Типы данных, которые не являются встроенными.
Типы данных с плавающей запятой, не эквивалентные встроенному типу.
При выборе этих настраиваемых параметров (в диалоговом окне «Создание S-функции для подсистемы»):
Программа выдает предупреждения в процессе сборки.
Сгенерированная маска блока S-Function не отображает эти параметры.
Если задан параметр конфигурации модели, необходимо обновить S-функцию для warning или errorгенератор кода дает команду обновить S-функции, созданные с помощью функции «Создать S-функцию». Это происходит потому, что целевой файл системы S-функций не регистрирует параметры времени выполнения. Параметры времени выполнения поддерживаются только для встроенных S-функций, а сгенерированная S-функция поддерживает функции, препятствующие ее встраиванию (например, она может вызывать или содержать другие неинлинированные S-функции).
Можно обойти это ограничение, установив для параметра S-function обновления, необходимые для none.
При использовании целевого файла системы S-функций генератор кода ограничивает ввод-вывод блоками Inport и Outport корневой модели (или блоками Inport и Outport блока Subsystem, из которого был создан целевой объект S-функции). Генератор кода не создает код для блоков Goto или From.
Чтобы обойти это ограничение, создайте модель и подсистему с требуемыми блоками Inport и Outport вместо использования блоков Goto и From для передачи данных между корневой моделью и подсистемой. В модели, включающей сгенерированную S-функцию, следует добавить блоки Перейти к (Goto) и Из (From).
Пример перед обходом
Корневая модель с блоком и подсистемой From, Subsystem1

Subsystem1 с блоком Goto, который имеет глобальную видимость и передает свои входные данные блоку From в корневой модели

Subsystem1 заменена на S-функцию, сгенерированную с помощью цели S-Function - предупреждающий результат при запуске модели, поскольку сгенерированная S-функция не реализует блок Goto

Пример после обхода
Блок Outport заменяет блок GoTo в Subsystem1. При подключении сгенерированной S-функции к корневой модели ее вывод подключается непосредственно к блоку «К рабочей области».


Для построения и обновления S-функций с использованием целевого файла системы S-функций применяются следующие ограничения:
Нельзя создавать модели, содержащие блоки модели, используя целевой файл системы S-функций. Это также означает, что невозможно построить подсистему с помощью контекстного меню, открывающегося щелчком правой кнопкой мыши, если подсистема содержит блоки модели. Это ограничение применяется только к S-функциям, сгенерированным с помощью цели S-функции, а не к S-функциям ERT.
Модель можно построить с помощью:
Цепь инструментов только в том случае, если она поддерживает создание MEX-файлов.
make-файл шаблона, только если make-файл шаблона связан с цепочкой инструментов, поддерживающей создание файлов MEX.
При изменении модели, которая создала блок S-функции, процесс построения не выполняет автоматическое перестроение моделей, содержащих созданный блок S-функции. Это противоречит практике автоматического перестроения моделей, на которые ссылаются блоки модели, при их изменении (в зависимости от настройки конфигурации «Перестроение ссылок на модель»).
Рукописные S-функции без соответствующих файлов TLC должны содержать код без исключений. Дополнительные сведения о коде без исключений см. в разделе Код без исключений.
Формат S-функции не поддерживает следующие встроенные блоки:
Интерпретируемый функциональный блок MATLAB
S-Функциональные блоки, содержащие любое из следующего:
S-функции языка MATLAB ® (если только не указан файл TLC для генерации кода C)
S-функции Fortran (если для генерации кода C не указан файл TLC)
S-функции C/C + + MEX, которые вызывают в среду MATLAB
Блок области
В блок рабочей области
Формат S-функции не поддерживает блоки из embeddedtargetslib библиотека блоков.
SimState Не поддерживается для создания кодаВы можете использовать SimState в C-MEX и Level-2 S-функции языка MATLAB для сохранения и восстановления состояния моделирования. См. раздел Соответствие S-функции ModelOperatingPoint. Однако SimState не поддерживается для генерации кода, в том числе с целевым файлом системы S-функций.
Профилирование производительности сгенерированного кода с помощью интерфейса функции захвата компилятора целевого языка (TLC), описанного в разделе Скорость выполнения кода профиля, не поддерживается для цели S-функции.
Примечание
Если у вас есть лицензия Embedded Coder ®, см. раздел Профилирование выполнения кода для альтернативного и более простого подхода, основанного на моделировании ПО в цикле (SIL) или процессора в цикле (PIL).
Следующие ограничения применяются к вложению сгенерированного блока S-функции в модель или подсистему, из которой создается другая S-функция.
Программное обеспечение не поддерживает входные и выходные сигналы невиртуальной шины для вложенной S-функции.
Избегайте вложения S-функции в модель или подсистему с тем же именем, что и S-функция (возможно, с несколькими уровнями). В таких ситуациях S-функция может называться рекурсивно. В настоящее время программное обеспечение не обнаруживает такие циклы в зависимости от S-функций, что может привести к прерыванию или зависанию сеанса MATLAB. Чтобы этого не произошло, присвойте подсистеме или модели уникальное имя цели S-функции, чтобы избежать дублирования существующих имен файлов MEX на пути MATLAB.
Целевой файл системы S-функций не поддерживает HeaderFile свойство, которое может быть указано для определяемых пользователем типов данных, включая те, которые основаны на Simulink.AliasType, Simulink.Bus, и Simulink.NumericType объекты. Если определяемый пользователем тип данных в модели использует HeaderFile свойство для указания связанного файла заголовка, создание кода с целевым файлом системы S-функции игнорирует значение и не генерирует соответствующую инструкцию include.
Если создать целевой объект S-функции, щелкнув правой кнопкой мыши блок Function-Call Subsystem, исходная подсистема и сгенерированная S-функция могут быть непротиворечивыми. Несогласованность возникает, когда для параметра Stations при активизации блока Trigger Port в блоке Function-Call Subsystem установлено значение inherit. Необходимо установить состояния при включении параметра для сброса или удержания, в противном случае Simulink сообщает об ошибке.
Если S-функция, генерируемая с использованием S-функции, имеет входные или выходные сигналы шины, генерируемые структуры данных шины могут включать в себя заполнение для выравнивания полей элементов шины с представлением Simulink, используемым во время моделирования. Однако если вставить S-функцию в модель и создать код с использованием целевого объекта модели, например grt.tlc, выравнивание структуры шины, сгенерированное для построения модели, может быть несовместимо с дополнением, сгенерированным для S-функции, и может повлиять на числовые результаты выполнения кода. Чтобы выравнивание структуры согласовывалось между моделированием модели и выполнением кода модели, для каждого Simulink.Bus , можно изменить HeaderFile для удаления файла заголовка структуры шины без добавления. Это приведет к повторному использованию в коде модели типов шин, сгенерированных для S-функции.
Целевой объект S-функции не поддерживает создание блока S-функции из подсистемы, которая имеет вход триггера вызова функции или выход вызова функции.
Если модель включает этот шаблон моделирования подсистемы вызова функций, необходимо вставить блок преобразования сигналов.

Подсистема функционального вызова подключается непосредственно к блоку Outport, а сигнальная линия, соединяющая подсистему с блоком Outport, ответвляется к блоку, имеющему Update функция (блок, который обновляется на каждом основном временном шаге, например, Unit Delay и Memory). Ветвь может находиться внутри или снаружи подсистемы. В модели, включающей подсистему вызова функций, необходимо вставить блок преобразования сигналов в одно из следующих расположений:
Между блоком подсистемы и ветвью
Между ветвью и корневым блоком Outport
Между ветвью и блоком, который имеет Update функция

Перед генерацией блока S-Function для подсистемы установите следующие параметры блока преобразования сигнала:
Установить выход в копию сигнала
Выберите Исключить этот блок из оптимизации сокращения блоков
Если не применить обходной путь, при добавлении сгенерированного блока S-Function в модель, а затем моделировать эту модель, MATLAB может потерпеть сбой.
Когда S-функция в модели обращается к хранилищу данных во время моделирования, Simulink отключает диагностику хранилища данных.
При создании S-функции из модели диагностика также отключается для глобальных хранилищ данных.
При создании S-функции из подсистемы диагностика отключается для следующих хранилищ данных:
Глобальные хранилища данных
Хранилища данных, размещенные вне подсистемы, но доступные для блоков чтения хранилища данных или записи хранилища данных.
Параметры блока Inport или Outport нельзя задать с помощью переменных маски подсистемы, если требуется создать блок S-Function из подсистемы. Программа создает ошибку при попытке запуска моделирования с использованием блока S-Function, например:
Invalid setting in 'testSystem/Subsystem/__OutputSSForSFun__/Out2' for parameter 'PortDimensions' ...