Báo cáo TN Kỹ thuật điều khiển

61
Bài 1: ĐIỀU KHIỂN CÁC PHẦN TỬ KHÍ NÉN I) Phân biệt các loại cảm biến: Cảm biến quang: khi đưa bất cứ vật nào che đầu cảm biến thì cảm biến sẽ lên mức 1. Càm biến điện dung: khi đưa một vật bất kì lại thật gần thì cảm biến sẽ lên mức 1. Cảm biến điện cảm : chỉ lên mức 1 khi đưa vật bằng kim loại lại gần. II) Các ví dụ chương trình mẫu: 1)Thí nghiệm 1C: Viết chương trình điếu khiển xi lanh I,mỗi khi nhấn SW2 xi lanh I đẩy ra,sau 2 s thì xi lanh tự đẩy vào Chương trình LADDER: Chương trình danh sách lệnh //Cho phép tự động giữ khi nhấn SW2,cho xilanh I đẩy ra,và dừng khi timer 1 on LD 00004 1 100 0 TIM1 #002 0 0000 4 1000 1000 1000 100 1 TIM1 SW2

description

Báo cáo TNKTĐK Đại học BK

Transcript of Báo cáo TN Kỹ thuật điều khiển

Page 1: Báo cáo TN Kỹ thuật điều khiển

Bài 1: ĐIỀU KHIỂN CÁC PHẦN TỬ KHÍ NÉN

I) Phân biệt các loại cảm biến: Cảm biến quang: khi đưa bất cứ vật nào che đầu cảm biến thì cảm biến sẽ

lên mức 1. Càm biến điện dung: khi đưa một vật bất kì lại thật gần thì cảm biến sẽ lên

mức 1. Cảm biến điện cảm : chỉ lên mức 1 khi đưa vật bằng kim loại lại gần.

II) Các ví dụ chương trình mẫu:1)Thí nghiệm 1C: Viết chương trình điếu khiển xi lanh I,mỗi khi nhấn SW2 xi lanh I đẩy

ra,sau 2 s thì xi lanh tự đẩy vàoChương trình LADDER:

Chương trình danh sách lệnh //Cho phép tự động giữ khi nhấn SW2,cho xilanh I đẩy ra,và dừng khi

timer 1 onLD 00004OR 1000AND NOT TIM 001OUT 1000//Khởi động Timer 1 khi xi lanh I bắt đầu đẩy raLD 1000TIM 001

1

1000

TIM1#0020

00004

1000

1000

1000

1001

TIM1

SW2

Page 2: Báo cáo TN Kỹ thuật điều khiển

#0020//Thiết lập 2 trạng thái đẩy ra và thu vào là ngược nhauLD NOT 1000

OUT 1001

2)Thí nghiệm 1E: Viết chương trình điều khiển sao cho khi nhấn SW2 ,thì 2 xi lanh I và J luân

phiên đẩy ra và vào với chu kì 4s,khi nhấn SW3 thì dừngChương trình LADDER

Chương trình danh sách lệnh//Tạo ra 1 biến trung gian tự giữ (AUTO) khi nhấn SW2

LD 00004OR 1007LD NOT 00005OUT 1007

2

1007

TIM0#0040

00004

1007

1007

1000

1001

00005

TIM0

TIM0

1000

1002

1007

1007 TIM1

TIM0TIM1#0040

Page 3: Báo cáo TN Kỹ thuật điều khiển

//Dùng timer 0 có chu kì 4s để cho phép xi lanh I và J đẩy ra tuần tự nhauLD 1007AND NOT TIM 000OUT 1000LD 1007AND TIM 000OUT 1002

//Thiết lập chế độ đẩy ra và thu vào của xi lanh I ngược nhauLD 1000AND 1007OUT 1001

//Tạo ra xung chu kì 8s (ON 4s và OFF 4s) cho timer 0LD 1007AND NOT TIM 001TIM 000

#0040LD 1007AND TIM 000TIM 001

#0040

3)Thí nghiệm 2D: (mở rộng của 2A,2B,2C):-Viết chương trình phân loại chai bia,nếu gặp chai lỗi thì cho xi lanh I đẩy ra để đưa chai lỗi về băng chuyền để sửa chữa,khi đủ 12 chai thì xi lanh J được đẩy từ trên xuống để đóng nút chai.-Dây truyền có dùng cảm biến quang để phát hiện lỗi kẹt chai,nếu quá 30s

ma cảm biến quang ko phát hiện được chai đi qua sẽ hú còi báo động-Nếu bị mất điện thì bộ đếm số chai sẽ không thay đổi và khi có điện thì vẫn

hoạt động bình thường

3

Page 4: Báo cáo TN Kỹ thuật điều khiển

Chương trình LADDER:

4

1007

00004

1007

00005

1007 0001 0002

1000

TIM0#0020

1000

TIM0

1000

CB1 CB2

AUTOSW3SW2

Page 5: Báo cáo TN Kỹ thuật điều khiển

Chương trình danh sách lệnh://Tạo ra 1 biến trung gian tự giữ (AUTO) khi nhấn SW2

LD 00004OR 1007LD NOT 00005OUT 1007

//Khi băng chuyền bắt đầu hoạt động,nếu cảm biến quang báo có chai đi ngang (CB1 ON) và cảm biến dung báo chai lỗi (CB2 ON) thì cho xi lanh I hoạt động trong 2 s để đẩy chai lỗi ra.

LD 10075

1007

CNT1

0001

1002

TIM2#0040

1002

0002 CNT 1

R 12

CNT1

1002

1000

1001

1007

TIM2

1007 0001TIM3#0300

TIM3

1004

HORN

Page 6: Báo cáo TN Kỹ thuật điều khiển

OR 1000AND 0001AND 0002AND NOT TIM 0OUT 1000LD 1000TIM 000

#0020LD NOT 1000AND 1007OUT 1001

//khi băng chuyền hoạt động,cảm biến quang báo có chai đi ngang(CB1 ON) và cảm biến dung không báo lỗi chai thì ta bắt đầu đếm số chai xuống.Khi số chai đếm xuống bằng 0(đủ 12 chai) thì reset số chai đếm về 12

