Взаимодействие Engine Simulink с S-функциями C

Можно исследовать, как механизм Simulink® взаимодействует с S-функциями с двух точек зрения:

  • Перспектива процесса, i. e., в которых точках в моделировании механизм вызывает S-function.

  • Перспектива данных, i. e., как механизм и S-функция обмениваются информацией во время моделирования.

Представление процесса

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

Примечание

Схема представления процесса представляет выполнение S-функций, которые содержат непрерывные и дискретные состояния, включают обнаружение пересечения нулем и находятся в модели, которая использует решатель переменного шага. Различные решатели не используют определенные шаги в схеме. Для лучшего понимания того, как механизм Simulink выполняет вашу конкретную S-функцию, запустите модель, содержащую S-функцию с помощью отладчика Simulink. Для получения дополнительной информации смотрите Введение в Отладчик.

В следующем образцовом цикле инициализации механизм Simulink конфигурирует S-функцию для предстоящего моделирования. Механизм всегда выполняет необходимые вызовы к mdlInitializeSizes и mdlInitializeSampleTime, чтобы настроить основные атрибуты S-функции, включая порты ввода и вывода, диалоговые параметры S-функции, работать векторы, частоты дискретизации, и т.д.

Механизм вызывает дополнительные методы, по мере необходимости, завершить инициализацию S-функции. Например, если использование S-функции работает векторы, механизм вызывает mdlSetWorkWidths. Кроме того, если метод mdlInitializeSizes задержал подготовку атрибутов порта ввода и вывода, механизм вызывает любые методы, необходимые, чтобы завершить инициализацию портов, такую как mdlSetInputPortWidth, во время распространения сигнала. Вызовы метода mdlStart mdlCheckParameters и методы mdlProcessParameters, если S-функция использует диалоговые параметры.

Примечание

Метод обратного вызова mdlInitializeSizes также запускается, когда вы вводите имя скомпилированной S-функции в диалоговое окно S-Function Block Parameters.

После инициализации механизм Simulink выполняет следующий цикл моделирования. Если цикл моделирования прерван, или вручную или когда ошибка происходит, механизм переходит непосредственно к методу mdlTerminate. Если моделирование было вручную остановлено, механизм сначала завершает шаг текущего времени прежде, чем вызов mdlTerminate.

Если ваша модель содержит несколько Блоков s-function на данном уровне иерархии модели, механизм вызывает конкретный метод для каждой S-функции прежде, чем перейти к следующему методу. Например, механизм вызывает все методы mdlInitializeSizes прежде, чем вызвать любые методы mdlInitializeSampleTimes. Механизм использует блок отсортированный порядок определить порядок выполнить S-функции. Смотрите то, Что Сортируется Порядок? в Использовании Simulink, чтобы узнать больше, как механизм определяет блок отсортированный порядок.

Вызов структуры для генерации кода

При использовании продукт Simulink Coder™, чтобы сгенерировать код для модели, содержащей S-функции, механизм Simulink не выполняет целую вызывающую последовательность, обрисованную в общих чертах выше. Инициализация продолжает, как обрисовано в общих чертах выше, пока механизм не достигает метода mdlStart. Механизм затем вызывает методы S-функции, показанные в следующей фигуре, где метод mdlRTW уникален для продукта Simulink Coder.

Если S-функция находится в условно выполняемой подсистеме, для сгенерированного кода возможно чередовать вызовы mdlInitializeConditions и mdlStart. Считайте следующую модель Simulink sfcndemo_enablesub.

Модель содержит две невиртуальных подсистемы, условно выполняемую активированную подсистему под названием Сброс и атомарную подсистему под названием Атомарный. Каждая подсистема содержит Блок s-function, который вызывает S-функцию dsfunc.c, который моделирует дискретную систему пространства состояний с двумя состояниями. Активированный Сброс подсистемы сбрасывает значения состояния, когда подсистема включена, и выходные значения, когда подсистема отключена.

Используя цель типичного в реальном времени (GRT), сгенерированный код для вызовов функции Start всей модели функции Start этих двух подсистем прежде, чем вызвать функцию MdlInitialize всей модели, как показано в следующем коде:

