Anda di halaman 1dari 49

Bi 1: IU

KHIN CC PHN T KH NN

I) Phn bit cc loi cm bin: Cm bin quang: khi a bt c vt no che u cm bin th cm bin s ln mc 1. Cm bin in dung: khi a mt vt bt k li tht gn th cm bin s ln mc 1. Cm bin in cm : ch ln mc 1 khi a vt bng kim loi li gn. II) Cc v d chng trnh mu: 1)Th nghim 1C: Vit chng trnh iu khin xi lanh I,mi khi nhn SW2 xi lanh I y ra,sau 2 s th xi lanh t y vo Chng trnh LADDER:
SW2 00004 TIM1 1000 1000

1000

TIM1 #0020

1000 1001

Chng trnh danh sch lnh //Cho php t ng gi khi nhn SW2,cho xilanh I y ra,v dng khi timer 1 on LD 00004 OR 1000 AND NOT TIM 001 OUT 1000 //Khi ng Timer 1 khi xi lanh I bt u y ra LD 1000 TIM 001
1

#0020 //Thit lp 2 trng thi y ra v thu vo l ngc nhau LD NOT 1000 OUT 1001 2)Th nghim 1E: Vit chng trnh iu khin sao cho khi nhn SW2 ,th 2 xi lanh I v J lun phin y ra v vo vi chu k 4s,khi nhn SW3 th dng Chng trnh LADDER

00004

00005 1007

1007

1007

TIM0 1000 TIM0 1002

1000

1007 1001

1007

TIM1

TIM0 #0040 TIM1 #0040

TIM0

Chng trnh danh sch lnh //To ra 1 bin trung gian t gi (AUTO) khi nhn SW2 LD 00004 OR 1007 LD NOT 00005 OUT 1007
2

//Dng timer 0 c chu k 4s cho php xi lanh I v J y ra tun t nhau LD 1007 AND NOT TIM 000 OUT 1000 LD 1007 AND TIM 000 OUT 1002 //Thit lp ch y ra v thu vo ca xi lanh I ngc nhau LD 1000 AND 1007 OUT 1001 //To ra xung chu k 8s (ON 4s v OFF 4s) cho timer 0 LD 1007 AND NOT TIM 001 TIM 000 #0040 LD 1007 AND TIM 000 TIM 001 #0040 3)Th nghim 2D: (m rng ca 2A,2B,2C): -Vit chng trnh phn loi chai bia,nu gp chai li th cho xi lanh I y ra a chai li v bng chuyn sa cha,khi 12 chai th xi lanh J c y t trn xung ng nt chai. -Dy truyn c dng cm bin quang pht hin li kt chai,nu qu 30s ma cm bin quang ko pht hin c chai i qua s h ci bo ng -Nu b mt in th b m s chai s khng thay i v khi c in th vn hot ng bnh thng

Chng trnh LADDER:


SW2 00004 SW3 00005 1007 1007 CB1 0001 CB2 0002 AUTO

1007 1000

TIM0 1000

1000 TIM0 #0020

1000

1007 1001

1007

0001

0002

CNT 1

CNT1 R 12

CNT1 1002

TIM2 1002

1002 TIM2 #0040 1007 0001

TIM3 #0300

TIM3

HORN 1004

Chng trnh danh sch lnh: //To ra 1 bin trung gian t gi (AUTO) khi nhn SW2 LD 00004 OR 1007 LD NOT 00005 OUT 1007 //Khi bng chuyn bt u hot ng,nu cm bin quang bo c chai i ngang (CB1 ON) v cm bin dung bo chai li (CB2 ON) th cho xi lanh I hot ng trong 2 s y chai li ra. LD 1007
5

