Механизм Simulink ® взаимодействует с S-функциями с двух точек зрения:
Перспектива процесса, т.е. точки, в которых при моделировании движок вызывает S-функцию.
Перспектива данных, т.е. как механизм и 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-функциональных блоков на заданном уровне иерархии модели, механизм вызывает конкретный метод для каждой S-функции, прежде чем перейти к следующему методу. Например, обработчик вызывает все mdlInitializeSizes методы перед вызовом любого mdlInitializeSampleTimes методы. Механизм использует порядок сортировки блоков для определения порядка выполнения S-функций. Дополнительные сведения о том, как механизм определяет порядок выполнения блока, см. в разделе Управление и просмотр порядка выполнения.
При использовании продукта Simulink Coder™ для создания кода модели, содержащей S-функции, механизм Simulink не выполняет всю последовательность вызовов, описанную выше. Инициализация продолжается, как описано выше, до тех пор, пока механизм не достигнет mdlStart способ. Затем механизм вызывает методы S-функций, показанные на следующем рисунке, где mdlRTW метод уникален для продукта Simulink Coder.

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

Модель содержит две невиртуальные подсистемы, условно выполненную разрешенную подсистему Reset и атомарную подсистему Atomic. Каждая подсистема содержит S-функциональный блок, вызывающий S-функцию. dsfunc.c, которая моделирует дискретную пространственно-государственную систему с двумя состояниями. Включенная подсистема Reset сбрасывает значения состояния, когда подсистема включена, и выходные значения, когда подсистема отключена.
С использованием общего целевого объекта в реальном времени (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).
При запуске модели Simulink во внешнем режиме последовательность вызовов для подпрограмм S-функций изменяется, как показано на следующем рисунке.

Механизм вызывает mdlRTW один раз при входе во внешний режим и снова при каждом изменении параметра или при нажатии кнопки Обновить модель (Update Model) на вкладке Моделирование (Modeling).
Примечание
Для запуска модели Simulink во внешнем режиме требуется продукт Simulink Coder.
S-функциональные блоки имеют входные и выходные сигналы, параметры и внутренние состояния, а также другие общие рабочие области. В общем случае входы и выходы блоков записываются в вектор ввода-вывода блока и считываются из него. Входные данные также могут поступать из
Внешние входы через корневые блоки ввода
Заземление, если входной сигнал не подключен или заземлен
Блочные выходы также могут поступать на внешние выходы через корневые блоки Outport. Помимо входных и выходных сигналов, S-функции могут иметь
Непрерывные состояния
Дискретные состояния
Другие рабочие области, такие как вещественные, целочисленные или указательные рабочие векторы
Можно параметризовать S-функциональные блоки, передавая им параметры с помощью диалогового окна S-Function Block Parameters.
На следующем рисунке показано общее сопоставление между этими различными типами данных.

S-функция mdlInitializeSizes программа устанавливает размеры различных сигналов и векторов. S-функциональные методы, вызываемые во время цикла моделирования, могут определять размеры и значения сигналов.
S-функциональный метод может обращаться к входным сигналам двумя способами:
Через указатели
Использование смежных входов
Во время цикла моделирования получить доступ к входным сигналам с помощью
InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,portIndex)
Возвращает массив указателей для входного порта с индексом portIndex, где portIndex начинается с 0. Для каждого входного порта имеется один массив указателей. Для доступа к элементу этого массива необходимо использовать
*uPtrs[element]
На следующем рисунке показано, как получить доступ к входным сигналам S-функции с двумя входами.

Как показано на предыдущем рисунке, указатели входных массивов могут указывать в несмежных местах памяти.
С помощью этого кода можно извлечь выходной сигнал.
real_T *y = ssGetOutputPortSignal(S,outputPortIndex);
S-функция mdlInitializeSizes способ может определять, что элементы его входных сигналов должны занимать смежные области памяти, используя ssSetInputPortRequiredContiguous. Если входные данные являются смежными, можно использовать другие методы ssGetInputPortSignal для доступа к входам.
В этом разделе описывается, как получить доступ ко всем входным сигналам определенного порта и записать их в выходной порт. На предыдущем рисунке показано, что входной массив указателей может указывать на несмежные элементы в векторе блочного ввода-вывода. Выходные сигналы конкретного порта образуют смежный вектор. Поэтому правильный способ доступа к входным элементам и записи их в выходные элементы (при условии, что входной и выходной порты имеют одинаковую ширину) - использовать этот код.
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-функций, не являются смежными. Несмежные данные сигнала возникают, когда сигналы проходят через виртуальные блоки соединения, такие как блоки мультиплексора или селектора.
Для проверки правильности доступа S-функции к широким входным сигналам передайте реплицированный сигнал на каждый входной порт S-функции. Для этого создайте Mux-блок с количеством входных портов, равным ширине требуемого сигнала, входящего в вашу S-функцию. Затем подключите источник возбуждения к каждому входному порту S-функции, как показано на следующем рисунке. Наконец, запустите S-функцию, используя этот входной сигнал, чтобы убедиться, что она не потерпит крах и не даст ожидаемых результатов.

Level-2 S-функция MATLAB | Функция MATLAB | S-функция | Построитель S-функций