void MdlStart(void)
{
  /* snip */

  /* Start for enabled SubSystem: '<Root>/Reset' */
  sfcndemo_enablesub_Reset_Start();

  /* end of Start for SubSystem: '<Root>/Reset' */

  /* Start for atomic SubSystem: '<Root>/Atomic' */
  sfcndemo_enablesub_Atomic_Start();

  /* end of Start for SubSystem: '<Root>/Atomic' */

MdlInitialize();

Функция Start для активированной подсистемы вызывает функцию InitializeConditions подсистемы:

void sfcndemo_enablesub_Reset_Start(void)
{
   sfcndemo_enablesub_Reset_Init();
   /* snip */
}

Функция MdlInitialize, вызванная в MdlStart, содержит вызов функции InitializeConditions для атомарной подсистемы:

void MdlInitialize(void)
{
   /* InitializeConditions for atomic SubSystem: 
        '<Root>/Atomic' */

   sfcndemo_enablesub_Atomic_Init();
}

Поэтому Start всей модели функционирует вызовы чередований Start и функций InitializeConditions для этих двух подсистем и S-функций, которые они содержат.

Для получения дополнительной информации о продукте Simulink Coder и как это взаимодействует с S-функциями, смотрите S-функции и Генерацию кода (Simulink Coder).

Альтернативная структура вызова для режима external mode

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

Механизм вызывает mdlRTW однажды, когда это переходит к режиму external mode и снова каждый раз, когда параметр изменяется или когда вы выбираете Simulation> Update Diagram.

Примечание

Выполнение модели Simulink в режиме external mode требует продукта Simulink Coder.

Представление данных

Блоки s-function имеют сигналы ввода и вывода, параметры и внутренние состояния, плюс другие общие рабочие области. В целом блокируйтесь, вводы и выводы записаны в и считаны из, вектор блока I/O. Вводы могут также прибыть из

  • Внешние входные параметры через корневые блоки Inport

  • Основывайтесь, если входной сигнал не связан или основан

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

  • Непрерывные состояния

  • Дискретные состояния

  • Другие рабочие области такой как действительные, целочисленные, или указатель работают векторы

Можно параметризовать Блоки s-function передающими параметрами им использующий диалоговое окно S-Function Block Parameters.

Следующие данные показывают общее отображение между этими различными типами данных.

Стандартная программа mdlInitializeSizes S-функции устанавливает размеры различных сигналов и векторов. Методы S-функции, названные во время цикла моделирования, могут определить размеры и значения сигналов.

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

  • Через указатели

  • Используя непрерывные входные параметры

Доступ к сигналам Используя указатели

Во время цикла моделирования получите доступ к использованию входных сигналов

InputRealPtrsType uPtrs = 
  ssGetInputPortRealSignalPtrs(S,portIndex)

Это возвращает массив указателей для входного порта с индексом portIndex, где portIndex запускается в 0. Существует один массив указателей для каждого входного порта. Чтобы получить доступ к элементу этого массива, необходимо использовать

*uPtrs[element]

Следующая фигура описывает, как получить доступ к входным сигналам S-функции с двумя входными параметрами.

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

Можно получить выходной сигнал при помощи этого кода.

real_T *y = ssGetOutputPortSignal(S,outputPortIndex);

Доступ к непрерывным входным сигналам

Метод mdlInitializeSizes S-функции может указать, что элементы его входных сигналов должны занять непрерывные области памяти, с помощью ssSetInputPortRequiredContiguous. Если входные параметры непрерывны, другие методы могут использовать ssGetInputPortSignal, чтобы получить доступ к входным параметрам.

Доступ к входным сигналам отдельных портов

В этом разделе описывается получить доступ ко всем входным сигналам конкретного порта и записать им в выходной порт. Предыдущие данные показывают, что входной массив указателей может указать на записи, состоящие из нескольких несмежных участков, в векторе блока I/O. Выходные сигналы конкретного порта формируют непрерывный вектор. Поэтому правильный способ получить доступ к входным элементам и записать им в выходные элементы (принимающий порты ввода и вывода имеют равные ширины) состоит в том, чтобы использовать этот код.

int_T element;
int_T portWidth = ssGetInputPortWidth(S,inputPortIndex);
InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,inputPortIndex);
real_T *y = ssGetOutputPortSignal(S,outputPortIdx);

for (element=0; element<portWidth; element++) {
  y[element] = *uPtrs[element];
}

Частая ошибка состоит в том, чтобы попытаться получить доступ к входным сигналам через адресную арифметику с указателями. Например, если необходимо было поместить

real_T *u = *uPtrs; /* Incorrect */

чуть ниже инициализации uPtrs и замены внутренняя часть вышеупомянутого цикла с

*y++ = *u++; /* Incorrect */

компиляции кода, но файл MEX могут разрушить программное обеспечение Simulink. Это вызвано тем, что возможно получить доступ к недопустимой памяти (который зависит от того, как вы создаете свою модель). При доступе к входным сигналам неправильно, происходит катастрофический отказ, когда сигналы, вводящие Блок s-function, не непрерывны. Данные сигнала, состоящие из нескольких несмежных участков, происходят, когда сигналы проходят через виртуальные блоки связи, такие как Мультиплексор или Селекторные блоки.

Чтобы проверить что ваша S-функция правильно доступы широкие входные сигналы, передайте реплицированный сигнал каждому входному порту вашей S-функции. Для этого создайте блок Mux с количеством входных портов, равных ширине желаемого сигнала, вводящего вашу S-функцию. Затем соедините ведущий источник с каждым портом S-входного-параметра-функции, как показано в следующей фигуре. Наконец, запустите свою S-функцию с помощью этого входного сигнала, чтобы проверить, что это не разрушает и производит ожидаемые результаты.

Смотрите также

| | |

Похожие темы

Была ли эта тема полезной?