1000 0001 0002 NOT TIM 0 1000 1000 000 #0020 LD NOT 1000 AND 1007 OUT 1001 //khi bng chuyn hot ng,cm bin quang bo c chai i ngang(CB1 ON) v cm bin dung khng bo li chai th ta bt u m s chai xung.Khi s chai m xung bng 0( 12 chai) th reset s chai m v 12 LD 1007 AND 0001 AND NOT 0002 LD CNT1 CNT 001 12 //Khi 12 chai th cho xi lanh J hot ng (trong 4s) ng np chai LD CNT1 OR 1002 AND NOT TIM 002 OUT 1002 LD 1002 TIM 002 #0040 //Thit lp ch bo ng ci khi c li kt chai:khi bng chuyn hot ng,v cm bin quang cha xc nh c chai ti th ta s cho timer 3 chy,nu sau 30s m khng c chai i ngang (tc b kt chai) timer 3 s on v h ci bo LD 1007 AND NOT 0001 TIM 003 #0300 LD TIM3 OUT 1004 III) Thc hin phng n c giao: Khi nhn Start (SW2) , h thng s thc hin mt cch tun t cc bc sau: 1/ xi lanh I y ra
6

OR AND AND AND OUT LD TIM

2/ xi lanh J y ra 3/ xi lanh K y ra 4/ xi lanh I,J thu vo 5/ xi lanh K thu vo 6/ xi lanh K y ra 7/ xi lanh J y ra 8/ xi lanh I y ra 9/ xi lanh J,K thu vo 10/ xi lanh I thu vo 11/ tt h thng Mi bc cch nhau 1s Khi nhn Stop (SW3) h thng dng li.

Chng trnh Ladder:


SW2 00004 SW3 00005 TIM11 1007 1007 AUTO

1007

TIM1 #0010 TIM2 #0020 TIM3 #0030 TIM4 #0040 TIM5 #0050 TIM6 #0060 TIM7 #0070 TIM8 #0080 TIM9 #0090

1007

1007

1007

1007

1007

1007

1007

1007

1007

TIM10 #0100 TIM11 #0110 TIM1 TIM8 TIM4 1000 TIM10

1007

1000

1007 1001

TIM2 TIM7

TIM4 1002 TIM9

TIM3 TIM6

TIM5 1003 TIM9

Chng trnh danh sch lnh: //To ra 1 bin trung gian t gi (AUTO) khi nhn STAR(SW2),bin t gi ny s tt khi nhn STOP (SW3) hoc h thng chy xong cc bc (timer 11 on) LD 00004 OR 1007 LD NOT 00005 AND NOT TIM 11 OUT 1007 //Khi h thng bt u hot ng,ta kch cho cc timer chy,mi timer tng ng vi mi mc thi gian bt u cc bc LD 1007 TIM 001 #0010
9

LD 1007 TIM 002 #0020 .. LD 1007 TIM 011 #0110 //da vo yu cu ta c xi lanh I s y ra khi timer 1 ON v thu vo khi timer 4 ON,v li y ra khi timer 8 ON thu vo khi timer 10 ON LD TIM1 AND NOT TIM4 OUT 1000 LD TIM8 AND NOT TIM10 OUT 1000 LD 1007 AND NOT 1000 OUT 1001 //Tng t ta c xi lanh J y ra khi timer 2 ON v thu vo khi timer 4 ON,tip tc y ra khi timer 7 ON,thu vo khi timer 9 ON LD TIM2 AND NOT TIM4 OUT 1002 LD TIM7 AND NOT TIM9 OUT 1002 //Tng t ta c xi lanh K y ra khi timer 3 ON v thu vo khi timer 5 ON,tip tc y ra khi timer 6 ON,thu vo khi timer 9 ON LD TIM3 AND NOT TIM5 OUT 1003 LD TIM6 AND NOT TIM9 OUT 1003 Nhn xt: h thng hot ng ng theo yu cu.

10

Bi 2: IU KHIN DNG PLC OMRON


I) Cc chng trnh v d mu: Th nghim 7: dy chuyn chy sau khi nhn nt STAR 5s, ng 10 thng th dng, c nt PAUSE tm dng chng trnh Chng trnh LADDER:
STAR 00001 STOP 00002 AUTO 20001 20000 20000

20000 PAUSE 00003

TIM1 #0050 S KEEP(11) 20002

TIM1

20002

20002 IL(02) 10001 TIM1 10000

11

00000 00007

CNT 0 #0010

CNT0

TIM1 10001

00007

CNT0

CNTR(12) #0010

25314

20000

25313

CMP(20) #0010

25506 20001

IL(03)

END

