8 Aralık 2017 Cuma

S7-1200 PLC , NetToPLCsim , TIA Portal , S7NetPlus kütüphanesi ve C# ile PLC'ye Bağlanma

Uzun bir aradan sonra merhaba.

Bu yazıda yine endüstriyel otomasyon denemesi yapacağız. Örneğimiz bir otopark kapısının kontrolünü PLC üzerinden yapmak ve C# kullanarak S7-1200 PLC'ye bağlanarak bir HMI (Human Machine Interface) oluşturmak.

İlk adım tabiki bir akış diyagramı oluşturmak. Düşünelim bakalım otopark kapıları nasıl çalışıyor? 

Ben bu yazıma rehberlik edecek bir akış diyagramı hazırladım:




Kısaca bakalım:
  • Duruyor adımında iken kumandaya basılırsa kapı açma adımına geçer.
  • Açarken kumandaya basılırsa veya kapı açık swici bir süre sonuna kadar görmezse kapı olduğu yerde durur.
  • Açarken açık swici görünce kapı açık adımına geçilir.
  • Açık adımında kumandaya basılırsa kapı o pozisyonda durur.
  • Aradan geçen insan ya da araçları gören fotosel bir süre boyunca bir şey görmezse kapı kapatma adımına geçilir.
  • Kapatma esnasında fotosel bir şey görürse hemen açma adımına geçilir (emniyet).
  • Kapatırken  kumandaya basılırsa veya kapı kapalı swici bir süre sonuna kadar görmezse kapı olduğu yerde durur.
  • Kapatırken kapalı swici görürse kapı kapalı adımına geçilir ve yeni bir kumanda sinyali beklenir.




S7-1200 PLC Programı


Hadi bakalım önce PLC programını yazmaya başlayalım. TIA Portal yazılımı kullanacağız. Programı açalım ve yeni bir proje oluşturalım. Projemize isim olarak "Otopark Kapısı" adını uygun gördüm:


Şimdi ilk iş bir PLC seçimi. Biz zaten simülasyonda deneme yapacağımız için en basit modellerden birini seçelim. TIA Portal'da yeni proje oluşturduktan sonra gelen projenin başlangıç ekranında "Configure a Device" simgesini tıklayalım ve açılan ekranda "Add New Device" yazısını tıklayalım. Çıkan seçeneklerde "Controllers" sekmesi altında, "CPU 1211C DC/DC/DC" PLC modelinin en yeni ürününü seçip aşağıdaki "Add" butonuna tıklayalım:



Şimdi projemizi oluşturduk PLC'mizi seçtik. Sırada PLC'nin yapılandırılması var. C# veya başka programların PLC içindeki verilere ulaşabilmesi için PLC'nin koruma seçeneklerini ayarlamamız gerekiyor. Bunun için proje ağacında PLC adına sağ tıklayıp "Properties" seçeneğini tıklıyoruz:


Açılan özellikler penceresinde "General" sekmesinde sol taraftaki ağaçtan "Protection" yazısını tıklayalım. "Access level" seçeneğinde "Full acces (no protection)" seçilmiş olmalıdır. Aşağıya indiğimizde "Connection mechanizms" altındaki "Permit Access with PUT/GET communication from remote partner (PLC, HMI, OPC, ...)" checkbox'ı seçili olmalıdır ki dış yazılımdan PLC verilerine erişebilelim.


"OK" butonu tıklayarak seçimlerimizi kaydedelim. Bu arada ara sıra menüden "Save Project" simgesini tıklamayı unutmazsınız umarım. 

Sıra geldi PLC programını akış diyagramına göre yazmaya. Projemizi oluşturunca otomatik olarak OB1 (Main) programı boş olarak oluşturulmuştur. Bu programı proje ağacından seçip açalım:


İlk işimiz kumanda düğmesine ilk basıldığı anı yakalamak. Bunun için çıkan kenar algılama fonksiyonu "P_TRIG" kullanalım:


Yaz bi kağıda "M0.0 = Kumanda butonu" . Akış diyagramımıza göre adım sıfırda duruyorken kumanda basılırsa adım bire (kapı açma) geçiliyor:


Yaz bi kağıda "MW50 = Adım numarası" . Adım birde zaman aşımı olursa demişiz demek ki bu adıma bir timer koyacağız. Diyelim 30 saniyede kapı açık swicini göremezsek bir sıkıntı olmalı ve durmalıyız:


Adım birde (kapı açılırken) zaman aşımı olur ya da kumanda butonuna basılırsa adım beşe geçerek kapı durdurulacak:


Adım ikide (kapı açıkken) kumanda basılırsa yine adım beşe geçerek işlemi durduracağız:


Adım üçte de zaman aşımı olursa demişiz demek ki bu adıma da bir timer koyacağız. Diyelim 30 saniyede kapı kapalı swicini göremezsek bir sıkıntı olmalı ve durmalıyız:


Adım üçte (kapı kapanırken) zaman aşımı olur ya da kumanda butonuna basılırsa adım sıfıra geçerek kapı durdurulacak:


Adım dörtte (kapı kapalıyken) kumanda butonu basılırsa adım bire (kapı açma) geçilecek:


Adım beşse (açarken durdurulmuş) ve kumanda butonu basılmışsa adım üçe (kapı kapatma) geçilecek:


Ara sıra projeyi kaydetmeyi unutmayalım. Adım birde (kapı açılırken) kapı açık swici görürse adım ikiye (bekleme) geçeceğiz:


Yaz bi kağıda "M0.1 = Kapı açık swici". Adım ikide (kapı açıkken bekleme) araçları gören fotosel 10 saniye boyunca bişey görmezse adım üçe (kapatma adımı) geçiyoruz:


Yaz bi kağıda "M0.2 = Fotosel".  Adım üçte (kapı kapanırken) kapı kapalı swici görürse adım dörde(duruş) geçeceğiz:



Yaz bi kağıda "M0.3 = Kapı kapalı swici". Adım üçte (kapı kapanırken) fotosel bir şey görürse arada sıkışmasın diye adım bire (kapı açma) geçmeliyiz:


Adım birde motor açma yönünde çalışacak. İleri geri geçişlerde falan hareket eden sistemlere emir verirken her zaman adıma geçildikten 2-3 saniye sonra çıkış vermek iyi olur:



Yaz bi kağıda "M1.0 = Motor açma yönü çıkışı". Adım üçte motor kapatma yönünde çalışacak:


Yaz bi kağıda "M1.1 = Motor kapatma yönü çıkışı". Tek bir şey kaldı kapını üstüne aktif olduğunu, yani hareket ettiğini ya da her an hareket edebileceğini belirtir bir sinyal lambası koyup onu yakıp söndürmek. Lambanın flaşör yapmasını timer kullanarak kendimiz kontrol edebiliriz. Ama ben burada S7-1200 PLC içinde bulunan hazır flaşör bitlerini kullanmak istedim. Bunun için önce CPU yapılanmasında bu özelliği aktif hale getirmek gerekiyor. Bunun için proje ağacında PLC adına sağ tıklayıp "Properties" seçeneğini tıklıyoruz. Açılan özellikler penceresinde "General" sekmesinde sol taraftaki ağaçtan "System and clock memory" yazısını tıklayalım. "Enable the use of clock memory byte" checkbox'ını seçili hale getirelim ve "Address of clock memory byte" değerine 100 değeri girelim. Böylece MB100 adresinin bitlerini flaşör olarak kullanabiliriz:


MB100 adresinin hangi bitinin hangi frekansta flaşör yaptığı da buradan görünebilir. "OK" tıklayıp kaydettikten sonra OB1 programımıza geri dönelim:




Yaz bi kağıda "M1.2 = Lamba".

Ohh şükür, PLC programı bitti. Şimdi PLC simülasyon programı yardımı ile bir test edelim bakalım. Menüden "Start simulation" simgesini tıklayalım.


Bir sürü yönergeleri izleyip programı simülasyona yükleyip çalıştırdıktan sonra şu kağıda yazıp durduğumuz değişken adreslerini simülasyon tablosuna koyalım bakalım:


İsterseniz burada "Monitor/Modify value" değerlerine 1 veya 0 yazarak programı test edebilirsiniz. Ama ben bu işlemi pas geçeceğim çünkü nasıl olsa yazacağım C# programını oluştururken tüm testleri yapılacak.



NetToPLCsim programı

Şimdi simülasyon programını projeyi bir isimle kaydederek kapatalım. TIA Portal yazılımını da kapatalım. Çünkü NetToPLCsim yazılımı ilk çalıştırılan olmak zorunda yoksa online olma sorunu yaşanıyor. 