LD 1007AND 0001AND NOT 0002LD CNT1CNT 001

12//Khi đã đủ 12 chai thì cho xi lanh J hoạt động (trong 4s) để đóng nắp chai

LD CNT1OR 1002AND NOT TIM 002OUT 1002LD 1002TIM 002

#0040//Thiết lập chế độ báo động còi khi có lỗi kẹt chai:khi băng chuyền hoạt động,và cảm biến quang chưa xác định có chai tới thì ta sẽ cho timer 3 chạy,nếu sau 30s mà không có chai đi ngang (tức bị kẹt chai) timer 3 sẽ on và hú còi báo

LD 1007AND NOT 0001TIM 003

#0300LD TIM3OUT 1004

III) Thực hiện phương án được giao:Khi nhấn Start (SW2) , hệ thống sẽ thực hiện một cách tuần tự các

bước sau: 1/ xi lanh I đẩy ra

6

Page 7: Báo cáo TN Kỹ thuật điều khiển

2/ xi lanh J đẩy ra 3/ xi lanh K đẩy ra 4/ xi lanh I,J thu vào

5/ xi lanh K thu vào 6/ xi lanh K đẩy ra 7/ xi lanh J đẩy ra

8/ xi lanh I đẩy ra 9/ xi lanh J,K thu vào

10/ xi lanh I thu vào11/ tắt hệ thống

Mỗi bước cách nhau 1sKhi nhấn Stop (SW3) hệ thống dừng lại.

7

Page 8: Báo cáo TN Kỹ thuật điều khiển

Chương trình Ladder:

8

1007

00004

1007

00005

1007TIM1#0010

TIM11

1007TIM2#0020

1007TIM3#0030

1007TIM4#0040

1007TIM5#0050

1007TIM6#0060

1007TIM7#0070

1007TIM8#0080

1007TIM9#0090

SW2 SW3AUTO

Page 9: Báo cáo TN Kỹ thuật điều khiển

Chương trình danh sách lệnh://Tạo ra 1 biến trung gian tự giữ (AUTO) khi nhấn STAR(SW2),biến tự giữ này

sẽ tắt khi nhấn STOP (SW3) hoặc hệ thống đã chạy xong các bước (timer 11 on)LD 00004OR 1007LD NOT 00005AND NOT TIM 11OUT 1007

//Khi hệ thống đã bắt đầu hoạt động,ta kích cho các timer chạy,mỗi timer tương ứng với mỗi mốc thời gian bắt đầu các bước

LD 1007TIM 001

#0010

9

1007TIM10#0100

1007TIM11#0110

TIM1 TIM4

TIM8 TIM10

1000

1000

1001

1007

TIM2 TIM4

TIM7 TIM9

1002

TIM3 TIM5

TIM6 TIM9

1003

Page 10: Báo cáo TN Kỹ thuật điều khiển

LD 1007TIM 002

#0020………..LD 1007TIM 011

#0110//dựa vào yêu cầu ta có xi lanh I sẽ đẩy ra khi timer 1 ON và thu vào khi

timer 4 ON,và lại đẩy ra khi timer 8 ON thu vào khi timer 10 ONLD TIM1AND NOT TIM4OUT 1000LD TIM8AND NOT TIM10OUT 1000LD 1007AND NOT 1000OUT 1001

//Tương tự ta có xi lanh J đẩy ra khi timer 2 ON và thu vào khi timer 4 ON,tiếp tục đẩy ra khi timer 7 ON,thu vào khi timer 9 ON

LD TIM2AND NOT TIM4OUT 1002LD TIM7AND NOT TIM9OUT 1002

//Tương tự ta có xi lanh K đẩy ra khi timer 3 ON và thu vào khi timer 5 ON,tiếp tục đẩy ra khi timer 6 ON,thu vào khi timer 9 ON

LD TIM3AND NOT TIM5OUT 1003LD TIM6AND NOT TIM9OUT 1003

Nhận xét: hệ thống hoạt động đúng theo yêu cầu.

10

Page 11: Báo cáo TN Kỹ thuật điều khiển

Bài 2: ĐIỀU KHIỂN DÙNG PLC OMRON

I) Các chương trình ví dụ mẫu:Thí nghiệm 7: dây chuyền chạy sau khi nhấn nút STAR 5s, đóng đủ 10

thùng thì dừng, có nút PAUSE để tạm dừng chương trìnhChương trình LADDER:

11

20000

00001

20000

20000

00002

STAR STOP

TIM1#0050

AUTO

20001

KEEP(11) 20002

TIM1 00003

PAUSE

S

R20002

20002

IL(02)

10001 TIM1

10000

Page 12: Báo cáo TN Kỹ thuật điều khiển

Chương trình danh sách lệnh://thiết lập chế độ tự giữ khi nhấn STAR

LD 0000112

CNT0 TIM1

CNT 0 #0010

10001

00000

00007

00007

END

CNT0CNTR(12)

#001025314

20000

25313

CMP(20)#0010

25506

20001

IL(03)

Page 13: Báo cáo TN Kỹ thuật điều khiển

OR 20000AND NOT 00002OUT 20000

//Cho timer 1 chạy để delay 5s sau khi nhấn STARLD 20000TIM 001

#0050//thiết lập chế độ PAUSE dùng địa chỉ 20002 để làm biến trung gian

LD TIM1AND 00003LD TIM1AND 20002KEEP 20002

//Sử dụng địa chỉ 20002 để làm điều kiện cho hàm khóa đoạn chương trìnhLD 20002IL

//Bắt đầu đoạn chương trình trong hàm khóa//Nếu đã delay đủ 5s và băng tải thùng dừng thì cho băng tải táo chạy

LD TIM1AND NOT 10001OUT 10000

//khi công tắc hành trình ON,báo thùng đã đến đúng vị trí thì reset counter đếm táo và dùng cảm biến táo để đếm số táo đi qua

LD 00000LD NOT 00007CNT 000

#0010//băng tải thùng sẽ chạy khi timer 5s đã ON và công tắc hành trình không ON(tức thùng chưa đến đúng vị trí để bỏ táo vào) hoặc băng tài thùng sẽ chạy khi táo đã bỏ đủ (CNT0 ON),

