Báo cáo TN Kỹ thuật điều khiển
Trang 1Bà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:
SW2
Trang 2#0020//Thiết lập 2 trạng thái đẩy ra và thu vào là ngược nhau
1000 1002 1007
TIM0
TIM1
#0040
Trang 3//Dùng timer 0 có chu kì 4s để cho phép xi lanh I và J đẩy ra tuần tự nhau
LD 1007AND NOT TIM 000OUT 1000
LD 1007AND TIM 000OUT 1002//Thiết lập chế độ đẩy ra và thu vào của xi lanh I ngược nhau
LD 1000AND 1007OUT 1001//Tạo ra xung chu kì 8s (ON 4s và OFF 4s) cho timer 0
LD 1007AND NOT TIM 001TIM 000
#0040
LD 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
Trang 4Chương trình LADDER:
1007 00004
TIM0 1000
CB1 CB2
AUTO SW3
SW2
Trang 5CNT 1
Trang 6//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
chạy,nếu sau 30s mà không có chai đi ngang (tức bị kẹt chai) timer 3 sẽ on
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
Trang 72/ 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ào
11/ tắt hệ thống
Mỗi bước cách nhau 1s
Khi nhấn Stop (SW3) hệ thống dừng lại
7
Trang 8Chương trình Ladder:
1007 00004
1007
TIM2
#0020 1007
TIM3
#0030 1007
Trang 9//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
Trang 10LD 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 ON
//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
Trang 11Bài 2: ĐIỀU KHIỂN DÙNG PLC OMRON
KEEP(11) 20002
TIM1 00003
PAUSE
S
R 20002
20002
IL(02)
10001 TIM1
10000
Trang 1210001 00000
20000
25313
CMP(20)
#0010 25506
20001
IL(03)
Trang 13//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
Trang 14CMP 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óa
ILC
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ặckhi 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:
Trang 1717
Trang 18Chươ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
//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ừng
LD 200.00
AND NOT 100.01
LD NOT 200.01
OR TIM000
Trang 19AND 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 1
LD NOT 000.07CNT 007 005
LD CNT020 //Counter 8 đếm 3 táo cho thùng 2AND 000.00
LD NOT 000.07CNT 008 003
LD CNT002 //Counter 9 đếm 2 táo cho thùng 3AND 000.00
LD NOT 000.07CNT 009 002
LD CNT003 //Counter 10 đếm 1 táo cho thùng 4AND 000.00
LD NOT 000.07CNT 010 001
LD 000.07 //Counter 20 ON khi đã có 2 thùng qua
LD 000.01CNT 020 002
LD 000.07 //Counter 2 ON khi đã có 3 thùng qua
LD 000.01CNT 002 003
LD 000.07 //Counter 3 ON khi đã có 4 thùng qua
LD 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 CNT007
Trang 21CÁ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ình
BOOL CBai3_3Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog The framework does this automatically
CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
int 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 icon dc.DrawIcon(x, y, m_hIcon);
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
Trang 22// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
Trang 23// 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.
// CSetting message handlers
// Sự kiện khi nhấn nút Start
void 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);
ptAIVoltageIn.TrigMode = 0; // internal trigger
ptAIVoltageIn.voltage = (FLOAT far *)&Input;
// configures the gain for the specifed analog output channel
Trang 24s.Format("%0.2lf",pw);
// Pwr = 100 ; this->SetDlgItemText(IDC_POWER, s);
Scope2.Channels[0].Data.AddYPoint(Pwr);
}
dwCurrentTime = GetTickCount()- gdwStartTime;
Trang 25// 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
Trang 261) Đ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;
2) Điều khiển ON-OFF:
- Đoạn đọc tín hiệu nhiệt độ:
// read input data
DRV_AIVoltageIn(DriverHandle,(LPT_AIVoltageIn)&ptAIVoltageIn);
- Đoạn tính và xuất tín hiệu điều khiển:
// write output data
ptAOConfig.chan = gwChannelOutput ;
Trang 27a=KL/T=7.5 T i =2L=100 T d =0.5L=25
K p =1,20/a=0.16 K i =K p /T i =1.6*10 -3 K d =K p *T d =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
Trang 28Khảo sát với các hệ số PID mặc định:
Độ vọt lố (%)
Sai số xác lập ( 0 C)
Hệ số tìm được 75 550 122.5 9
Hệ 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à 1 o C , 0.2 o C
Trang 29Bảng giá trị:
29
Trang 30Độ vọt lố (%)
Sai số xác lập ( 0 C)
=> 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)
Trang 31
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;
// -//configure input and output of the PCI card
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
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;
31
Trang 32//Đ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];
// Đoạn xuất tín hiệu điều khiển:
void CBAI4Dlg::OnTimer(UINT nIDEvent)
Trang 34this->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)
Trang 35+ Trường hợp Kp=0.002:
Thí Nghiệm với Ki thay đổi,Kp=0.0004,Kd=e^(-6):
35
Trang 372) Điều khiển vị trí động cơ:
Thí Nghiệm với Ki=0.05,Kp=0.002,Kd=0.025
Thời gian lên 0.07s
Thời gian xl (s) 1.6s
Độ vọt lố (%) 15%
Sai số xl (v/p) 0.41
37
Trang 38III) 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Ơ DC
Trang 39I) 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_DioReadPortByte ptDioReadPortByte0,ptDioReadPortByte1;
USHORT DataLo,DataHi;
doublePulse;
doubleDelta_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)&ptDioReadPort Byte0);
DRV_DioReadPortByte(DriverHandle,(LPT_DioReadPortByte)&ptDioReadPort Byte1);
Pulse = DataHi*256 + DataLo;
Delta_Pulse = Pulse - PrevPulse;
Trang 40//Đ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)
*/
/* 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 –
Trang 41currentspeed))/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];
//Đoạn xuất tín hiệu điều khiển:
void CBAI4Dlg::OnTimer(UINT nIDEvent)
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
Trang 42if(i<1000) {
Trang 43Thời gianxác lập(s)
Độvọt lố(%)
Sai sốXác lập(v/p)
43
Trang 44 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)
Trang 46Thí 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)
Thời gianxác lập(s)
Độvọt lố(%)
Sai sốXác lập(v/p)
Trang 47 Thí nghiệm với tốc độ đặt -2000(v/p):
47
Trang 48Điều Khiển lên(s) xác lập(s) vọt lố(%) Xác lập(v/p)
Trang 49Nhậ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