1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài tập lớn mô HÌNH hóa và mô PHỎNG

17 98 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 17
Dung lượng 550,18 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

2 1.XẬY DỰNG HÀM TRUYỀN-THIẾT LẬP PHƯƠNG TRÌNH SAI PHÂN ..... 2 ĐỀ BÀI: Dùng máy tính khảo sát quá trình quá độ của hệ điều khiển tự động.. Chương trình có thể viết bằng ngôn ngữ C/C++,

Trang 1

1

MỤC LỤC

ĐỀ BÀI: 2

1.XẬY DỰNG HÀM TRUYỀN-THIẾT LẬP PHƯƠNG TRÌNH SAI PHÂN 2

2.CODE CHƯƠNG TRÌNH MÔ PHỎNG – C# 4

3.IN KẾT QUẢ ĐƯỜNG CONG QUÁ ĐỘ 11

5.IN KẾT QUẢ Y[K] 14

6.CÁC CHỈ TIÊU CHẤT LƯỢNG CỦA HỆ THỐNG 16

7.NHẬN XÉT: 17

8.TÀI LIỆU THAM KHẢO: 17

Trang 2

2

ĐỀ BÀI:

Dùng máy tính khảo sát quá trình quá độ của hệ điều khiển tự động

Yêu cầu:

1 Chương trình có thể viết bằng ngôn ngữ C/C++,visual,VB,matlab,

2 Cho phép người dùng nhập các tham số T1,T2,T3,K1,K2,K3,

3 Cho phép người dùng nhập bước cắt mẫu T

4 Hiển thị đường cong quá độ trên trục có khắc tọa độ để đánh giá tính ổn định của hệ thống

5 Thể hiện được các chỉ tiêu như ymax , max (%), yod,Tmax ,Tod… trên đồ thị

6 In ra màn hình 100 điểm y[k] ( cứ 10 điểm in 1 giá trị)

1.XẬY DỰNG HÀM TRUYỀN-THIẾT LẬP PHƯƠNG TRÌNH SAI PHÂN

Hàm truyền kín của hệ thống là:

𝑊(𝑠) =

𝐾1

𝑇1𝑠 + 1

𝐾2

𝑇2𝑠 + 1

1 + 𝐾1 𝐾2 𝐾3 (𝑇1𝑠 + 1)(𝑇2𝑠 + 1)

(𝑇1𝑠 + 1)(𝑇2𝑠 + 1) + 𝐾1𝐾2𝐾3

𝑇1𝑇2𝑠2+ (𝑇1+ 𝑇2)𝑠 + 𝐾1𝐾2𝐾3+ 1

Trang 3

3

Thay 𝑠 = 2

𝑇.𝑧−1

𝑧+1 vào hàm W(s) ta có:

2

𝑇 .

𝑧 − 1

𝑧 + 1)

𝑇1𝑇2 ( 2 𝑇 𝑧 − 1 𝑧 + 1)

2 + (𝑇1+ 𝑇2) ( 2 𝑇 𝑧 − 1 𝑧 + 1) + 𝐾1𝐾2𝐾3+ 1

2(𝑧 + 1)2 4𝑇1𝑇2(𝑧 − 1)2+ (𝐾1𝐾2𝐾3+ 1)𝑇2(𝑧 + 1)2+ 2(𝑇1+ 𝑇2)𝑇(𝑧 + 1)(𝑧 − 1) Biến đổi về dạng:

𝑌(𝑧) 𝑈(𝑧) =

𝐾1𝐾2𝑇2(𝑧2+ 2𝑧 + 1)

𝐴𝑧2+ 𝐵𝑧 + 𝐶 Trong đó:

𝐴 = 4𝑇1 𝑇2+ 2𝑇(𝑇1 + 𝑇2) + (𝐾1𝐾2𝐾3+ 1)𝑇2

𝐵 = −8𝑇1 𝑇2+ 2𝑇2(𝐾1𝐾2𝐾3+ 1)

𝐶 = 4𝑇1 𝑇2− 2𝑇(𝑇1 + 𝑇2) + (𝐾1𝐾2𝐾3+ 1)𝑇2

 Az2Y(z) + BzY(z) + CY(z) = K1K2T2 [z2U(z) + 2zU(z) + U(z)]

