Pick & Place 1 - Simülasyona hazırlık


Pick al, Place yerleştir veya koy demek. Otomasyonda bir parçayı alıp başka bir alana taşımaya yarıyor. Önceki 2 yazıyı okuduysan, artık bu projeye başlayabiliriz. 

X ekseninde yani sağa sola pnömatik rodless (milsiz) silindir, Y ekseninde yukarı aşağı pnömatik bir silindir, parçayı tutmak içinde pnömatik bir gripper (tutucu) var. Bu arada "pnömatik" tabiri, basınçlı hava ile çalışan malzemeler için kullanılır.
Hiçbir donanıma veya malzemeye gerek kalmadan bu cihazı PC ekranında çalıştıracağız. Sonrasında başka bir yazıda Tia Portal da S7-1200 ile simülasyonunu gerçekleştireceğiz. SharpDevelop ta aşağıdaki gibi bir dizayn yapalım.


En üstte soldan sağa isimleri btnX, btnY, btnGripper butonları var. Buton ismini değiştirmek için formda butona tıklayıp, sağdaki properties panelinden Name özelliğini değiştirmek gerekiyor.
Butonların altında 3 tane label oluşturun, isimleri resimdeki gibi. Altına 6 tane  textbox koyalım, bunlar silindir pozisyonunu algılamak için kullanılan manyetik silindir sensörlerini temsil edecek. Soldan sağa isimleri txbXmin, txbXmax, txbYmin, txbYmax, txbGr_acik, txbGr_kapali olsun. En alt sıraya da 6 tane label yazdım resimdeki gibi.

using Nakov.TurtleGraphics;

namespace pickplace
{

    public partial class MainForm : Form
    {
        float y_pos=20; // max 80
        bool Y;
        float x_pos=0; // max 160
        bool X;
        bool Gripper;
        float gripper_pos = 16; // min 6


Değikenleri yukarıdaki gibi tanımlayalım. En üstteki using Nakov.. da ne ola ki diyenler önceki 2 yazıya baksın lütfen. bool değişkeni true yada false olabilir başka değer alamaz, aynen PLC de bulunan bit gibi çalışır, S7-1200 de Q0.0 çıkışı gibi. Burada X true ise cihaz sağa, false ise sola gidecektir. Aynı şekilde yukarı aşağı hareketi Y ile sağlanacak. X, Y ve Gripper değişkenleri sonraki yazımda PLC çıkışlarından gelecektir, henüz o aşamaya gelmediğimiz için butonlar ile işlem yapıyoruz.

Design ekranında butona çift tık yaparak aşağıdaki kodları yazalım.


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;
}
Butona tıklama olayı, bool değişkenin o anki değerini tersine çeviriyor olacak. True ise false olacak örneğin. Şimdi çizimin animasyon olabilmesi için her 100 ms de yeni baştan çizilmesi gerekiyor. Bunun için soldaki panelden, yani Tools -> Windows Forms panelinden en altta bulunan Timer a tıkla, sonra forma tıkla. timer1 oluşacaktır. Çalışması için sağdaki panelden Enabled özelliğini True yapalım


Design tab ındayken formun altında çıkan timer1 e çift tık yapınca aşağıdaki kod otomatik olarak çıkmalıdır.

void Timer1Tick(object sender, EventArgs e)
{

}

Her 100 ms de bir, süslü parantezlerin arasına yazacağımız aşağıdaki kod çalışacaktır. 

Turtle.Dispose(); // Grafik silinir..
Turtle.ShowTurtle=false; // Tosba ekranda gözükmesin ciddi bir iş yapıyoruz
Turtle.PenColor = Color.Gray; // Kalem gri oldu
Turtle.PenSize=25; // Kalem ucunu kalınlaştırdık
Turtle.Rotate(90); // Tosba saat yönünde 90 derece döner, başta yukarı bakıyordu şimdi sağa
Turtle.Forward(160); // Tosba 160 pixel ileri gider
Turtle.Backward(160-x_pos); // 160 - x_pos kadar geri gider
Turtle.Rotate(-90); // // Tosba saat yönünün tersine 90 derece döner

Turtle.PenColor = Color.Black; // Kalem siyah oldu
Turtle.Forward(20);
Turtle.Backward(40);

Turtle.PenColor = Color.Green; // Kalem yeşil oldu
Turtle.PenSize=7; // Kalem ucunu inceldi
Turtle.Backward(y_pos); // y_pos

Turtle.PenColor = Color.Blue; // Kalem mavi oldu
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);