LD CNT0OR NOT 00007AND TIM1OUT 10001

//Mỗi lần đã bỏ xong 1 thùng táo (CNT0 ON) thì cho counter đếm thùng tăng thêm 1 và dùng biến trung gian chạy chương trình (20000) để reset counter đếm thùng(mỗi lần hệ thống hoạt động lại thì reset counter)

LD CNT0LD 25314LD 20000CNTR 0000 #0010

//thiết lập giá trị so sánh liên tục cho counter đếm thùngLD 25313

13

Page 14: Báo cáo TN Kỹ thuật điều khiển

CMP 00000#0010//dừng hệ thống khi bộ so sánh báo đã đếm đủ 10 thùng (25506 ON)

LD 25506OUT 20001

//dừng đoạn chương trình trong hàm khóaILC

II) Thực hiện phương án được giao:Sau khi nhấn Start, hệ thống sẽ tự động đóng gói 1 thùng 5 táo. Sau đó hệ

thống nghỉ trong 10s. Kế tiếp đóng liên tục 3 thùng theo thứ tự gồm 3 táo, 2 táo và 1 táo. Hệ thống sẽ dừng hoàn toàn sau khi thực hiện xong tất cả các bước trên hoặc khi ta nhấn Stop.

Khi hệ thống đang trong trạng thái dừng, nếu ta nhấn Start, hệ thống sẽ thực hiện lại tất cả công việc theo thứ tự như trên.

Chương trình LADDER:

14

Page 15: Báo cáo TN Kỹ thuật điều khiển

15

Page 16: Báo cáo TN Kỹ thuật điều khiển

16

Page 17: Báo cáo TN Kỹ thuật điều khiển

17

Page 18: Báo cáo TN Kỹ thuật điều khiển

Chương trình danh sách lệnh://Để giải quyết bài toán ta chia bài toán ra làm 2 giai đoạn,giai đoạn sau khi nhấn START và giai đoạn sau khi TIMER 0 ON tức là sau khi ngừng hệ thống 10s //giai đoạn đầu sẽ chạy với biến tự giữ 20000//giai đoạn sau sẽ chạy với biến timer 0

LD 000.01OR 200.00AND NOT 000.02AND NOT TIM001OUT 200.00

//thiết lập điều kiện cho băng tải táo chạy:+biến hoạt động của giai đoạn 1 hoặc 2 đã ON (20000 và TIMER 0

ON)+băng tải thùng phải đang dừngLD 200.00AND NOT 100.01LD NOT 200.01OR TIM000

18

Page 19: Báo cáo TN Kỹ thuật điều khiển

AND LDOUT 100.00

//thiết lập các Counter đếm số thứ tự thùng tới (1..4) và Counter đếm số táo cho mỗi thùng:

LD 000.00 //Counter 7 đếm 5 táo cho thùng 1LD NOT 000.07CNT 007 005

LD CNT020 //Counter 8 đếm 3 táo cho thùng 2AND 000.00LD NOT 000.07CNT 008 003

LD CNT002 //Counter 9 đếm 2 táo cho thùng 3AND 000.00LD NOT 000.07CNT 009 002

LD CNT003 //Counter 10 đếm 1 táo cho thùng 4AND 000.00LD NOT 000.07CNT 010 001

LD 000.07 //Counter 20 ON khi đã có 2 thùng quaLD 000.01CNT 020 002

LD 000.07 //Counter 2 ON khi đã có 3 thùng quaLD 000.01CNT 002 003

LD 000.07 //Counter 3 ON khi đã có 4 thùng quaLD 000.01CNT 003 004

//Thiết lập điều kiện chạy cho băng tải thùng: gồm 5 điều kiện tương ứng cho từng trường hợp

LD NOT 200.01AND CNT007OR NOT 000.07OR CNT008OR CNT009OR CNT010

19

Page 20: Báo cáo TN Kỹ thuật điều khiển

AND 200.00OUT 100.01

//Thiết lập Timer0 để Delay hệ thống 10s sau khi đã đóng xong thùng thứ 1 (ở đây mô phỏng chỉ 2s)

LD CNT020TIM 000 020OUT 200.01

//Sau khi đã đóng xong tất cả các thùng thì cho biến 20003 ON và kích hoạt Timer1. Sau thời gian 2s, hệ thống sẽ dừng hoàn toàn và chờ nhấn START để khởi động lại.

LD CNT010OR 200.03AND NOT TIM001OUT 200.02LD 200.02OUT 200.03

LD 200.03TIM 001 020END

Nhận xét: hệ thống trên Board thí nghiệm hoạt động đúng như yêu cầu

Bài 3: ĐIỀU KHIỂN NHIỆT ĐỘ BẰNG 20

Page 21: Báo cáo TN Kỹ thuật điều khiển

CÁC PHƯƠNG PHÁP ĐIỀU KHIỂN CỔ ĐIỂN

I) Đoạn chương trình mẫu:// Sự kiện khi khởi động chương trìnhBOOL CBai3_3Dlg::OnInitDialog(){

CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this automaticallyCPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icondc.DrawIcon(x, y, m_hIcon);

}else{

CDialog::OnPaint();}

}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CBai3_3Dlg::OnQueryDragIcon(){

return (HCURSOR) m_hIcon;}

// Sự kiện khi nhấn nút Settingvoid CBai3_3Dlg::OnSetting() {

// TODO: Add your control notification handler code hereCSetting setting;setting.DoModal();

}/////////////////////////////////////////////////////////////////////////////// CSetting dialogCSetting::CSetting(CWnd* pParent /*=NULL*/)

: CDialog(CSetting::IDD, pParent){

//{{AFX_DATA_INIT(CSetting)21

Page 22: Báo cáo TN Kỹ thuật điều khiển

m_Db = 0.5;m_T0 = 1000;m_Temp = 80;//}}AFX_DATA_INIT

}void CSetting::DoDataExchange(CDataExchange* pDX){

CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CSetting)DDX_Text(pDX, IDC_DB, m_Db);DDX_Text(pDX, IDC_T0, m_T0);DDX_Text(pDX, IDC_TEMP, m_Temp);//}}AFX_DATA_MAP

}BEGIN_MESSAGE_MAP(CSetting, CDialog)

