Electric Rail Car - Tia portal programı ve C# kodu



Youtube ta izleyebilirsin..

Elektrikli raylı taşıma platformu yada aracı olarak geçiyor.. Bunla ilgili senaryomuz şu şekilde :

Aracın kontrolü için gerekli sensörler vardır (s1, s2 ve s3 sensörleri).
Start butonuna basıldığında taşıt geri yönde hareket ederek s1 sensörünün olduğu noktaya gelecektir. Yükü alana kadar 5 dakika bekleyecektir. Daha sonra s2 sensörünün olduğu noktaya gelecektir. Burada ek yükü alana kadar 1 dakika bekleyecektir. Daha sonra ileri yönde hareket edecektir. s3 sensörünün olduğu noktaya geldiğinde yükü boşaltmak için 7 dakika bekleyecektir. Daha sonra geri yönde hareket edecektir. s1 sensörünün olduğu noktaya gelerek yük alacaktır. Bu işlemler 3 defa tekrar edecektir. Bu işlemler esnasında Stop butonuna basılırsa, taşıt hangi noktada olursa olsun, doğrudan s3 sensörünün olduğu noktaya hareket edip duracaktır.


Soruyu, kontrolkalemi forumunda görünce hemen C# tosba mı iş başı yaptırdım;
Simülasyonda S1 bekleme 4sn, S2 bekleme 2sn, S3 bekleme 6sn. yaptım.. Tekrar sayısını da 3 yaptım.






Bu sefer sırayı değiştirelim, önce Tia Portal programı :



Adım 2 de S1 de bekliyor.. Adım 3 te Motor ileri, tabi tekrar sayacı çıkış vermediyse.



Sayaç dolmadıysa Adım 1 e döner..


Nerde olursa olsun, STOP a basılırsa Adım 7 ye..


Adım 5 ve 7 de Q0.0 için set/reset kullanmak durumunda kaldım, aslında sadece coil kullanmak yeterli olması lazım fakat PLCSIM aksi halde Adım 3 te takılı kalıyordu. Bu sanırım siemens in hatası benden ötürü değil yani. Tia V16, Plcsim V16 kullanmaktayım. C# ta simülasyonu da gerçekleştirdim, kodlar aşağıdaki gibidir..

Not: Jeton sonradan düştü yine ve ne olduğunu anladım... Sorun, benden ötürüymüş :) Çift bobin sendromu adlı yazıda durumu anlattım. Çözüm olarak orda da dediğim gibi tüm çıkışlarda sadece coil kullanmak yerine set veya reset kullanırsanız bu sorun olmuyor.


using Nakov.TurtleGraphics;
using S7.Net;


namespace railCart
{
    public partial class MainForm : Form
    {
        Plc _S71200 = new Plc(CpuType.S71200, "127.0.0.1", 0, 1);

        float x_pos=-70; // min -200, max 200
        bool M_ileri;
        bool M_geri;
        bool S1,S2,S3;

        public MainForm()
        {

            InitializeComponent();
            _S71200.Open();
        }

        void Timer1Tick(object sender, EventArgs e)
        {
            ushort stepNo = (ushort)_S71200.Read("MW50"); // Adım numarası
            lblAdim.Text = "Adım: " + stepNo;

            ushort sayac = (ushort)_S71200.Read("DB4.DBW4");
            lblSayac.Text = "Sayaç: " + sayac;

            M_ileri = (bool)_S71200.Read("Q0.0"); // motor ileri
            M_geri = (bool)_S71200.Read("Q0.1"); // motor geri

            if(M_ileri && x_pos<200) x_pos += 3;
            if(M_geri && x_pos>-200) x_pos -= 3;

            lblXpos.Text="Vagon poz : "+x_pos;

            Turtle.Init(panel1);
            Turtle.ShowTurtle=false;

            // Raylar
            Turtle.PenColor = Color.Green;
            Turtle.PenSize=7;
            Turtle.PenUp();
            Turtle.MoveTo(-200,50); //X te sola Y de yukarı
            Turtle.PenDown();
            Turtle.Rotate(90);
            Turtle.Forward(400);
            Turtle.PenUp();
            Turtle.MoveTo(-200,-10); //X te sola Y de yukarı
            Turtle.PenDown();
            Turtle.Forward(400);

            //S1
            Turtle.PenColor = Color.Black;
            if(x_pos>-185 && x_pos<-135)
            {
                Turtle.PenColor = Color.Yellow; _S71200.Write("I0.2",1);
            } else _S71200.Write("I0.2",0);
            Turtle.Rotate(90);
            Turtle.PenUp();
            Turtle.MoveTo(-180,-20); //X te sola Y de yukarı
            Turtle.PenDown();
            Turtle.Forward(20);
            Turtle.PenColor = Color.Black;
            //S2
            if(x_pos>-5 && x_pos<45)
            {
                Turtle.PenColor = Color.Yellow;_S71200.Write("I0.3",1);
            } else _S71200.Write("I0.3",0);
            Turtle.PenUp();
            Turtle.MoveTo(0,-20); //X te sola Y de yukarı
            Turtle.PenDown();
            Turtle.Forward(20);
            Turtle.PenColor = Color.Black;
            //S3
            if(x_pos>175)
            {
                Turtle.PenColor = Color.Yellow;_S71200.Write("I0.4",1);
            } else _S71200.Write("I0.4",0);
            Turtle.PenUp();
            Turtle.MoveTo(180,-20); //X te sola Y de yukarı
            Turtle.PenDown();
            Turtle.Forward(20);

            //Araba
            Turtle.PenColor = Color.Blue;
            Turtle.PenUp();
            Turtle.MoveTo(x_pos,40);
            Turtle.PenDown();
            Turtle.Forward(40);
            Turtle.Rotate(90);
            Turtle.Forward(40);
            Turtle.Rotate(90);
            Turtle.Forward(40);
            Turtle.Rotate(90);
            Turtle.Forward(40);

        }
        void BtnStartMouseDown(object sender, MouseEventArgs e)
        {
            _S71200.Write("I0.0",1);
        }
        void BtnStartMouseUp(object sender, MouseEventArgs e)
        {
            _S71200.Write("I0.0",0);
        }
        void BtnStopMouseDown(object sender, MouseEventArgs e)
        {
            _S71200.Write("I0.1",1);
         }
        void BtnStopMouseUp(object sender, MouseEventArgs e)
        {
            _S71200.Write("I0.1",0);
        }
        void MainFormFormClosed(object sender, FormClosedEventArgs e)
        {
            _S71200.Close();
        }
    }
}

Sayaç değerini plc de bulunan CTU sayacın DB sinden S7.Net ile okuyabilmek için DB nin özelliklerine girip Optimized tikini kaldırmak gerekiyor..


Bu şekilde plcsim ile C# ı haberleştirmek için bazı ayar ve program gerekiyor, önceki yazılara bakabilirsiniz..

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