NetToPLCsim programını buradan .zip olarak indirebilirsiniz. Programı indirdikten sonra çalıştırırken sağ tuş tıklayıp "Yönetici olarak çalıştır" seçmeliyiz, çünkü Port 102 ile ilgili servisleri durdurabilmesi ve tekrar çalıştırabilmesi için yetki gerekebilir. Programı çalıştırınca bize Port 102'nin kullanımda olduğunu gösterir bir uyarı çıkartır:


"Evet" butonu tıkladığımızda Port 102 ile ilgili servisleri kapatıp uygulamayı çalıştırır. Ana pencerede "Add" butonu tıklayarak yeni bir PLC bağlantısı ekleyelim:


Bağlantı ekranında ayarlamamız gereken 3 değer yukarıda okla gösterilmiştir. "Network IP Address" yanındaki butonu tıkladığımızda bilgisayarımızın Ethernet adresini gösteren bir pencere açılır. Bu adresi seçtikten sonra "Plcsim IP Address" yanındaki butona tıklayınca program çalışmakta olan simülasyondaki PLC'nin Ethernet adresini gösterir, bunu da seçeriz. "Plcsim Rack / Slot" seçeneklerini ise S7-1200 PLC'ler için 0 ve 1 seçeriz.

"OK" tuşuna bastığımızda artık bağlantımız hazırdır. "Start Server" butonu tıkladığımızda program artık PLC simülasyonu ile bilgisyarımızın Ethernet adresi arasında bir bağlantı köprüsü oluşturmuştur ve dış programlar bunun üzerinden PLC simülasyona erişebilirler:


Ekrandaki "RUNNING" ve status bardaki "Port 102 OK" mesajlarına dikkat. Şunu unutmayalım gerçek PLC ile bağlanabilmek için bu programa ihtiyacımız yok. Direk olarak PLC Ethernet adresine bağlanabiliriz.





C# Programı

Şükür artık C# programımızı yazıp PLC değerlerine erişimi test edebiliriz. Ben C# program geliştirirken SharpDevelop programını kullanıyorum. Bu yüzden bu program üzerinden anlatacağım. İsteyen Visual Studio Expres de kullanabilir. 

"File - New - Solution" menüsü üzerinden yeni bir çözüm oluşturalım, ismi "OtoparkKapısı" olsun. Programı yazmaya başlamadan önce "S7.NetPlus" kütüphanesini projemize eklemeliyiz.

"Project - Manage Packages" menüsünden açılan konfigürasyon penceresinde "nuget.org" içinde "S7" kelimesini aratalım:


"S7.Net Plus" seçeneği yanındaki "Add" butonu tıkladığımızda kütüphane artık projemize eklenmiştir. Şimdi form özelliklerinden pencere boyutunu 570x300 olarak ayarlayalım. Öncelikle programın en başındaki "using" satırlarına
using S7.Net;
satırını ekleyelim ve kütüphanemizi kullanacağımızı belirtelim. Şimdi programa PLC'ye nasıl bağlanacağımızı anlatmalıyız. Bunun için form sınıf tanımın en başına
Plc _S71200 = new Plc(CpuType.S71200, "192.168.43.228", 0, 1);
satırını ekleyelim. Burada gördüğünüz gibi PLC adresi olarak NetToPLCsim programındaki "Network Address" değerini giriyoruz. PLC simülatörü kullanmayıp gerçek PLC kullanıyorsak buraya PLC Ethernet adresini yazmalıyız. Hadi bir de resim atalım:


PLC ile programımızın bağlantısını açıp kapamak için ".Open()" ve ".Close()" metodlarını kullanırız. formun program satırlarında "InitializeComponent" satırı arkasından
_S71200.Open();
satırını ekleyerek PLC bağlantısını açıyoruz. Formun özelliklerinde "FormClosed" olayına çift tıklayarak uygulama kapanırken çalışacak metodu oluşturalım ve içine
_S71200.Close();
satırını koyalım. Artık uygulama kapatılırken PLC bağlantısı da kapatılacak. Programın son hali:
PLC'mize gerçekten bağlı mıyız bakalım? Ekrana bir Label ekleyelim , özelliklerinde şunları değiştirin:
  • FontSize : 12 Bold
  • Text : "PLC: "
  • Name : labelPLC
  • Location : 7; 4
  • Size : 145; 21
