Electric Rail Car - Tia portal programı ve C# kodu
Youtube ta izleyebilirsin..
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)
{
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 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.
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 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..
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.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.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..
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();
}
}
}
Yorumlar
Yorum Gönder