Chng trnh danh sch lnh: //thit lp ch t gi khi nhn STAR LD 00001
12

OR 20000 AND NOT 00002 OUT 20000 //Cho timer 1 chy delay 5s sau khi nhn STAR LD 20000 TIM 001 #0050 //thit lp ch PAUSE dng a ch 20002 lm bin trung gian LD TIM1 AND 00003 LD TIM1 AND 20002 KEEP 20002 //S dng a ch 20002 lm iu kin cho hm kha on chng trnh LD 20002 IL //Bt u on chng trnh trong hm kha //Nu delay 5s v bng ti thng dng th cho bng ti to chy LD TIM1 AND NOT 10001 OUT 10000 //khi cng tc hnh trnh ON,bo thng n ng v tr th reset counter m to v dng cm bin to m s to i qua LD 00000 LD NOT 00007 CNT 000 #0010 //bng ti thng s chy khi timer 5s ON v cng tc hnh trnh khng ON(tc thng cha n ng v tr b to vo) hoc bng ti thng s chy khi to b (CNT0 ON), LD CNT0 OR NOT 00007 AND TIM1 OUT 10001 //Mi ln b xong 1 thng to (CNT0 ON) th cho counter m thng tng thm 1 v dng bin trung gian chy chng trnh (20000) reset counter m thng(mi ln h thng hot ng li th reset counter) LD CNT0 LD 25314 LD 20000 CNTR 0000 #0010 //thit lp gi tr so snh lin tc cho counter m thng LD 25313
13

CMP 00000#0010 //dng h thng khi b so snh bo m 10 thng (25506 ON) LD 25506 OUT 20001 //dng on chng trnh trong hm kha ILC II) Thc hin phng n c giao: Sau khi nhn Start, h thng s t ng ng gi 1 thng 5 to. Sau h thng ngh trong 10s. K tip ng lin tc 3 thng theo th t gm 3 to, 2 to v 1 to. H thng s dng hon ton sau khi thc hin xong tt c cc bc trn hoc khi ta nhn Stop. Khi h thng ang trong trng thi dng, nu ta nhn Start, h thng s thc hin li tt c cng vic theo th t nh trn. Chng trnh LADDER:

14

15

16

17

Chng trnh danh sch lnh: // gii quyt bi ton ta chia bi ton ra lm 2 giai on,giai on sau khi nhn START v giai on sau khi TIMER 0 ON tc l sau khi ngng h thng 10s //giai on u s chy vi bin t gi 20000 //giai on sau s chy vi bin timer 0 LD 000.01 OR 200.00 AND NOT 000.02 AND NOT TIM001 OUT 200.00 //thit lp iu kin cho bng ti to chy: +bin hot ng ca giai on 1 hoc 2 ON (20000 v TIMER 0 ON) +bng ti thng phi ang dng LD 200.00 AND NOT 100.01 LD NOT 200.01 OR TIM000
18

AND LD OUT 100.00 //thit lp cc Counter m s th t thng ti (1..4) v Counter m s to cho mi thng: LD 000.00 LD NOT 000.07 CNT 007 005 LD CNT020 AND 000.00 LD NOT 000.07 CNT 008 003 LD CNT002 AND 000.00 LD NOT 000.07 CNT 009 002 LD CNT003 AND 000.00 LD NOT 000.07 CNT 010 001 LD 000.07 LD 000.01 CNT 020 002 LD 000.07 LD 000.01 CNT 002 003 //Counter 7 m 5 to cho thng 1

//Counter 8 m 3 to cho thng 2

//Counter 9 m 2 to cho thng 3

//Counter 10 m 1 to cho thng 4

//Counter 20 ON khi c 2 thng qua

//Counter 2 ON khi c 3 thng qua

LD 000.07 //Counter 3 ON khi c 4 thng qua LD 000.01 CNT 003 004 //Thit lp iu kin chy cho bng ti thng: gm 5 iu kin tng ng cho tng trng hp LD NOT 200.01 AND CNT007 OR NOT 000.07 OR CNT008 OR CNT009 OR CNT010
19

AND 200.00 OUT 100.01

