Ускорение симуляции, повторного использования кода или защиты интеллектуального свойства при помощи S-Function Target

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

В следующих разделах описываются свойства целей S-функций и проиллюстрировано, как их сгенерировать. Для получения дополнительной информации о структуре S-функций смотрите C/C + + S-Function Basics.

О цели S-функции

Используя цель 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-функции для развертывания прикладного компонента для повторного использования, защищая его внутреннюю логику от проверки и модификации, предпочтительными решениями для защиты интеллектуального свойства в распределенных компонентах являются:

Необходимые файлы для развертывания S-функций

Существуют различные файлы, необходимые для развертывания сгенерированного блока 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 >, где mexext является зависящим от платформы расширением файла MEX (см mexext)

  • Подпапка subsys_sfcn_rtw и его содержимое

Сгенерированный код S-функции использует Configuration Parameters > Hardware Implementation значения параметров, которые соответствуют хост-системе, на которой была построена функция. Когда вы используете S-функцию в модели для генерации кода, убедитесь, что эти значения параметров для модели совпадают со значениями параметров 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-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-функции,

  1. Создайте новую модель и скопируйте/вставьте SourceSubsys блокируйте в пустое окно.

  2. Установите ширины сигнала и шаги расчета входных портов внутри SourceSubsys такие, что они совпадают с сигналами в исходной модели. Входной порт 1, Filter, имеет ширину 1 и шаг расчета 1. Входной порт 2, Xferfcn, имеет ширину 1 и шаг расчета 0,5. Входной порт 3, offsets, имеет ширину 2 и шаг расчета 0,5.

  3. Сгенерированный блок S-Function должен иметь три входных порта и один выходной порт. Соедините входные и выходные порты с SourceSubsys, как показано на следующем рисунке.

    Ширина сигнала и шаги расчета распространяются на эти порты.

  4. Установите тип решателя, режим и другие параметры решателя так, чтобы они были идентичны параметрам исходной модели. Это проще всего сделать, если вы используете Model Explorer.

  5. Установите System target file параметра конфигурации модели в rtwsfcn.tlc.

  6. Выберите панель S-Function Target. Убедитесь, что Create new model выбран, как показано на следующем рисунке:

    Когда эта опция выбрана, процесс сборки создает новую модель после того, как она создает компонент S-функции. Новая модель содержит блок S-Function, связанный с компонентом S-функции.

    Нажмите Apply.

  7. Сохраните новую модель, содержащую вашу подсистему, например, как SourceSubsys.

  8. Создайте модель.

  9. Процесс сборки создает компонент S-функции в рабочей папке. После сборки отображается новое окно модели.

    Вы можете сохранить сгенерированную модель, например, как SourceSubsys_Sfunction.

  10. Теперь можно скопировать блок S-Function, сгенерированный из новой модели, и использовать его в других моделях или в библиотеке.

    Примечание

    Список файлов, необходимых для развертывания блока S-Function для симуляции или генерации кода, см. в Необходимых файлах для развертывания S-Function.

    Следующий рисунок показывает блок S-Function, подключенный к исходной модели. Учитывая идентичные входные сигналы, блок S-Function выполняет аналогично исходной подсистеме.

    Сгенерированная S-функция, сконфигурированная как SourceModel

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

Настраиваемые параметры в сгенерированных S-функциях

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

Блокируйте параметры, которые вы объявляете настраиваемыми со auto класс памяти в исходной модели становится настраиваемыми параметрами сгенерированной S-функции. Эти параметры не становятся частью сгенерированного model_P (ранее rtP) структура данных параметра, так как они были бы в коде, сгенерированном из других системных целевых файлов. Вместо этого сгенерированный код обращается к этим параметрам с помощью вызовов MEX API, таких как mxGetPr или mxGetData. Ваш код должен получить доступ к этим параметрам таким же образом.

Дополнительные сведения о вызовах MEX API см. в разделах О MEX S-Functions и Выбор MATLAB API для вашего приложения.

Блоки S-Function, созданные при помощи цели S-функции, автоматически маскируются. Маска отображает каждый настраиваемый параметр в поле редактирования. По умолчанию в поле edit отображается параметр по имени переменной, как в следующем примере.

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

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

Системный целевой файл

The rtwsfcn.tlc системный целевой файл предусмотрен для использования с S-функционным целевым файлом.

Контрольные суммы и цель S-функции

Генератор кода создает контрольную сумму для модели и использует контрольную сумму в процессе сборки для повторного использования кода, модели-ссылки и режима external mode функций.

Генератор кода вычисляет контрольную сумму модели на

  1. Вычисление контрольной суммы для каждой подсистемы в модели. Контрольная сумма подсистемы является комбинацией свойств (тип данных, сложность, шаг расчета, размерности порта и так далее) блоков подсистемы.

  2. Объединение контрольных сумм подсистемы и другой информации уровня модели.

