Создание S-функций на языке MATLAB — КиберПедия 

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Создание S-функций на языке MATLAB

2018-01-05 593
Создание S-функций на языке MATLAB 0.00 из 5.00 0 оценок
Заказать работу

Наиболее простой и быстрый путь создать S-функцию – это написать ее на языке MATLAB с использованием файла-шаблона. И хотя создание S-функций на языке MATLAB имеет некоторые ограничения (например, MATLAB S-функция может иметь только по одному входному и выходному порту, а также передаваемые и принимаемые данные через эти порты могут быть только скалярами и векторами типа double), этот способ является наилучшим с точки зрения изучения механизма работы S-функции.

Ниже приводится шаблон S-функции с авторским переводом комментариев. Оригинальный файл шаблона sfuntmpl.m находится в папке ...\toolbox\simulink\blocks.

Шаблон MATLAB S-функции:

function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag)%% SFUNTMPL - Базовый шаблон для создания MATLAB S-функции. % С помощью MATLAB S-функции пользователь может задать систему % обыкновенных дифференциальных уравнений (ODE), уравнения дискретной % системы, и(или) любой алгоритм, описывающий работу Simulink -блока. %% Базовая форма синтаксиса S-функции выглядит следующим образом: % [sys,x0,str,ts] = sfunc(t,x,u,flag,p1,...,pn)%% Параметры S-функции: %% t - Текущее время % x - Вектор переменных состояния системы % u - Вектор входных сигналов % flag - Флаг - целое число, определяющее какая функция внутри S-функции % выполняется при вызове. % p1,...,pn - Параметры S-функции, задаваемые в окне диалога % блока "S-function".%% Результат, возвращаемый (вычисляемый) S-функцией в момент времени t % зависит от значения переменной flag, значения вектора состояния системы x% и текущего значения вектора входного сигнала u. %% Результаты работы S-функции в зависимости от значения переменной flag% приведены в таблице: % _________________________________________________________________________ % | | | | | % | flag | РЕЗУЛЬТАТ | ВЫПОЛНяЕМАя ФУНКЦИя | ОПИСАНИЕ | % | | | (сallback-метод) | | % |______|___________|________________________|_____________________________| % | 0 | [sizes,x0, | mdlInitializesizes | Инициализация: Расчет | % | | str,ts] | | начальных условий, значений | % | | | | вектора модельного времени | % | | | | времени, размерности матриц.| % | 1 | dx | mdlDerivatives | Расчет значений производных| % | | | | вектора x состояния системы.| % | 2 | ds | mdlUpdate | Расчет значений вектора | % | | | | состояний x дискретной | % | | | | системы: sys = x(n+1). | % | 3 | y | mdlOutputs | Расчет значений выходного | % | | | | вектора sys. | % | 4 | tnext | mdlGetTimeOfNextVarHit | Расчет значения времени для| % | | | | следующей расчетной точки | % | | | | дискретной части системы. | % | | | | Используется при расчете | % | | | | дискретной или гибридной | % | | | | системы с переменным шагом. | % | 5 | | | Зарезервировано для будущего| % | | | | использования. | % | 9 | [] | mdlTerminate | Завершение расчета | % |______|___________|________________________|_____________________________| % %% Параметры блока " S-function " p1,...,pn передаются в S-функцию при любом % значении переменной flag. %% При вызове S-функции со значением переменной flag = 0 ею рассчитываются % следующие величины: %% sys(1) - Число непрерывных переменных состояния. % sys(2) - Число дискретных переменных состояния. % sys(3) - Число выходных переменных. % sys(4) - Число входных переменных (размерность вектора u). % Любой из первых четырех элементов в sys может быть задан % равным -1 (минус один), что означает динамически задаваемую % размерность соответствующих переменных. Фактическая размерность % при вызове S-функции с другими значениями переменной flag% будет равна размерности входного вектора u. % Например, при sys(3) = -1, размерность выходного вектора будет % задана равной размерности входного вектора. % sys(5) - Значение зарезервировано для будущего использования. % sys(6) - Значение, равное 1, соответствует прохождению входного сигнала % на выход. Значение, равное 0, определяет, что входной сигнал не % используется для вычисления выходного сигнала в функции % mdlOutputs, вызываемой при значении переменной flag = 3. % sys(7) - Размерность вектора модельного времени (количество строк в % матрице ts). %%% x0 - Задание вектора начальных значений переменных состояния. % Если переменных состояния нет - значение параметра задается % равным []. %% str - Зарезервированный параметр. Значение параметра задается % равным []. %% ts - Матрица, размерностью m -на- 2, задающая модельное время % и смещение (period и offset), где m - число строк в матрице ts. %% Например: %% ts = [0 0, % Шаг модельного времени для непрерывной % % части системы. % 0 1, % Фиксированный шаг расчета для непрерывной % % части системы. % period offset, % Фиксированный шаг модельного времени для % % дискретной части системы, % % где - period > 0 & offset < PERIOD. % -2 0]; % Переменный шаг модельного времени для % дискретной части системы. При вызове % S-функции со значением переменной flag = 4 % выполняется расчет следующей точки по времени. %% Если в матрице ts заданы несколько значений шага модельного времени, % то его значения должны располагаться в порядке возрастания. % В том случае, если задано более одного значения шага требуется проверка % времени срабатывания блока в явном виде: % abs(round((T-OFFSET)/PERIOD) - (T-OFFSET)/PERIOD)% Обычно задаваемая погрешность при проверке равна 1e-8. Она зависит от % величин шага модельного времени и времени окончания расчета. % Можно также задать, чтобы значение временного шага передавалось в % блок " S-function " из предшествующего блока модели. Для функций, % изменяющихся внутри основного временного шага должно быть задано % sys(7) = 1 и ts = [-1 0]. % Для функций, не изменяющихся внутри основного временного шага % должно быть задано sys(7) = 1 и ts = [-1 1]. %% Copyright 1990-2001 The MathWorks, Inc. % $Revision: 1.17 $% Авторский перевод комментариев: Черных И.В. %% Нижележащие строки показывают базовую структуру S-функции: %switch flag, % В зависимости от значения переменной flag происходит % вызов того или иного метода:: % ===============% % Инициализация % % ===============% case 0, [sys,x0,str,ts]=mdlInitializeSizes; % ====================% % Расчет производных % % ====================% case 1, sys=mdlDerivatives(t,x,u); % ============================================================% % Расчет значений вектора состояний дискретной части системы % % ============================================================% case 2, sys=mdlUpdate(t,x,u); % =====================================================================% % Расчет значений вектора выходных сигналов непрерывной части системы % % =====================================================================% case 3, sys=mdlOutputs(t,x,u); % ==================================================================% % Расчет значения времени для следующей расчетной точки дискретной % % части системы % % ==================================================================% case 4, sys=mdlGetTimeOfNextVarHit(t,x,u); % ====================% % Завершение расчета % % ====================% case 9, sys=mdlTerminate(t,x,u); % ======================================% % Неизвестное значение переменной flag % % ======================================% otherwise error(['Unhandled flag = ',num2str(flag)]); end% Окончание функции sfuntmpl% ===============================================================% % mdlInitializeSizes % % Функция инициализации % % Расчет начальных условий, значений вектора модельного времени,% % размерности матриц % % ===============================================================% function [sys,x0,str,ts]=mdlInitializeSizes% Приведенные ниже значения параметров даны в качестве примера и не отражают % реально задаваемых значений. sizes = simsizes; % Первый вызов функции simsizes создает структуру sizessizes.NumContStates = 0; % Число непрерывных переменных состояния sizes.NumDiscStates = 0; % Число дискретных переменных состояния sizes.NumOutputs = 0; % Число выходных переменных (размерность выходного % вектора) sizes.NumInputs = 0; % Число входных переменных (размерность вектора u) sizes.DirFeedthrough = 1; % Параметр, задающий проход входного сигнала на % выход. % Этот параметр нужно задавать равным 1, в том % случае, если входной сигнал прямо или % опосредованно(например, через логическое % выражение или алгебраическую операцию) % проходит на выход системы (иными словами: если % входной сигнал u, входит в выражения задаваемые в % функции mdlOutputs) или используется метод % mdlGetTimeOfNextVarHit. % При описании системы в уравнениях пространства % состояний этот параметр следует задать равным 1, % если матрица D (матрица обхода) не пустая и % равным нулю, в противном случае. sizes.NumSampleTimes = 1; % Размерность вектора модельного времени. % Минимальное значение параметра = 1 % (одна строка в матрице ts). sys = simsizes(sizes); % Второй вызов функции simsizes. Данные о % размерностях передаются в Simulink. x0 = []; % Задание вектора начальных значений переменных состояния % (начальных условий). str = []; % Задание параметра str, как пустой матрицы. Параметр % заразервирован для будущего использования. ts = [0 0]; % Матрица из двух колонок, задающая шаг модельного времени % и смещение. % Окончание mdlInitializeSizes % ========================================================================% % mdlDerivatives % % Функция для расчета значений производных вектора состояния непрерывной % % части системы % % ========================================================================% function sys=mdlDerivatives(t,x,u)sys = [];% Окончание mdlDerivatives % ==========================================================================% % mdlUpdate % % Функция для расчета значений вектора выходных сигналов непрерывной части % % системы % % ==========================================================================% function sys=mdlUpdate(t,x,u)sys = [];% Окончание mdlUpdate % ===========================================================================% % mdlOutputs % % Функция для расчета значений вектора выходных сигналов непрерывной части % % системы % % ===========================================================================% function sys=mdlOutputs(t,x,u)sys = [];% Окончание mdlOutputs % ===========================================================================% % mdlGetTimeOfNextVarHit % % Расчет значения времени для следующей расчетной точки дискретной части % % системы. % % Функция рассчитывает время (абсолютное значение), по достижении которого % % значения дискретной части системы передаютсяв Simulink -модель. % % Функция используется только в случае моделирования дискретной части % % системы с переменным шагом (variable discrete-time sample time). В этом % % случае параметр ts функции mdlInitializeSizes должен быть задан как [-2 0] % % ===========================================================================% function sys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime = 1; % Пример: время срабатывания блока увеличивается % на 1 секунду. sys = t + sampleTime;% Окончание mdlGetTimeOfNextVarHit % =========================================% % mdlTerminat e % % Функция, выполняющая завершение расчета % % =========================================% function sys=mdlTerminate(t, x,u) sys = []; % Окончание mdlTerminate