//{{AFX_MSG_MAP(CSetting)ON_BN_CLICKED(IDC_ACCEPT, OnAccept)ON_EN_CHANGE(IDC_DB, OnChangeDb)ON_EN_CHANGE(IDC_T0, OnChangeT0)//}}AFX_MSG_MAP// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

VCL_InitControls(m_hWnd);Scope2.Open(m_Scope2.m_hWnd);

Scope2.SizeLimit = 1000;Scope2.Channels.Add(0);Scope2.Title.Text="Control Power realtime trend";Scope2.Channels[0].Name="Control Power";Scope2.YAxis.AxisLabel.Text="Power(%)";Scope2.YAxis.Max=100;Scope2.YAxis.Min=0;

Scope1.Open(m_Scope1.m_hWnd);Scope1.SizeLimit = 1000;Scope1.Channels.Add(0);Scope1.Channels.Add(1);Scope1.Title.Text="Measuring temperature realtime trend";Scope1.Channels[0].Name="Meas.Temp";Scope1.Channels[1].Name="Set Temp";Scope1.YAxis.AxisLabel.Text="Temperature(C)";

Scope1.YAxis.Max=200;Scope1.YAxis.Min=0;return TRUE; // return TRUE unless you set the focus to a control

}

22

Page 23: Báo cáo TN Kỹ thuật điều khiển

// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CBai3_3Dlg::OnPaint() {

if (IsIconic()){

END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CSetting message handlers

// Sự kiện khi nhấn nút Startvoid CBai3_3Dlg::OnStart() {

// TODO: Add your control notification handler code here// Select and Open Device

if(!flag) DRV_SelectDevice(m_hWnd,FALSE,&m_DeviceNume, m_DeviceName);DRV_DeviceOpen(m_DeviceNume,&DriverHandle);

// configures the gain for the specifed analog input channel ptAIConfig.DasGain = DevFeatures.glGainList[gwGain].usGainCde; ptAIConfig.DasChan = gwChannelInput; DRV_AIConfig(DriverHandle,(LPT_AIConfig)&ptAIConfig); // reads an analog input channel ptAIVoltageIn.chan = gwChannelInput; ptAIVoltageIn.gain = ptAIConfig.DasGain; ptAIVoltageIn.TrigMode = 0; // internal trigger ptAIVoltageIn.voltage = (FLOAT far *)&Input; // configures the gain for the specifed analog output channel ptAOConfig.chan = gwChannelOutput; ptAOConfig.RefSrc = 0; // reference source internal ptAOConfig.MaxValue = MaxValueOut; ptAOConfig.MinValue = MinValueOut; DRV_AOConfig(DriverHandle,(LPT_AOConfig)&ptAOConfig); // output data ptAOVoltageOut.chan = gwChannelOutput; Output = 5 ; ptAOVoltageOut.OutputValue = Output; DRV_AOVoltageOut(DriverHandle,(LPT_AOVoltageOut)&ptAOVoltageOut); m_nTimer = SetTimer(1, T0, 0); if(!flag) gdwStartTime = GetTickCount(); flag = 1;}

// Sự kiện khi nhấn nút Stopvoid CBai3_3Dlg::OnStop() {

// TODO: Add your control notification handler code herem_nTimer = 0;Output= 0;

23

Page 24: Báo cáo TN Kỹ thuật điều khiển

Pwr=0;pw=0;ptAOConfig.chan = gwChannelOutput ;ptAOVoltageOut.OutputValue = 0;

DRV_AOVoltageOut(DriverHandle,(LPT_AOVoltageOut)&ptAOVoltageOut);}

// Sự kiện khi nhấn nút Acceptvoid CSetting::OnAccept() {

// TODO: Add your control notification handler code hereCString s1,s2,s3;this->GetDlgItemText(IDC_T0, s2);m_T0 = atof(s2);T0 = (int)m_T0;

this->GetDlgItemText(IDC_DB, s1);m_Db = atof(s1);Db = (float)m_Db;this->GetDlgItemText(IDC_TEMP, s3);m_Temp = atof(s3);Temp = (float)m_Temp;OnOK();

}void CBai3_3Dlg::OnTimer(UINT nIDEvent) {

// TODO: Add your message handler code here and/or call defaultCString s;

// read input dataDRV_AIVoltageIn(DriverHandle,(LPT_AIVoltageIn)&ptAIVoltageIn);

if(m_nTimer){

y[i++] = Input*62.5;if(i>999) i = 0;

s.Format("%0.2lf", y[i-1]);this->SetDlgItemText(IDC_MTEMP, s);Scope1.Channels[0].Data.AddYPoint(y[i-1]) ; s.Format("%0.2lf",Pwr);

Scope1.Channels[1].Data.AddYPoint(Temp);s.Format("%0.2lf",pw);// Pwr = 100 ;this->SetDlgItemText(IDC_POWER, s);Scope2.Channels[0].Data.AddYPoint(Pwr);

}dwCurrentTime = GetTickCount()- gdwStartTime;

24

Page 25: Báo cáo TN Kỹ thuật điều khiển

s.Format("%0d", dwCurrentTime/1000);this->SetDlgItemText(IDC_RTIME, s);s.Format("%.2f",Temp);this->SetDlgItemText(IDC_STEMP, s);s.Format("%.2f",Temp - Input*62.5);this->SetDlgItemText(IDC_ERROR, s);// write output dataif ((Temp-Input*62.5)<(Db))//db duoi{

Output = 5; Pwr = 100 ; pw = 100 ;

}if ((Input*62.5-Temp)>(Db))//db tren{

Output = 0; Pwr = 0 ; pw = 0 ;

} ptAOConfig.chan = gwChannelOutput ;

ptAOVoltageOut.OutputValue = Output; DRV_AOVoltageOut(DriverHandle,(LPT_AOVoltageOut)&ptAOVoltageOut);

CDialog::OnTimer(nIDEvent);}void CSetting::OnChangeDb() {

// TODO: If this is a RICHEDIT control, the control will not// send this notification unless you override the CDialog::OnInitDialog()// function and call CRichEditCtrl().SetEventMask()// with the ENM_CHANGE flag ORed into the mask.// TODO: Add your control notification handler code her

}

