Главная страница

И.В.Черных. Simulink. И. В. Черных. "Simulink Инструмент моделирования динамических систем"


Скачать 3.7 Mb.
НазваниеИ. В. Черных. "Simulink Инструмент моделирования динамических систем"
Дата21.09.2022
Размер3.7 Mb.
Формат файлаdoc
Имя файлаИ.В.Черных. Simulink.doc
ТипДокументы
#689048
страница24 из 26
1   ...   18   19   20   21   22   23   24   25   26

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

    Команда

    Назначение


    Меню File (Файл)


    New

    Открыть окно новой блок-диаграммы




    Model (Ctrl-N)

    Открыть окно для создания Simulink-модели.

    Library

    Открыть окно для создания новой библиотеки Simulink.

    Open … (Ctrl - O)

    Открыть существующий mdl-файл. При выборе данного пункта открывается окно диалога, с помощью которого можно отыскать и открыть требуемый файл модели.

    Close (Ctrl – W)

    Закрыть окно модели (и соответствующий mdl-файл). В том случае, если модель изменялась, то перед закрытием окна MATLAB запросит подтверждение на закрытие файла.

    Preferences…

    Настройка Simulink. Задает параметры создаваемых моделей.


    Меню Edit (Редактирование)

    1   ...   18   19   20   21   22   23   24   25   26


  • написать администратору сайта