[ÇÖZÜLDÜ] GMT GLC-396T PLC den veri (Tag) okuma hk.

compusayar

Üye
Katılım
2 Kas 2016
Mesajlar
3
Puanları
1
Yaş
44
[ÇÖZÜLDÜ]
Arkadaşlar merhaba,

Konuyu yanlış yere açtıysam şimdiden kusura bakmayın.
Elektronik ve PLC sistemleri tarafında nerdeyse hiç bilgim yok diyebilirim.
İnternette biraz araştırırken burayı buldum ve oldukça güzel paylaşımlar olduğunu gördüm.

Sorunum ile ilgili forum içinde biraz araştırma yaptım ama anlayacağım şekilde veriler bulamadım. Konuya tam hakim olamadığım için doğru kelimeler ile arayamamış ta olabilirim.

Sorunum şu;
İş yerinde bir makine den GMT GLC-396T Plc vasıtası ile makinenin çalışma bilgileri çekilip Windows uygulaması yardımı ile ekranda görüntüleniyor. Plc yi temin ettiğimiz firma tarafından basit bir yazılım verilmiş ve verileri kaydedemiyoruz.

Bende C# tarafında bir uygulama geliştirip Datagrid View içine bu kayıtları almak ve gerektiğinde bir veritabanına kaydetmek istiyorum.
Sizlere sormak istediğim şey, Plc den belirtilen TAG lerin değerlerini anlık olarak okumak için kod yardımı (C# dilinde bağlantı ve okuma).

Dediğim gibi biraz araştırmalarım sonucu EasyModbus.dll yardımı ile Plc ye bağlanabildim ancak istediğim verileri çekemedim;

Ekte 2 adet görsel resim mevcut,
1nci resim: Firma tarafından verilen yazılımın Plc tanımlama ekranı burada istediğimiz TAG leri yazıp adresleri belirtiyoruz.

2nci Resim: benim yazdığım kodlar neticesinde Plc den gelen veriler. (c# kodlarım aşağıdaki gibi)

public static void plcBilgiAl()
{

Form1 frm1 = new Form1();

string formAdi = "Form1";
if (Application.OpenForms[formAdi] == null) { frm1.Show(); }
else { frm1 = (Form1)Application.OpenForms[formAdi]; frm1.Focus(); }

string plcIPAdress = "169.254.8.100";
int plcPort = 23;
EasyModbus.ModbusClient modBus = new EasyModbus.ModbusClient(plcIPAdress, plcPort);

#region
try
{
modBus.Connect();
frm1.label1.Text = "Plc ile bağlantı sağlandı..";
}
catch (Exception hata)
{
//MessageBox.Show(hata.Message.ToString());
baglantiHatasi = 1;
frm1.label1.Text = "Plc bağlantı Hatası!!!";
}

if (baglantiHatasi == 0)
{
frm1.label2.Text = "Plc değerleri Kaydediliyor...";


//*******************************************
bool[] readCoils;
readCoils = modBus.ReadCoils(0, 25);

byte say1 = 0;
frm1.listBox1.Items.Clear();

for (int i = 0; i < readCoils.Length; i++)
{
frm1.listBox1.Items.Add(say1 + " - " + readCoils.ToString());
say1++;
}
modBus.Disconnect();
//*******************************************



//*******************************************
modBus.Connect();

int[] readInput;
readInput = modBus.ReadInputRegisters(0, 25);

byte say2 = 0;
frm1.listBox2.Items.Clear();

for (int i = 0; i < readInput.Length; i++)
{
frm1.listBox2.Items.Add(say2 + " - " + readInput.ToString());
say2++;
}
modBus.Disconnect();
//*******************************************

modBus.Connect();
int[] readHoldings;

readHoldings = modBus.ReadHoldingRegisters(0, 25);

byte say3 = 0;
frm1.listBox3.Items.Clear();

for (int i = 0; i < readHoldings.Length; i++)
{
frm1.listBox3.Items.Add(say3 + " - " + readHoldings.ToString());
say3++;
}
modBus.Disconnect();
//*******************************************
#endregion
frm1.label3.Text = "Plc bağlantısı Sonlandırıldı..";
}

}


Not: verileri önce listbox da görmek istedim, henüz Datagridview e aktarmadım.
plc2.jpg
plc_csharp.jpg
 
Son düzenleme:
KNX Standardı, küçük bir rezidansın içerisindeki aydınlatma, perde panjur, klima kontrolünden, Dünya’nın en büyük havalimanlarındaki aydınlatma otomasyonu gibi çözümler için tercih edilen bir Dünya standardıdır.
Yazımızda endüstrinin can damarı sayılabilecek PLC’yi inceleyeceğiz.
Sorun çözüldü..

Benim gibi başka arkadaşlar da benzer durum ile karşılaşırlar diye buraya da yazıyorum.

Aslında Plcler ile ile ilgili bilgim olmadığı için bir hayli uğraşmışım;

aşağıdaki kod ile MI ve MF tipinde verileri belirtilen Adresler den çekebildim: (bu kodları bir metod içine alıp, timer ile metod çağırıldığında canlı bir veri elde etmiş oluyoruz)

int[] mi = modBus.ReadHoldingRegisters(1000 + 20, 2); //1000= MI tipinde veri / 20=çekmek istediğim adres./ 2= sorgu neticesinde gelecek veri sayısı
double mii = EasyModbus.ModbusClient.ConvertRegistersToDouble(mi); //üst satır sonucunda adresten gelen 2 adet sayıyı Double formatına dönüştürüyor.
label1.Text = mii.ToString();

int[] mf = modBus.ReadHoldingRegisters(4000 + (51 * 2), 2); //4000= MF tipinde veri / 51=çekmek istediğim adres./ 2= sorgu neticesinde gelecek veri sayısı
float mff = EasyModbus.ModbusClient.ConvertRegistersToFloat(mf); //üst satır sonucunda adresten gelen 2 adet sayıyı Double formatına dönüştürüyor.
label2.Text = mff.ToString();


not: EasyModbus.dll sınıfı kullanılmıştır.
 
Son zamanlarda sahadan verilerin toplanip pc yazilimlari ile izlenmesi, kayit alina alinmasi ve geçmişe yonelik incelenmesi populer hale gelmeye basladi. Kimileri bunu Scada yazilimlari ile, kimileri de sizin gibi kendi yazdıkları yazilimlarla yapmaktadir.

Bu sebeple takdiri hak ediyorsunuz.
 
Son zamanlarda sahadan verilerin toplanip pc yazilimlari ile izlenmesi, kayit alina alinmasi ve geçmişe yonelik incelenmesi populer hale gelmeye basladi. Kimileri bunu scada yazilimlari ile, kimileri de sizin gibi kendi yazdıkları yazilimlarla yapmaktadir.

Bu sebeple takdiri hak ediyorsunuz.

Çok teşekkür ederim . Onure oldum.

Dakika bazında loglama yapmak üzere 80 adet plc ve her plc den ortalama 22 tag çekmek için yazıyorum.
 
Merhaba. Öncelikle bu güzel çalışma için teşekkür ederim. GMT PLC ve EasyModbus ile ben de benzer uygulama yapmaya çalışıyorum. PLC den analog veriyi kendi scada programımda gösterebiliyorum; ancak PLC nin gönderdiği değer ile Scadadan okuduğum değer aynı değil. PLC den sıfır gelirken 16400 gibi bir değer geliyor onu gelen veriden çıkarıyorum ama yinede kalan veride 10 katı gibi bir fark oluşuyor. Oransal olarak da değişmiyor. Siz de böyle bir sorunla karşılaştınız mı acaba.
 

Forum istatistikleri

Konular
128,128
Mesajlar
915,261
Kullanıcılar
449,843
Son üye
hvncrblt

Yeni konular

Geri
Üst