void CSetting::OnChangeT0() {

// TODO: If this is a RICHEDIT control, the control will not// send this notification unless you override the CDialog::OnInitDialog()// function and call CRichEditCtrl().SetEventMask()// with the ENM_CHANGE flag ORed into the mask.

// TODO: Add your control notification handler code here

}

II) Các đoạn chương trình điều khiển ON-OFF và PID:

25

Page 26: Báo cáo TN Kỹ thuật điều khiển

1) Điều khiển PID:- Đoạn đọc tín hiệu nhiệt độ:DRV_AIVoltageIn(DriverHandle,(LPT_AIVoltageIn)&ptAIVoltageIn);- Đoạn tính và xuất tín hiệu điều khiển:Error = Temp - 62.5*Input;

ek2 = ek1;ek1 = ek;ek = Error;uk1 = uk;uk = uk1 + A0*ek + A1*ek1 + A2*ek2;if(uk>MaxValueOut){

uk = MaxValueOut;}if(uk<MinValueOut){

uk = MinValueOut;}Output = (float)uk;

2) Điều khiển ON-OFF:- Đoạn đọc tín hiệu nhiệt độ:// read input dataDRV_AIVoltageIn(DriverHandle,(LPT_AIVoltageIn)&ptAIVoltageIn);

- Đoạn tính và xuất tín hiệu điều khiển:// write output data

if ((Temp-Input*62.5)<(Db) ; {

Output = 5; Pwr = 100 ; pw = 100 ;

}

if ((Input*62.5-Temp)>(Db)){

Output = 0; Pwr = 0 ; pw = 0 ;

} ptAOConfig.chan = gwChannelOutput ;

26

Page 27: Báo cáo TN Kỹ thuật điều khiển

Output =(float)Pwr*5/100;

ptAOVoltageOut.OutputValue = Output;

DRV_AOVoltageOut(DriverHandle,(LPT_AOVoltageOut)&ptAOVoltageOut);

V) Tiến hành thí nghiệm1) Khảo sát vòng hở:

Đáp ứng thu được:

Xác định các hệ số Kp,Ki,Kd:Ta xác định được các hệ số K=100-32=68

L=50 T=450

a=KL/T=7.5 Ti=2L=100 Td=0.5L=25Kp=1,20/a=0.16 Ki=Kp/Ti=1.6*10-3 Kd=Kp*Td=4

2) Khảo sát vòng kín với bộ điều khiển PID:Khảo sát với các hệ số PID tính được từ vòng hở:

Đáp ứng thu được:

27

Page 28: Báo cáo TN Kỹ thuật điều khiển

Khảo sát với các hệ số PID mặc định:Đáp ứng thu được:

Bảng giá trị thu được từ đáp ứng:

Bộ điều khiển PID

Thời gian lên (s)

Thời gian xác lập (s)

Độ vọt lố(%)

Sai số xác lập(0C)

Hệ số tìm được 75 550 122.5 9Hệ số mặc định 70 450 112.5 5

3) Khảo sát vòng kín với bộ điều khiển ON-OFF:Vẽ các đáp ứng lần lượt với các vùng trễ Db là 1oC , 0.2oC

28

Page 29: Báo cáo TN Kỹ thuật điều khiển

Bảng giá trị:29

Page 30: Báo cáo TN Kỹ thuật điều khiển

Bộ điều khiển ON-OFF

Thời gian lên (s)

Thời gian xác lập (s)

Độ vọt lố(%)

Sai số xác lập(0C)

∆=10C 60 420 140 15∆=0.20C 120 420 140 10

=> Nhận xét:- Ở điều khiển ON-OFF khi độ rộng vùng chết càng nhỏ thì sai số xác lập càng nhỏ.- Bộ điều khiển PID cho sai số nhỏ hơn so với bộ điều khiển ON-OFF.Chất lượng bộ điều khiển PID tốt hơn nhiều so với ON-OFF.

Câu hỏi thêm: làm cho “mịn” đặc tuyến khi điều khiển ON-OFF (đoạn nhấp nhô đều nhau ở 2 bên giá trị xác lập)Trả lời:

-Nguyên nhân làm cho phần nhấp nhô không đều nhau là do quán tính nhiệt lúc tăng và giảm nhiệt độ không đều nhau.(tăng thì nhanh ,giảm thì chậm)

-Hướng giải quyết:sửa đoạn code thành như sau:…if ((Temp-Input*62.5)>(Db+a)

…if ((Input*62.5-Temp)>(Db-b))....với a,b là các số dương ta chọn thích hợp để sai số phần trên và phần dưới đều

nhau (dựa vào thực nghiệm và phương pháp thử và sai).

Bài 4: ĐIỀU KHIỂN TỐC ĐỘ VÀ VỊ TRÍ ĐỘNG CƠ DC30

Page 31: Báo cáo TN Kỹ thuật điều khiển

I) Các đoạn chương trình mẫu :// Đoạn chương trình đọc xung:

PT_DioReadPortByte ptDioReadPortByte0,ptDioReadPortByte1; USHORT DataLo,DataHi; double Pulse; double Delta_Pulse; static double PrevPulse; // read low byte ptDioReadPortByte0.port = 0; ptDioReadPortByte0.value = (USHORT far *)&DataLo; // read high byte ptDioReadPortByte1.port = 1; ptDioReadPortByte1.value = (USHORT far *)&DataHi; DRV_DioReadPortByte(DriverHandle,(LPT_DioReadPortByte)&ptDioReadPortByte0); DRV_DioReadPortByte(DriverHandle,(LPT_DioReadPortByte)&ptDioReadPortByte1); Pulse = DataHi*256 + DataLo; Delta_Pulse = Pulse - PrevPulse; PrevPulse = Pulse; // processing counter overflow if(Delta_Pulse>+32768) Delta_Pulse = Delta_Pulse - 65536; if(Delta_Pulse<-32768) Delta_Pulse = Delta_Pulse + 65536; return (Delta_Pulse);

// Đoạn xử lý tín hiệu:void CBAI4Dlg::OnRun() {