Dùng tính chất dịch hàm gốc cả biến đổi Z ta tìm được phương trình sai phân tương ứng:

 AY[k+2] + BY[k+1] + CY[k] = K1K2T2 (U[k+2] + 2 U[k+1] + U[k])

Vì tín hiệu vào là tín hiệu nhảy cấp U(t) = 1(t) nên ta có:

U[k+2] = U[k+1] = U[k] = 1

 AY[k+2] + BY[k+1] + CY[k] = 4K1K2T2

 Y[k+2] = (4K1K2T2 – BY[k+1] – CY[k]) /A

Từ đó ta có công thức tính các giá trị đáp ứng y(t) như sau:

y[0] = y[1] = 0;

y[k+2] = (4K1K2T2 – By[k+1] – Cy[k]) /A;

k=0, 1, 2…999; A, B, C là các hằng số đã tính ở trên

Trang 4

4

2.CODE CHƯƠNG TRÌNH MÔ PHỎNG – C#

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace test

{

public partial class Form1 : Form

{

private Graphics graph;

private int x0, y0, xMax, yMax; // tọa độ gốc O, xMax, yMax

private int min, max;

private int delta_x=30;

private int delta_y=30; // độ lệch trục tọa độ khi vẽ

private double dx, x, y;

private float x1, y1, x2, y2;

private bool OnDinh = true;

private float K1, K2, K3, T1, T2, T; //thông số đầu vào

private float Tmin;

private float ymax, yod, x_ymax, Tod, Tmax, xicma; //Thông số đầu ra cần tính toán private int x_Tod; // Xác định tọa độ của Tod;

private float unit_x, unit_y; // Độ chia để vẽ đồ thị

private float A, B, C;

public Form1()

{

InitializeComponent();

graph = DrawArea.CreateGraphics();

Trang 5

5

xMax = DrawArea.Width;

yMax = DrawArea.Height;

x0 = 0;

y0 = DrawArea.Height;

}

private void button1_Click(object sender, EventArgs e)

{

int sopt = 1000;

graph.Clear(Color.White);

float[] y = new float[sopt];

PointF[] pnt = new PointF[sopt];

Pen blackPen = new Pen(Color.Black, 1);

Pen redPen = new Pen(Color.Red, 1);

Pen greenPen = new Pen(Color.Green, 3);

int index = 0;

for (int i = 0; i < 100; i++)

{

// 100 chỉ số điểm y[k] cần in ra

comboBox_item.Items.Add(index);

index += 10;

}

listBox1.Items.Clear(); // phải xóa rỗng listbox mỗi lần cập nhật lại đồ thị

// Kiểm tra nhập thông số hợp lệ hay không

if (float.TryParse(textBoxK1.Text, out K1) && float.TryParse(textBoxK2.Text, out K2)

&& float.TryParse(textBoxT2.Text, out T2) && float.TryParse(textBoxT1.Text, out T1) && float.TryParse(textBoxT.Text, out T)

&& float.TryParse(textBoxT2.Text, out K3))

{

if (T1 < T2) { Tmin = T1/20; }

else { Tmin = T2 / 20; }

if (T > Tmin)

{ MessageBox.Show("Xin nhập lại chu kỳ trich mẫu T, T<= (1/20) Min(T1,T2) !"); } // chu kỳ trích mẫu

else

{

A = 4 * T1 * T2 + 2*T*(T1+T2) + (1 + K1 * K2 * K3) *T*T;

B = (-8*T1*T2 +(2 +2*K1*K2*K3) *T*T);

C = 4*T1*T2 - 2*T*(T1+T2) + T*T*(1 + K1 *K2 *K3);

Trang 6

6

float a0 = (1 + K1 * K2 * K3);

float a1 = (T1 + T2);

float a2 = (T1 * T2);

//Kiem tra tinh on dinh he thong theo tieu chuan Hurwits

if ((a1 > 0) && (a2 > 0)) { OnDinh = true; }

else OnDinh = false;

y[0] = 0; y[1] = 0;

ymax = y[1];

float ymin = 0;

for (int i = 0; i < (sopt - 2); i++)

{

y[i + 2] = (4*K1*K2*T*T - B *y[i+1] - C* y[i]) / A;

if (ymax < y[i]) { ymax = y[i]; x_ymax = i; } // Tìm vị trí và giá trị của ymax

if (ymin > y[i]) { ymin = y[i]; }

}

if (ymin < 0) { y0 = DrawArea.Height / 2; }

// ymin dùng để vẽ trục tọa độ khi có giá trị y âm!!! => có thể hệ thống ko ổn định

else { y0 = DrawArea.Height; }

//=== Tính toán lại độ chia để đồ thị nằm chọn trong "gọn" trong picturebox

unit_x = (DrawArea.Width - 3 * delta_x) / (T * 1000);

unit_y = (y0 - 3 * delta_y) / ymax;

for (int j = 0; j <= (sopt - 1); j++)

{ // Cập nhật các điểm đồ thị ->pnt

float toado_x = +j * T;

float toado_y = y[j];

pnt[j].X = (float)(delta_x + toado_x * unit_x);

//nhân với độ chia để full màn hình pnt[j].Y = (float)( y0 - toado_y * unit_y - delta_y);

if (j % 10 == 0)

{ //Lấy 4 chữ số sau dấu phẩy

int tmp = (int)(y[j] * Math.Pow(10, 4));

float _item = (float)(tmp / Math.Pow(10, 4));

listBox1.Items.Add(_item); // Cứ 10 phần tử thì thêm y[] vào listbox }

// listBox1.DataSource = y; add cả mảng y

// listBox1.Items.Add(y[0]); add từng phần tử

}

Trang 7

7

VeTrucToaDo(); // Vẽ trục tọa độ

graph.DrawLines(greenPen, pnt); // Vẽ đồ thị

// Vẽ vạch chia hoành độ

Font f = new Font("Tahoma", 12);

Brush b = new SolidBrush(Color.Red);

float chi_so = 0;

for (int i = 0; i < 10; i++)

{ chi_so += 100;

graph.DrawLine(blackPen, delta_x + chi_so * T * unit_x, y0 - delta_y - 3, delta_x + chi_so * T * unit_x, y0 - delta_y + 3);

graph.DrawString(chi_so.ToString(), f, b, delta_x + (chi_so - 15) * T * unit_x, y0

- 20);

}

if (OnDinh)

{

//==============Tính thời gian hệ thống bắt đầu ổn định

int k = 999;

do

{

Tod = k * T; // Thời gian ổn định

k;

x_Tod = k;

}

while ((Math.Abs((y[k] - y[999]) / y[999]) <= 0.05) && (k >= x_ymax));

k = 999;

do

{ k; }

while (Math.Abs((y[k] - (1 / K2)) / (1 / K2)) <= 0.01);

yod = 0;

for (int i = k; i < 1000; i++)

{

yod += y[i];

}

yod = yod / (999 - k + 1);

xicma = Math.Abs(ymax - yod) * 100 / yod;

Tmax = x_ymax * T;

// Đưa ra các thông số đầu ra

textBoxHT.Text = "Ổn định";

textBoxTod.Text = Tod.ToString();

textBoxYod.Text = yod.ToString();

Trang 8

8

textBoxTmax.Text = Tmax.ToString();

textBoxYmax.Text = ymax.ToString();

textBoxxicma.Text = xicma.ToString();

// Vẽ gióng tọa độ của ymax

float toa_do_x = delta_x;

float toa_do_y = y0 - ymax * unit_y - delta_y;

do

{

graph.DrawLine(blackPen, toa_do_x, y0 - ymax * unit_y - delta_y, toa_do_x +

3, y0 - ymax * unit_y - delta_y); //giong ngang

toa_do_x += 6;

} while (toa_do_x <= delta_x + x_ymax * T * unit_x);

do{

graph.DrawLine(blackPen, delta_x + x_ymax * T * unit_x, toa_do_y, delta_x + x_ymax * T * unit_x, toa_do_y +3); //doc

toa_do_y +=6;

} while (toa_do_y <= y0 - ymax * unit_y - delta_y);

graph.DrawString("Ymax=" + ymax.ToString(), f, b, delta_x + x_ymax * T * unit_x, y0 - ymax * unit_y - 2 * delta_y);

// Vẽ gióng yod

toa_do_x = delta_x;

do

{

graph.DrawLine(blackPen, toa_do_x, y0 - delta_y - yod * unit_y, toa_do_x +3, y0 - delta_y - yod * unit_y);

graph.DrawLine(blackPen, toa_do_x, y0 - delta_y - yod * unit_y * 1.05F, toa_do_x + 3, y0 - delta_y - yod * unit_y * 1.05F);

graph.DrawLine(blackPen, toa_do_x, y0 - delta_y - yod * unit_y * 0.95F, toa_do_x + 3, y0 - delta_y - yod * unit_y * 0.95F);

toa_do_x += 6;

} while (toa_do_x <= (xMax - 2 * delta_x));

graph.DrawString("Yod=" + yod.ToString(), f, b, xMax - 7 * delta_x, y0 - delta_y

- yod * unit_y * 1.1F);

//Vẽ gióng Tod

toa_do_y = y0 - delta_y - y[x_Tod] * unit_y;

do

{

graph.DrawLine(blackPen, delta_x + x_Tod * T * unit_x, toa_do_y, delta_x + x_Tod * T * unit_x, toa_do_y + 3);

Trang 9

9

toa_do_y += 6;

} while (toa_do_y <= (y0-delta_y));

graph.DrawString("Tod=" + x_Tod.ToString(), f, b, delta_x + x_Tod * T * unit_x + 10, y0 - 2*delta_y);

chi_so = ymax / 5;

int _tmp = (int)(chi_so * Math.Pow(10, 1));

chi_so = (float)(_tmp / Math.Pow(10, 1));

float tmp2 = chi_so;

for (int i = 0; i <= 15; i++)

if ((chi_so>0) && (chi_so<ymax))

{

graph.DrawLine(blackPen, delta_x - 3, yMax - chi_so * unit_y - delta_y,

delta_x + 3, yMax - chi_so * unit_y - delta_y);

_tmp = (int)(chi_so * Math.Pow(10, 1));

chi_so = (float)(_tmp / Math.Pow(10, 1));

graph.DrawString(chi_so.ToString(), f, b, delta_x - 30, yMax - chi_so * unit_y - delta_y-10);

chi_so += tmp2;

}

} else

{ textBoxTod.Text = "N/A";

textBoxHT.Text = "Không ổn định";

textBoxYod.Text = "N/A";

textBoxTmax.Text = "N/A";

textBoxYmax.Text = "N/A";

textBoxxicma.Text = "N/A";

}

}

}

else

MessageBox.Show("Xin chỉ nhập dữ liệu dạng số!");

}

//============================================//

private void VeTrucToaDo()

{ Pen p = new Pen(Color.Black, 2);

graph.DrawLine(p, delta_x, y0 - delta_y, xMax - 2, y0 - delta_y);//truc hoanh

graph.DrawLine(p, delta_x, 4, delta_x, yMax - delta_y);//truc tung

MuiTen(graph, new Pen(Color.Black), new PointF((float)(xMax - 2.5), (float)(y0 -

delta_y)), new PointF((float)(xMax - 2), (float)(y0 - delta_x))); //mui ten Ox

MuiTen(graph, new Pen(Color.Black), new PointF((float)delta_y, (float)0), new

PointF((float)delta_y, (float)(-2.5))); //mui ten Oy

Trang 10

10

VeOXY();

}

//============================================//

private void VeOXY()

{ Font f = new Font("Tahoma", 12);

Brush b = new SolidBrush(Color.Black);

graph.DrawString("O", f, b, x0, y0 - delta_y);

graph.DrawString("T", f, b, xMax - 20, y0 - 18);

graph.DrawString("Y", f, b, x0 + 3, 5);

}

//============================================//

public static void MuiTen(Graphics graphics, Pen p, PointF diemDau, PointF diemCuoi) { Pen myPen = new Pen(Color.Black);

myPen.Width = 5;

myPen.EndCap = LineCap.ArrowAnchor;

PointF endPoint = new PointF((diemDau.X + diemCuoi.X) / 2, (diemDau.Y +

diemCuoi.Y) / 2);

graphics.DrawLine(myPen, diemDau, endPoint);

}

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)

{ // Đưa chỉ số của y ra comboBox

comboBox_item.Text = ((listBox1.SelectedIndex) * 10).ToString();

}

private void comboBox_item_SelectedIndexChanged(object sender, EventArgs e)

{

listBox1.SelectedIndex =int.Parse(comboBox_item.Text ) /10;

}

}

}// END OF PROGRAM

