S-функции являются важным классом системного конечного файла, для которого генератор кода может произвести код. Способность инкапсулировать подсистему в S-функцию позволяет вам увеличивать свой КПД выполнения и упрощать повторное использование кода.
Следующие разделы описывают свойства целей S-функции и иллюстрируют, как сгенерировать их. Для получения дополнительной информации о структуре S-функций смотрите Основы S-функции C/C++.
Используя цель S-функции, можно создать компонент S-функции и использовать ее в качестве Блока s-function в другой модели. Следующие разделы описывают рекомендации по развертыванию для цели S-функции.
'S-Function'
значение для CodeFormat
Переменная TLC, используемая целью S-функции, генерирует код, который соответствует Simulink® C прикладной программный интерфейс (API) S-функции MEX. Приложения этого формата включают
Преобразование модели к компоненту. Можно сгенерировать Блок 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. mexext
где
имя подсистемы и subsys
зависимое платформой расширение файла MEX (см. mexext
mexext
). Например, SourceSubsys_sf.mexw64
.
Чтобы развернуть ваш сгенерированный Блок s-function для включения в другие модели для генерации кода, обеспечьте файлы, которые были сгенерированы в текущей рабочей папке, когда Блок s-function был создан. Необходимые файлы:
или subsys
_sf.c.cpp
, где
имя подсистемы (например, subsys
SourceSubsys_sf.c
)
subsys
_sf.h
, где subsys
_sf. mexext
зависимое платформой расширение файла 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-функций.
Опции решателя модели верхнего уровня и шаги расчета
Параметры конфигурации модели: настройка модели верхнего уровня | ||
---|---|---|
Шаги расчета | Опции решателя, введите: переменный шаг | Опции решателя, введите: фиксированный шаг |
Дискретный | Сгенерированная S-функция требует решателя переменного шага | Сгенерированная S-функция может иметь решатель переменного шага или решатель фиксированного шага |
Непрерывный | Сгенерированная S-функция требует решателя переменного шага | Сгенерированная S-функция требует решателя фиксированного шага |
S-функции, сгенерированные от подсистемы, имеют параметры, которые являются hardcoded в блок. 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-функции, имеют все атрибуты сигнала (такие как ширины сигнала или шаги расчета) соединенный проводами. (Единственное исключение к этому правилу касается шагов расчета, как описано в Распространении Шага расчета в Сгенерированных S-функциях.)
В этом примере вы хотите, чтобы Блок s-function сохранил свойства SourceSubsys
когда это существует в SourceModel
. Поэтому, прежде чем вы создаете подсистему как отдельный компонент S-функции, необходимо установить шаги расчета импорта и ширины явным образом. Кроме того, параметры решателя компонента S-функции должны совпасть с теми параметрами исходной модели. Сгенерированный компонент S-функции действует тождественно к исходной подсистеме (см., Выбирают Solver Type для получения дополнительной информации).
Создавать SourceSubsys
как компонент S-функции,
Создайте новую модель и скопировать/вставить SourceSubsys
блокируйтесь в пустое окно.
Установите ширины сигнала и шаги расчета импорта в SourceSubsys
таким образом, что они совпадают с теми из сигналов в исходной модели. Inport 1, Filter
, имеет ширину 1 и шаг расчета 1. Inport 2, Xferfcn
, имеет ширину 1 и шаг расчета 0,5. Inport 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-функции.
Следующий рисунок показывает, что Блок s-function включил исходную модель. Учитывая идентичные входные сигналы, Блок s-function выполняет тождественно к исходной подсистеме.
Сгенерированная S-функция, сконфигурированная как SourceModel
Скорость, на которой выполняется Блок s-function, обычно быстрее, чем исходная модель. Это различие в скорости является более явным для больших и более сложных моделей. При помощи сгенерированных S-функций можно увеличить КПД процесса моделирования.
Можно использовать настраиваемые параметры в сгенерированных S-функциях двумя способами:
Используйте функцию Generate S-function (см., Генерируют S-функцию от Подсистемы).
или
Используйте диалоговое окно Model Parameter Configuration (см., Объявляют Переменные Рабочей области как Настраиваемые параметры Используя Диалоговое окно Настройки Параметра модели) объявить желаемые настраиваемые параметры блоков.
Параметры блоков, которые вы объявляете как настраиваемые с auto
класс памяти в исходной модели становится настраиваемыми параметрами сгенерированной S-функции. Эти параметры не становятся частью сгенерированного
(раньше model
PrtP
) структура данных параметра, как они были бы в коде, сгенерированном от других системных конечных файлов. Вместо этого сгенерированный код получает доступ к этим параметрам при помощи вызовов API MEX, таких как mxGetPr
или mxGetData
. Ваш код должен получить доступ к этим параметрам таким же образом.
Для получения дополнительной информации о вызовах API MEX займитесь S-функциями MEX C и Выбором MATLAB API for Your Application.
Блоки s-function, созданные при помощи цели S-функции, автоматически маскируются. Маска отображает каждый настраиваемый параметр в поле редактирования. По умолчанию поле редактирования отображает параметр именем переменной, как в следующем примере.
Можно принять решение отобразить значение параметра, а не его имени переменной путем выбора параметра конфигурации модели Use value for tunable parameters.
Когда выбирают этот параметр, значение переменной (во время генерации кода) отображено в поле редактирования, как в следующем примере.
rtwsfcn.tlc
системный конечный файл обеспечивается для использования с целью S-функции.
Генератор кода создает контрольную сумму для модели и использует контрольную сумму во время процесса сборки для повторного использования кода, модели - ссылки и функций режима external mode.
Генератор кода вычисляет контрольную сумму модели
S-функция может добавить дополнительную информацию, не полученную во время анализа свойства блока, к контрольной сумме путем вызывания функции ssSetChecksumVal
. Для цели S-функции значение, которое добавляется к контрольной сумме, является контрольной суммой модели или подсистемы, от которой сгенерирована S-функция.
Генератор кода применяет подсистему и контрольные суммы модели можно следующим образом:
Повторное использование кода — Если две подсистемы в модели имеют ту же контрольную сумму, генератор кода, производит код для одной функции только.
Модель - ссылка — Если контрольная сумма текущей модели совпадает с контрольной суммой, когда модель была создана, процесс сборки, не восстанавливает модели, на которые ссылаются.
Режим external mode — Если контрольная сумма текущей модели не совпадает с контрольной суммой кода, который работает на целевом компьютере, процесс сборки, генерирует ошибку.
То, когда вы создаете S-функцию MEX из своей модели, генератор кода создает уровень 2, не встроило S-функцию. Перекрестный выпустите ограничения использования на сгенерированный код и бинарный файл MEX (например, *.mexw64
Включение:
Целевой сгенерированный код S-функции из предыдущего программного обеспечения релиза MATLAB не совместим с более новыми релизами. Не перекомпилируйте сгенерированный код от предыдущего релиза с более новым программным обеспечением релиза MATLAB. Используйте то же программное обеспечение релиза MATLAB, чтобы сгенерировать код для S-функции, предназначаются и компилируют код в файл MEX.
Можно использовать бинарные файлы MEX S-функции, сгенерированные из предыдущего программного обеспечения релиза MATLAB с теми же или более новыми релизами с теми же вопросами совместимости как рукописные S-функции. Для получения дополнительной информации смотрите Совместимость S-функции.
Генератор кода может сгенерировать код и создать исполняемый файл из модели, которая содержит сгенерированные S-функции. Эта поддержка требует, чтобы S-функции были созданы с тем же программным обеспечением релиза MATLAB, которое создает модель. Не возможно включить сгенерированный файл MEX S-функции из предыдущего программного обеспечения релиза MATLAB в модель и создать модель с более новыми релизами.
Конфигурирование Inport и блоков Outport со временем непрерывной выборки
Параметры периода выполнения и диагностика совместимости S-функции
Не может задать параметры блоков Inport или выходного порта через маску подсистемы
Метод сборки щелчка правой кнопкой для генерации S-функции не сохраняет время непрерывной выборки для блоков Outport и Inport. Поскольку шаг расчета не сохраняется, симуляция сгенерированного Блока s-function может быть затронута.
Определенные ограничения применяются к использованию настраиваемых переменных в выражениях. Когда генератор кода сталкивается с неподдерживаемым выражением при создании кода, предупреждение появляется, и эквивалентное числовое значение сгенерировано в коде. Для списка ограничений смотрите Настраиваемые Ограничения Выражения.
Блок S-Function не поддерживает настройку настраиваемых параметров с:
Комплексные числа.
Значения или типы данных, которые преобразовываются к константе (путем установки параметра конфигурации модели Optimization > Default parameter behavior к Inlined
).
Типы данных, которые не встроены.
Типы данных с плавающей точкой, которые не эквивалентны встроенному типу.
Если вы выбираете эти настраиваемые параметры (через Сгенерировать S-функцию для диалогового окна Subsystem):
Программное обеспечение производит предупреждения во время процесса сборки.
Сгенерированная маска блока S-Function не отображает эти параметры.
Если вы устанавливаете параметр конфигурации модели S-function upgrades needed на warning
или error
, генератор кода дает вам команду обновлять S-функции, которые вы создаете с функцией Generate S-function. Это вызвано тем, что системный конечный файл S-функции не указывает параметры периода выполнения. Параметры периода выполнения только поддерживаются для встроенных S-функций, и генерированная S-функция поддерживает функции, которые препятствуют тому, чтобы она была встроена (например, она может вызвать или содержать другие невстроенные S-функции).
Можно работать вокруг этого ограничения путем установки параметра S-function upgrades needed на none
.
При использовании системного конечного файла S-функции генератор кода ограничивает ввод-вывод, чтобы соответствовать корневым блокам модели Inport и Outport (или блоки Inport и Outport блока Subsystem, от которого цель S-функции была сгенерирована). Генератор кода не производит код для блоков From или Goto.
Чтобы работать вокруг этого ограничения, создайте свою модель и подсистему с необходимыми блоками Inport и Outport, вместо того, чтобы использовать Goto и От блоков, чтобы передать данные между корневой моделью и подсистемой. В модели, которая включает сгенерированную S-функцию, вы затем добавили бы Goto и Из блоков.
Пример перед работой вокруг
Корневая модель с блоком From и подсистемой, Subsystem1
Subsystem1
с блоком Goto, который имеет глобальную видимость и передает ее вход блоку From в корневой модели
Subsystem1
замененный S-функцией, сгенерированной с целью S-функции — предупреждение заканчивается, когда вы запускаете модель, потому что сгенерированная 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-функции MEX C/C++, которые вызывают в среду MATLAB
Блок Simulink Function
Блок Function Caller
Блок Scope
Блок To Workspace
Формат S-функции не поддерживает блоки из embeddedtargetslib
библиотека блоков.
SimState
Не поддерживаемый для генерации кодаМожно использовать SimState
в S-функциях языка MATLAB C-MEX и Уровня 2, чтобы сохранить и восстановить состояние симуляции. Смотрите Податливость S-функции с ModelOperatingPoint. Однако SimState
не поддерживается для генерации кода, включая с системным конечным файлом S-функции.
Нижеследующие ограничения применяются к вложению сгенерированный Блок 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 Сигнализировать о копии
Выберите Exclude this bock from 'Block reduction' optimization
Если вы не применяете обходное решение, когда вы добавляете сгенерированный Блок s-function в модель и затем симулируете ту модель, MATLAB может отказать.
Когда S-Function в ваших доступах модели хранилище данных в процессе моделирования, Simulink отключает диагностику хранилища данных.
Если вы создали S-Function из модели, диагностика отключена для хранилищ глобальных данных также.
Если вы создали S-Function из подсистемы, диагностика отключена для следующих хранилищ данных:
Хранилища глобальных данных
Хранилища данных, помещенные вне подсистемы, но, получили доступ блоками Записи Чтения или Хранилища данных Хранилища данных.
Вы не можете задать Inport или параметры блоков Outport при помощи переменных маски подсистемы, если вы хотите сгенерировать блок S-Function из подсистемы. Программное обеспечение производит ошибку, когда вы пытаетесь запустить симуляцию, которая использует блок S-Function, например:
Invalid setting in 'testSystem/Subsystem/__OutputSSForSFun__/Out2' for parameter 'PortDimensions' ...