Pick & Place 2 - S7.Net Plus
Önceki yazıda oluşturduğumuz programı açalım. PLC ile bağlantı kurmamızı sağlayan kütüphaneyi NuGet ten bulalım ve projeye ekleyelim. Project -> Manage Packages açılan pencerede sağdaki arama kutusuna S7 yazalım ve enter a basalım.
S7.Net Plus ı seçelim ve seçtiğimiz yerde köşede çıkan Add (ekle) ye tıklayalım. Önceki yazılarda bahsetmiştim. Projeyi ilk oluştururken .NET versiyonu minimum 4.5.2 seçilmesi gerekiyor, böyle yapmadıysan S7.Net çalışmayacaktır. Fontu sarı olan satırları koda ekleyelim :
using S7.Net;
namespace pickplace
{
public partial class MainForm : Form
{
Plc _S71200 = new Plc(CpuType.S71200, "127.0.0.1", 0, 1);
float y_pos=20; // max 80
bool Y;
float x_pos=0; // max 160
bool X;
bool Gripper;
float gripper_pos = 16; // min 6
public MainForm()
{
InitializeComponent();
_S71200.Open();
Design tab ında formda boş bir yere tıklayalım, sağda properties penceresinde en üstte bulunan sarı şimşek sembolüne (events - olaylar) tıklayalım, behavior altında FormClosed a çift tık yapalım, süslü parantezlerin arasına bu kodu ekleyelim :
void MainFormFormClosed(object sender, FormClosedEventArgs e)
{
_S71200.Close(); // form penceresi kapatılırsa plc bağlantısı kapatılsın
}
Design tab ında formu sağa doğru genişletelim ve üst kısma, name (isim) özelliği lblBag olan bir label ekleyelim. Text özelliğine Bağlantı durumu yazalım. Fontu 11 ve kalın yapalım. Kopyala yapıştır ile bir label daha oluşturalım, name özelliği lblAdim, Text özelliği Adım numarası olsun.
Timer1Tick kodunun başına 2 satır sonuna 2 satır ekleyelim :
void Timer1Tick(object sender, EventArgs e)
{
if(_S71200.IsConnected){
lblBag.Text="PLC: Bağlı..";
.....
.....
}
else lblBag.Text="PLC: Yok !";
}
Böylece Timer1Tick kodu sacede PLC bağlıyken çalışacaktır. Şuan programı çalıştırırsan hata alman normal yani. Bu arada artık PLC den kontrol sağlayacağımız için 3 butonun ve 6 textbox ın Enabled özelliğini false yapalım. İsmi btnStart, Text i START olan yeni bir buton oluşturalım. Bununla PLC deki programı başlatacağız.
Simülasyon yöntemimiz şöyle PLC nin input larına C# ile yazacağız, PLC output larını yine C# ile okuyacağız. PLC deki işlemin hangi adımda olduğunu ve PLC çıkışlarını okuyalım. Min max durumlarını gösteren buna göre renklenen textbox lar ve START butonu, PLC için input olacak. Programdaki X, Y ve Gripper değişkenleri PLC için output olacak.
if(x_pos==0) txbXmin.BackColor=Color.LightGreen; else txbXmin.BackColor=Color.White;if satırlarımız vardı, x_pos pozisyon değerine göre, lamba yada led niyetine kullanılan textbox ın arka fon rengini ayarlıyordu. Bu satırı aşağıdaki gibi değiştiriyoruz :
if(x_pos==0) // X min sensörü{
_S71200.Write("I0.1",1);
else
{
_S71200.Write("I0.1",0);
Demek oluyor ki eğer x_pos değeri 0 ise textbox ın arka rengini açık yeşil yap ve ayrıyeten PLC nin I0.1 girişine de 1 yani true yaz. Silindir sensörü görmüş oldu bu şekilde. Bu değer 0 değilse, arka rengi beyaz yap ve ayrıyeten I0.1 e 0 yaz, sensör görmüyor olacak bu şekilde.
START butonunun mouse down ve mouse up olaylarına da aşağıdaki kodları ekleyelim. Olay eklemek için START butonuna tıklayın ve sağdaki properties penceresinden sarı şimşek (events) e tıklayarak olayı bulun, ardından olaya çift tıklayın :
void BtnStartMouseDown(object sender, MouseEventArgs e)
{
_S71200.Write("I0.0",1);
}
void BtnStartMouseUp(object sender, MouseEventArgs e)
{
_S71200.Write("I0.0",0);
}
Böylece kullanıcı START butonuna sol tık yaptığında PLC ye 1, mouse tan parmağını çektiğinde 0 gidiyor.
X = (bool)_S71200.Read("Q0.0");Y = (bool)_S71200.Read("Q0.1");
Gripper = (bool)_S71200.Read("Q0.2");
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using Nakov.TurtleGraphics;
using S7.Net;
namespace pickplace
{
public partial class MainForm : Form
{
Plc _S71200 = new Plc(CpuType.S71200, "127.0.0.1", 0, 1);
float y_pos=20; // max 80
bool Y;
float x_pos=0; // max 160
bool X;
bool Gripper;
float gripper_pos = 16; // min 6
public MainForm()
{
InitializeComponent();
_S71200.Open();
}
void Timer1Tick(object sender, EventArgs e)
{
if(_S71200.IsConnected) {
lblBag.Text="PLC: Bağlı..";
ushort stepNo = (ushort)_S71200.Read("MW50"); // Adım numarası
lblAdim.Text = "Adım: " + stepNo;
X = (bool)_S71200.Read("Q0.0");
Y = (bool)_S71200.Read("Q0.1");
Gripper = (bool)_S71200.Read("Q0.2");
if(X) btnX.BackColor=Color.LightGreen; else btnX.BackColor=Color.LightPink;
if(Y) btnY.BackColor=Color.LightGreen; else btnY.BackColor=Color.LightPink;
if(Gripper) btnGripper.BackColor=Color.LightGreen; else btnGripper.BackColor=Color.LightPink;
if(X && x_pos<160) x_pos += 5;
if(!X && x_pos>0) x_pos -= 5;
if(Y && y_pos<80) y_pos += 5;
if(!Y && y_pos>20) y_pos -= 5;
if(Gripper && gripper_pos>6) gripper_pos -= 2;
if(!Gripper && gripper_pos<16) gripper_pos += 2;
if(x_pos==0) // X min sensörü
{txbXmin.BackColor=Color.LightGreen;
_S71200.Write("I0.1",1);}
else
{txbXmin.BackColor=Color.White;
_S71200.Write("I0.1",0);}
if(x_pos==160) // X max sensörü
{txbXmax.BackColor=Color.LightGreen;
_S71200.Write("I0.2",1);}
else
{txbXmax.BackColor=Color.White;
_S71200.Write("I0.2",0);}
if(y_pos==20) // Y min sensörü
{txbYmin.BackColor=Color.LightGreen;
_S71200.Write("I0.3",1);}
else
{txbYmin.BackColor=Color.White;
_S71200.Write("I0.3",0);}
if(y_pos==80) // Y max sensörü
{txbYmax.BackColor=Color.LightGreen;
_S71200.Write("I0.4",1);}
else
{txbYmax.BackColor=Color.White;
_S71200.Write("I0.4",0);}
if(gripper_pos==16) // Gripper açık sensörü
{txbGr_acik.BackColor=Color.LightGreen;
_S71200.Write("I0.5",1);}
else
{txbGr_acik.BackColor=Color.White;
_S71200.Write("I0.5",0);}
if(gripper_pos==6) // Gripper kapalı sensörü
{txbGr_kapali.BackColor=Color.LightGreen;
_S71200.Write("I0.6",1);}
else
{txbGr_kapali.BackColor=Color.White;
_S71200.Write("I0.6",0);}
lblX.Text="x pos: "+x_pos;
lblY.Text="y pos: "+y_pos;
lblGripper.Text="gr pos: "+gripper_pos;
Turtle.Dispose();
Turtle.Init(panel1);
Turtle.ShowTurtle=false;
Turtle.PenUp();
Turtle.MoveTo(-80,40);
Turtle.PenDown();
Turtle.PenColor = Color.Gray;
Turtle.PenSize=25;
Turtle.Rotate(90);
Turtle.Forward(160);
Turtle.Backward(160-x_pos); // 160 - x_pos
Turtle.Rotate(-90);
Turtle.PenColor = Color.Black;
Turtle.Forward(20);
Turtle.Backward(40);
Turtle.PenColor = Color.Green;
Turtle.PenSize=7;
Turtle.Backward(y_pos); // y_pos
Turtle.PenColor = Color.Blue;
Turtle.Rotate(90);
Turtle.Forward(gripper_pos); //griper sağ tırnak konum
Turtle.Rotate(90);
Turtle.Forward(20);
Turtle.Backward(20);
Turtle.Rotate(-90);
Turtle.Backward(gripper_pos*2); //griper sol tırnak konum
Turtle.Rotate(90);
Turtle.Forward(20);
}
else lblBag.Text="PLC: Yok!";
}
void BtnXClick(object sender, EventArgs e)
{
if(X) X=false; else X=true;
}
void BtnYClick(object sender, EventArgs e)
{
if(Y) Y=false; else Y=true;
}
void BtnGripperClick(object sender, EventArgs e)
{
if(Gripper) Gripper=false; else Gripper=true;
}
void MainFormFormClosed(object sender, FormClosedEventArgs e)
{
_S71200.Close();
}
void BtnStartMouseDown(object sender, MouseEventArgs e)
{
_S71200.Write("I0.0",1);
}
void BtnStartMouseUp(object sender, MouseEventArgs e)
{
_S71200.Write("I0.0",0);
}
}
}
Yorumlar
Yorum Gönder