Garage Door 1 - Hazırlık Aşaması
Plc programını yazarken bu çizim baş ucunda olsun
Başımıza bu da mı geleceedi demeyin, PLC ile uğraşan herkesin başına gelebilir benzer senaryolar. PLC ye sıralı bir takım işler yaptırmak durumunda kalırız sık sık. Konuya hakim olabilmek için lütfen önceki post ları okuyunuz, önceki dediğim toplam 6 yazı, ama kısa kısa merak etmeyin.. İlk yazıda SharpDevelop ve NuGet kurulumunu anlatmıştım. Tabiki şart değil SharpDevelop, Microsoft Visual Studio da kullanabilirsiniz. Burda 6 yazıda bahsettiğim detaylardan bahsetmeyeceğim..
Otopark kapısı projesini, internette bulduğum bir projeyi biraz değiştirerek ve ilginç bir grafik kütüphanesi kullanarak size sunuyorum. Ümit beye, bu blogu açmamda ilham ve bilgi kaynağı olduğundan şükranlarımı yolluyorum..
Bu işe biraz da şöyle merak sardım.. Yurtdışından gelecek olan bir makine vardı. Beyin olarak S7-1200 kullanılmış, beyin dışında barkod yazıcı, barkod okuyucu, pnömatik silindirler ve çeşitli sensörleri var. Birçok fabrikada görebileceğiniz paletlerin, ön ve yan yüzlerine palet dururken etiket yapıştırıyor. Ortada henüz makine yoktu ama sağ olsunlar epey kapsamlı ve büyük bir Tia Portal projesi yazmışlar. Programa bakarak anlamanın imkanı yok kısaca. Makine gelmeden önce, plc programını bana ilettiler. Makinenin yaptığı işi bildiğim için blog ta anlattığım yöntemle C# da bir program yazdım. Makineyi, makine henüz gelmeden önce PC de sanal olarak çalıştırdım, bu sayede ne tür harici sinyaller vermek gerekiyor ? S7-1200 plc den hangi bilgileri alabiliyorum ? gibi detayları inceleme imkanı buldum. Örneğin etiketleme esnasında palet konveyörünün durması gerekiyor, buda fabrikaya ait olan konveyör plc si ile karşılıklı sinyalleşme ile oluyor. Özetle bu sayede makinenin çalışması ile ilgili konulara önceden hakim olmuş oldum.
Aşağıdaki C# programını S7.Net yada Tia Portal olmadan çalıştırabilirsiniz. Bu tarz çalışma yaparken önce bu adımı yapmak gerekiyor. Sonra S7.Net i ekleyeceğiz ve PLCSIM ile haberleşmeye başlayacağız.
Resimdeki gibi bir form hazırlayalım.
4 tane buton, 3 tane textbox, 1 label ve 1 panel. Küçük textbox lar kapı açık/kapalı sensörleri, büyük textbox ise kapalı otoparka girince karanlıkta kalmamak için yanan lambayı temsil ediyor. Textbox ların Enabled özelliğini false yapabilirsiniz. Burda kritik bir uyarı yapayım benim gibi acemiler için, sakın ola ki küçük textbox ları panel in üstüne bırakmayın.. SharpDevelop bu hareketi yazılım olarak alıyor onları panele ekliyor, çalıştırınca Design tab ı yok oluyor ve bir daha proje açılmıyor malesef. Panel in Size özelliği yani büyüklüğü bende 266;193, formun size ı ise 340;359 olarak gözüküyor. Bu değerler sizde farklı olabilir çok takılmayın, bu rakamlar ekran çözünürlüğüne ve büyüklüğüne göre değişebilir.
Kapı açık, araç sensörü görüyor, lamba yanıyor
Araç Sensörü butonunu, araçları gören sensörün bilgisini plc ye input olarak göndermek için kullanıyoruz. İlerde simülasyon yaparken kapıyı hareketlendiren Y butonunun ve Lamba butonunun Enabled özelliklerini false yapacağız, çünkü bunları plc yönetecek.
Program bu şekilde :
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using Nakov.TurtleGraphics;
namespace garageDoor
{
/// <summary>
/// Description of MainForm.
/// </summary>
public partial class MainForm : Form
{
float y_pos=150; // min 10, max 100
bool Y;
bool Sensor;
bool Kumanda;
bool Lamba;
public MainForm()
{
InitializeComponent();
}
void Timer1Tick(object sender, EventArgs e)
{
if(Lamba) {
btnLamba.BackColor=Color.LightGreen;
txbLamba.BackColor=Color.Yellow; }
else {
btnLamba.BackColor=Color.LightPink;
txbLamba.BackColor=Color.Black;}
if(Y) btnY.BackColor=Color.LightGreen; else btnY.BackColor=Color.LightPink;
if(Sensor) btnSensor.BackColor=Color.LightGreen; else btnSensor.BackColor=Color.LightPink;
if(Kumanda) btnKumanda.BackColor=Color.LightGreen; else btnKumanda.BackColor=Color.LightPink;
if(y_pos==10) txbKapiAcik.BackColor=Color.LightGreen; else txbKapiAcik.BackColor=Color.White;
if(y_pos==150) txbKapiKapali.BackColor=Color.LightGreen; else txbKapiKapali.BackColor=Color.White;
lblYpos.Text="Kapı poz : "+y_pos;
if(Y && y_pos>10) y_pos -= 5; //animasyon hızına göre bu değerleri oynayabilirsin ama
if(!Y && y_pos<150) y_pos += 5; //kapı açık/kapalı sensörlerini y_pos a göre ayarlaman gerekir
Turtle.Init(panel1);
Turtle.ShowTurtle=false;
// Kapı nın dış hatlarını yani dikdörtgen çizelim
Turtle.PenColor = Color.Green;
Turtle.PenSize=7;
Turtle.PenUp();
Turtle.MoveTo(-105,65); //X te sola Y de yukarı
Turtle.PenDown();
Turtle.Rotate(90);
Turtle.Forward(210);
Turtle.Rotate(90);
Turtle.Forward(155);
Turtle.Rotate(90);
Turtle.Forward(210);
Turtle.Rotate(90);
Turtle.Forward(155);
Turtle.Rotate(90);
// Hareketli tente çizelim
Turtle.PenUp();
Turtle.MoveTo(-100,57);
Turtle.PenDown();
Turtle.PenColor = Color.Gray;
Turtle.PenSize=10;
for (int i = 10; i <= y_pos; i = i + 10) {
Turtle.Forward(200);
Turtle.PenUp();
Turtle.MoveTo(-100,57-i);
Turtle.PenDown();
}
// Sensör çizelim
Turtle.PenUp();
Turtle.MoveTo(-130,-50);
Turtle.PenDown();
Turtle.PenColor = Color.Black;
Turtle.PenSize=10;
Turtle.Forward(5);
// Sensör bişey gördü
if(Sensor) {
Turtle.PenColor = Color.Red;
Turtle.PenSize=3;
Turtle.Forward(230);
}
}
void BtnYClick(object sender, EventArgs e)
{
if (Y) Y=false; else Y=true;
}
void BtnSensorClick(object sender, EventArgs e)
{
if (Sensor) Sensor=false; else Sensor=true;
}
void BtnLambaClick(object sender, EventArgs e)
{
if(Lamba) Lamba=false; else Lamba=true;
}
void BtnKumandaMouseDown(object sender, MouseEventArgs e)
{
Kumanda=true;
}
void BtnKumandaMouseUp(object sender, MouseEventArgs e)
{
Kumanda=false;
}
}
}
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using Nakov.TurtleGraphics;
namespace garageDoor
{
/// <summary>
/// Description of MainForm.
/// </summary>
public partial class MainForm : Form
{
float y_pos=150; // min 10, max 100
bool Y;
bool Sensor;
bool Kumanda;
bool Lamba;
public MainForm()
{
InitializeComponent();
}
void Timer1Tick(object sender, EventArgs e)
{
if(Lamba) {
btnLamba.BackColor=Color.LightGreen;
txbLamba.BackColor=Color.Yellow; }
else {
btnLamba.BackColor=Color.LightPink;
txbLamba.BackColor=Color.Black;}
if(Y) btnY.BackColor=Color.LightGreen; else btnY.BackColor=Color.LightPink;
if(Sensor) btnSensor.BackColor=Color.LightGreen; else btnSensor.BackColor=Color.LightPink;
if(Kumanda) btnKumanda.BackColor=Color.LightGreen; else btnKumanda.BackColor=Color.LightPink;
if(y_pos==10) txbKapiAcik.BackColor=Color.LightGreen; else txbKapiAcik.BackColor=Color.White;
if(y_pos==150) txbKapiKapali.BackColor=Color.LightGreen; else txbKapiKapali.BackColor=Color.White;
lblYpos.Text="Kapı poz : "+y_pos;
if(Y && y_pos>10) y_pos -= 5; //animasyon hızına göre bu değerleri oynayabilirsin ama
if(!Y && y_pos<150) y_pos += 5; //kapı açık/kapalı sensörlerini y_pos a göre ayarlaman gerekir
Turtle.Init(panel1);
Turtle.ShowTurtle=false;
// Kapı nın dış hatlarını yani dikdörtgen çizelim
Turtle.PenColor = Color.Green;
Turtle.PenSize=7;
Turtle.PenUp();
Turtle.MoveTo(-105,65); //X te sola Y de yukarı
Turtle.PenDown();
Turtle.Rotate(90);
Turtle.Forward(210);
Turtle.Rotate(90);
Turtle.Forward(155);
Turtle.Rotate(90);
Turtle.Forward(210);
Turtle.Rotate(90);
Turtle.Forward(155);
Turtle.Rotate(90);
// Hareketli tente çizelim
Turtle.PenUp();
Turtle.MoveTo(-100,57);
Turtle.PenDown();
Turtle.PenColor = Color.Gray;
Turtle.PenSize=10;
for (int i = 10; i <= y_pos; i = i + 10) {
Turtle.Forward(200);
Turtle.PenUp();
Turtle.MoveTo(-100,57-i);
Turtle.PenDown();
}
// Sensör çizelim
Turtle.PenUp();
Turtle.MoveTo(-130,-50);
Turtle.PenDown();
Turtle.PenColor = Color.Black;
Turtle.PenSize=10;
Turtle.Forward(5);
// Sensör bişey gördü
if(Sensor) {
Turtle.PenColor = Color.Red;
Turtle.PenSize=3;
Turtle.Forward(230);
}
}
void BtnYClick(object sender, EventArgs e)
{
if (Y) Y=false; else Y=true;
}
void BtnSensorClick(object sender, EventArgs e)
{
if (Sensor) Sensor=false; else Sensor=true;
}
void BtnLambaClick(object sender, EventArgs e)
{
if(Lamba) Lamba=false; else Lamba=true;
}
void BtnKumandaMouseDown(object sender, MouseEventArgs e)
{
Kumanda=true;
}
void BtnKumandaMouseUp(object sender, MouseEventArgs e)
{
Kumanda=false;
}
}
}
Yorumlar
Yorum Gönder