// TODO: Add your control notification handler code here//-------------------------------------------------------------//configure input and output of the PCI cardif(!flag) DRV_SelectDevice(m_hWnd,FALSE,&m_DeviceNume, m_DeviceName);DRV_DeviceOpen(m_DeviceNume,&DriverHandle);

// configures the gain for the specifed analog input channelptAIConfig.DasGain = DevFeatures.glGainList[gwGain].usGainCde;ptAIConfig.DasChan = gwChannelInput;DRV_AIConfig(DriverHandle,(LPT_AIConfig)&ptAIConfig);

// reads an analog input channelptAIVoltageIn.chan = gwChannelInput;ptAIVoltageIn.gain = ptAIConfig.DasGain;ptAIVoltageIn.TrigMode = 0; // internal triggerptAIVoltageIn.voltage = (FLOAT far *)&Input;

// configures the gain for the specifed analog output channelptAOConfig.chan = gwChannelOutput;ptAOConfig.RefSrc = 0; // reference source internalptAOConfig.MaxValue = MaxValueOut;

31

Page 32: Báo cáo TN Kỹ thuật điều khiển

ptAOConfig.MinValue = MinValueOut;DRV_AOConfig(DriverHandle,(LPT_AOConfig)&ptAOConfig);

// output dataptAOVoltageOut.chan = gwChannelOutput;ptAOVoltageOut.OutputValue = Output;DRV_AOVoltageOut(DriverHandle,(LPT_AOVoltageOut)&ptAOVoltageOut);

//---------------------------------------------------

m_nTimer = SetTimer(1,T0,0);

if(!flag)gdwStartTime = GetTickCount();

flag =1;

//--------------------------------------------a0 = Kp + Ki*T0/1000/2 + Kd*1000/T0;a1 = -Kp + Ki*T0/1000/2 - 2*Kd*1000/T0;a2 = Kd*1000/T0;

}

//Đoạn tính tín hiệu điều khiển:double CBAI4Dlg::PID(double currentspeed){

static double u[2];static double e[3];

e[2] = SetSpeed - currentspeed;u[1] = u[0] + a0*e[2] + a1*e[1] + a2*e[0];

u[0] = u[1];e[0] = e[1];e[1] = e[2];return u[1];

}

// Đoạn xuất tín hiệu điều khiển:void CBAI4Dlg::OnTimer(UINT nIDEvent) {

// TODO: Add your message handler code here and/or call defaultCString s;double m_speed;static double updatespeed[10];double avrspeed =0;

32

Page 33: Báo cáo TN Kỹ thuật điều khiển

if(m_nTimer){

m_speed = DataPulse()*speedratio/T0;

updatespeed[9] = m_speed;for(i=0;i<10;i++){

avrspeed+= updatespeed[i];}

avrspeed = avrspeed/10;

for (i=0;i<9;i++)updatespeed[i] = updatespeed[i+1];

Output = (float)PID(avrspeed);

Output = 2.5 + Output;if(Output> MaxValueOut)

Output = MaxValueOut;if(Output < MinValueOut)

Output = MinValueOut;

ptAOVoltageOut.OutputValue = (Output);DRV_AOVoltageOut(DriverHandle,(LPT_AOVoltageOut)&ptAOVoltageOut);

if(i<1000){

CurrentSpeed[i] = m_speed;i++;

}//plot the measure speed, set speed, control voltage

Scope1.Channels[0].Data.AddYPoint(SetSpeed);Scope1.Channels[1].Data.AddYPoint(avrspeed);Scope2.Channels[0].Data.AddYPoint(Output);

}

dwCurrentTime = GetTickCount()- gdwStartTime;s.Format("%0d", dwCurrentTime/1000);this->SetDlgItemText(IDC_STATIC_RUN, s);

s.Format("%2.2f",Output);this->SetDlgItemText(IDC_STATIC_VOLTAGE, s);

s.Format("%2.2f",SetSpeed - m_speed);this->SetDlgItemText(IDC_STATIC_ERROR, s);

s.Format("%4d",m_speed);this->SetDlgItemText(IDC_STATIC_MEASPEED, s);

s.Format("%4d",SetSpeed);33

Page 34: Báo cáo TN Kỹ thuật điều khiển

this->SetDlgItemText(IDC_STATIC_SETSPEED, s);

CDialog::OnTimer(nIDEvent);}

II) Tiến hành thí nghiệm:1)Điều khiển tốc độ động cơ:

Thí nghiệm với Kp thay đổi,Ki=0.015,Kd=1e-6:

Kp 0.001 0.002 0.003 0.004 0.005 0.006 0.007Thời gian lên (s)

Thời gian xác lập (s) 14 6.2 5.5 4.1 3.6 3.2 3

Độ vọt lố (%) 26 27 28 30 32 34 35Sai số xác lập (v/p) 2 5 6 9 11 13 16

Đáp ứng thu được: + Trường hợp Kp=0.001:

34

Page 35: Báo cáo TN Kỹ thuật điều khiển

+ Trường hợp Kp=0.002:

Thí Nghiệm với Ki thay đổi,Kp=0.0004,Kd=e^(-6):

35

Page 36: Báo cáo TN Kỹ thuật điều khiển

Ki 0.0015 0.002 0.0025Thời gian xl (s) 7.6 8 10Độ vọt lố (%) 36.8 61.2 75Sai số xl (v/p) 6 2 0

+ Trường hợp Ki=0.002:

Thí Nghiệm với Kd thay đổi,Kp=0.0004,Kd=0.0015:Kd 10^(-4) 3.10^(-4)

Thời gian xl (s) 4s 5.9sĐộ vọt lố (%) 29.93% 23.2%Sai số xl (v/p) 4 2

+ Trường hợp Kd=3.10^(-4):

36

Page 37: Báo cáo TN Kỹ thuật điều khiển

2) Điều khiển vị trí động cơ:

Thí Nghiệm với Ki=0.05,Kp=0.002,Kd=0.025Thời gian lên 0.07sThời gian xl (s) 1.6sĐộ vọt lố (%) 15%Sai số xl (v/p) 0.41

37

Page 38: Báo cáo TN Kỹ thuật điều khiển

