И.В.Черных. Simulink. И. В. Черных. "Simulink Инструмент моделирования динамических систем"
Скачать 3.7 Mb.
|
double A00, A01, A10, B00, B11, C00, C11; Это объявление следует сделать сразу же за последней директивой #include. Убрать ("закомментировать") ставшие лишними строки, в которых выполняется объявление и расчет переменных A00, A01, A10, B00, B11, C00 и C11. В результате файл DPT_Sfunc_1_C_wrapper.c будет выглядеть следующим образом (жирным шрифтом отмечены изменения в этом файле): /* * * --- THIS FILE GENERATED BY S-FUNCTION BUILDER: BASIC, 1.0 --- * * This file is a wrapper S-function produced by the S-Function * Builder which only recognizes certain fields. Changes made * outside these fields will be lost the next time the block is * used to load, edit, and resave this file. This file will be overwritten * by the S-function Builder block. If you want to edit this file by hand, * you must change it only in the area defined as: * * %%%-SFUNWIZ_wrapper_XXXXX_Changes_BEGIN * Your Changes go here * %%%-SFUNWIZ_wrapper_XXXXXX_Changes_END * * For better compatibility with the Real-Time Workshop, the * "wrapper" S-function technique is used. This is discussed * in the Real-Time Workshop User's Manual in the Chapter titled, * "Wrapper S-functions". * * Created: Sun Mar 30 13:07:10 2003 */ /* * Include Files * */ #include "tmwtypes.h" /* %%%-SFUNWIZ_wrapper_includes_Changes_BEGIN --- EDIT HERE TO _END */ #include //=========================NEW CODE================================== double A00, A01, A10, B00, B11, C00, C11; //=========================NEW CODE================================== /* %%%-SFUNWIZ_wrapper_includes_Changes_END --- EDIT HERE TO _BEGIN */ /* * Create external references here. * */ /* %%%-SFUNWIZ_wrapper_externs_Changes_BEGIN --- EDIT HERE TO _END */ //extern double func(double a); /* %%%-SFUNWIZ_wrapper_externs_Changes_END --- EDIT HERE TO _BEGIN */ /* * Output functions * */ void DPT_Sfunc_1_C_Outputs_wrapper(const real_T *u, real_T *y, const real_T *xC, const real_T *param0, const int_T p_width0, const real_T *param1, const int_T p_width1, const real_T *param2, const int_T p_width2, const real_T *param3, const int_T p_width3, const real_T *param4, const int_T p_width4, const real_T *param5, const int_T p_width5) { /* This Outputs function allows for 1 input and 1 output * signal of any width, any number of discrete states and * parameters, all of type real_T. * * If you need the FULL POWER of the S-function interface, * familiarize yourself with the full template file at: * * matlabroot/simulink/src/sfuntmpl_doc.c * * and the "Writing S-functions" manual in the documentation. */ /* %%%-SFUNWIZ_wrapper_Outputs_Changes_BEGIN --- EDIT HERE TO _END */ //=========================OLD CODE================================== /* double Cm = param3[0], Fi = param5[0]; double C00=Cm*Fi, C11= 1; */ //=========================OLD CODE================================== y[0] = C00*xC[0]; y[1] = C11*xC[1]; /* %%%-SFUNWIZ_wrapper_Outputs_Changes_END --- EDIT HERE TO _BEGIN */ } /* * Updates function * */ void DPT_Sfunc_1_C_Update_wrapper(const real_T *u, const real_T *y, const real_T *param0, const int_T p_width0,const real_T *param1, const int_T p_width1,const real_T *param2, const int_T p_width2,const real_T *param3, const int_T p_width3,const real_T *param4, const int_T p_width4, const real_T *param5, const int_T p_width5) { /* %%%-SFUNWIZ_wrapper_Update_Changes_BEGIN --- EDIT HERE TO _END */ /* * Code example * xD[0] = u[0]; */ /* %%%-SFUNWIZ_wrapper_Update_Changes_END --- EDIT HERE TO _BEGIN */ } /* * Derivatives function * */ void DPT_Sfunc_1_C_Derivatives_wrapper(const real_T *u, const real_T *y, real_T *dx, real_T *xC, const real_T *param0, const int_T p_width0,const real_T *param1, const int_T p_width1,const real_T *param2, const int_T p_width2,const real_T *param3, const int_T p_width3,const real_T *param4, const int_T p_width4, const real_T *param5, const int_T p_width5) { /* %%%-SFUNWIZ_wrapper_Derivatives_Changes_BEGIN --- EDIT HERE TO _END */ //=========================OLD CODE================================== /* double L = param0[0], R = param1[0], J =param2[0]; double Cm = param3[0], Cw = param4[0], Fi=param5[0]; double A00 = -R/L , A01 = -Cw*Fi/L , B00 = 1/L; double A10 = Cm*Fi/J , B11 = -1/J; */ //=========================OLD CODE================================== dx[0] = A00*xC[0]+A01*xC[1]+B00*u[0]; dx[1] = A10*xC[0]+B11*u[1]; /* %%%-SFUNWIZ_wrapper_Derivatives_Changes_END --- EDIT HERE TO _BEGIN */ } Выполнить сборку S-функции на основе измененных файлов следует командой из рабочего окна MATLAB: mex DPT_Sfunc_1_C.c DPT_Sfunc_1_C_wrapper.c или mex -g DPT_Sfunc_1_C.c DPT_Sfunc_1_C_wrapper.c . При этом папка, где находятся исходные файлы, должна быть настроена как текущая. Команда mex с опцией -g создает отладочный вариант S-функции. В результате использования предложенной методики будет получена S-функция, обеспечивающая наилучшие характеристики по быстродействию. Вносимые в исходные файлы изменения не очень значительны и могут быть выполнены даже начинающим пользователем. [Скачать пример] 16.10. Создание S-функций на языке Fortran При создании S-функции на языке Fortran могут использоваться два подхода. Первый поход (первый уровень) подразумевает использование только языка Fortran. Второй подход (второй уровень) предусматривает совместное использование программных модулей, написанных на языках Fortran и C. Наилучшими возможностями обладает второй способ. Однако, первый подход наиболее прост и позволяет создать Fortran S-функцию в сжатые сроки. В данном параграфе будет рассмотрен именно такой способ. Ограничения второго способа, по сравнению с первым, заключаются, в основном, невозможности передать параметры S-функции через окно диалога блока S-function. Данное ограничение легко преодолевается передачей параметров через входы блока S-function. Создание Fortran S-функции рассмотрим на примере двигателя постоянного тока независимого возбуждения (п. 16.7.6). В качестве основы использован файл шаблона sfuntmpl_fortran.f (папка ...\simulink\src). В тексте шаблона приняты следующие обозначения: T - Текущее время. X - Вектор непрерывных переменных состояния системы. U - Вектор входных сигналов. Y - Вектор выходных переменных. X0 - Вектор начальных значений непрерывных переменных состояния системы. DX - Вектор производных переменных состояния системы. XNEW - Вектор новых значений дискретных переменных состояния системы. Ниже приводится текст S-функции модели ДПТ НВ (файл DPT_Sfunc_1_For.f): C=========================================================================== C Файл: DPT_Sfunc_1_For.for C Пример S-функции на языке FORTRAN длЯ моделированиЯ двигателЯ постоЯнного C тока независимого возбуждениЯ C C В примере выполнЯетсЯ моделирование с помощью уравнений пространства- С состоЯниЯ: C x' = Ax + Bu C y = Cx + Du C C Copyright 2002, Chernykh ILya C $Revision: Free C============================================================================ C C Откомпилировать S-функцию можно командой: C C mex DPT_Sfunc_1_For.f simulink.f C C Copyright 2002, Chernykh ILya C $Revision: Free C C============================================================================ C Функция: SIZES. Задает размерность вектора size. C C SIZES возвращает вектор, который задает характеристики модели. C Вектор содержит информацию о числе переменных состояния и другие параметры, C а именно: C SIZE(1) Число непрерывных переменных состоЯниЯ C SIZE(2) Число дискретных переменных состоЯниЯ C SIZE(3) Число выходных переменных C SIZE(4) Число входов C SIZE(5) Число разрывных корней системы C SIZE(6) Флаг, задающий возможность передачи входных переменных на выход C C============================================================================ C SUBROUTINE SIZES(SIZE) C .. Массив аргументов функции INTEGER*4 SIZE(*) C .. Параметры .. INTEGER*4 NSIZES PARAMETER (NSIZES=6) SIZE(1) = 2 C Число непрерывных переменных состояния (ток якоря и скорость C вращения вала) SIZE(2) = 0 С Число дискретных переменных состоЯниЯ C Параметр равен 0, поскольку модель непрерывнаЯ SIZE(3) = 2 C Число выходных переменных (скорость вращениЯ и момент на валу) SIZE(4) = 2+6 C Число входов. Параметр равен 2 + 6 (напряжение на обмотке якоря и C момент сопротивлениЯ + параметры двигателя). SIZE(5) = 0 C Число разрывных корней системы SIZE(6) = 1 C Прямой проход (1 - есть, 0 - нет). C В данном случае проход входных сигналов на выход есть, С поскольку параметры двигателя передаются через входной порт RETURN END C C============================================================================ C Функция: OUTPUT . Рассчитывает значения непрерывных выходных переменных. C============================================================================ C SUBROUTINE OUTPUT(T,X,U,Y) C .. Параметры .. C T - Текущее времЯ C X - Вектор непрерывных переменных состоЯниЯ системы C U - Вектор входных сигналов C Y - Вектор выходных переменных (возвращаемые значениЯ) C REAL*8 T REAL*8 X(*), U(*), Y(*) C REAL*8 L,R,J,Cm,Cw,Fi C Объявление переменных - параметров двигателя постоЯнного тока C L,R,J,Cm,Cw,Fi L=U(3) R=U(4) J=U(5) Cm=U(6) Cw=U(7) Fi=U(8) C C Расчет выходных переменных: Y(1) = Cm*Fi*X(1) Y(2) = X(2) RETURN END C C C===================================================== C Функция: INITCOND. Задает начальные значения переменных состояния. C===================================================== C SUBROUTINE INITCOND(X0) C .. Параметры .. C X0 - Вектор начальных значений переменных состояния системы C (возвращаемые значениЯ) REAL*8 X0(*) X0(1)=0 X0(2)=0 C В данном случае начальные условиЯ нулевые RETURN END C===================================================================== C Функция: DERIVS. Рассчитывает значения производных вектора состояния C системы X. C===================================================================== C SUBROUTINE DERIVS(T,X,U,DX) REAL*8 T, X(*), U(*), DX(*) C REAL*8 L,R,J,Cm,Cw,Fi C Объявление переменных - параметров двигателя постоЯнного тока L=U(3) R=U(4) J=U(5) Cm=U(6) Cw=U(7) Fi=U(8) C DX(1) = (-R/L)*X(1)-(Cw*Fi/L)*X(2)+(1/L)*U(1) DX(2) = (Cm*Fi/J)*X(1)-(1/J)*U(2) C RETURN END C C================================================================ C Функция: TSAMPL. Задает вектор модельного времени и смещениЯ C================================================================ C SUBROUTINE TSAMPL(T, X, U, TS, OFFSET) REAL*8 T,TS,OFFSET,X(*),U(*) TS=0. C Шаг модельного времени. OFFSET=0. C Смещение. RETURN END C C===================================================== C Шаблоны не используемых в данном примере функций. C===================================================== C C C==================================================================== C Функция: DSTATES. Рассчитывает новые значения дискретных переменных C состояния. C==================================================================== C .. Параметры .. SUBROUTINE DSTATES(T, X, U, XNEW) C XNEW - Вектор новых значений дискретных переменных состоЯниЯ системы REAL*8 T, X(*), U(*), XNEW(*) C --- Ничего не выполняется RETURN END C=================================================================== C Функция: DOUTPUT. Рассчитывает новые значения дискретных выходных переменных C=================================================================== C SUBROUTINE DOUTPUT(T, X, U, Y) REAL*8 T, X(*), U(*), Y(*) C --- Ничего не выполняется RETURN END C Сборку S-функции следует произвести командой: mex DPT_Sfunc_1_For.f simulink.f . Файл simulink.f предварительно необходимо скопировать из папки ...MATLAB6p5\simulink\src в рабочую папку. Естественно, что компилятор языка Fortran должен быть дополнительно установлен на компьютере. Matlab 6.5 поддерживает следующие компиляторы: Compaq Visual Fortran version 6.1 Compaq Visual Fortran version 6.6 Digital Visual Fortran version 6.0 Digital Visual Fortran version 5.0 Перед сборкой S-функции следует выбрать компилятор командой: mex -setup. Пример модели с разработанной S-функцией показан на рис. 16.20. На рисунке видно, что параметры модели передаются не через окно диалога блока S-function, а через входной порт. Рис. 16.20 Модель ДПТ на основе Fortran S-функции. [Скачать пример] Приложение 1. Система меню обозревателя библиотек программы Simulink File (Файл) — Работа с файлами библиотек. Edit (Редактирование) — Добавление блоков и их поиск. View (Вид) — Управление показом элементов интерфейса. Help (Справка) — Вызов справочной системы. Таблица П.1
|