S-функция может добавить дополнительную информацию, не полученную во время анализа свойств блоков, к контрольной сумме путем вызова функции ssSetChecksumVal. Для цели S-Function значение, которое добавляется к контрольной сумме, является контрольной суммой модели или подсистемы, из которой генерируется S-функция.

Генератор кода применяет подсистему и модели контрольных сумм следующим образом:

  • Повторное использование кода - Если две подсистемы в модели имеют одинаковую контрольную сумму, генератор кода производит код только для одной функции.

  • Модель-ссылка - Если текущая контрольная сумма модели совпадает с контрольной суммой при построении модели, процесс сборки не перестраивает модели-ссылки.

  • Режим external mode - Если текущая контрольная сумма модели не совпадает с контрольной суммой кода, выполняемого на целевом компьютере, процесс сборки генерирует ошибку.

Сгенерированная совместимость S-функций

Когда вы создаете 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 в модель и создать модель с более новыми релизами.

Ограничения цели S-функции

Конфигурирование Inport и Outport блоков с непрерывным шагом расчета

Метод сборки правой кнопкой мыши для генерации S-функции не сохраняет непрерывный шаг расчета для блоков Inport и Outport. Поскольку шаг расчета не сохранён, может быть затронуто симуляция сгенерированного блока S-Function.

Использование настраиваемых переменных в выражениях

Некоторые ограничения применяются к использованию настраиваемых переменных в выражениях. Когда генератор кода встречается с неподдерживаемым выражением во время создания кода, появляется предупреждение, и в коде генерируется эквивалентное числовое значение. Список ограничений см. в разделе Настраиваемые ограничения выражения.

Настройка параметров

Блок S-Function не поддерживает настройку настраиваемых параметров с:

  • Комплексные числа.

  • Значения или типы данных, которые преобразуются в константу (путем установки параметра конфигурации модели Optimization > Default parameter behavior равным Inlined).

  • Типы данных, которые не являются встроенными.

  • Типы данных с плавающей точкой, которые не эквивалентны встроенному типу.

Если вы выбираете эти настраиваемые параметры (через диалоговое окно Generate S-Function for Subsystem):

  • Программа выдает предупреждения в процессе сборки.

  • Сгенерированный S-Function блока маска не отображает эти параметры.

Диагностика параметров во время выполнения и совместимости S-функций

Если вы задаете S-function upgrades needed параметра конфигурации модели warning или errorГенератор кода инструктирует вас обновить S-функции, которые вы создаете с помощью Generate S-function функции. Это связано с тем, что целевой файл системы S-функций не регистрирует параметры во время выполнения. Параметры run-time поддерживаются только для inlined S-Functions и сгенерированных функций S-Function поддержек, которые препятствуют его встраиванию (для примера, они могут вызывать или содержать другие нелинейные S-функции).

Можно обойти это ограничение, установив значение параметра S-function upgrades needed на none.

Перейдите к блоку Goto и From

При использовании целевого файла системы 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-функций с использованием целевого файла системы 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-функции.

Профилирование производительности кода с не поддерживаемой функцией TLC Hook

Профилирование эффективности сгенерированного кода с помощью интерфейса функции hook компилятора целевого языка (TLC), описанного в Profile Code Execution Speed, не поддерживается для целевого объекта S-функции.

Примечание

Если у вас есть Embedded Coder® лицензия, смотрите Профилирование выполнения кода для альтернативного и более простого подхода, основанного на симуляциях «цикл» (SIL) или «цикл» (PIL).

Вложение S-функций

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

  • Программное обеспечение не поддерживает невиртуальные входные и выходные сигналы шины для вложенной S-функции.

  • Избегайте вложения S-функции в модель или подсистему, имеющую то же имя, что и S-функция (возможно, на нескольких уровнях друг от друга). В таких ситуациях S-функция может быть вызвана рекурсивно. В настоящее время программа не обнаруживает такие циклы в зависимости S-функции, что может привести к прерыванию или зависанию вашего сеанса работы с MATLAB. Чтобы предотвратить это, назовите подсистему или модель, которая будет сгенерирована как цель S-функции, уникально, чтобы избежать дублирования существующих имен файлов MEX в пути MATLAB.

Определяемые пользователем типы данных

Целевой файл системы S-функции не поддерживает HeaderFile свойство, которое может быть задано на определяемых пользователем типах данных, включая те, которые основаны на Simulink.AliasType, Simulink.Bus, и Simulink.NumericType объекты. Если определяемый пользователем тип данных в вашей модели использует HeaderFile свойство, чтобы задать связанный заголовочный файл, генерация кода с целевым файлом системы S-функции игнорирует значение и не генерирует соответствующий оператор включения.

Генерация целевого устройства 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-функции, в коде модели.

Подсистемы с Function-Call сигналами ввода-вывода

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

Шаблон моделирования подсистемы вызова функций

Если модель включает этот шаблон моделирования подсистемы вызова функций, необходимо вставить блок Signal Conversion.

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

  1. Между блоком подсистемы и ветвью

  2. Между ветвью и корневым блоком Outport

  3. Между ветвью и блоком, который имеет 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'
...

Похожие темы