//Thit lp Timer0 Delay h thng 10s sau khi ng xong thng th 1 ( y m phng ch 2s) LD CNT020 TIM 000 020 OUT 200.01 //Sau khi ng xong tt c cc thng th cho bin 20003 ON v kch hot Timer1. Sau thi gian 2s, h thng s dng hon ton v ch nhn START khi ng li. LD CNT010 OR 200.03 AND NOT TIM001 OUT 200.02 LD 200.02 OUT 200.03 LD 200.03 TIM 001 020 END Nhn xt: h thng trn Board th nghim hot ng ng nh yu cu

Bi 3: IU KHIN NHIT BNG


20

CC PHNG PHP IU KHIN C IN


I) on chng trnh mu:

// S kin khi khi ng chng trnh


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); } 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 kin khi nhn nt Setting void CBai3_3Dlg::OnSetting() { // TODO: Add your control notification handler code here CSetting setting; setting.DoModal(); } ///////////////////////////////////////////////////////////////////////////// // CSetting dialog CSetting::CSetting(CWnd* pParent /*=NULL*/) : CDialog(CSetting::IDD, pParent) { //{{AFX_DATA_INIT(CSetting) 21

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 dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(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

// 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 kin khi nhn nt 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); 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 kin khi nhn nt Stop


void CBai3_3Dlg::OnStop() { // TODO: Add your control notification handler code here m_nTimer = 0; Output= 0; 23

Pwr=0; pw=0; ptAOConfig.chan = gwChannelOutput ; ptAOVoltageOut.OutputValue = 0; DRV_AOVoltageOut(DriverHandle,(LPT_AOVoltageOut)&ptAOVoltageOut); }

// S kin khi nhn nt Accept


void CSetting::OnAccept() { // TODO: Add your control notification handler code here CString 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 default CString s; // read input data DRV_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

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 data if ((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) Cc on chng trnh iu khin ON-OFF v PID:


25

1) iu khin PID: - on c tn hiu nhit : DRV_AIVoltageIn(DriverHandle,(LPT_AIVoltageIn)&ptAIVoltageIn); - on tnh v xut tn hiu iu khin: 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) iu khin ON-OFF: - on c tn hiu nhit : // read input data DRV_AIVoltageIn(DriverHandle,(LPT_AIVoltageIn)&ptAIVoltageIn); - on tnh v xut tn hiu iu khin: // 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

Output =(float)Pwr*5/100; ptAOVoltageOut.OutputValue = Output; DRV_AOVoltageOut(DriverHandle,(LPT_AOVoltageOut)&ptAOVoltageOut); V) Tin hnh th nghim


1) Kho st vng h:

p ng thu c:

Xc nh cc h s Kp,Ki,Kd: Ta xc nh c cc h s K=100-32=68 L=50 T=450 a=KL/T=7.5 Ti=2L=100 Kp=1,20/a=0.16 Ki=Kp/Ti=1.6*10-3

Td=0.5L=25 Kd=Kp*Td=4

2) Kho st vng kn vi b iu khin PID: Kho st vi cc h s PID tnh c t vng h: p ng thu c:

27

Kho st vi cc h s PID mc nh: p ng thu c:

Bng gi tr thu c t p ng: B iu khin PID H s tm c H s mc nh Thi gian ln (s) 75 70 Thi gian xc lp (s) 550 450 vt l (%) 122.5 112.5 Sai s xc lp (0C) 9 5

3) Kho st vng kn vi b iu khin ON-OFF: V cc p ng ln lt vi cc vng tr Db l 1oC , 0.2oC

28

Bng gi tr:
29

B iu khin ON-OFF =10C =0.20C

Thi gian ln (s) 60 120

Thi gian xc lp (s) 420 420

vt l (%) 140 140

Sai s xc lp (0C) 15 10

