И.В.Черных. Simulink. И. В. Черных. "Simulink Инструмент моделирования динамических систем"
Скачать 3.7 Mb.
|
16.7.6.2. Пример S-функции для ДПТ НВ Для создания S-функции для ДПТ НВ за основу взят файл примера модели непрерывной системы csfunc.m . Принципиальные отличия нового файла от образца сводятся к следующему: Для расчета матриц уравнений пространства состояния A, В и С используются параметры передаваемые в S-функцию через окно диалога блока S-function. Эти параметры (L,R,J,Cm,Cw,Fi) записываются в конце списка параметров в заголовке S-функции : function [sys,x0,str,ts] = dpt_sfunc_1(t,x,u,flag,L,R,J,Cm,Cw,Fi) Для исключения одинаковых (повторяющихся) вычислений расчет матриц A, В и С выполняется в методе mdlInitializeSizes. Для этого параметры блока (L,R,J,Cm,Cw,Fi) передаются в метод mdlInitializeSizes через его заголовок: [sys,x0,str,ts] = mdlInitializeSizes(L,R,J,Cm,Cw,Fi) Поскольку инициализация модели происходит лишь один раз, то и расчет матриц A, В и С будет выполнен также один раз, что значительно повысит скорость моделирования. Передача рассчитанных в mdlInitializeSizes матриц выполняется с помощью глобальных переменных. Для этого объявления вида: global A B C; выполнены в теле S-функции, методе mdlInitializeSizes (где выполняется расчет этих матриц), а также методах mdlDerivatives и mdlOutputs (где эти матрицы используются для расчетов). Поскольку в уравнения пространства-состояния матрица D отсутствует (входные переменные не участвуют в формировании выходных переменных), то параметр sizes.DirFeedthrough в методе mdlInitializeSizes задан равным нулю. Ниже приводится текст S-функции dpt_sfunc_1 (файл dpt_sfunc_1.m): function [sys,x0,str,ts] = dpt_sfunc_1(t,x,u,flag,L,R,J,Cm,Cw,Fi) % DPT_SFUNC_1 Пример S-функции для моделирования двигателя постоянного тока % независимого возбуждения. % % В примере выполняется моделирование с помощью уравнений % пространства-состояния: % x' = Ax + Bu % y = Cx + Du % % Copyright 2002, Chernykh ILya % $Revision: 1.8 % Автор: Черных И.В. % % Параметры S-функции, передаваемые через окно диалога блока S-function: % % L - Индуктивность цепи якоря % R - Активное сопротивление цепи якоря % J - Момент инерции % Cm - Коэффициент связи между моментом и током % Cw - Коэффициент связи между потоком и скоростью вращения вала % Fi - Поток, создаваемый обмоткой возбуждения % global A B C; % Объявление глобальными переменных, необходимых для % расчетов внутри функций mdlDerivatives и mdlOutputs . % Сами матрицы расчитываются в методе mdlInitializeSizes . switch flag, % В зависимости от значения переменной flag происходит % вызов того или иного метода: %===============% % Инициализация % %===============% case 0, [sys,x0,str,ts]=mdlInitializeSizes(L,R,J,Cm,Cw,Fi); %====================% % Расчет производных % %====================% case 1, sys=mdlDerivatives(t,x,u); %===========================================% % Расчет значений вектора выходных сигналов % %===========================================% case 3, sys=mdlOutputs(t,x,u); %=========================================% % Неиcпользуемые значения переменной flag % %=========================================% case { 2, 4, 9 }, sys = []; %======================================% % Неизвестное значение переменной flag % %======================================% otherwise error(['Unhandled flag = ',num2str(flag)]); end % Окончание dpt_sfunc_1 %===============================================================% % mdlInitializeSizes % % Функция инициализации % % Расчет начальных условий, значений вектора шагов модельного % % времени,размерности матриц % %===============================================================% function [sys,x0,str,ts]=mdlInitializeSizes(L,R,J,Cm,Cw,Fi) sizes = simsizes; sizes.NumContStates = 2; % Число непрерывных переменных состояния % В данном случае этот параметр равен 2 % (ток якоря и скорость вращения вала). sizes.NumDiscStates = 0; % Число дискретных переменных состояния % В данном случае этот параметр равен 0, % поскольку модель непрерывная. sizes.NumOutputs = 2; % Число выходных переменных (размерность выходного % вектора). В данном случае этот параметр равен 2 % (скорость вращения и момент на валу). sizes.NumInputs = 2; % Число входных переменных (размерность входного % вектора). В данном случае этот параметр равен 2 % (напряжение на обмотке якоря и момент % сопротивления). sizes.DirFeedthrough = 0; % Прямой проход. Значение параметра равно нулю, % поскольку матрица обхода D - отсутствует (входные % переменные не участвуют в формировании выходных % переменных). sizes.NumSampleTimes = 1; % Размерность вектора модельного времени. sys = simsizes(sizes); x0 = zeros(2,1); % Задание вектора начальных значений переменных % состояния. Начальные условия нулевые. str = []; % Зарезервированный параметр ts = [0 0]; % Матрица из двух колонок, задающая шаг модельного % времени и смещение. % Далее в функцию mdlInitializeSizes добавлены операторы для % вычисления матриц A, B и C уравнений пространства состояния % модели двигателя постоянного тока global A B C; % Объявление глобальными переменных, необходимых для % расчетов внутри функций mdlDerivatives и mdlOutputs. % Расчет матриц А,В и С: % A=[-R/L -Cw*Fi/L Cm*Fi/J 0 ]; % B=[1/L 0 0 -1/J]; % C=[Cm*Fi 0 0 1]; % Окончание mdlInitializeSizes %========================================================================% % mdlDerivatives % % Функция для расчета значений производных вектора состояния непрерывной % % части системы % %========================================================================% function sys=mdlDerivatives(t,x,u) % global A B; % Объявление глобальными переменных, необходимых для % расчетов внутри метода. sys = A*x + B*u; % Окончание mdlDerivatives %========================================================% % mdlOutputs % % Функция для расчета значений вектора выходных сигналов % %========================================================% function sys=mdlOutputs(t,x,u) global C; % Объявление глобальными переменных, необходимых для % расчетов внутри метода. sys = C*x; % Окончание mdlOutputs На рис.16.10 показаны модели двигателя постоянного тока на базе S-функции и с использованием стандартных блоков. Результаты расчета для обеих моделей идентичны. Окно диалога блока S-function изображено на рис. 16.11.
[Скачать пример] 16.8. Создание S-функций на языке C с помощью S-Function Builder Инструментарий Simulink предоставляет пользователю два способа создания S-функций на языке C: с помощью автоматического построителя S-Function Builder и вручную, с использованием шаблона (аналогично созданию S-функций на языке MATLAB). И хотя наибольшими возможностями обладает именно второй способ, первый способ прост и наименее трудоемок, и, поэтому именно с помощью S-Function Builder пользователь может легко и быстро создать нужную ему S-функцию. При этом как во втором, так и в первом случаях S-функция будет создана в виде исполняемого dll-файла, что обеспечивает повышенное быстродействие этой функции. Создание S-функции рассмотрим на примере двигателя постоянного тока независимого возбуждения. Его математическое описание дано в п. 16.7.6.1. Поскольку в стандарте языка C отсутствуют матричные операции, то уравнения (9) - (12) перепишем в обычной форме:
Значения элементов матриц даны в п. 16.7.6.1. S-Function Builder оформлен в виде обычного блока Simulink и находится в библиотеке Function&Tables (функции и таблицы). Пиктограмма блока показана на рис.16.12. Рис. 16.12 Пиктограмма блока S-Function Builder Двойной щелчок на пиктограмме открывает окно S - Function Builder . Окно S - Function Builder (см. рис. 16.13) содержит панель параметров ( Parameters), в которой находится графа для ввода имени S -функции ( S - function name ) и графа для ввода начальных значений параметров, передаваемых через окно диалога блока S - function ( S - function parameters ). Также на этой панели находится кнопка Build, предназначенная для запуска процесса компиляции S -функции . В нижней части окна S - Function Builder находятся кнопки Help (вызов справки) и Close / Cancel (закрыть окно). Среднюю часть окна занимают шесть вкладок, предназначенных для задания свойств S -функции и фрагментов ее кода: 1. Initialization - Инициализация. На вкладке Initialization задаются следующие свойства S -функции: Input port width - Число входных переменных (размерность входного вектора). Output port width - Число выходных переменных (размерность выходного вектора). Number of parameters - Количество параметров, передаваемых в S-функцию через окно диалога блока. Sample time - Шаг модельного времени. Может принимать значения (из списка): Inherited - наследуемый, Continuous - непрерывный, Discrete - дискретный. Discrete sample time value - Шаг модельного времени для дискретной системы. Параметр доступен для ввода значения, если выбран дискретный шаг расчета. Number of discrete states - Число дискретных переменных состояния. Discrete states IC - Начальные значения дискретных переменных состояния. Значения вводятся через запятую. Number of continuous states - Число непрерывных переменных состояния. Continuous states IC - Начальные значения непрерывных переменных состояния. Значения вводятся через запятую. Окно S-Function Builder с открытой вкладкой Ininialization показано на рис.16.13. Для рассматриваемого примера число входных переменных равно двум (напряжение на обмотке якоря и момент сопротивления). Число выходных переменных равно двум (момент и скорость). Количество переменных состояния также равно двум (ток якоря и скорость). Число параметров S-функции, передаваемых через окно диалога равно 6 (см. п. 16.7.6.2), шаг модельного времени - наследуемый, число дискретных переменных состояния - 0, начальные значения дискретных и непрерывных переменных состояния нулевые. Рис. 16.13 Окно S-Function Builder (вкладка Ininialization) 2. Libraries - Библиотеки. На вкладке имеется три окна для ввода фрагментов С-кода: Library/Object/Source files - Имена подключаемых библиотечных (*. lib) и объектных (*. obj ) файлов. Указанные файлы должны находиться в текущей рабочей папке, либо следует полностью указать путь к этим файлам. Имена файлов указываются по одному в каждой строке. Includes - Директивы для подключения заголовочных (*. h ) и обычных (*.с, *.с pp ) файлов. Например: # include # include "myutils.c" и т.п. В данном окне следует записать файлы, содержащие функции пользователя, которые будут использоваться в проекте. External Function Declarations - Объявления внешних функций, если они отсутствуют в заголовочных или иных подключаемых файлах. Например : extern double func(double a); Окно S - Function Builder с открытой вкладкой Libraries показано на рис. 16.14. Рис. 16.14 Окно S-Function Builder ( вкладка Libraries) 3. Outputs - Выходы. Вкладка содержит текстовое окно, предназначенное для ввода выражений расчета выходных переменных. В расчетных выражениях можно использовать следующие переменные (не объявляя их специально): u 0[0] , u 0[1] , u 0[2] … u 1[0] , u 1[1] , u 1[2]… и т.д. - Входные сигналы блока S - function . Входные сигналы должны быть действительными и иметь тип double . y [0] , y [1] , y [2] и т.д. - Выходные сигналы блока S - function . Выходные сигналы должны быть действительными и иметь тип double . param 1[0] , param 2[0] , param 3[0] и т.д. - Параметры блока S - function , передаваемые через окно диалога. Параметры быть действительными и иметь тип double . p _ width 0, p _ width 1, p _ width 2 - и т.д. Переменные целого типа, значения которых равны размерности нулевого, первого, второго и т.д. параметров блока S- function , передаваемых через окно диалога. u _ width - Фактическая размерность входного сигнала (переменная целого типа). Переменная доступна, если размерность входного сигнала на вкладке Initialization задана равной -1 (минус один). Если входной сигнал матрица - значением переменной u _ width будет вектор из двух элементов. y _ width - Фактическая размерность выходного сигнала (переменная целого типа). Переменная доступна, если размерность выходного сигнала на вкладке Initialization задана равной -1 (минус один). Если выходной сигнал матрица - значением переменной y _ width будет вектор из двух элементов. xC [0], xC [1], xC [2] и т.д. - Непрерывные переменные состояния. Тип переменных - double . xD [0], xD [1], xD [2] и т.д. - Дискретные переменные состояния. Тип переменных - double . На вкладке имеется флажок для установки параметра Inputs are needed in the output function ( direct feedthrough ) - использование входных сигналов для расчета выходных (прямой проход). Текст автоматически генерируемого метода mdl Outputs , приведен ниже: void sfun_Outputs_wrapper(const real_T *u, real_T *y, const real_T *xD, /* optional */ const real_T *xC, /* optional */ const real_T *param0, /* optional */ int_T p_width0 /* optional */ real_T *param1 /* optional */ int_t p_width1 /* optional */ int_T y_width, /* optional */ int_T u_width) /* optional */ { /* Место для ввода расчетного кода */ } , где sfun - имя S -функции. Окно S - Function Builder с открытой вкладкой Output s показано на рис. 16.15. Рис. 16.15 Окно S-Function Builder (вкладка Outputs) В примере на рис. 16.15 в первой строке объявляются переменные - параметры электродвигателя, и этим переменным присваиваются значения параметров передаваемых в S -функцию через окно диалога. Во второй строке объявляются и вычисляются переменные COO и С11, входящие в уравнения (17), (18). В третьей и четвертой строках записаны выражения для расчета выходных сигналов в соответствии с уравнениями (17) и (18). Параметр Inputs are needed in the output function ( direct feedthrough ) не установлен, поскольку в выражениях для расчета выходных сигналов отсутствуют входные. После генерации С-кода в тексте S-функции появится код, введенный в окне вкладки Outputs . 4. Continuous Derivatives - Производные непрерывных переменных состояния. Вкладка содержит текстовое окно, предназначенное для ввода выражений расчета производных непрерывных переменных состояния. В расчетных выражениях можно использовать те же переменные, что и на вкладке Outputs , за исключением дискретных переменных состояния xD . Сами производные обозначаются как dx [0], dx [1], dx [2] и т.п. Текст автоматически генерируемого метода mdl Derivatives , приведен ниже: |