Uzak I/O modülü olarak PLC kullanmak

 


Yerli GMTCONTROL firmasının plc ürünlerini uzun süredir kullanıyorum ve gayet memnunum. Resimde gördüğünüz en temel ve en uygun fiyatlı modeli GLC-196T, sondaki T transistor çıkışlı olduğunu gösterir. Model ismi 196R olursa röle çıkışlı oluyor. 9 giriş ve 6 çıkışa sahip plc de, bu sayılar ek modül kullanılarak artırılabiliyor. 

Modbus RTU, RS485 kablo (2 tel) ile çalışırken, modbus TCP, ethernet veya network kablosu ile çalışır. 196 ve 296 modelleri sadece modbus RTU ile çalışabilirken, 396 ve 496 modelleri hem modbus RTU ile hem de modbus TCP ile çalışabiliyor. 

Remote I/O, türkçeye uzak Giriş/Çıkış olarak tercüme ediliyor. Normal bir bilgisayarda, 24V sensörleri okuyacağımız veya 24V röleleri kontrol edebileceğimiz bir donanım bulunmuyor. İşte bu nedenle uzak i/o modülüne ihtiyaç duyuyoruz. Phoenix Contact, Turck gibi firmaların uzak i/o modülleri var ama tahmin edersiniz ki fiyatları cep yakıyor olabilir. (araştırmadım bile :)) Yabancı firmaların yanısıra yerli olarak uzak i/o modülü yapan firmalar da var. Örnek olarak Bqtek BQ353 modülüne bakabilirsiniz. Bu cihaz modbus RTU ile çalışıyor, 8 giriş ve 8 röle çıkışına sahip. Modbus TCP ile çalışabilmesi için ilave bir çevirici modül olan BQ152 yi de almanız gerekiyor. BQ353 modül ile GLC-196T plc nin fiyatları birbirine çok yakın. Liste fiyatı 100 dolar civarında.

Velhasıl bu yazıda GLC-196T plc yi nasıl uzak i/o olarak kullandığımızdan bahsedeceğim. 

Bu plc de modbus RTU protokolünü RS232 üzerinden de kullanabilirsiniz ama RJ-11 konnektörü kullanıldığından bu bağlantıyı tercih etmedim. Üstteki resimde COM2 RS485 olarak gözüken vidalı soketi kullanmak çok daha kolay. Ayrıca RS485, bize birden fazla cihaza 2 telli kablo ile bağlanma imkanını sağlıyor. 

Bu yazıda plc, modbus slave (köle) olarak kullanılıyor olacak. Bu durumda .net ile yapacağımız yazılımın master (sahip) olması gerekiyor. Master, soru sorar, slave cevap verir. Slave kendi kendine konuşamaz, soru soramaz. Slave birden fazla olabilir. Bu durumda her kölenin bir slave id (kimliği) vardır. Varsayılan olarak plc nin slave id'si 1 dir. Master hangi köleye soru sorduysa bu kimlik numarasına sahip olan köle cevap verir, diğer köleler cevap vermez. 

Terminolojide client, server gibi tabirler duyabilirsiniz. Master ve client (istemci) aynı şeydir. Yine slave ve server (sunucu) aynı şeydir. Kafanız karışmasın, veya karışsın :) Örneğin SQL veya bir Web server hiç bir şey yapmadan bekler. Kendisine bir client tarafından bir istek gelirse ona cevap verir. 

Modbus RTU protokolünü kullanmak için fiyatı 2 dolar civarında olan usb rs485 çevirici cihazını kullanacağız. CH340 çipine sahip bu aleti, internette arama yaparak kolayca bulabilirsin.


Bende sürücü önceden kurulduğundan COM2 olarak bilgisayarda, aygıt yöneticisinde gözüküyor. Sizde farklı gözükebilir. .Net programımızda burada gözüken portu kullanıyor olacağız.





