11 Ekim 2016 Salı

MAKEL ELEKTRİK SAYACI VERİ OKUMA (RS 485)

MAKEL ELEKTRİK SAYACI VERİ OKUMA (RS 485)

Merhaba,

Yine gündelik hayatta pek kullanmadığımız ancak ihtiyacımız olduğunda bulunması zor olan bir konuyu yazmaya çalışacağım.

İşletmlerede maliyetin büyük bir kısmını enerji tüketimleri oluşturmaktadır. Bu durumda enerji tüketiminin en iyi şekilde takibi ve kayıt altına alınması bir yerden sonra zorunluluk halini almıştır. Burada MAKEL marka elektrik sayaçlarından, C# kodu üzerinden nasıl veri alındığına biraz değineceğim.

İlkin, kabaca RS485 seri port iletişiminden bahsetmekte fayda var. RS485 seri port iletişimi, bir hat üzerinden birden fazla nokta ile iletişimimizi sağlayan bir teknolojiye sahiptir. Genel prensip olarak, iki tel arasında gönderilen sinyaller, bağlı olan tüm cihazlara gider. Cihazlardan hangisi ile iletişim kurulacak ise o cihazın "numarası" gönderilen bilginin içinde olduğunda, ilgili cihaz kendisi ile iletişim kurulmak istendiğini anlar ve kendisinden istenen bilgileri gönderir, yada yapar.

Hemen hemen her bilgisayarda en az 1 adet seri port vardır. Olmasa bile RS485 seri port kartları bulunabiliyor. Ancak ben bu kartlar yerine RS485 to Ethernet çeviricileri tercih ediyorum. Bu sayede network alt yapınız üzerinden bu bilgileri toplama imkanınız oluyor. Bu çeviricilerin genel olarak bir IP adresi üzerinden ara yüzüne bağlanıyorsunu ve burada yaptığınız ayarlarla verdiğiniz IP üzerinden bilgisayarınıza kurduğunuz (çeviricinin programı ile) program ile sanal portlar yaratıp bu portlar üzerinden veri okuyabiliyorsunuz. Burada dikkat edilecek nokta, 7 Bit + 1 Stop Bit ve "EVENT" ayarlarının yapılması (RS485 ayar ekranına girdiğinizde bunları seçenekler içinde görebilirsiniz)

Artık COM portumuzda olduğuna göre, kod ile veri okumaya başlayabiliriz.

C# kodları ile okumak için

                        serialPort1.Close(); //Seripart objesini ne olur ne olmaz diye kapatıyoruz.
                        serialPort1.BaudRate = 300; //bound rate 300 yapıyoruz, ilk iletişim için zorunlu
                        serialPort1.PortName = "COM2"; //iletişim kurulacak port numarasını yazıyoruz.
                        serialPort1.Open(); //seri portu açıyoruz.

Buraya kadar, ilk letişim için 300 bpd ile bağlantı yapılıyor. Şimdi okuyacağımız sayacın olup olmadığına bakacağız.

      if (serialPort1.IsOpen) //Port açık ise işlemleri yap
                        {
                            Thread.Sleep(100); //biraz bekle
                            serialPort1.Write("/?MSY" + sayacSeriNo + "!"); //sayacSerino=okumak istediğiniz //sayacın üzerindeki seri numarasıdır. Bu işlemler bu bilgiyi RS485 üzerinden gönderiyoruz.
                            serialPort1.Write("\r\n"); // satır başı

                            Thread.Sleep(200); //az biraz bekle
                            int read = 0;
                            int shouldRead = readData1.Length;
                            int len;
                            while (read < shouldRead)
                            {
                                len = serialPort1.Read(buffer, 0, readData1.Length); //Eğer RS485 üzerinde cihazımız var ise burada bize seri numarasını göndermiş olmalı eğer bu satırı geçemiyorsak okuma yapamıyoruzdur.
                                if (len == 0)
                                    continue;
                                Array.Copy(buffer, 0, readData1, read, len);
                                read += len;
                                string Baslik = HexString2Ascii(BitConverter.ToString(readData1).Replace("-", string.Empty)); //okuduğumuuz bilyi bir string değişkene aldırk
                                //System.Threading.Thread.Sleep(250);
                            }

                            serialPort1.Write(char.ConvertFromUtf32(6) + "057"); //kontrol için gönderiliyor, bu bilgiyi gönderdiğimizde bize üzerindeki tüm bilgileri dökmeye hazır duruma gelmeli
                            serialPort1.Write("\r\n" + char.ConvertFromUtf32(6) + "057");
                            serialPort1.Write("\r\n");

                            serialPort1.Close(); //300 bps ile olan bağlantıyı kapatıyoruz.

                            serialPort1.BaudRate = 9600; //9600 bps e ayarlıyoruz.
                            serialPort1.Open(); // tekrar açıyoruz.

                            serialPort1.DtrEnable = true; //DTR özelliğini açıyoruz.

                            readData1 = new byte[6566]; // alınacak data boyutunu en yüksek seviyeye ayarlıyoruz.
                            buffer = new byte[6566];
                            int read2 = 0;
                            int shouldRead2 = readData1.Length;

                            int k = 1;
                            serialPort1.ReadTimeout = 10000; //Okuma için time out belirliyoruz.
                            for (int m = 0; m < k; m++)
                            {
                                //if (txtAyrinti.Text.Contains('!'))
                                //{
                                //    break;
                                //}                              

                                string[] d = Regex.Split(txtAyrinti.Text, "\r");
                                try
                                {
                                     string Bilgiler += serialPort1.ReadLine() + "\r\n"; //gelmiş olan bilgileri satır satır okuyoruz.
                                }
                                catch (Exception ex)
                                {
                                    break;
                                }
                                k = d.Length;
                               }


Bu yöntem ile MAKEL üzerindeki tüm bilgileri bir kerede çekerek gelen bilgileride IEC 62056-21 standartına göre değerlendirerek kullanabilirsiniz.

Kolay gelsin.

NOT: Kodlar yazılan bir örnekten alınmıştır, örnek çalışıyor ancak aktarırken hata yapılmış olabilir, çalışmayan yer olursa bir miktar uğraşmanız gerekebilir.


3 yorum:

  1. Makel Sayaç Okuma Programı

    IP : 88.249.230.57

    YanıtlaSil
    Yanıtlar
    1. İyi çalışmalar; Bende 485 çıkışı olan köhler marka bir cihaz var, max485 modülünü arduino ya bağlayıp veri almak istiyorum . Veri alabilmek için önce değer göndermek gerekiyor aynen sizin bahsettiğiniz gibi. Sizdeki bu kodları kullanmayı denedim fakat olmadı. Nasıl bir yol izlememi önerirsiniz

      Sil
  2. Merhaba,
    HexString2Ascii kısmını açıklayabilir misiniz?

    YanıtlaSil