[Скачать пример]

Примеры S-функций языке MATLAB

Простейшая S-функция

Одним из самых простых примеров S-функций поставляемых с пакетом MATLAB является функция timestwo (файл timestwo.m). Данная S-функция выполняет умножение входного сигнала на коэффициент 2. Ниже приведен текст этой S-функции.

function [sys,x0,str,ts] = timestwo(t,x,u,flag) %% TIMESTWO - Пример S-функции. Выходной сигнал равен входному,% умноженному на 2:% y = 2 * u; %% Шаблон для создания S-функции - файл sfuntmpl.m. %% Copyright 1990-2001 The MathWorks, Inc.% $Revision: 1.6 $% Авторский перевод комментариев: Черных И.В.% switch flag, % В зависимости от значения переменной flag происходит % вызов того или иного метода: %===============%% Инициализация %%===============% case 0 [sys,x0,str,ts]=mdlInitializeSizes; %===========================================%% Расчет значений вектора выходных сигналов %%===========================================% case 3 sys=mdlOutputs(t,x,u); %=========================================%% Неиcпользуемые значения переменной flag %%=========================================% % В примере не используются методы для завершения работы S-функции, % нет непрерывных и дискретных переменных состояния, % поэтому значения переменной flag = 1, 2, 4, 9 не используются. % Результатом S-функции в этом случае является пустая матрица. case { 1, 2, 4, 9 } sys=[]; %======================================%% Неизвестное значение переменной flag %%======================================% otherwise error(['Unhandled flag = ',num2str(flag)]); end % Окончание функции timestwo %===============================================================%% mdlInitializeSizes %% Функция инициализации %% Расчет начальных условий, значений вектора шагов модельного %% времени, размерности матриц %%=============================================================%% function [sys,x0,str,ts] = mdlInitializeSizes() sizes = simsizes;sizes.NumContStates = 0; % Число непрерывных переменных состояния. sizes.NumDiscStates = 0; % Число дискретных переменных состояния. sizes.NumOutputs = -1; % Число выходных переменных (размерность выходного вектора). % Динамическая размерность выходного вектора. sizes.NumInputs = -1; % Число входных переменных (размерность входного % вектора). % Динамическая размерность входного вектора. sizes.DirFeedthrough = 1; % Прямой проход. Есть проход входного сигнала % на выход. sizes.NumSampleTimes = 1; % Размерность вектора шагов модельного времени. sys = simsizes(sizes);str = []; % Параметр заразервирован для будущего % использования. x0 = []; % Задание вектора начальных значений переменных % состояния. % Переменных сомтояния нет, поэтому значение % параметра - пустая матрица. ts = [-1 0]; % Матрица из двух колонок, задающая шаг % модельного времени и смещение. % Шаг наследуется из предшествуюшего блока. % Окончание mdlInitializeSizes %%========================================================%% mdlOutputs %% Функция для расчета значений вектора выходных сигналов %%========================================================%% function sys = mdlOutputs(t,x,u) sys = u * 2; % Выходной сигнал блока есть входной сигнал, умноженный на % коэффициент 2. % Окончание mdlOutputs