Programı F5 ile çalıştırınca tosbayı iş başında görebilirsin. Butonların işe yaraması yani animasyonun başlaması için bu kodları da süslülerin arasına yerleştirelim, yalnız  bu kodları tosba hareketi olan yukardaki kodların üstüne yapıştırın:

if(X && x_pos<160) x_pos += 5; // && and demek yani X true ve x_pos<160 ise x_pos u 5 artır
if(!X && x_pos>0) x_pos -= 5; // !X , X false ise demek
if(Y && y_pos<80) y_pos += 5; // bu kodları tosba hareketi olan yukardaki kodların üstüne yapıştırın
if(!Y && y_pos>20) y_pos -= 5;
if(Gripper && gripper_pos>6) gripper_pos -= 2;
if(!Gripper && gripper_pos<16) gripper_pos += 2;

Bir de buton ve textbox ların arka fon renklerini düzenlemek gerekiyor. Şuan için kodun tamamı aşağıdaki gibi, çalıştırınca ne işe yaradıklarını kolayca anlayabilirsiniz.. 

using Nakov.TurtleGraphics;

namespace pickplace
{

    public partial class MainForm : Form
    {
        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();
    }

    void Timer1Tick(object sender, EventArgs e)
    {
        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) txbXmin.BackColor=Color.LightGreen; else txbXmin.BackColor=Color.White;
        if(x_pos==160) txbXmax.BackColor=Color.LightGreen; else txbXmax.BackColor=Color.White;
        if(y_pos==20) txbYmin.BackColor=Color.LightGreen; else txbYmin.BackColor=Color.White;
        if(y_pos==80) txbYmax.BackColor=Color.LightGreen; else txbYmax.BackColor=Color.White;
        if(gripper_pos==16) txbGr_acik.BackColor=Color.LightGreen; 
        else txbGr_acik.BackColor=Color.White;
        if(gripper_pos==6) txbGr_kapali.BackColor=Color.LightGreen; 
        else txbGr_kapali.BackColor=Color.White;


        lblX.Text="x pos: "+x_pos;
        lblY.Text="y pos: "+y_pos;
        lblGripper.Text="gr pos: "+gripper_pos;

        Turtle.Dispose(); // Grafik silinir..
        Turtle.ShowTurtle=false;

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

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

İyi güzel program çalışıyor.. Fakat bir terslik var muhtemelen sen de fark ettin. Program çalışırken, pencereyi minimize (simge durumuna küçültünce) yapınca veya başka bir uygulamayı açınca .net böyle bir hata veriyor :




Çakılıyor yani, biraz araştırmadan sonra internette birşey bulamadım. İnsan benim gibi kodlamadan anlamayanlar için bir çözüm sunar. Hata penceresini kapattıktan sonra SharpDevelop ekranının en üstünde bulunan F5 ile aynı işlevi gören yeşil play tuşunun 2 sağında mavi kare şeklindeki stop yani dur tuşuna tıklamak gerekiyor ki (kısayolu shift + F5) program tırmalamaya devam etmesin normale dönsün.. 

Hatanın çözümü için tosbayı bir panelin içine tıkmak gerekiyormuş. Şöyle ki soldaki panelden bir panel alıp penceremizin altına yerleştiriyoruz.


Sağda panel1 in özelliklerini görebilirsin en altta Size yani büyüklüğü 319;177 yazıyor bende. Tosba panelin içine girince panelin ortasından çizmeye başlıyor ve çizim panele sığmıyor. Bunun için başlama noktasını MoveTo komutuyla taşıyoruz bunu yaparkende PenUp kalem yukarı yapıyoruz ki birşey çizmesin. Tosbayı panel in içine koymak için de Init komutunu kullanıyoruz. 

Turtle ile başlayan komutların başındaki bu 2 satırı bul ve sil :
     

Turtle.Dispose(); // Grafik silinir..
Turtle.ShowTurtle=false;


Silinen 2 satır yerine aşağıdaki 6 satırı kopyala yapıştır :


Turtle.Dispose(); //Dispose, Init den önce olmalı yoksa panele girmiyor kerata
Turtle.Init(panel1);
Turtle.ShowTurtle=false;
Turtle.PenUp();
Turtle.MoveTo(-80,40);
Turtle.PenDown();

Son hali aşağıdaki gibi çalışıyor, ve küçültünce program çakılmıyor artık.



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