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. 




Önemli uyarı: PLC ile pc haberleşmesinde S7.Net sıkıntı çıkarabiliyor, fabrika ortamında kullanılan bir yazılım yapacaksanız S7.Net yerine Modbus TCP protokolünü kullanın... Modbus kütüphanesiyle ilgili bir yazıyı ileride yayınlayacağım 03.06.2022

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ü
{
    txbXmin.BackColor=Color.LightGreen;
    _S71200.Write("I0.1",1);
}
else
{
    txbXmin.BackColor=Color.White;
    _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");

Timer1Tick kodu içinde bu şekilde PLC çıkışlarını okuyabiliyoruz. Bunlara göre de tosba hareket ediyor olacak haliyle. Kodun tamamı aşağıdaki şekilde :

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

Bu blogdaki popüler yayınlar

VBA - Mscomm (seri port) ile veri loglama

RJ45 2 - Novexx barkod yazıcıya, S7-1200 plc ile etiket yazdırma

Uzak I/O modülü olarak PLC kullanmak