=> Nhn xt: - iu khin ON-OFF khi rng vng cht cng nh th sai s xc lp cng nh. - B iu khin PID cho sai s nh hn so vi b iu khin ON-OFF.Cht lng b iu khin PID tt hn nhiu so vi ON-OFF. Cu hi thm: lm cho mn c tuyn khi iu khin ON-OFF (on nhp nh u nhau 2 bn gi tr xc lp) Tr li: -Nguyn nhn lm cho phn nhp nh khng u nhau l do qun tnh nhit lc tng v gim nhit khng u nhau.(tng th nhanh ,gim th chm) -Hng gii quyt:sa on code thnh nh sau: if ((Temp-Input*62.5)>(Db+a) if ((Input*62.5-Temp)>(Db-b)) .... vi a,b l cc s dng ta chn thch hp sai s phn trn v phn di u nhau (da vo thc nghim v phng php th v sai).

Bi 4: IU KHIN TC V V TR NG C DC
30

I) Cc on chng trnh mu :
// on chng trnh 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); // on x l tn hiu: void CBAI4Dlg::OnRun() { // TODO: Add your control notification handler code here //------------------------------------------------------------//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 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; 31

ptAOConfig.MinValue = MinValueOut; DRV_AOConfig(DriverHandle,(LPT_AOConfig)&ptAOConfig); // output data ptAOVoltageOut.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; }

//on tnh tn hiu iu khin:


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]; }

// on xut tn hiu iu khin:


void CBAI4Dlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CString s; double m_speed; static double updatespeed[10]; double avrspeed =0;

32

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

this->SetDlgItemText(IDC_STATIC_SETSPEED, s); CDialog::OnTimer(nIDEvent); }

II)Tin hnh th nghim:


1)iu khin tc ng c: Th nghim vi Kp thay i,Ki=0.015,Kd=1e-6: Kp Thi gian ln (s) Thi gian xc lp (s) vt l (%) Sai s xc lp (v/p) 0.001 14 26 2 0.002 6.2 27 5 0.003 5.5 28 6 0.004 4.1 30 9 0.005 3.6 32 11 0.006 3.2 34 13 0.007 3 35 16

p ng thu c: + Trng hp Kp=0.001:


34

+ Trng hp Kp=0.002:

Th Nghim vi Ki thay i,Kp=0.0004,Kd=e^(-6):


35

Ki Thi gian xl (s) vt l (%) Sai s xl (v/p) + Trng hp Ki=0.002:

0.0015 7.6 36.8 6

0.002 8 61.2 2

0.0025 10 75 0

Th Nghim vi Kd thay i,Kp=0.0004,Kd=0.0015: Kd 10^(-4) Thi gian xl (s) 4s vt l (%) 29.93% Sai s xl (v/p) 4

3.10^(-4) 5.9s 23.2% 2

+ Trng hp Kd=3.10^(-4):
36

2) iu khin v tr ng c: Th Nghim vi Ki=0.05,Kp=0.002,Kd=0.025 Thi gian ln 0.07s Thi gian xl (s) 1.6s vt l (%) 15% Sai s xl (v/p) 0.41

37

III) Nhn

xt nh hng ca cc thnh phn Kp , Ki , Kd ca b iu khin PID:

Khi tng Kp : sai s xc lp cng nh, thi gian xc lp tng, vt l cng

cao. Khi tng Kp th cc cc ca h thng ni chung c xu hung di chuyn ra xa trc thc. Nu tng Kp qu gi tr h s khuch i gii hn th h thng s tr nn mt n nh (dao ng). Khi tng Ki : lm chm p ng qu thi gian xc lp tng , vt l tng , sai s xc lp gim. Do h s khuch i ca khu PI bng v cng ti tn s bng 0 nn khu PI c th lm cho sai s ca tn hiu vo l hm nc ca h thng khng c khu vi phn l tng bng 0. Ngoi ra, do khu PI l mt b lc thng thp nn n cn c tc dng trit tiu nhiu tn s cao tc ng vo h thng. Khi tng Kd : p ng ca h thng cng nhanh ,thi gian ln ngn,nhng thi gian xc lp tng , vt l tng v sai s xc lp tng.

Bi 5:IU KHIN THCH NGHI TC NG C DC


38

I) Yu cu ca thy:
To thm 1 nt nhn REVERSE o chiu quay ca ng c nhng ch nhn REVERSE c 1 ln.

II) Cc on chng trnh mu ca gii thut PID thch nghi:


