You are on page 1of 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

TIM0
#0040
TIM1
#0040

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

SW3

00004

00005

AUTO
1007

1007
CB1
1007

0001

CB2
0002

TIM0
1000

1000

1000
TIM0
#0020

1000

1007
1001

1007

0001

0002

CNT 1

CNT1
R

12

TIM2

CNT1

1002
1002

1002
TIM2
#0040
1007

TIM3

0001

TIM3
#0300

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

OR
AND
AND
AND
OUT
LD
TIM

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

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

SW3

00004

00005

AUTO
TIM11
1007

1007

1007

1007

1007

1007

1007

1007

1007

1007

1007

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

1007

TIM10
#0100

1007

TIM11
#0110
TIM1

TIM4
1000

TIM8

1000

TIM10

1007
1001

TIM2

TIM4
1002

TIM7

TIM9

TIM3

TIM5
1003

TIM6

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:
STOP

STAR
00001

00002

AUTO
20001
20000

20000

20000

TIM1
#0050
PAUSE

TIM1

00003

20002

KEEP(11)
20002

20002
IL(02)
10001

TIM1
10000

11

00000

CNT 0

00007

CNT0

#0010

TIM1
10001

00007

CNT0

25314

CNTR(12)
#0010

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

//Counter 7 m 5 to cho thng 1

LD CNT020
AND 000.00
LD NOT
000.07
CNT 008 003

//Counter 8 m 3 to cho thng 2

LD CNT002
AND 000.00
LD NOT
000.07
CNT 009 002

//Counter 9 m 2 to cho thng 3

LD CNT003
AND 000.00
LD NOT
000.07
CNT 010 001

//Counter 10 m 1 to cho thng 4

LD 000.07
LD 000.01
CNT 020 002

//Counter 20 ON khi c 2 thng qua

LD 000.07
LD 000.01
CNT 002 003

//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
Td=0.5L=25
Kp=1,20/a=0.16
Ki=Kp/Ti=1.6*10-3 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

29

Bng gi tr:
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).

30

Bi 4: IU KHIN TC V V TR NG C DC
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;
31

// 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;
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;
32

double m_speed;
static double updatespeed[10];
double avrspeed =0;

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);
33

s.Format("%4d",m_speed);
this->SetDlgItemText(IDC_STATIC_MEASPEED, s);
s.Format("%4d",SetSpeed);
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)

0.001

0.002

0.003

0.004

0.005

0.006

0.007

Thi gian xc lp (s)

14

6.2

5.5

4.1

3.6

3.2

vt l (%)
Sai s xc lp (v/p)

26
2

27
5

28
6

30
9

32
11

34
13

35
16

34

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

+ Trng hp Kp=0.002:

35

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


Ki
0.0015
0.002
Thi gian xl (s)
7.6
8
vt l (%)
36.8
61.2
Sai s xl (v/p)
6
2

0.0025
10
75
0

+ Trng hp Ki=0.002:

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

36

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

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.

38

Bi 5:IU KHIN THCH NGHI TC NG C DC


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;
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)&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;

//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;
40

if(Output>=2.6) e[2] = 2.6-(2897.7-(SetSpeed


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

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)&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);
}
42

III) Thc hin sa code li theo ng yu cu:

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
iu Khin
ln(s)
xc lp(s)

vt l(%)

Sai s
Xc lp(v/p)
47

PID
10
PID thch nghi 3

50
6

25
53

0
0

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


48

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

You might also like