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

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

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

  • Перспектива данных, т.е. как механизм и 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-функцию с помощью этого входного сигнала, чтобы проверить, что это не разрушает и производит ожидаемые результаты.

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

| | |

Похожие темы