//on c tn hiu xung: double CBAI4Dlg::DataPulse() { PT_DioReadPortByte ptDioReadPortByte0,ptDioReadPortByte1; USHORT DataLo,DataHi; doublePulse; doubleDelta_Pulse; //static doublePrevPulse; // 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; 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); } //on x l tn hiu: m_nTimer = SetTimer(1,T0,0); if(!flag) gdwStartTime = GetTickCount(); flag =1;
39

if(SetSpeed > 0) USetSpeed = (2952.0 - SetSpeed)/1135.4; //QUY DOI TOC DO RA DIEN AP else USetSpeed = (2720.0 - SetSpeed)/1133.8; a[0][0] = a0; a[1][0] = a1; a[2][0] = a2; //on tnh tn hiu iu khin: 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; 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

//e2 trong cong thuc cap nhat thong so

*/

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]; } //on xut tn hiu iu khin: void CBAI4Dlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CString 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

Output = 2.5 - Output; if(Output> MaxValueOut) Output = MaxValueOut; if(Output < MinValueOut) Output = MinValueOut; ptAOVoltageOut.OutputValue = (Output); DRV_AOVoltageOut(DriverHandle, (LPT_AOVoltageOut)&ptAOVoltage Out); 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) Thc hin sa code li theo ng yu cu:


42

Ta thm vo FUNCTION sau cho nt bm REVERSE,v nh khai bo int reverse =0 u chng trnh xc nh ng c ang quay theo chiu no void CBAI4Dlg::OnReverse() { // TODO: Add your control notification handler code here If (reverse) SetSpeed=-SetSpeed; Else SetSpeed=SetSpeed; Reverse =1; }

III) Tin hnh th nghim:


Th nghim vi tc t 200(v/p): B Thi gian Thi gian iu Khin ln(s) xc lp(s) PID 18 45 PID thch nghi 11 20 vt l(%) 12 4 Sai s Xc lp(v/p) 10 0

43

Th nghim vi tc t 1000(v/p): B Thi gian Thi gian iu Khin ln(s) xc lp(s) PID 10 27 PID thch nghi 4.5 12

vt l(%) 4.4 8.5

Sai s Xc lp(v/p) 0 0

44

45

Th nghim vi tc t 2000(v/p): B Thi gian Thi gian iu Khin ln(s) xc lp(s) PID 10 50 PID thch nghi 2.5 16

vt l(%) 25 10

Sai s Xc lp(v/p) 0 0

Th nghim vi tc t -200(v/p): B Thi gian Thi gian iu Khin ln(s) xc lp(s) PID 14 40 PID thch nghi 2 12

vt l(%) 15 30

Sai s Xc lp(v/p) 3 0

46

Th nghim vi tc t -2000(v/p): B Thi gian Thi gian

Sai s
47

iu Khin ln(s) PID 10 PID thch nghi 3

xc lp(s) 50 6

vt l(%) 25 53

Xc lp(v/p) 0 0

48

Nhn xt v so snh gia b PID thch nghi v PID thng :

Trong tt c cc trng hp iu khin vi tc t cho trc th b iu khin thch nghi lun c thi gian xc lp rt nhanh so vi b iu khin PID thng . Thi gian ln v thi gian xc lp ca b iu khin thch nghi lun b hn thi gian ln v xc lp ca b iu khin PID thng. ng thi b iu khin thch nghi lun cho sai s xc lp bng 0 do cc h s Kp,Kd,Ki s c t chnh nh sao sai s ng ra bng 0. Tuy nhin trong mt s trng hp th b iu khin thch nghi c vt l kh ln, gp i so vi vt l ca b iu khin PID thng thng. H s thch nghi phn nh tc thch nghi ca b iu khin: -Nu ln th h thng s hi t nhanh nhng vt l cng tng theo, h thng nhy vi nhiu -Nu nh th ngc li,h thng s hi t chm nhng vt l cng s gim xung => Ta phi chn h s sao cho thch hp c th chp nhn tc hi t v vt l l t yu cu so vi thc t
Quan st cui cng l kt qu ca th nghim thc t ta thy c kh nng

iu khin tn hiu ng ra bm theo tn hiu t ca b iu khin thch nghi l rt tt. chnh l l do ti sao b iu khin thch nghi c s dng trong cc trng hp i hi chnh xc cao v thi gian p ng nh.

49

Anda mungkin juga menyukai