S-функции являются важным классом системного целевого файла, для которого генератор кода может производить код. Возможность инкапсулировать подсистему в S-функцию позволяет повысить ее эффективность выполнения и облегчить повторное использование кода.
В следующих разделах описываются свойства целей S-функций и проиллюстрировано, как их сгенерировать. Для получения дополнительной информации о структуре S-функций смотрите C/C + + S-Function Basics.
Используя цель S-функции, можно создать компонент S-функции и использовать его как блок s-function в другой модели. В следующих разделах описываются факторы развертывания для цели S-функции.
The 'S-Function'
значение для CodeFormat
Переменная TLC, используемая объектом S-функции, генерирует код, который соответствует Simulink® Интерфейс прикладного программирования MEX S (API) на C. Приложения этого формата включают
Преобразование модели в компонент. Можно сгенерировать блок S-Function для модели, m1
. Затем можно поместить сгенерированный блок S-Function в другую модель, m2
. Регенерация кода для m2
не требует регенерации кода для m1
.
Преобразование подсистемы в компонент. Путем извлечения подсистемы в отдельную модель и генерации блока S-Function из этой модели, можно создать повторно используемый компонент из подсистемы. Пример этой процедуры см. в разделе Создание блоков s-function из подсистемы.
Ускорение симуляции. Часто S-функция, сгенерированная из модели, выполняет более эффективно, чем исходная модель.
Повторное использование кода. Можно включать несколько образцы одной модели в другую, не реплицируя код для каждого образца. Каждый образец продолжает поддерживать свои собственные уникальные данные.
Можно поместить сгенерированный блок s-function в другую модель, из которой можно сгенерировать другую S-функцию. Этот подход допускает уровни вложенных S-функций. Ограничения, связанные с вложением, см. в разделе Вложение S-функций.
Примечание
Если вы генерируете код для моделируемого программного компонента, используйте образец модели вместо того, чтобы генерировать блок s-function из подсистемы.
Примечание
В то время как вы можете использовать цель S-функции для развертывания прикладного компонента для повторного использования, защищая его внутреннюю логику от проверки и модификации, предпочтительными решениями для защиты интеллектуального свойства в распределенных компонентах являются:
Защищенная модель, ссылочная модель, которая скрывает информацию о блоках и линиях. Для получения дополнительной информации смотрите Ссылки Защищенные Модели от Третьих Сторон.
Целевой файл общей библиотечной системы, используемый для генерации общей библиотеки для модели или подсистемы для использования в системной симуляции, внешнем для Simulink. Для получения дополнительной информации смотрите Пакет Сгенерированный код как Общие библиотеки (Embedded Coder).
Существуют различные файлы, необходимые для развертывания сгенерированного блока S-Function для симуляции в зависимости от генерации кода.
Чтобы развернуть свой сгенерированный блок S-Function для включения в другие модели для симуляции, необходимо предоставить только двоичный объект файла MEX, который был сгенерирован в текущей рабочей папке при создании блока S-Function. Требуемый файл:
subsys
_sf.<reservedrangesplaceholder0 >
где
- имя и subsys
подсистемыmexext
является зависящим от платформы расширением файла MEX (см mexext
). Для примера, SourceSubsys_sf.mexw64
.
Чтобы развернуть свой сгенерированный блок S-Function для включения в другие модели генерации кода, предоставьте файлы, которые были сгенерированы в текущей рабочей папке при создании блока S-Function. Необходимые файлы:
или subsys
_sf.c.cpp
, где
- имя подсистемы (для примера, subsys
SourceSubsys_sf.c
)
subsys
_sf.h
, где subsys
_sf.<reservedrangesplaceholder0 >
является зависящим от платформы расширением файла MEX (см mexext
mexext
)
Подпапка
и его содержимоеsubsys
_sfcn_rtw
Сгенерированный код S-функции использует Configuration Parameters > Hardware Implementation значения параметров, которые соответствуют хост-системе, на которой была построена функция. Когда вы используете S-функцию в модели для генерации кода, убедитесь, что эти значения параметров для модели совпадают со значениями параметров S-функции.
Сгенерированный блок S-Function может наследовать свой шаг расчета от модели, в которой он помещается, если удовлетворяются определенные критерии. Условия, которые управляют распространением шага расчета для обоих блоков Model и сгенерированных блоков S-Function, описаны в Ссылочных шагах расчета модели и S-функциях, которые задают правила наследования шага расчета.
Чтобы сгенерировать блок S-Function, который удовлетворяет критериям наследования шага расчета, необходимо ограничить решатель для модели, из которой генерируется блок S-Function. Установите Type параметра конфигурации модели в Fixed-step
и Periodic sample time constraint к Ensure sample time independent
. Если модель не может наследовать шаги расчета, эта настройка заставляет программное обеспечение Simulink отображать сообщение об ошибке при построении модели. Для получения дополнительной информации об этой опции см. Раздел «Периодический шаг расчета ограничения».
Таблица показывает возможные комбинации типов решателя модели верхнего уровня, поскольку эти типы относятся к тому, имеют ли модель дискретные или непрерывные шаги расчета и типы решателя для сгенерированных S-функций.
Опции решателя модели верхнего уровня и шаги расчета
Параметры конфигурации модели: строение модели верхнего уровня | ||
---|---|---|
Шаги расчета | Опции решателя, тип: Переменный-шаг | Опции решателя, тип: Fixed-step |
Дискретный | Сгенерированная S-функция требует переменного шага решателя | Сгенерированная S-функция может иметь решатель с переменным шагом или решатель с фиксированным шагом |
Непрерывный | Сгенерированная S-функция требует переменного шага решателя | Сгенерированная S-функция требует решателя с фиксированным шагом |
S-функции, сгенерированные из подсистемы, имеют параметры, которые жестко закодированы в блок. Simulink вычисляет параметры, такие как шаг расчета, когда он генерирует блок, а не во время запуска симуляции. Важно проверить, работает ли сгенерированный блок S-Function должным образом в целевой модели.
В этом разделе показано, как извлечь подсистему из модели и сгенерировать из нее повторно используемый компонент S-функции.
Следующий рисунок показывает SourceModel
, простая модель, которая вводит сигналы в подсистему. Следующий рисунок показывает подсистему, SourceSubsys
. Сигналы, которые имеют различные ширины и шаги расчета, являются:
Блок Step со шаг расчета 1
Блок Sine wave со шаг расчета 0,5
Блок Constant, значение которого является вектором [-2 3]
SourceModel
SourceSubsys
Цель состоит в том, чтобы извлечь SourceSubsys
из модели и создайте из нее блок S-Function, используя цель S-функции. Блок S-Function должен выполнять так же, как и подсистема, из которой он был сгенерирован.
В этой модели SourceSubsys
наследует шаги расчета и ширины сигнала от его входных сигналов. Однако блоки S-Function, созданные из модели с использованием цели S-функции, имеют все атрибуты сигнала (такие как ширина сигнала или шаги расчета) в жестком проводе. (Единственное исключение из этого правила касается шагов расчета, как описано в Sample Time Propagation in Generated S-Functions.)
В этом примере вы хотите, чтобы блок 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
, как показано на следующем рисунке.
Ширина сигнала и шаги расчета распространяются на эти порты.
Установите тип решателя, режим и другие параметры решателя так, чтобы они были идентичны параметрам исходной модели. Это проще всего сделать, если вы используете Model Explorer.
Установите System target file параметра конфигурации модели в rtwsfcn.tlc
.
Выберите панель S-Function Target. Убедитесь, что Create new model выбран, как показано на следующем рисунке:
Когда эта опция выбрана, процесс сборки создает новую модель после того, как она создает компонент S-функции. Новая модель содержит блок S-Function, связанный с компонентом S-функции.
Нажмите Apply.
Сохраните новую модель, содержащую вашу подсистему, например, как SourceSubsys
.
Создайте модель.
Процесс сборки создает компонент S-функции в рабочей папке. После сборки отображается новое окно модели.
Вы можете сохранить сгенерированную модель, например, как SourceSubsys_Sfunction
.
Теперь можно скопировать блок S-Function, сгенерированный из новой модели, и использовать его в других моделях или в библиотеке.
Примечание
Список файлов, необходимых для развертывания блока S-Function для симуляции или генерации кода, см. в Необходимых файлах для развертывания S-Function.
Следующий рисунок показывает блок S-Function, подключенный к исходной модели. Учитывая идентичные входные сигналы, блок S-Function выполняет аналогично исходной подсистеме.
Сгенерированная S-функция, сконфигурированная как SourceModel
Скорость, с которой выполняется блок S-Function, обычно быстрее, чем исходная модель. Это различие в скорости более выражена для больших и более сложных моделей. При помощи сгенерированных S-функций можно увеличить эффективность процесса моделирования.
Можно использовать настраиваемые параметры в сгенерированных S-функциях двумя способами:
Используйте функцию Generate S-function (см. «Генерация S-функции из Подсистемы»).
или
Используйте диалоговое окно Model Parameter Configuration (см. Объявление переменных рабочей области как настраиваемых параметров с использованием Диалогового окна строения параметра модели), чтобы объявить требуемые параметры блоков настраиваемыми.
Блокируйте параметры, которые вы объявляете настраиваемыми со auto
класс памяти в исходной модели становится настраиваемыми параметрами сгенерированной S-функции. Эти параметры не становятся частью сгенерированного
(ранее model
_PrtP
) структура данных параметра, так как они были бы в коде, сгенерированном из других системных целевых файлов. Вместо этого сгенерированный код обращается к этим параметрам с помощью вызовов MEX API, таких как mxGetPr
или mxGetData
. Ваш код должен получить доступ к этим параметрам таким же образом.
Дополнительные сведения о вызовах MEX API см. в разделах О MEX S-Functions и Выбор MATLAB API для вашего приложения.
Блоки S-Function, созданные при помощи цели S-функции, автоматически маскируются. Маска отображает каждый настраиваемый параметр в поле редактирования. По умолчанию в поле edit отображается параметр по имени переменной, как в следующем примере.
Можно принять решение отобразить значение параметра, а не его имя переменной, выбрав параметр конфигурации <reservedrangesplaceholder0> модели.
При выборе этого параметра значение переменной (во время генерации кода) отображается в поле edit, как в следующем примере.
The rtwsfcn.tlc
системный целевой файл предусмотрен для использования с S-функционным целевым файлом.
Генератор кода создает контрольную сумму для модели и использует контрольную сумму в процессе сборки для повторного использования кода, модели-ссылки и режима external mode функций.
Генератор кода вычисляет контрольную сумму модели на
S-функция может добавить дополнительную информацию, не полученную во время анализа свойств блоков, к контрольной сумме путем вызова функции ssSetChecksumVal
. Для цели S-Function значение, которое добавляется к контрольной сумме, является контрольной суммой модели или подсистемы, из которой генерируется S-функция.
Генератор кода применяет подсистему и модели контрольных сумм следующим образом:
Повторное использование кода - Если две подсистемы в модели имеют одинаковую контрольную сумму, генератор кода производит код только для одной функции.
Модель-ссылка - Если текущая контрольная сумма модели совпадает с контрольной суммой при построении модели, процесс сборки не перестраивает модели-ссылки.
Режим external mode - Если текущая контрольная сумма модели не совпадает с контрольной суммой кода, выполняемого на целевом компьютере, процесс сборки генерирует ошибку.
Когда вы создаете MEX S-функцию из вашей модели, генератор кода создает нелинейную S-функцию уровня 2. Перекрестные ограничения на использование сгенерированного кода и двоичного файла MEX (для примера, *.mexw64
) включают:
Целевой сгенерированный код S-функции из предыдущего программного обеспечения MATLAB release не совместим с более новыми релизами. Не компилируйте сгенерированный код из предыдущего релиза с более новым программным обеспечением MATLAB релиза. Используйте то же программное обеспечение MATLAB release, чтобы сгенерировать код для цели S-функции и скомпилировать код в файл MEX.
Можно использовать двоичные файлы MEX S-функции, сгенерированные из предыдущего программного обеспечения MATLAB release с теми же или более новыми релизами с теми же вопросами совместимости, что и рукописные S-функции. Для получения дополнительной информации см. Раздел «Совместимость S-функций»
Генератор кода может сгенерировать код и создать исполняемый файл из модели, которая содержит сгенерированные S-функции. Эта поддержка требует, чтобы S-функции были созданы с тем же программным обеспечением релиз, которое создает модель. Невозможно включить сгенерированный файл S-функции MEX из предыдущего программного обеспечения MATLAB release в модель и создать модель с более новыми релизами.
Конфигурирование Inport и Outport блоков с непрерывным шагом расчета
Диагностика параметров во время выполнения и совместимости S-функций
Профилирование производительности кода с не поддерживаемой функцией TLC Hook
Невозможно задать входные или выходные Параметры блоков через маску подсистемы
Метод сборки правой кнопкой мыши для генерации S-функции не сохраняет непрерывный шаг расчета для блоков Inport и Outport. Поскольку шаг расчета не сохранён, может быть затронуто симуляция сгенерированного блока S-Function.
Некоторые ограничения применяются к использованию настраиваемых переменных в выражениях. Когда генератор кода встречается с неподдерживаемым выражением во время создания кода, появляется предупреждение, и в коде генерируется эквивалентное числовое значение. Список ограничений см. в разделе Настраиваемые ограничения выражения.
Блок S-Function не поддерживает настройку настраиваемых параметров с:
Комплексные числа.
Значения или типы данных, которые преобразуются в константу (путем установки параметра конфигурации модели Optimization > Default parameter behavior равным Inlined
).
Типы данных, которые не являются встроенными.
Типы данных с плавающей точкой, которые не эквивалентны встроенному типу.
Если вы выбираете эти настраиваемые параметры (через диалоговое окно Generate S-Function for Subsystem):
Программа выдает предупреждения в процессе сборки.
Сгенерированный S-Function блока маска не отображает эти параметры.
Если вы задаете S-function upgrades needed параметра конфигурации модели warning
или error
Генератор кода инструктирует вас обновить S-функции, которые вы создаете с помощью Generate S-function функции. Это связано с тем, что целевой файл системы S-функций не регистрирует параметры во время выполнения. Параметры run-time поддерживаются только для inlined S-Functions и сгенерированных функций S-Function поддержек, которые препятствуют его встраиванию (для примера, они могут вызывать или содержать другие нелинейные S-функции).
Можно обойти это ограничение, установив значение параметра S-function upgrades needed на none
.
При использовании целевого файла системы S-функций генератор кода ограничивает ввод-вывод в соответствие с корневой моделью Inport и Outport blocks (или блоками 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-функцию к корневой модели, ее выход соединяется непосредственно с блоком To Workspace.
Следующие ограничения применяются к созданию и обновлению S-функций с использованием целевого файла системы S-функций:
Вы не можете создавать модели, которые содержат Model блоков, используя целевой файл системы S-функций. Это также означает, что вы не можете создать подсистему с помощью контекстного меню правой кнопкой мыши, если подсистема содержит Model блоков. Это ограничение применяется только к S-функциям, сгенерированным с использованием цели S-функции, а не к S-функциям ERT.
Можно создать модель с:
Набор инструментов, только если набор инструментов поддерживает генерацию файлов MEX.
Шаблон make-файла только в том случае, если шаблон make-файла связан с набором инструментов, поддерживающим генерацию Файла MEX.
Если вы измените модель, которая сгенерировала блок S-Function, процесс сборки не перестраивает модели, содержащие сгенерированный блок S-Function автоматически. Это отличается от практики автоматического восстановления моделей, на которые ссылаются блоки Model при их изменении (в зависимости от настройки строения Rebuild Модель-ссылка).
Рукописные S-функции без соответствующих файлов TLC должны содержать код без исключений. Для получения дополнительной информации о коде без исключений смотрите Бесплатный код исключения.
Формат S-функции не поддерживает следующие встроенные блоки:
Interpreted MATLAB Function блок
S-Function блоки, содержащие любой из следующих:
MATLAB® язык S-функций (если вы не поставляете файл TLC для генерации кода C)
S-функции Фортран (если вы не поставляете файл TLC для генерации кода C)
S-функции C/C + + MEX, которые вызываются в окружение MATLAB
Scope блок
To Workspace блок
Формат S-функции не поддерживает блоки из embeddedtargetslib
библиотека блоков.
SimState
Не поддерживается для генерации кодаМожно использовать SimState
в пределах C-MEX и Level-2 языка MATLAB S-функции для сохранения и восстановления состояния симуляции. См. Податливость S-функций ModelOperatingPoint. Однако SimState
не поддерживается для генерации кода, в том числе с целевым файлом системы S-функции.
Профилирование эффективности сгенерированного кода с помощью интерфейса функции hook компилятора целевого языка (TLC), описанного в Profile Code Execution Speed, не поддерживается для целевого объекта S-функции.
Примечание
Если у вас есть Embedded Coder® лицензия, смотрите Профилирование выполнения кода (Embedded Coder) для альтернативного и более простого подхода, основанного на симуляциях цикле (SIL) или цикле (PIL).
Следующие ограничения применяются к вложению сгенерированного блока S-Function в модель или подсистему, из которой вы генерируете другую S-функцию:
Программное обеспечение не поддерживает невиртуальные входные и выходные сигналы шины для вложенной S-функции.
Избегайте вложения S-функции в модель или подсистему, имеющую то же имя, что и S-функция (возможно, на нескольких уровнях друг от друга). В таких ситуациях S-функция может быть вызвана рекурсивно. В настоящее время программа не обнаруживает такие циклы в зависимости S-функции, что может привести к прерыванию или зависанию вашего сеанса работы с MATLAB. Чтобы предотвратить это, назовите подсистему или модель, которая будет сгенерирована как цель S-функции, уникально, чтобы избежать дублирования существующих имен файлов MEX в пути MATLAB.
Целевой файл системы S-функции не поддерживает HeaderFile
свойство, которое может быть задано на определяемых пользователем типах данных, включая те, которые основаны на Simulink.AliasType
, Simulink.Bus
, и Simulink.NumericType
объекты. Если определяемый пользователем тип данных в вашей модели использует HeaderFile
свойство, чтобы задать связанный заголовочный файл, генерация кода с целевым файлом системы S-функции игнорирует значение и не генерирует соответствующий оператор включения.
Если вы генерируете цель S-функции путем щелчка правой кнопкой мыши по блоку Function-Call Subsystem, исходная подсистема и сгенерированная S-функция могут быть непротиворечивыми. Несогласованность возникает, когда параметр States when enabling блока Trigger Port внутри блока Function-Call Subsystem установлен в inherit. Вы должны задать параметр States when enabling равным reset или held, в противном случае Simulink сообщает об ошибке.
Если S-функция, сгенерированная с использованием S-функции, имеет входные или выходные сигналы, сгенерированные структуры данных шины могут включать заполнение для выравнивания полей элементов шины представлением Simulink, используемым во время симуляции. Однако, если вы вставляете S-функцию в модель и генерируете код с помощью модели-цели, такой как grt.tlc
выравнивание структуры шины, сгенерированное для сборки модели, может быть несовместимым с заполнением, сгенерированным для S-функции, и может повлиять на числовые результаты выполнения кода. Чтобы сделать выравнивание структуры согласованным между симуляцией модели и выполнением кода модели, для каждого Simulink.Bus
объект, можно изменить HeaderFile
свойство для удаления файла заголовка незагруженной структуры шины. Это приведет к повторному использованию шинных шин, сгенерированных для S-функции, в коде модели.
Цель S-функции не поддерживает создание блока S-Function из подсистемы, которая имеет вход триггера вызова функции или выход вызова функции.
Если модель включает этот шаблон моделирования подсистемы вызова функций, необходимо вставить блок Signal Conversion.
Подсистема вызова функций соединяется непосредственно с блоком Outport, а сигнальная линия, которая соединяет подсистему с ветвями Outport, - с блоком, который имеет Update
функция (блок, который обновляется на каждом крупном временном шаге, таком как Unit Delay и Memory). Ветвь может находиться внутри или вне подсистемы. В модели, которая включает подсистему вызова функций, необходимо вставить блок Signal Conversion в одно из следующих местоположений:
Между блоком подсистемы и ветвью
Между ветвью и корневым блоком Outport
Между ветвью и блоком, который имеет Update
функция
Прежде чем сгенерировать блок S-Function для подсистемы, установите следующие Signal Conversion параметров блоков:
Установите Output в значение Signal copy
Выберите Exclude this bock from 'Block reduction' optimization
Если вы не применяете обходное решение, когда вы добавляете сгенерированный блок S-Function к модели и затем симулируете эту модель, MATLAB может рухнуть.
Когда S-Function в вашей модели обращается к хранилищу данных во время симуляции, Simulink отключает диагностику хранилища данных.
Если вы создали S-Function из модели, диагностика также отключена для глобальных хранилищ данных.
Если вы создали S-Function из подсистемы, диагностика отключается для следующих хранилищ данных:
Глобальные данные
Хранилища данных, размещенные вне подсистемы, но доступные блокам Data Store Read или Data Store Write.
Вы не можете задать Inport или Outport параметры блоков при помощи переменных маски подсистемы, если хотите сгенерировать блок S-Function из подсистемы. Программа создает ошибку, когда вы пытаетесь запустить симуляцию, которая использует блок S-Function, например:
Invalid setting in 'testSystem/Subsystem/__OutputSSForSFun__/Out2' for parameter 'PortDimensions' ...