Trang 11

11

*GIAO DIỆN CHƯƠNG TRÌNH:

Khung bên trái, phần “NHẬP THAM SỐ” là để nhập các tham số K1, K2, K3,T1, T2,T

Sau khi nhập xong ấn “VẼ VÀ KIỂM TRA ĐẶC TÍNH HỆ THỐNG” để vẽ đồ thị

và tính toán các chỉ tiêu chất lượng và in ra các gị trị của y[k]

3.IN KẾT QUẢ ĐƯỜNG CONG QUÁ ĐỘ

Chọn bộ thông số: K1=4; K2=5; K3=2; T1=2; T2=3; T=0.01

Giao diện chương trình sau khi mô phỏng:

Trang 12

12

Đồ thị:

Trang 13

13

Trục x thể hiện giá trị T (1000 lần chu kỳ trich mẫu)

Trục y thể hiện giá trị của y(t) theo T

4.MÔ PHỎNG TRÊN MATLAB

Sơ đồ simulink:

Lệnh vẽ đồ thị:

>> figure(1)

>> plot(ScopeData.time,ScopeData.signals.values)

>> grid on

Đường cong quá độ thu được qua Matlab:

Trang 14

14

Nhận xét:

Đồ thị thu được bằng chương trình mô phỏng có dạng giống với đồ thị mô phỏng bởi Matlab Như vậy, nếu bỏ qua sai số không thể tránh khỏi trong quá trình