Animasyonları göstermek için PLC içindeki değerlere 100 mili saniyede okuma yapmayı planlıyoruz. Bu amaçla programa bir timer ekliyelim ve değerleri şöyle olsun:
  • Enabled : True
  • Interval : 100
  • Name : T100ms
Timer özelliklerinden "Tick" olayına çift yıklayarak oluşturduğumuz metod her 100 mili saniyede çağırılacaktır. Nerdeyse tüm animasyonu bu metod içinde yapacağız. Bu metoda şunları ekleyelim:
void T100msTick(object sender, EventArgs e)
        {
            if(_S71200.IsConnected)
            {
                //ANIMASYONLAR
                labelPLC.Text = "PLC: Bağlı";
  
            }
            else labelPLC.Text = "PLC: Bağsız";
        }
".IsConnected" özelliği bize PLC'mizin programa bağlı olduğunu gösterir. Programı bu kadarıyla çalıştırıp deneyelim :


Aha da resimdeki gibi "Bağlı" yazısını görürseniz artık PLC'ye bağlanmış ve tozunu atmaya hazırsınız demektir. 

Hadi adım numarasını yazalım. Adım numarası PLC içinde "MW50" adresinde bunu kağıda yazmıştık , sonunda lazım oldu. Bağlantı labelimizi kopyasını oluşturalım ve şu özellikleri verelim :
  • Size : 213; 21
  • Location : 7; 25
  • Name : labelStepNo
  • Text : "Adım: "
  • FontSize : 12 Bold

MW50 adresi 15 bit tamsayı olduğu için C# dilinde karşılığı "ushort" tipi oluyor. Şimdi animasyon satırlarına şunu ekleyelim :
                ushort stepNo = (ushort)_S71200.Read("MW50");
                labelStepNo.Text = "Adım: " + stepNo;
Son halinde program şöyle görünür :