Kablo bağlantılarını güç kaynağı kapalı durumdayken yapmanız daha iyi olur. Plc güç girişi ve 24V güç kaynağı bağlantısını yapınız. Usb rs485 çevirici cihazı ile plc üstündeki COM2 arasına 2 tel ile bağlantı yapınız.  Plc giriş (input) klemensinde Com ile işaretli yere 24V Gnd (24V - ucu) yi bağlayınız. Plc çıkış (output) klemensinde V+ ile işaretli yerlere 24V bağlayınız. Bu bağlantıları yapmazsanız işlemler sırasında plc üzerinde giriş ve çıkışlara bağlı ledler yanmayacaktır.


PLC yi hazırlama


Plc ye, program yüklemek için network kablosu kullanılıyor. Aslında boş bir program yükleyeceğiz ama modbus kullanabilmek için bazı ayarlar yapmamız gerekecek. GMTSuite programının son versiyonunu web sitesinden indirip kurun. Programda cihazlar butonuna tıklayınca plc ip adresi 169.254.11.85 gibi gözükecektir. Bilgisayarın ip adresini bu aralığa getirmeniz gerekiyor, örneğin 169.254.11.100 olabilir. Sonra şifre kutusuna 1234 yazarak bağlan butonuna tıklayın. Yine cihazlar butonuna ardından Ayarlar butonuna tıklayarak plc nin ip adresini değiştirebilirsiniz. Örneğin ben 192.168.0.100 yaptım. Bu durumda bilgisayar ip adresini tekrar ayarlamak gerekiyor tabi. Yoksa plc ile bağlantı kuramazsınız.



Yine Ayarlarda bulunan Güncelle butonu ile plc firmware yazılımı güncellenebilir. Yeni butonuna tıkladıktan sonra dosya ismi yazın. Konfigürasyon penceresinde plc modelini seçip ekle (+) butonuna tıklayın. Bölüm combobox a tıkladıktan sonra COM2 RS485 i seçin ve aktif butonuna tıklayın.



RS485 ayarları gözükecektir. Buraya dokunmanıza gerek yok, ModbusRTU Slave seçilmiş durumda zaten. Daha önce bahsettiğim slave id burada NetID olarak gözüküyor. 

Şimdi Operandlar butonuna tıklayarak açılan pencerede giriş ve çıkışların modbus kutucuklarını işaretleyin. Modbus adresleri gözükecektir.



Girişler 10001 den çıkışlar 1 den başlıyor. Bağlantı koptuysa tekrar bağlantı kurup program yükleme butonuna basarak boş programı plc ye yükleyin. Artık network kablosunu çıkarabilirsiniz.




Modbus poll ile test 


C# modbus RTU master programını yazmadan önce bu program ile modbus bağlantıyı ve plc yi test edebiliyoruz. 


F3 butonuna basınca Connection setup penceresi açılacaktır. Burada usb rs485 çevirici portunu seçip OK butonuna tıklayın. Bağlantı kurulacaktır. Ekran her saniye sorgulama yapılarak güncellenmektedir. F8 butonuna basınca Read/Write Definition penceresi açılacaktır. Plc girişlerini okumak için ayarları resimdeki gibi yapın. PLC Addresses Base 1 kutucuğunu işaretleyin. Burada adres 1 olarak gözükmekte aslında 10001 sorgulanmaktadır. Function kutusunda yazan 1x bunu ifade eder.



OK butonuna tıkladıktan sonra plc input klemensinde her bir girişe sırayla 24V a bağladığınız bir teli dokundurun. Ekranda ilgili kutunun 1 olduğunu göreceksiniz.

Plc çıkış ledlerini modbus ile yakmak için yine F8 e basın. 1 adresli çıkışı yakmak için ayarları aşağıdaki gibi yapın.



OK butonuna tıkladıktan sonra ilk satırda resimde mavi gözüken kutuya tıklayın. Klavyede space (boşluk) tuşuna basınca çıkış 1 olacak ve plc üstünde ilgili led yanacaktır. 


F8 tuşuna basıp adresi 2 yaparsanız 2. çıkış aktif olacaktır. Şimdi tekrar F8 tuşuna basalım ve aşağıdaki ayarları yapalım.



Böylece 05 Write Single Coil fonksiyonu ile değiştirdiğimiz çıkışları 01 Read Coils fonksiyonu ile okuyabildiğimizi görüyoruz.


C# programı 