mô phỏng, chúng ta có thể kiểm chứng được phương pháp tìm phương trình sai phân của hệ thống, và tính toán của chương trình mô phỏng là đúng

5.IN KẾT QUẢ Y[K]

In ra màn hình kết quả y[k], cách 10 số in 1 lần

Sử dụng listbox để đưa ra 100 giá trị, cứ 10 giá trị thì add phần tử đó vào listbox

y[10]=0.0145 y[260]=0.3254 y[510]=0.4337 y[760]=0.4703

y[20]=0.0587 y[270]=0.3475 y[520]=0.4435 y[770]=0.4744

Trang 15

15

y[30]=0.1274 y[280]=0.377 y[530]=0.4555 y[780]=0.479

y[40]=0.214 y[290]=0.4113 y[540]=0.4686 y[790]=0.4839

y[50]=0.3116 y[300]=0.4479 y[550]=0.4819 y[800]=0.4886

y[60]=0.4128 y[310]=0.4841 y[560]=0.4945 y[810]=0.4928

y[70]=0.5109 y[320]=0.5176 y[570]=0.5056 y[820]=0.4964

y[80]=0.5996 y[330]=0.5466 y[580]=0.5147 y[830]=0.4991

y[90]=0.6738 y[340]=0.5693 y[590]=0.5213 y[840]=0.5009

y[100]=0.7301 y[350]=0.5849 y[600]=0.5251 y[850]=0.5016

y[110]=0.766 y[360]=0.593 y[610]=0.5263 y[860]=0.5014 y[120]=0.7809 y[370]=0.5935 y[620]=0.5248 y[870]=0.5003 y[130]=0.7754 y[380]=0.5871 y[630]=0.521 y[880]=0.4984 y[140]=0.7517 y[390]=0.5747 y[640]=0.5153 y[890]=0.496

y[150]=0.7126 y[400]=0.5576 y[650]=0.5083 y[900]=0.4933 y[160]=0.662 y[410]=0.5373 y[660]=0.5005 y[910]=0.4904 y[170]=0.6041 y[420]=0.5154 y[670]=0.4925 y[920]=0.4875 y[180]=0.5432 y[430]=0.4935 y[680]=0.4848 y[930]=0.4849 y[190]=0.4835 y[440]=0.4729 y[690]=0.4779 y[940]=0.4827 y[200]=0.4289 y[450]=0.4579 y[700]=0.4722 y[950]=0.481

Ngày đăng: 05/04/2020, 20:58

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w