Adım numarasına PLC simülasyon programı üzerinden değerler girerek doğru değeri okuduğumuzu test edelim. İyi de bu adım numaraları PLC programına çok şey anlatırken biz hep kafada "1 neydi? 2 neydi?" gibi hatırlamaya çalışıyoruz. Bunun yerine numaralara karşı gelen açıklamaların olduğu bir Enumeration tanımlayalım. Formun sınıf tanımlaması başına şu satırları ekleyelim :
public partial class MainForm : Form
    {
        Plc _S71200 = new Plc(CpuType.S71200, "192.168.1.24", 0, 1);

        public enum adimlar
        {
            Duruyor = 0 , Açıyor = 1 , Açık = 2 , Kapatıyor = 3 , Kapalı = 4 , AçarkenDurdu = 5
        }
 Şimdi de adım numarasını yazdığımız satırı açıklama yazacak şekilde değiştirelim :
ushort stepNo = (ushort)_S71200.Read("MW50");
 labelStepNo.Text =
"Adım: " + Enum.GetName(typeof(adimlar) ,stepNo);
Sıra geldi PLC'ye değer yazmaya. Önce kumanda butonu ile başlayalım. Kağıda baktık kumanda butonu "M0.0" adresindeymiş. Ekrana bir buton ekleyelim , özellikleri şöyle olsun :
  • Text : "Kumanda"
  • Name : buttonKumanda
  • Location : 445; 12
  • Size : 87; 26
Bu bir buton olacak , yani butona bastığımızda PLC'deki değer 1 olacak bırakınca 0'a geri dönecek. Bu 2 işlemi buton özelliklerinde "Mouse Down" ve "Mouse Up" olaylarına atayacağımız metodlar yardımıyla yapacağız :
        void ButtonKumandaMouseDown(object sender, MouseEventArgs e)
        {
            _S71200.Write("M0.0",1);
        }

        void ButtonKumandaMouseUp(object sender, MouseEventArgs e)
        {
            _S71200.Write("M0.0",0);
        }
Şimdi programı çalıştırıp kumanda butonumuzun çalışmasını test edebiliriz. Butonu tıkladığımızı PLC'den değer okuyarak görelim. Burda canım sıkıldı , butonun yanına bir daire çizeyim dolgu rengi de okunan değere göre değişsin istedim. Form sınıf tanımı başına grafik çizebilmek için şunu ekleyelim :
        public enum adimlar
        {
            Duruyor = 0 , Açıyor = 1 , Açık = 2 , Kapatıyor = 3 , Kapalı = 4 , AçarkenDurdu = 5
        }

        Graphics g;
Bu dairelerden başkaları da olacağı için daire çizme üzerine bir metod yazalım. Metodu diğer metodların en altına yerleştirelim :
        void daire_ciz(int x, int y, int cap, Color c)
        {
            g = this.CreateGraphics();
            Pen kalemim = new Pen(c, cap);
            g.DrawEllipse(kalemim, x, y, cap, cap);
            g.Dispose();
        }
Böylece tek komutla daire çizebileceğiz. Hadi gidelim kumanda butonu yanına bir daire çizip butona basıldığını PLC içinden okuyarak gösterelim. Animasyonlara şu satırları ekleyelim :
                ushort stepNo = (ushort)_S71200.Read("MW50");
                labelStepNo.Text = "Adım: " + Enum.GetName(typeof(adimlar) ,stepNo);
         
                bool kumanda = (bool)_S71200.Read("M0.0");
                if (kumanda == true) daire_ciz(420,20,10,Color.Yellow);
                else daire_ciz(420,20,10,Color.Gray);
Nasıl olduğunu test edelim. 


Bu kumandanın bir eşini de fotosel sinyalini PLC'mize göndermek için kullanalım. Önce butonu kopyalayalım, özellikler şöyle :
  • Text : "Fotosel"
  • Name : buttonFotosel
  • Location : 445; 44
  • Size : 97; 26

Aynı şekilde bunun da "Mouse Down" ve "Mouse Up" olaylarına metod bağlayalım ve içlerine şunları yazalım :
        void ButtonFotoselMouseDown(object sender, MouseEventArgs e)
        {
            _S71200.Write("M0.2",1);
        }
 
        void ButtonFotoselMouseUp(object sender, MouseEventArgs e)
        {
            _S71200.Write("M0.2",0);
        }
Gösterge dairemizi de çizelim :
                bool kumanda = (bool)_S71200.Read("M0.0");
                if (kumanda == true) daire_ciz(420,20,10,Color.Yellow);
                else daire_ciz(420,20,10,Color.Gray);
         
                bool fotosel = (bool)_S71200.Read("M0.2");
                if (fotosel == true) daire_ciz(420,53,10,Color.Yellow);
                else daire_ciz(420,53,10,Color.Gray);
Açma motoru ve kapatma motoru için de birer gösterge koyalım. Önce belirtici iki Label yazalım. Özellikler şöyle olsun :
  • Text : "Açma Motoru :"
  • Location : 245; 96
  • Size : 77; 15
ikincisi :
  • Text : "Kapatma Motoru :"
  • Location : 15; 96
  • Size : 91; 15

Animasyonları da programda yine daire çizimleri olarak ekleyelim :
                bool acmaMotoru = (bool)_S71200.Read("M1.0");
                if (acmaMotoru == true) daire_ciz(330,98,10,Color.Yellow);
                else daire_ciz(330,98,10,Color.Gray);
           
                bool kapamaMotoru = (bool)_S71200.Read("M1.1");
                if (kapamaMotoru == true) daire_ciz(120,98,10,Color.Yellow);
                else daire_ciz(120,98,10,Color.Gray);
Programın en son hali şöyle görünüyor :


Huh! , biraz bişeyler çıkmaya başladı. Kapının hareketlerini simüle etmek için biraz resim koyalım ekrana. Bu amaçla 3 tane panel ekliyoruz forma. Sağda solda duvar olacak ortada kapı. Ben bişeyler karaladım linklerden resimleri indirebilirsiniz. Panellerin özellikleri şöyle :

Panel 1 :
  • BackGroundImage : duvar.png
  • Location : 12;123
  • Size : 119; 58
Panel 2 :
  • Size : 198; 58
  • Location : 137;123
  • BackGroundImage : kapı.png
  • BackGroundImageLayout : Stretch
  • Name : panelKapi 

Panel 3 :
  • BackGroundImage : duvar.png
  • Location : 341;123
  • Size : 201; 58

Bu arada panel 2 yani kapı panelini sağ tıklayıp "Bring to front" seçerek öne getirmezsek hareket ederken duvarın arkasında kalır. Son görünüm şuna benzedi :


Kapıya hareket vermek için kapı konumunu simüle etmemiz lazım. Bu amaçla programın başına bir değişken tanımı ekliyoruz :
        Graphics g;
      
        int kapiKonum = 0;
Şimdi motor hareketine göre bu değeri değiştireceğiz ve kapı panelini bu konuma bağlı sağa sola hareket ettireceğiz. Animasyonların altına bir de simülasyon bölümü ekleyelim :
                bool kapamaMotoru = (bool)_S71200.Read("M1.1");
                if (kapamaMotoru == true) daire_ciz(120,98,10,Color.Yellow);
                else daire_ciz(120,98,10,Color.Gray);
              
              
                //SIMULASYON
                if (acmaMotoru && kapiKonum < 200) kapiKonum += 2;
                if (kapamaMotoru && kapiKonum > 0) kapiKonum -= 2;
                panelKapi.Location = new Point(137 + kapiKonum, 123);
Hadi deneyelim, hareketi görelim. Az kaldı bitiyor. Sıra geldi kapı swiçlerini simüle etmeye. Kapı kapalıyken kapalı swici , açılınca da açık swicinin görmesini kapı konumuna göre simüle edelim. Önce swiçlerin animasyonunu gösterelim :
                bool kapamaMotoru = (bool)_S71200.Read("M1.1");
                if (kapamaMotoru == true) daire_ciz(120,98,10,Color.Yellow);
                else daire_ciz(120,98,10,Color.Gray);
              
                bool acikSW = (bool)_S71200.Read("M0.1");
                if (acikSW == true) daire_ciz(330,200,10,Color.Yellow);
                else daire_ciz(330,200,10,Color.Gray);
              
                bool kapaliSW = (bool)_S71200.Read("M0.3");
                if (kapaliSW == true) daire_ciz(120,200,10,Color.Yellow);
                else daire_ciz(120,200,10,Color.Gray);
Sonra da aşağıda simülasyona swiç aktivasyonlarını ekleyelim :
  
                //SIMULASYON
                if (acmaMotoru && kapiKonum < 200) kapiKonum += 2;
                if (kapamaMotoru && kapiKonum > 0) kapiKonum -= 2;
                panelKapi.Location = new Point(137 + kapiKonum, 123);
              
                acikSW = kapiKonum >= 200;
                _S71200.Write("M0.1", acikSW ? 1 : 0);
                kapaliSW = kapiKonum <= 0;
                _S71200.Write("M0.3",kapaliSW ? 1 : 0);
Burada PLC'ye bool değer yazarken bir sorun çıktı. "True" "False" olan bool değişkeni direk yazınca almadı ben de ternary komutla "1" ve "0" sayıları yazdım çalıştı. Belki bende hata var ama bu saatte sallayamıycam.

Artık tamamen çalışan bir simülasyon elde errik. Deneyelim çalışmasını seyredelim , acık keyif alalım.

Tek bir şeyi göstermedik uyarı lambası. Hadi onun animasyonunu da ekleyelim :
                bool kapaliSW = (bool)_S71200.Read("M0.3");
                if (kapaliSW == true) daire_ciz(120,200,10,Color.Yellow);
                else daire_ciz(120,200,10,Color.Gray);

                bool lamba = (bool)_S71200.Read("M1.2");
                if (lamba == true) daire_ciz(250,20,30,Color.Yellow);
                else daire_ciz(250,20,30,Color.Gray);
Lamba biraz hızlı mı yanıp sönüyor? Keşke PLC programında daha düşük frekanslı bir flaşöre bağlasaydık.

Neyse burdan sonrası size kalmış, oynayın durun. Programın en son halini topluca bir daha verelim ve kapatalım :
/*
 * Created by SharpDevelop.
 * User: ujk
 * Date: 9.12.2017
 * Time: 14:14
 *
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using S7.Net;

namespace OtoparkKapısı
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
        Plc _S71200 = new Plc(CpuType.S71200, "192.168.1.24", 0, 1);

        public enum adimlar
        {
            Duruyor = 0 , Açıyor = 1 , Açık = 2 , Kapatıyor = 3 , Kapalı = 4 , AçarkenDurdu = 5
        }
       
        Graphics g;
       
        int kapiKonum = 0;
       
        public MainForm()
        {
            InitializeComponent();
            _S71200.Open();
        }
       
        void MainFormFormClosed(object sender, FormClosedEventArgs e)
        {
            _S71200.Close();
        }
       
        void T100msTick(object sender, EventArgs e)
        {
            if(_S71200.IsConnected)
            {
                //ANIMASYONLAR
                labelPLC.Text = "PLC: Bağlı";
               
                ushort stepNo = (ushort)_S71200.Read("MW50");
                labelStepNo.Text = "Adım: " + Enum.GetName(typeof(adimlar) ,stepNo);
               
                bool kumanda = (bool)_S71200.Read("M0.0");
                if (kumanda == true) daire_ciz(420,20,10,Color.Yellow);
                else daire_ciz(420,20,10,Color.Gray);
               
                bool fotosel = (bool)_S71200.Read("M0.2");
                if (fotosel == true) daire_ciz(420,53,10,Color.Yellow);
                else daire_ciz(420,53,10,Color.Gray);
               
                bool acmaMotoru = (bool)_S71200.Read("M1.0");
                if (acmaMotoru == true) daire_ciz(330,98,10,Color.Yellow);
                else daire_ciz(330,98,10,Color.Gray);
               
                bool kapamaMotoru = (bool)_S71200.Read("M1.1");
                if (kapamaMotoru == true) daire_ciz(120,98,10,Color.Yellow);
                else daire_ciz(120,98,10,Color.Gray);
               
                bool acikSW = (bool)_S71200.Read("M0.1");
                if (acikSW == true) daire_ciz(330,200,10,Color.Yellow);
                else daire_ciz(330,200,10,Color.Gray);
               
                bool kapaliSW = (bool)_S71200.Read("M0.3");
                if (kapaliSW == true) daire_ciz(120,200,10,Color.Yellow);
                else daire_ciz(120,200,10,Color.Gray);

                bool lamba = (bool)_S71200.Read("M1.2");
                if (lamba == true) daire_ciz(250,20,30,Color.Yellow);
                else daire_ciz(250,20,30,Color.Gray);

               
                //SIMULASYON
                if (acmaMotoru && kapiKonum < 200) kapiKonum += 2;
                if (kapamaMotoru && kapiKonum > 0) kapiKonum -= 2;
                panelKapi.Location = new Point(137 + kapiKonum, 123);
               
                acikSW = kapiKonum >= 200;
                _S71200.Write("M0.1", acikSW ? 1 : 0);
                kapaliSW = kapiKonum <= 0;
                _S71200.Write("M0.3",kapaliSW ? 1 : 0);
            }
            else labelPLC.Text = "PLC: Bağsız";
        }
       
        void ButtonKumandaMouseDown(object sender, MouseEventArgs e)
        {
            _S71200.Write("M0.0",1);
        }
       
        void ButtonKumandaMouseUp(object sender, MouseEventArgs e)
        {
            _S71200.Write("M0.0",0);
        }
       
        void daire_ciz(int x, int y, int cap, Color c)
        {
            g = this.CreateGraphics();
            Pen kalemim = new Pen(c, cap);
            g.DrawEllipse(kalemim, x, y, cap, cap);
            g.Dispose();
        }
       
        void ButtonFotoselMouseDown(object sender, MouseEventArgs e)
        {
            _S71200.Write("M0.2",1);
        }
       
        void ButtonFotoselMouseUp(object sender, MouseEventArgs e)
        {
            _S71200.Write("M0.2",0);
        }
    }
}

Vatan size minnettar arkadaşlar. Artık bu öğrendiklerimizle gerçek hayat projeleri bulup değerlendirme zamanı.

Hoşçakalın..



6 yorum:

  1. Bu yorum bir blog yöneticisi tarafından silindi.

    YanıtlaSil
  2. Paylaşım ve açık anlatım için teşekkurler..

    YanıtlaSil
  3. Merhaba hocam..Sunumun harikaydı,süpersin..Allah ilmini arttırsın inşallah.Allah razı olsun

    YanıtlaSil
  4. merhaba hocam MW50 == word du hangi instructions tan sectiniz

    YanıtlaSil
    Yanıtlar
    1. https://github.com/S7NetPlus/s7netplus/blob/develop/Documentation/Documentation.pdf adresinde C# kütüphanesi dökümanı var. Ona bakarak word verilerin C#'ta karşılık olarak ushort seçilmesi gerekiyor.

      Sil
  5. Çok Teşekkürler Hocam Adana'dan Selamlar

    YanıtlaSil