Bunun için daha önce SharpDevelop diye minik bir ide ile modbus tcp client veya master bir program yazmıştım. Şimdi Visual Studio ile modbus RTU master program oluşturalım. Windows Forms Uygulaması (.NET Framework) şablonunu seçerek bir proje oluşturuyoruz.

Label, button ve bir textbox ile basit bit form oluşturdum..




Çözüm gezgininde proje ismine sağ klik yaparak NuGet Paketlerini Yönet... i seçiyoruz. Burada easymodbus kelimesini aratın. EasyModbusTCP 5.6.0 paketini yükleyin.

Plc ye her saniye sorgu yollamak için forma bir timer ekleyin. Zaman aralığını 1000 yapın. Aşağıdaki kodu yazdığınızda, plc girişleri ve çıkışları her saniye okunacaktır. QP0 butonuna her tıkladığınızda çıkış 0 ise 1, 1 ise 0 olacaktır. 

Yazılım geliştirmek için ille de plc ve rs485 çevirici sahibi olmanız gerekmiyor. HadiScada video açıklamasından indireceğeniz ModbusHD isimli program modbus slave simülasyonu yapabiliyor. İki tane sanal seriport kurmanız gerekiyor. Bir portu .net programında diğerini ModbusHD içinde kullanıyorsunuz. İki port otomatik olarak haberleşiyor.


using System.Windows.Forms;
using EasyModbus;

namespace ModbusRtuMaster
{
    public partial class Form1 : Form
    {
        ModbusClient ModClient = new ModbusClient();

        public Form1()
        {
            InitializeComponent();
        }


        private void btnConnect_Click(object sender, EventArgs e)
        {
            if (btnConnect.Text == "Connect")
            {
                ModClient.SerialPort = txtPort.Text;
                ModClient.Baudrate = 9600;
                ModClient.Parity = System.IO.Ports.Parity.None; //default is Even
                ModClient.Connect();
                lblStatus.Text = "Connected";
                btnConnect.Text = "Disconnect";
                timer1.Start();
               
            } else
            {
                ModClient.Disconnect();
                lblStatus.Text = "Disconnected";
                btnConnect.Text = "Connect";
                timer1.Stop();

            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (ModClient.Connected == true)
            {
                //read plc inputs
                ModClient.UnitIdentifier = 1; //slave id
                bool[] inputs = ModClient.ReadDiscreteInputs(0, 9); //starting address is 0 but in GMTSuite it is 10001
                lblIp0.Text = inputs[0].ToString();
                lblIp1.Text = inputs[1].ToString();
                lblIp2.Text = inputs[2].ToString();
                lblIp3.Text = inputs[3].ToString();
                lblIp4.Text = inputs[4].ToString();
                lblIp5.Text = inputs[5].ToString();
                lblIp6.Text = inputs[6].ToString();
                lblIp7.Text = inputs[7].ToString();
                lblIp8.Text = inputs[8].ToString();

                //read plc outputs
                bool[] outputs = ModClient.ReadCoils(0, 6); //starting address is 0 but in GMTSuite it is 1
                lblQp0.Text = outputs[0].ToString();
                lblQp1.Text = outputs[1].ToString();
                lblQp2.Text = outputs[2].ToString();
                lblQp3.Text = outputs[3].ToString();
                lblQp4.Text = outputs[4].ToString();
                lblQp5.Text = outputs[5].ToString();
            }
        }

   

        private void btnQp0_Click(object sender, EventArgs e)
        {
            bool[] output = ModClient.ReadCoils(0, 1); //address is 0 for QP0
            if (output[0] == true)
            {
                ModClient.WriteSingleCoil(0, false);
            }
            else
            {
                ModClient.WriteSingleCoil(0, true);
            }
        }

        private void btnQp1_Click(object sender, EventArgs e)
        {
            bool[] output = ModClient.ReadCoils(1, 1); //address is 1 for QP1
            if (output[0] == true)
            {
                ModClient.WriteSingleCoil(1, false);
            }
            else
            {
                ModClient.WriteSingleCoil(1, true);
            }
        }

        //you can write codes for other Qp buttons...pay attention to modbus address of each coil

    }
}




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