МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
РОЗРАХУНКОВА РОБОТА
з курсу “Динамічні елементи систем керування”
Тема 4. Варіант 1. Вхідна дія 4
«Математичне моделювання та дослідження роботи
системи статичного слідкування за швидкістю
задаючого вала»
Частина 1. Розрахунок передатної функції системи та побудова графіків характеристик АФХ, АЧХ, ФЧХ
Схема роботи пристрою :
Замінюємо похідні операторами Лапласа :
Побудуємо 3 графіки, які характеризують дану систему : АФХ, АЧХ, ФЧХ.
1. АФХ – Амплітудно-фазова характеристика
2. АЧХ – Амплітудно-частотна характеристика
3. ФЧХ – Фазо-частотна характеристика
Текст програми написаний мовою C++ із виведенням результатів у файл :
HEADER_FILE----------------------------------------------------------------------------------
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Chart.hpp>
#include <DbChart.hpp>
#include <ExtCtrls.hpp>
#include <TeEngine.hpp>
#include <TeeProcs.hpp>
#include <Series.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TDBChart *DBChart1;
TDBChart *DBChart2;
TDBChart *DBChart3;
TButton *Button1;
TLineSeries *Series2;
TLineSeries *Series3;
TLineSeries *Series1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
//Початок.Параметри системи--------------------------------------------------
double TM,T1,T2,C,KEMP,KEP,K1,K2;
//Кінець.Параметри системи---------------------------------------------------
//Початок.Змінні табулювання-------------------------------------------------
double w,wk,h,P,Q,H,Fi;
//Кінець.Змінні інтегрування-------------------------------------------------
//Початок.Додаткові змінні---------------------------------------------------
double K,D1,D2,D3;
//Кінець.Додаткові змінні----------------------------------------------------
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
CPP_FILE-----------------------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include <Math.h>
#include <vcl.h>
#pragma hdrstop
#include <fstream.h>
#include <iostream.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
using namespace std;
//Початок. Параметри системи-------------------------------------------------
TM=0.006;
T1=0.1;
T2=0.02;
C=2;
KEMP=10;
KEP=1;
K1=1.01;
K2=1;
h=0.01;
wk=400;
//Кінець. Параметри системи--------------------------------------------------
//Початок. Створюємо та відкриваємо файл для запису даних--------------------
fopen("D:\DESK_w_P_Q_H_Fi.dat","w+");
fstream DESK_w_P_Q_H_Fi("D:\DESK_w_P_Q_H_Fi.dat");
//Кінець. Створюємо та відкриваємо файл для запису даних---------------------
//Початок. Обчислюємо АФХ, АЧХ, ФЧХ------------------------------------------
for (w=0;w<=wk;w=w+h)
{
K=C*K2*K1*KEP;
D1=1+K*K2-(T1*T2+(T1+T2)*TM)*pow(w,2.0);
D2=(T1+T2+TM)*w-T1*T2*TM*pow(w,3.0);
D3=K*K1;
P=(D1*D3)/(pow(D1,2.0)+pow(D2,2.0));
Q=-1.0*(D2*D3)/(pow(D1,2.0)+pow(D2,2.0));
H=pow((pow(P,2.0)+pow(Q,2.0)),(1.0/2.0));
Fi=atan(Q/P);
if(P<0)
{
Fi=Fi-M_PI;
}
//Початок.Записуємо дані у файл----------------------------------------------
DESK_w_P_Q_H_Fi<<w<<" "<<P<<" "<<Q<<" "<<H<<" "<<Fi<<endl;
//Кінець.Записуємо дані у файл-----------------------------------------------
//Початок. Будуємо графіки АФХ, АЧХ, ФЧХ-------------------------------------
Series1->AddXY(P,Q,"",clRed);
Series2->AddXY(w,H,"",clRed);
Series3->AddXY(w,Fi,"",clRed);
//Кінець. Будуємо графіки АФХ, АЧХ, ФЧХ--------------------------------------
}
//Кінець. Обчислюємо АФХ, АЧХ, ФЧХ-------------------------------------------
//Початок.Закриваємо файл----------------------------------------------------
DESK_w_P_Q_H_Fi.close();
//Кінець.Закриваємо файл-----------------------------------------------------
}
//---------------------------------------------------------------------------
Графіки залежностей :
Графік АФХ :
Графік АЧХ :
Графік ФЧХ :
Частина 2. Розрахунок перехідного процесу в системі та побудова графіків вихідної величини і помилки системи
Текст програми написаний мовою C++ із виведенням результатів у файл :
HEADER_FILE----------------------------------------------------------------------------------
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Chart.hpp>
#include <DbChart.hpp>
#include <ExtCtrls.hpp>
#include <Series.hpp>
#include <TeEngine.hpp>
#include <TeeProcs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TDBChart *DBChart1;
TDBChart *DBChart2;
TButton *Button1;
TDBChart *DBChart4;
TLineSeries *Series1;
TDBChart *DBChart5;
TLineSeries *Series2;
TDBChart *DBChart6;
TLineSeries *Series3;
TLineSeries *Series4;
TLineSeries *Series5;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
//Початок.Параметри системи--------------------------------------------------
double TM,T1,T2,C,KEMP,KEP,K1,K2;
//Кінець.Параметри системи---------------------------------------------------
//Початок.Змінні інтегрування------------------------------------------------
double Y[4];
double tend,h,t,Tper,a;
//Кінець.Змінні інтегрування-------------------------------------------------
//Початок.Додаткові змінні---------------------------------------------------
double sw,sw2,k1,k2,k3,k4;
//Кінець.Додаткові змінні----------------------------------------------------
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
CPP_FILE-----------------------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include <Math.h>
#include <vcl.h>
#pragma hdrstop
#include <fstream.h>
#include <iostream.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//Початок. Вхідна дія-------------------------------------------------------
double WBX(double,double sw1);
double WBX(double arg,double sw1)
{
double a1,y,h1,Tper1;
a1=0.1;
Tper1=a1*2;
h1=0.00001;
if((0+sw1*Tper1-h1/2<=arg)&&(arg<a1+sw1*Tper1+h1/2))
{
y=(arg-Tper1*sw1)/a1;
};
return y;
};
//Кінець. Вхідна дія---------------------------------------------------------
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
using namespace std;
//Початок. Параметри системи-------------------------------------------------
TM=0.006;
T1=0.1;
T2=0.02;
C=2;
KEMP=10;
KEP=1;
K1=1.01;
K2=1;
h=0.00001;
a=0.1;
Tper=2*a;
tend=4*Tper;
//Кінець. Параметри системи--------------------------------------------------
//Початок. Створюємо та відкриваємо файл для запису даних--------------------
fopen("D:\DESK_t_UK_UP_WBUX_DW.dat","w+");
fstream DESK_t_UK_UP_WBUX_DW("D:\DESK_t_UK_UP_WBUX_DW.dat");
//Кінець. Створюємо та відкриваємо файл для запису даних---------------------
//Початок. Початові параметри побудови вхідної дії---------------------------
sw=0;
sw2=1;
//Кінець. Початові параметри побудови вхідної дії----------------------------
//Початок. Початкові умови---------------------------------------------------
Y[0]=0;
Y[1]=0;
Y[2]=0;
//Кінець. Початкові умови----------------------------------------------------
//Початок. Обчислюємо UK, UP, w, QBUX, DQ------------------------------------
for (t=0;t<=tend;t=t+h)
{
//Початок. Параметри побудови вхідної дії------------------------------------
if((sw2*Tper-h/2<=t)&&(t<=sw2*Tper+h/2))
{
sw=sw+1;
sw2=sw2+1;
};
//Кінець. Параметри побудови вхідної дії-------------------------------------
//Введемо позначення---------------------------------------------------------
//1.Y[0]=UK
//2.Y[1]=UP
//3.Y[2]=WBUX
//4.Y[3]=WBX-WBUX=DW
//Введемо позначення---------------------------------------------------------
//Початок. Метод Рунге-Кутта-------------------------------------------------
//Початок. Рівняння 1--------------------------------------------------------
k1=h*(K1*KEP*(K1*WBX(t,sw)-K2*Y[2])-Y[0])/T1;
k2=h*(K1*KEP*(K1*WBX(t,sw)-K2*Y[2])-(Y[0]+k1/2))/T1;
k3=h*(K1*KEP*(K1*WBX(t,sw)-K2*Y[2])-(Y[0]+k2/2))/T1;
k3=h*(K1*KEP*(K1*WBX(t,sw)-K2*Y[2])-(Y[0]+k3))/T1;
Y[0]=Y[0]+(k1+2*k2+2*k3+k4)/6;
//Кінець. Рівняння 1---------------------------------------------------------
//Початок. Рівняння 2--------------------------------------------------------
k1=h*(K2*Y[0]-Y[1])/T2;
k2=h*(K2*Y[0]-(Y[1]+k1/2))/T2;
k3=h*(K2*Y[0]-(Y[1]+k2/2))/T2;
k4=h*(K2*Y[0]-(Y[1]+k3))/T2;
Y[1]=Y[1]+(k1+2*k2+2*k3+k4)/6;
//Кінець. Рівняння 2---------------------------------------------------------
//Початок. Рівняння 3--------------------------------------------------------
k1=h*(C*Y[1]-Y[2])/TM;
k2=h*(C*Y[1]-(Y[2]+k1/2))/TM;
k3=h*(C*Y[1]-(Y[2]+k2/2))/TM;
k4=h*(C*Y[1]-(Y[2]+k3))/TM;
Y[2]=Y[2]+(k1+2*k2+2*k3+k4)/6;
//Кінець. Рівняння 3---------------------------------------------------------
//Початок. Рівняння 4--------------------------------------------------------
Y[3]=WBX(t,sw)-Y[2];
//Кінець. Рівняння 4---------------------------------------------------------
//Кінець. Метод Рунге-Кутта--------------------------------------------------
//Початок.Записуємо дані у файл----------------------------------------------
DESK_t_UK_UP_WBUX_DW<<t<<" "<<Y[0]
<<" "<<Y[1]<<" "<<Y[2]<<" "<<Y[3]<<endl;
//Кінець.Записуємо дані у файл-----------------------------------------------
//Початок. Будуємо графіки UK, UP, w, QBUX, DQ-------------------------------
Series1->AddXY(t,Y[0],"",clRed);
Series2->AddXY(t,Y[1],"",clRed);
Series3->AddXY(t,Y[2],"",clRed);
Series4->AddXY(t,WBX(t,sw),"",clRed);
Series5->AddXY(t,Y[3],"",clRed);
//КІнець. Будуємо графіки UK, UP, w, QBUX, DQ--------------------------------
}
//Кінець. Обчислюємо UK, UP, w, QBUX, DQ-------------------------------------
//Початок.Закриваємо файл----------------------------------------------------
DESK_t_UK_UP_WBUX_DW.close();
//Кінець.Закриваємо файл-----------------------------------------------------
}
//---------------------------------------------------------------------------
Графіки залежностей :
Вихідна величина :
Помилка системи :
Список основних ідентифікаторів :
Частина 1 :
Fi – фаза
w – частота
H – амплітуда
wk – кінцева частота табулювання
h – крок табулювання
TM, T1, T2, C, KEMP, KEP, K1, K2 – параметри системи
P – дійсна частина передатної функції за Лапласом
Q – уявна частина передатної функції за Лапласом
DESK_w_P_Q_H_Fi – файл для запису результатів
K, D1, D2, D3 – додаткові змінні для обрахунку P та Q
Частина 2 :
Y[4] – масив змінних інтегрування
TM, T1, T2, C, KEMP, KEP, K1, K2 – параметри системи
Tper – період
t – час інтегрування
WBX – вхідна частота
tend – кінцевий час інтегрування
sw, sw2 – перемикачі для поперіодної побудови вхідної величини
h – крок інтегрування
k1, k2, k3, k4 – коефіцієнти методу Рунне-Кутта
DESK_t_UK_UP_WBUX_DW – файл для запису результатів
Висновок : Дослідив роботу системи статичного слідкування за швидкістю
задаючого вала. Розрахував частотні характеристики АФХ, АЧХ, ФЧХ та побудув їх графіки. Проінтегрував систему диференціальних рівнянь системи та побудував графіки вихідної частоти і помилки системи. Система намагається змусити вал обертатися із заданою частотою. Графік вихідної частоти свідчить про правильну роботу системи, оскільки повторює вхідну частоту, а отже і про вірно розв’язане поставлене завдання.