В этом примере вы будете использовать основные методы в S-Function Builder, чтобы смоделировать дискретную систему в пространстве состояний с двумя входами и двумя выходами с двумя состояниями. Матрицы пространства состояний являются параметрами S-функции, и входные и выходные данные S-функции являются векторами.
Если вы хотите изучить написанную вручную версию созданной S-функции, смотрите dsfunc.c. Обратите внимание, что чтобы создать S-функцию из примера модели S-Function Builder, необходимо сначала создать модель.
Задайте количество дискретных состояний и их начальные условия, режим расчета и шаг расчета S-функции. Этот пример содержит два дискретных состояния, каждое из которых инициализировано в 1и режим дискретной выборки со шаг расчета 1. Убедитесь, что Direct feedthrough выбран, потому что текущие значения входных параметров S-функции используются для вычисления его выходов.

Используйте таблицу Ports and Parameters в нижней части редактора, чтобы задать порты и параметры S-функции. В данном примере у нас есть один вход, один выходной порт и четыре параметра.
Чтобы задать или изменить значения параметров блоков, можно:
Дважды кликните S-Function Builder блок на модели.
Используйте Block Parameters из контекстного меню.
Также можно хранить матрицы пространства состояний в переменных в MATLAB® Рабочая область и введите имена переменных в поле Value для каждого параметра. Введите значения на изображении для параметров пространства состояний в Value поле таблицы Block Parameters.

В этом примере The Outputs_wrapper метод вычисляет выход S-функции как функцию от входного и векторов состояния и матриц пространства состояний. В коде выходов ссылка на параметры S-функции с помощью имен параметров, определенных в таблице Ports and Parameters. Индексируйте в 2-D матрицы с помощью скалярного индекса, снова учитывая, что S-функции используют нулевую индексацию. Для примера доступа к элементу C(2,1) в параметре S-функции C, использовать C[1]в коде S-функции.
void dsfunc_builder_Outputs_wrapper(const real_T *u,
real_T *y,
const real_T *xD,
const real_T *xC,
const real_T *A, const int_T p_width0,
const real_T *B, const int_T p_width1,
const real_T *C, const int_T p_width2,
const real_T *D, const int_T p_width3)
{
/* Output_BEGIN */
y[0]=C[0]*xD[0]+C[2]*xD[1]+D[0]*u[0]+D[2]*u[1];
y[1]=C[1]*xD[0]+C[3]*xD[1]+D[1]*u[0]+D[3]*u[1];
/* Output_END */
} |
The Update_wrapper метод обновляет дискретные состояния. Как и в случае с кодом выходов, используйте имена параметров S-функции и индекс в 2-D матрицы с помощью скалярного индекса, принимая во внимание, что S-функции используют основанную на нуле индексацию. Для примера доступа к элементу A(2,1) в параметре S-функции A, использовать A[1]в коде S-функции. Переменная xD сохраняет окончательные значения дискретных состояний. Введите следующий код в Update_wrapper функция.
void dsfunc_builder_Update_wrapper(const real_T *u,
real_T *y,
real_T *xD,
const real_T *A, const int_T p_width0,
const real_T *B, const int_T p_width1,
const real_T *C, const int_T p_width2,
const real_T *D, const int_T p_width3)
{
/* Update_BEGIN */
real_T tempX[2] = {0.0, 0.0};
tempX[0]=A[0]*xD[0]+A[2]*xD[1]+B[0]*u[0]+B[2]*u[1];
tempX[1]=A[1]*xD[0]+A[3]*xD[1]+B[1]*u[0]+B[3]*u[1];
xD[0] = tempX[0];
xD[1] = tempX[1];
/* Update_END */
} |
Щелкните стреле под Build и выберите следующие опции:
Show compile steps
Create a debuggable MEX-file
Generate wrapper TLC
Дополнительные сведения о том, что делает каждая опция, см. в разделе Сборка S-функций автоматически с использованием S-Function Builder.
Чтобы создать свою S-функцию, нажмите Build на панели инструментов, чтобы создать исполняемый файл для этой S-функции. Теперь можно запустить модель и сравнить выход с исходной дискретной функцией пространства состояний S, содержащейся в sfcndemo_dsfunc.
S-Function | S-Function Builder