III) Nhận xét ảnh hưởng của các thành phần Kp , Ki , Kd của bộ điều khiển PID:

Khi tăng Kp : sai số xác lập càng nhỏ, thời gian xác lập tăng, độ vọt lố càng cao. Khi tăng Kp thì các cực của hệ thống nói chung có xu huớng di chuyển ra xa trục thực. Nếu tăng Kp quá giá trị hệ số khuếch đại giới hạn thì hệ thống sẽ trở nên mất ổn định (dao động).

Khi tăng Ki : làm chậm đáp ứng quá độ thời gian xác lập tăng , độ vọt lố tăng , sai số xác lập giảm. Do hệ số khuếch đại của khâu PI bằng vô cùng tại tần số bằng 0 nên khâu PI có thể làm cho sai số của tín hiệu vào là hàm nấc của hệ thống không có khâu vi phân lý tưởng bằng 0. Ngoài ra, do khâu PI là một bộ lọc thông thấp nên nó còn có tác dụng triệt tiêu nhiễu tần số cao tác động vào hệ thống.

Khi tăng Kd : đáp ứng của hệ thống càng nhanh ,thời gian lên ngắn,nhưng thời gian xác lập tăng , độ vọt lố tăng và sai số xác lập tăng.

Bài 5:ĐIỀU KHIỂN THÍCH NGHI TỐC ĐỘ ĐỘNG CƠ DC38

Page 39: Báo cáo TN Kỹ thuật điều khiển

I) Yêu cầu của thầy: Tạo thêm 1 nút nhấn REVERSE để đảo chiều quay của động cơ nhưng chỉ nhấn REVERSE được 1 lần.

II) Các đoạn chương trình mẫu của giải thuật PID thích nghi://Đoạn đọc tín hiệu xung:

double CBAI4Dlg::DataPulse(){

PT_DioReadPortByteptDioReadPortByte0,ptDioReadPortByte1;

USHORT DataLo,DataHi;doublePulse;doubleDelta_Pulse;

//static double PrevPulse;

// read low byteptDioReadPortByte0.port = 0;ptDioReadPortByte0.value = (USHORT far *)&DataLo;

// read high byteptDioReadPortByte1.port = 1;ptDioReadPortByte1.value = (USHORT far *)&DataHi;

DRV_DioReadPortByte(DriverHandle,(LPT_DioReadPortByte)&ptDioReadPort Byte0);

DRV_DioReadPortByte(DriverHandle,(LPT_DioReadPortByte)&ptDioReadPortByte1);

Pulse = DataHi*256 + DataLo;Delta_Pulse = Pulse - PrevPulse;PrevPulse = Pulse;

// processing counter overflowif(Delta_Pulse>+32768) Delta_Pulse = Delta_Pulse - 65536;if(Delta_Pulse<-32768) Delta_Pulse = Delta_Pulse + 65536;

return (Delta_Pulse);}

//Đoạn xử lý tín hiệu:m_nTimer = SetTimer(1,T0,0);if(!flag)

gdwStartTime = GetTickCount();flag =1;

39

Page 40: Báo cáo TN Kỹ thuật điều khiển

if(SetSpeed > 0)USetSpeed = (2952.0 - SetSpeed)/1135.4; //QUY DOI TOC DO RA DIEN AP

elseUSetSpeed = (2720.0 - SetSpeed)/1133.8;

a[0][0] = a0;a[1][0] = a1;a[2][0] = a2;

//Đoạn tính tín hiệu điều khiển:double CBAI4Dlg::PID(double currentspeed){

static double u[2]; //u[0]: u(k-1); u[1]: u(k)static double e[3]; //e[0] la` e1(k), e[1]: e1(k-1), e[2]: e1(k-2)

double etemp;double e2; //e2 trong cong thuc cap nhat thong so

int i1;

//dua toc do do duoc thanh ap/* if(Output>2.6)

etemp = (2952 - currentspeed)/1135.4;else if( Output >= 2.4)etemp = 0;else etemp =(2720 - currentspeed)/1133.8;

*/

/* Tinh' e2//*/

if(Output<=2.4) e2 = 2.5-(2695.0-SetSpeed-25)/1133.8+Output; // 50ms (0V->2.5V)//if(u<2.4) e = 2.4-(2696.5-dat)/1135.9-u; // 50ms (0V->2.5V) (them 2.3V)if(Output>2.4 & Output<2.6) e2 = 2.5;

if(Output>=2.6) e2 = 2.6-(2897.7- SetSpeed)/1135.4+Output; // 50ms (2.5V->5V)

//sai lech dau vao tinh theo ap// e[2] = USetSpeed - etemp;

/* Tinh e1(k) tuc la e[2]*/if(Output<=2.4) e[2] = 2.4-(2695.0-(SetSpeed -

currentspeed-25))/1133.8; // 50ms (0V->2.5V)// if(u<2.4) e_omega0 = 2.4-(2696.5-(dat - s/T1))/1135.9; // 50ms (0V->2.5V)

if(Output>2.4 & Output<2.6) e[2] = 2.5;if(Output>=2.6) e[2] = 2.6-(2897.7-(SetSpeed –

40

Page 41: Báo cáo TN Kỹ thuật điều khiển

currentspeed))/1135.4; // 50ms (2.5V->5V)

//sai lech tinh theo ap giua toc do dat va tin hieu dieu khien// Output = 2.5 - Output;// e2 = -USetSpeed + Output;

for(i1 =0;i1<3; i1++)//Cong thuc cap nhat thong so: an[k+1] = an[k] +beta*e2[k]*e1[k-n]a[i1][1] = a[i1][0] + beta*e[2-i1]*e2;

u[1] = u[0] + a[0][1]*e[2] + a[1][1]*e[1] + a[2][1]*e[0];

u[0] = u[1];e[0] = e[1];e[1] = e[2];

for (i1 = 0; i1<3; i1++)a[i1][0] = a[i1][1];

return u[1];}

//Đoạn xuất tín hiệu điều khiển:void CBAI4Dlg::OnTimer(UINT nIDEvent) {

// TODO: Add your message handler code here and/or call defaultCString s;double m_speed;

// static double updatespeed[MAXUPDATE];double avrspeed =0;

