Tải bản đầy đủ (.pdf) (49 trang)

BÁO CÁO-ĐIỀU KHIỂN CÁC PHẦN TỬ KHÍ NÉN

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.25 MB, 49 trang )

1

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
OR 1000
AND NOT TIM 001
OUT 1000
//Khởi động Timer 1 khi xi lanh I bắt đầu đẩy ra
LD 1000
TIM 001
1000


TIM1
#0020
00004
1000
1000
1000
1001
TIM1
SW2
2

#0020
//Thiết lập 2 trạng thái đẩy ra và thu vào là ngược nhau
LD 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ừng
Chươ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 00004
OR 1007

LD NOT 00005
OUT 1007
1007
TIM0
#0040
00004
1007
1007
1000
1001
00005
TIM0
TIM0
1000
1002
1007
1007
TIM1
TIM0
TIM1
#0040
3

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

//Thiết lập chế độ đẩy ra và thu vào của xi lanh I ngược nhau
LD 1000
AND 1007
OUT 1001
//Tạo 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í 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















4

Chương trình LADDER:


1007
00004
1007
00005
1007
0001
0002
1000
TIM0
#0020
1000
TIM0
1000
CB1
CB2
AUTO
SW3
SW2
5



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 00004
OR 1007
LD NOT 00005
OUT 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 1007
1007
CNT1
0001
1002
TIM2
#0040
1002
0002
CNT 1



R 12
CNT1
1002
1000
1001
1007

TIM2
1007
0001
TIM3
#0300
TIM3
1004
HORN
6

OR 1000
AND 0001
AND 0002
AND NOT TIM 0
OUT 1000
LD 1000
TIM 000
#0020
LD NOT 1000
AND 1007
OUT 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 1007
AND 0001
AND NOT 0002
LD CNT1
CNT 001
12

//Khi đã đủ 12 chai thì cho xi lanh J hoạt động (trong 4s) để đóng nắp chai
LD CNT1
OR 1002
AND NOT TIM 002
OUT 1002
LD 1002
TIM 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 1007
AND NOT 0001
TIM 003
#0300
LD TIM3
OUT 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
7

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à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.
































8

Chương trình Ladder:


1007
00004
1007
00005
1007
TIM1
#0010
TIM11
1007
TIM2
#0020
1007
TIM3
#0030
1007
TIM4
#0040

1007
TIM5
#0050
1007
TIM6
#0060
1007
TIM7
#0070
1007
TIM8
#0080
1007
TIM9
#0090
SW2
SW3
AUTO
9



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 00004
OR 1007
LD NOT 00005
AND NOT TIM 11

OUT 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 1007
TIM 001
#0010
1007
TIM10
#0100
1007
TIM11
#0110
TIM1
TIM4
TIM8
TIM10
1000
1000
1001
1007
TIM2
TIM4
TIM7
TIM9
1002
TIM3
TIM5
TIM6
TIM9
1003

10

LD 1007
TIM 002
#0020
………
LD 1007
TIM 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
LD TIM1
AND NOT TIM4
OUT 1000
LD TIM8
AND NOT TIM10
OUT 1000
LD 1007
AND NOT 1000
OUT 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 TIM2
AND NOT TIM4
OUT 1002
LD TIM7
AND NOT TIM9
OUT 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 TIM3
AND NOT TIM5
OUT 1003
LD TIM6
AND NOT TIM9
OUT 1003

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






11

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ình
Chương trình LADDER:

20000
00001
20000
20000
00002
STAR
STOP

TIM1
#0050
AUTO
20001
KEEP(11)
20002
TIM1

00003

PAUSE
S
R
20002
20002
IL(02)
10001
TIM1
10000
12









Chương trình danh sách lệnh:

//thiết lập chế độ tự giữ khi nhấn STAR
LD 00001
CNT0
TIM1
CNT 0

#0010
10001
00000
00007
00007
END
CNT0
CNTR(12)

#0010

25314
20000
25313
CMP(20)
#0010

25506
20001
IL(03)
13

OR 20000
AND NOT 00002

OUT 20000
//Cho timer 1 chạy để delay 5s sau khi nhấn STAR
LD 20000
TIM 001
#0050
//thiết lập chế độ PAUSE dùng địa chỉ 20002 để làm biến trung gian
LD TIM1
AND 00003
LD TIM1
AND 20002
KEEP 20002
//Sử dụng địa chỉ 20002 để làm điều kiện cho hàm khóa đoạn chương trình
LD 20002
IL
//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 TIM1
AND NOT 10001
OUT 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 00000
LD NOT 00007
CNT 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 CNT0
OR NOT 00007

AND TIM1
OUT 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 CNT0
LD 25314
LD 20000
CNTR 0000 #0010
//thiết lập giá trị so sánh liên tục cho counter đếm thùng
LD 25313
14

CMP 00000 #0010
//dừng hệ thống khi bộ so sánh báo đã đếm đủ 10 thùng (25506 ON)
LD 25506
OUT 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ặ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:




15




16



17








18




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.01
OR 200.00
AND NOT 000.02
AND NOT TIM001
OUT 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ừng
LD 200.00
AND NOT 100.01
LD NOT 200.01
OR TIM000
19

AND LD
OUT 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.07
CNT 007 005

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

CNT 008 003

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

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

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

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

LD 000.07 //Counter 3 ON khi đã có 4 thùng qua
LD 000.01
CNT 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.01
AND CNT007
OR NOT 000.07
OR CNT008
OR CNT009

OR CNT010
20

AND 200.00
OUT 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 CNT020
TIM 000 020
OUT 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 CNT010
OR 200.03
AND NOT TIM001
OUT 200.02
LD 200.02
OUT 200.03

LD 200.03
TIM 001 020
END

 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
21

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ì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);
}
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 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)
22

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
}

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.

void CBai3_3Dlg::OnPaint()
{
if (IsIconic())
{
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// 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);
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 Stop
void CBai3_3Dlg::OnStop()
{
// TODO: Add your control notification handler code here
m_nTimer = 0;
Output= 0;
24

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

// Sự kiện khi nhấn nút 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;
25

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) Các đoạn chương trình điều khiển ON-OFF và PID:

×