Можно передать параметры S-функции в начале и во время симуляции, с помощью поля S-параметров-функции диалогового окна Block Parameters. Такие параметры называются параметрами диалогового окна, чтобы отличить их от параметров периода выполнения, созданных S-функцией, чтобы упростить генерацию кода (см., Создают и Параметры периода выполнения S-функции Обновления).
Вы не можете использовать Model Explorer, диалоговое окно S-function Block Parameters или маску, чтобы настроить параметры исходной S-функции, т.е. S-функции, которая имеет выходные параметры, но никакие входные параметры, в то время как симуляция запускается. Для получения дополнительной информации смотрите Мелодию и Эксперимент со Значениями Параметров блоков.
Механизм Simulink® хранит значения параметров диалогового окна в S-функции структура SimStruct
. Используйте методы коллбэка S-функции и макросы SimStruct
, чтобы получить доступ и проверять параметры и использовать их, чтобы вычислить S-функцию вывод. Чтобы использовать диалоговые параметры в вашей S-функции C, выполните следующие шаги, когда вы создадите S-функцию:
Определите порядок, в котором параметры должны быть заданы в диалоговом окне блока.
В функции mdlInitializeSizes
используйте макрос
, чтобы сказать механизм Simulink, сколько параметров S-функция принимает. Задайте ssSetNumSFcnParams
S
в качестве первого аргумента и количества параметров диалогового окна в качестве второго аргумента. Если ваша S-функция реализует метод mdlCheckParameters
, стандартная программа mdlInitializeSizes
должна вызвать mdlCheckParameters
, чтобы проверять валидность начальных значений параметров. Например, функция mdlInitializeSizes
в sfun_runtime1.c
начинается со следующего кода.
ssSetNumSFcnParams(S, NPARAMS); /* Number of expected parameters */ #if defined(MATLAB_MEX_FILE) if (ssGetNumSFcnParams(S) == ssGetSFcnParamsCount(S)) { mdlCheckParameters(S); if (ssGetErrorStatus(S) != NULL) { return; } } else { return; /* Parameter mismatch reported by the Simulink engine*/ } #endif
Доступ к параметрам диалогового окна в S-функции с помощью макроса ssGetSFcnParam
.
Задайте S
в качестве первого аргумента, и относительное положение параметра в списке ввело в диалоговое окно (0, первое положение) в качестве второго аргумента. Макрос ssGetSFcnParam
возвращает указатель на mxArray
, содержащий параметр. Можно использовать
, чтобы получить тип данных параметра. Также можно использовать ssGetDTypeIdFromMxArray
ssGetSFcnParamDataType
, чтобы получить тип данных параметра путем определения индекса параметра.
Например, в sfun_runtime1.c
, следующие операторы #define
в начале S-функции задают порядок трех параметров диалогового окна и получают доступ к их значениям на диалоговом окне блока.
#define SIGNS_IDX 0 #define SIGNS_PARAM(S) ssGetSFcnParam(S,SIGNS_IDX) /* First parameter */ #define GAIN_IDX 1 #define GAIN_PARAM(S) ssGetSFcnParam(S,GAIN_IDX) /* Second parameter */ #define OUT_IDX 2 #define OUT_PARAM(S) ssGetSFcnParam(S,OUT_IDX) /* Third parameter */
При выполнении симуляции необходимо задать параметры в поле S-параметров-функции диалогового окна S-Function Block Parameters в том же порядке, что вы задали их на шаге 1. Можно ввести любое допустимое выражение MATLAB® как значение параметра, включая литеральные значения, имена переменных рабочей области, вызовов функции или арифметических выражений. Механизм Simulink выполняет выражение и передает его значение S-функции.
Как другой пример, следующий код является частью S-функции драйвера устройства. Используются четыре входных параметра: BASE_ADDRESS_PRM
, GAIN_RANGE_PRM
, PROG_GAIN_PRM
и NUM_OF_CHANNELS_PRM
. Код использует операторы #define
во главе S-функции, чтобы сопоставить конкретные входные параметры с названиями параметра.
/* Input Parameters */ #define BASE_ADDRESS_PRM(S) ssGetSFcnParam(S, 0) #define GAIN_RANGE_PRM(S) ssGetSFcnParam(S, 1) #define PROG_GAIN_PRM(S) ssGetSFcnParam(S, 2) #define NUM_OF_CHANNELS_PRM(S) ssGetSFcnParam(S, 3)
При выполнении симуляции введите четыре имен переменных или значения в поле S-параметров-функции диалогового окна S-Function Block Parameters. Первое соответствует первому ожидаемому параметру, BASE_ADDRESS_PRM(S)
. Второе соответствует следующему ожидаемому параметру и так далее.
Функция mdlInitializeSizes
содержит этот оператор.
ssSetNumSFcnParams(S, 4);
Диалоговые параметры могут быть или настраиваемыми или ненастраиваемыми. Настраиваемый параметр является параметром, который может изменить пользователь, в то время как симуляция запускается.
Параметры диалогового окна являются настраиваемыми по умолчанию. Тем не менее, это - хорошая методика программирования, чтобы установить приспособляемость каждого параметра, даже те, которые являются настраиваемыми. Если вы включаете диагностике симуляции S-function upgrades needed, механизм Simulink выпускает диагностику каждый раз, когда это сталкивается с S-функцией, которой не удается задать приспособляемость всех ее параметров.
Метод mdlCheckParameters
позволяет вам подтвердить изменения в настраиваемых параметрах во время симуляции. Механизм вызывает метод mdlCheckParameters
каждый раз, когда вы изменяете значения параметров во время цикла симуляции. Этот метод должен проверять параметры диалогового окна S-функции, чтобы гарантировать, что изменения допустимы.
Дополнительный метод коллбэка mdlProcessParameters
позволяет S-функции обрабатывать изменения в настраиваемых параметрах. Механизм вызывает этот метод, только если допустимые изменения параметра произошли в предыдущем временном шаге. Типичное использование этого метода должно выполнить вычисления, которые зависят только от значений параметров и следовательно должны быть вычислены только, когда значения параметров изменяются. Метод может кэшировать результаты вычислений параметра в векторах работы или, предпочтительно, как параметры периода выполнения (см., Создают и Параметры периода выполнения S-функции Обновления).
В S-функции C используйте макро-
в ssSetSFcnParamTunable
mdlInitializeSizes
, чтобы задать приспособляемость каждого параметра диалогового окна S-функции. Код ниже взят из функции mdlInitializeSizes
в примере sfun_runtime1.c
. Код сначала определяет номер параметров диалогового окна S-функции к три прежде, чем вызов mdlCheckParameters
. Если проверка параметра передает, приспособляемость трех параметров диалогового окна S-функции задана.
ssSetNumSFcnParams(S, 3); /* Three dialog box parameters*/ #if defined(MATLAB_MEX_FILE) if (ssGetNumSFcnParams(S) == ssGetSFcnParamsCount(S)) { mdlCheckParameters(S); if (ssGetErrorStatus(S) != NULL) { return; } } else { return; /* Parameter mismatch reported by the Simulink engine*/ } #endif ssSetSFcnParamTunable(S,GAIN_IDX,true); /* Tunable */ ssSetSFcnParamTunable(S,SIGNS_IDX,false); /* Not tunable */ ssSetSFcnParamTunable(S,OUT_IDX,false); /* Not tunable */
Стандартная программа mdlInitializeSizes
S-функции вызывает метод mdlCheckParameters
, чтобы гарантировать, что начальные значения параметров допустимы.
Когда вы настройки параметров во время симуляции, механизм Simulink вызывает S-функцию метод mdlCheckParameters
, чтобы подтвердить изменения и затем метод mdlProcessParameters
S-функций, чтобы дать S-функции шанс обработать параметры в некотором роде. Механизм также вызывает эти методы при выполнении в режиме external mode, но это передает необработанные изменения в цели S-функции. Таким образом, если важно, чтобы ваш параметр процесса S-функции изменился, необходимо создать файл Компилятора выходного языка (TLC), который встраивает S-функцию, включая ее код обработки параметра, во время процесса генерации кода. Для получения информации о встраивании S-функций см. “S-функции Встраивания” в документации Компилятора Выходного языка Simulink Coder™.