if(m_nTimer){

m_speed = DataPulse()*speedratio/T0;

updatespeed[MAXUPDATE-1] = m_speed;for(i=0; i<MAXUPDATE; i++){avrspeed+= updatespeed[i];}

avrspeed = avrspeed/MAXUPDATE; //TINH TRUNG BINH DE TRANH' NHIEU

for (i=0; i<MAXUPDATE-1; i++)updatespeed[i] = updatespeed[i+1];

Output = (float)PID(avrspeed);//********************************

41

Page 42: Báo cáo TN Kỹ thuật điều khiển

Output = 2.5 - Output;if(Output> MaxValueOut)

Output = MaxValueOut;if(Output < MinValueOut)

Output = MinValueOut;

ptAOVoltageOut.OutputValue = (Output);DRV_AOVoltageOut(DriverHandle,

(LPT_AOVoltageOut)&ptAOVoltageOut);

if(i<1000){

CurrentSpeed[i] = avrspeed; i++; //

}//plot the measure speed, set speed, control voltage

Scope1.Channels[0].Data.AddYPoint(SetSpeed);Scope1.Channels[1].Data.AddYPoint(avrspeed);Scope2.Channels[0].Data.AddYPoint(Output);

}

dwCurrentTime = GetTickCount()- gdwStartTime;s.Format("%0d", dwCurrentTime/1000);this->SetDlgItemText(IDC_STATIC_RUN, s);

s.Format("%2.2f",Output);this->SetDlgItemText(IDC_STATIC_VOLTAGE, s);

s.Format("%2.2f",SetSpeed - m_speed);this->SetDlgItemText(IDC_STATIC_ERROR, s);

s.Format("%4d",m_speed);this->SetDlgItemText(IDC_STATIC_MEASPEED, s);

s.Format("%4d",SetSpeed);this->SetDlgItemText(IDC_STATIC_SETSPEED, s);

CDialog::OnTimer(nIDEvent);}

III) Thực hiện sửa code lại theo đúng yêu cầu:42

Page 43: Báo cáo TN Kỹ thuật điều khiển

Ta thêm vào FUNCTION sau cho nút bấm REVERSE,và nhớ khai báo int reverse =0 ở đầu chương trình để xác định động cơ đang quay theo chiều nào

void CBAI4Dlg::OnReverse() {

// TODO: Add your control notification handler code here If (reverse)

SetSpeed=-SetSpeed;Else SetSpeed=SetSpeed;Reverse =1;

}

III) Tiến hành thí nghiệm: Thí nghiệm với tốc độ đặt 200(v/p):

BộĐiều Khiển

Thời gianlên(s)

Thời gianxác lập(s)

Độvọt lố(%)

Sai sốXác lập(v/p)

PID 18 45 12 10PID thích nghi 11 20 4 0

43

Page 44: Báo cáo TN Kỹ thuật điều khiển

Thí nghiệm với tốc độ đặt 1000(v/p):BộĐiều Khiển

Thời gianlên(s)

Thời gianxác lập(s)

Độvọt lố(%)

Sai sốXác lập(v/p)

PID 10 27 4.4 0PID thích nghi 4.5 12 8.5 0

44

Page 45: Báo cáo TN Kỹ thuật điều khiển

45

Page 46: Báo cáo TN Kỹ thuật điều khiển

Thí nghiệm với tốc độ đặt 2000(v/p):BộĐiều Khiển

Thời gianlên(s)

Thời gianxác lập(s)

Độvọt lố(%)

Sai sốXác lập(v/p)

PID 10 50 25 0PID thích nghi 2.5 16 10 0

Thí nghiệm với tốc độ đặt -200(v/p):BộĐiều Khiển

Thời gianlên(s)

Thời gianxác lập(s)

Độvọt lố(%)

Sai sốXác lập(v/p)

PID 14 40 15 3PID thích nghi 2 12 30 0

46

Page 47: Báo cáo TN Kỹ thuật điều khiển

Thí nghiệm với tốc độ đặt -2000(v/p):Bộ Thời gian Thời gian Độ Sai số

47

Page 48: Báo cáo TN Kỹ thuật điều khiển

Điều Khiển lên(s) xác lập(s) vọt lố(%) Xác lập(v/p)PID 10 50 25 0PID thích nghi 3 6 53 0

48

Page 49: Báo cáo TN Kỹ thuật điều khiển

Nhận xét và so sánh giữa bộ PID thích nghi và PID thường : Trong tất cả các trường hợp điều khiển với tốc độ đặt cho trước thì bộ điều

khiển thích nghi luôn có thời gian xác lập rất nhanh so với bộ điều khiển PID thường . Thời gian lên và thời gian xác lập của bộ điều khiển thích nghi luôn bé hơn ½ thời gian lên và xác lập của bộ điều khiển PID thường.

Đồng thời bộ điều khiển thích nghi luôn cho sai số xác lập bằng 0 do các hệ số Kp,Kd,Ki sẽ được tự chỉnh định sao sai số ngỏ ra bằng 0.

Tuy nhiên trong một số trường hợp thì bộ điều khiển thích nghi có độ vọt lố khá lớn, gấp đôi so với độ vọt lố của bộ điều khiển PID thông thường.

Hệ số thích nghi phản ánh tốc độ thích nghi của bộ điều khiển:-Nếu lớn thì hệ thống sẽ hội tụ nhanh nhưng độ vọt lố cũng tăng theo, hệ thống nhạy với nhiễu-Nếu nhỏ thì ngược lại,hệ thống sẽ hội tụ chậm nhưng độ vọt lố cũng sẽ giảm xuống => Ta phải chọn hệ số sao cho thích hợp để có thể chấp nhận tốc độ hội tụ và độ vọt lố là đạt yêu cầu so với thực tế

Quan sát cuối cùng là kết quả của thí nghiệm thực tế ta thấy được khả năng điều khiển tín hiệu ngỏ ra bám theo tín hiệu đặt của bộ điều khiển thích nghi là rất tốt. Đó chính là lý do tại sao bộ điều khiển thích nghi được sử dụng trong các trường hợp đòi hỏi độ chính xác cao và thời gian đáp ứng nhỏ.

49