Пример модели с S-функцией timestwo приведен на рис.16.4.

Рис. 16.4 Модель с S-функцией timestwo

[Скачать пример]

Модель непрерывной системы

Модель непрерывной системы, описываемой уравнениями пространства состояния дана в файле csfunc.m. Данная S-функция моделирует непрерывную систему с двумя входами, двумя выходами и двумя переменными состояния. Параметры модели (значения матриц A,В,С,D) задаются в теле S-функции и передаются в callback -методы через их заголовки в качестве дополнительных параметров.
Ниже приведен текст этой S-функции.

S-функция csfunc:

function [sys,x0,str,ts] = csfunc(t,x,u,flag) % CSFUNC Пример S-функции. Спомощью уравнений пространства состояния% моделируется непрерывная система:%% x' = Ax + Bu % y = Cx + Du %% Значения матриц передаются в callback-методы через их заголовки% в качестве дополнительных параметров% %% Шаблон для создания S-функции - файл sfuntmpl.m. % % Copyright 1990-2001 The MathWorks, Inc.% $Revision: 1.8 $% Авторский перевод комментариев: Черных И.В. % Задание матриц: A=[-0.09 -0.01 1 0]; % Mатрица системы. B=[ 1 -7 0 -2]; % Mатрица входа. C=[ 0 2 1 -5]; % Mатрица выхода. D=[-3 0 1 0]; % Mатрица обхода. switch flag, % В зависимости от значения переменной flag происходит % вызов того или иного метода: %===============%% Инициализация %%===============% case 0, [sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D); %====================%% Расчет производных %%====================% case 1, sys=mdlDerivatives(t,x,u,A,B,C,D); %===========================================%% Расчет значений вектора выходных сигналов %%===========================================% case 3, sys=mdlOutputs(t,x,u,A,B,C,D); %=========================================%% Неиcпользуемые значения переменной flag %%=========================================% % В примере не используются методы для завершения работы S-функции, % нет дискретных переменных состояния, % поэтому значения переменной flag = 2, 4, 9 не используются. % Результатом S-функции в этом случае является пустая матрица. case { 2, 4, 9 } sys=[]; %======================================%% Неизвестное значение переменной flag %%======================================% otherwise error(['Unhandled flag = ',num2str(flag)]); end % Окончание csfunc %%===============================================================%% mdlInitializeSizes %% Функция инициализации %% Расчет начальных условий, значений вектора модельного времени,%% размерности матриц %%===============================================================%% function [sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D) sizes = simsizes;sizes.NumContStates = 2; % Число непрерывных переменных состояния. sizes.NumDiscStates = 0; % Число дискретных переменных состояния. sizes.NumOutputs = 2; % Число выходных переменных (размерность выходного % вектора). sizes.NumInputs = 2; % Число входных переменных (размерность входного % вектора). sizes.DirFeedthrough = 1; % Прямой проход. Есть проход входного сигнала % на выход. % (матрица D не пустая). sizes.NumSampleTimes = 1; % Размерность вектора шагов модельного времени. sys = simsizes(sizes);x0 = zeros(2,1); % Задание вектора начальных значений переменных % состояния. Начальные условия нулевые. str = []; % Параметр заразервирован для будущего % использования. ts = [0 0]; % Матрица из двух колонок, задающая шаг модельного % времени и смещение. % Окончание mdlInitializeSizes %%========================================================================%% mdlDerivatives %% Функция для расчета значений производных вектора состояния непрерывной %% части системы %%========================================================================%% function sys=mdlDerivatives(t,x,u,A,B,C,D) sys = A*x + B*u; % Окончание mdlDerivatives %%========================================================%% mdlOutputs %% Функция для расчета значений вектора выходных сигналов %%========================================================% function sys=mdlOutputs(t,x,u,A,B,C,D) sys = C*x + D*u; % Окончание mdlOutputs

Пример модели с S-функцией csfunc приведен на рис.16.5.

Рис. 16.5 Модель с S-функцией csfunc

[Скачать пример]


Поделиться с друзьями:

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.015 с.