modbus master mqtt gateway
TRANSCRIPT
2
İçindekiler 1- ModBus – MQTT Çevirici Tag Bazlı Çalışma ..................................................................................... 3
1.1. APN Ayarları............................................................................................................................. 5
1.2. Mqtt Broker Ayarları ................................................................................................................ 5
1.3. Seri Haberleşme Ayarları ......................................................................................................... 7
1.4. Modbus Okuma Ayarları .......................................................................................................... 9
1.5. ModBus Yazma Ayarları ......................................................................................................... 12
2. ModBus – MQTT Çevirici JSON Bazlı Çalışma ................................................................................ 13
2.1. APN Ayarları........................................................................................................................... 14
2.2. Mqtt Broker Ayarları .............................................................................................................. 14
2.3. Seri haberleşme Ayarları ....................................................................................................... 14
2.4. ModBus Okuma Ayarları........................................................................................................ 14
2.5. ModBus Yazma Ayarları ......................................................................................................... 17
2.6. ModBus Arşiv Okuma Ayarları ............................................................................................... 19
2.7. JSON Bazlı Çalışma Detayları ................................................................................................. 24
3. Konfigürasyon Verilerinin Gateway’e yüklenmesi......................................................................... 24
3.1. Eclipse Gateway için XML konfigürasyon yükleme................................................................ 24
3.2. Gemalto Gateway için XML konfigürasyon yükleme ............................................................. 25
4. ModBus Mqtt Gateway Testleri .................................................................................................... 27
3
Konfigürasyon Uygulaması Kullanım Kılavuzu
ModBus MQTT çevrimi 2 farklı firmware üzerinden yapılabilmektedir. Temel olarak 2 firmware aynı
işlevi gerçekleştirmektedir. Aralarındaki fark ModBus sorgulama şeklinden ve okunan verinin Broker’a
gönderim veri formatından kaynaklanmaktadır.
MqttGateway masaüstü konfigürasyon yazılımı her iki firmware için de konfigürasyon yapılmasını
sağlamaktadır.
Uygulama açıldığından ilk olarak firmware seçilmesi gerekmektedir.
1- ModBus – MQTT Çevirici Tag Bazlı Çalışma
Firmware seçimi ekranında “Working Tag Based” seçeneği seçildikten sonra alttaki şekilde uygulama
açılmaktadır.
Konfigürasyona başlamadan önce ilk olarak yazılıma satın alınan gateway’lerle ilgili lisans dosyası
yükleme yapılmalıdır.
4
Lisans yükleme için “License” menüsüne gelinir.
Menüde bulunan License File Location’a tıklanarak açılan pencere aracılığıyla satın alma sonrasında
üretici tarafından gönderilen Lisans XML dosyası seçilir.
İşlem sonrasında Üreticiden satın alınan Gateway’lere ait IMEI numaraları IMEI alanına yüklenecektir.
Lisans yükleme işlemi tamamlanmıştır. Bundan sonraki adımlarda konfigüre edilmek istenen cihazın
IMEI numarası seçilerek devam edilmelidir. Yapılan tüm ayarlar kaydet butonuna basıldığında çalışma
5
yapılan bilgisayarda kaydedilecektir. Yapılan ayarların cihazlara yüklenebilmesi dokümanın sonunda
anlatılacaktır.
1.1. APN Ayarları
MQTT protokolünde tüm bağlantılar Broker’a yapılmaktadır. Broker Server modundan çalışarak
belirlenen portu(1883, 8883, 8884, vb.) sürekli olarak dinlemektedir.
Önemli Not: Broker’a bağlantı için gateway’lere ait sim kartların statik ip almalarına gerek yoktur. Mqtt
Gateway cihazının dışarıdan bağlantı kabul edeceği herhangi bir portu yoktur. Bu sebeple cihaz dinamik
ip ile çalışabilir ve güvenlik konusunda arka kapısı bulunmamaktadır.
APN ayarları sekmesinde Gateway’in mobil şebekeye bağlanabilmesi için gerekli olan parametreler
belirlenir.
APN Name: Sim kartın mobil şebekede bulunacağı APN ismidir. Şirket için özel bir APN kullanılmıyorsa
“internet” APN’i kullanılmaktadır. Mobil Operatör aracılığıyla oluşturulmuş şirkete özgü APN mevcutsa
bu APN adı bu alana girilir.
User Name / Password: APN’e dahil olabilmek için gerekli olan kullanıcı adı ve şifre parametreleridir.
Önemli Not: Gateway’e takılan sim kart için PIN kilidi kaldırılmış olması gereklidir.
1.2. Mqtt Broker Ayarları
Mqtt protokolünde birçok protokolde bulunan Master/Slave kavramı yoktur. Ölçüm yapan sensörler,
enerji sayaçları, RTU’lar, PLC’ler, gateway’ler, sunucu yazılımları, vb. tüm cihazlar/sistemler, Client
olarak adlandırılır. Bu Client’lar arasında veri trafiğini yöneten ise Broker yazılımıdır. Bu sebeple tüm
Client’ların veri gönderip aldığı tek uygulama Broker yazılımıdır. Broker yazılımlarına örnek olarak
Mosquitto, HiveMQ, vb. verilebilir. Birçok broker yazılımı hem Windows sunucularda hem de Linux
sunucularda çalışabilmektedir. Yine birçoğu hem ücretsiz olup open source olarak kaynak kodlarına
ulaşılabilmektedir. Buna ilave olarak Mosquitto broker’ına ait internet üzerinde tüm geliştiricilerin
testlerini yapabilmesi için test.mosquitto.org domain’inde çalışan bir sunucu bulunmaktadır.
Bu sekmede ModBus MQTT Gateway’in Broker’a bağlantı yapabilmesi için gerekli olan ayarlar
bulunmaktadır.
6
Broker URL: Bağlantı yapılan broker’ın domain adı veya ip adresidir.
Örnek olarak: test.mosquitto.org, test.mosquitto.org:1883, test.mosquitto.org:8883 şeklinde bilgi
girişi yapılabilir.
Port bilgisi girilmediği takdirde varsayılan port 1883 olarak belirlenir.
Broker’a bağlantı 2 farklı şekilde gerçekleşmektedir.
1- Güvenliksiz haberleşme
2- TLS/SSL üzerinden güvenlikli haberleşme
Her iki seçenek için de kullanıcı adı ve şifre kullanılabilir veya kullanılmayabilmektedir. Bu sebeple
toplamda 4 farklı seçenek ortaya çıkmaktadır.
Güvenliksiz haberleşme (Kullanıcı adı ve şifre olmadan)
Güvenliksiz haberleşme (Kullanıcı adı ve şifre ile)
TLS/SSL üzerinden güvenlikli haberleşme (Kullanıcı adı ve şifre olmadan)
TLS/SSL üzerinden güvenlikli haberleşme (Kullanıcı adı ve şifre ile)
MqttGateway cihazları tüm haberleşme güvenlik seçeneklerini desteklemektedir.
Sadece 2G(GPRS) üzerinden haberleşme yapılan Eclipse ECL-BGS5 ve Gemalto BGS5T cihazları TLS/SSL
güvenlik seçeneğini desteklememektedir.
Genel olarak güvenliksiz haberleşme kullanan Broker’lara bağlantı 1883 üzerinden yapılırken TLS/SSL
güvenlik seçeneğini kullanan Broker’lara bağlantı 8883 veya 8884 portlarından sağlanmaktadır.
User Name / Password: Broker’a kullanıcı adı ve şifre ile bağlantı yapılması gerektiği durumda
belirlenmesi gereken alanlardır.
Client Id: Broker’a bağlantı için kullanılan Client Id’nin ön ek değeridir. Modbus MQTT gateway her
bağlantı için bu ön eki kullanıp rastgele bir Client Id üretmektedir.
7
“MqttGateway” ön eki için örnek Client Id, “MqttGateway_1564321” şeklinde olabilir. Her yeni
bağlantıda rastgele bir sayı ile bağlantı yapılır.
Önemli Bilgi: Broker’a yapılan bağlantıların Client Id bazında tekil olma zorunluluğu vardır.
Mqtt Protocol: Güvenlik seçenekleri için seçilmesi gereken bilgidir.
“Mqtt/TCP” seçilmesi durumunda güvenliksiz haberleşme geçerli olacaktır.
“Server Authentication” seçilmesi durumunda Gateway’e sunucu güvenlik sertifikası(CA certificate)
yüklenir ve TLS/SSL üzerinden bağlantı yapılır.
Mqtt Version: Mqtt protokolünün versiyon bilgisidir.
Default: Broker’ın desteklediği Mqtt protokol versiyonu kullanılır.
“Mqtt 3.1”: Mqtt versiyon 3.1 kullanılır.
“Mqtt 3.1.1”: Mqtt versiyon 3.1.1 kullanılır.
TLS/SSL Version: TLS/SSL güvenlik seçeneği üzerinden Broker’a bağlantı yapılması durumunda
kullanılan TLS/SSL versiyonu seçilir. Varsayılan olarak TLSv1.2 seçilebilir.
Keep Alive: Saniye bazında Broker’a bağlantıda kullanılan canlı kalma süresidir. Varsayılan olarak 120
saniye olarak belirlenebilir.
Clean Session: Her yeni bağlantı içi önceki oturum bilgilerinin temizlenmesi seçeneğidir. Varsayılan
olarak “OFF” seçilebilir.
1.3. Seri Haberleşme Ayarları
RS232 veya RS485 hattı üzerinden Modbus protokolü ile verilerin alınabilmesi için seri haberleşme
ayarlarının yapılması gerekmektedir.
8
Baud Rate: Seri haberleşme üzerinden haberleşme yapılacak cihazların bulunduğu haberleşme hızıdır.
Seçenekler; 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400 şeklindedir.
Genel Bilgi: Baud Rate arttıkça haberleşme hızı artmaktadır. Fakat hattaki parazitlerden etkilenme
oranı artacağından dolayı veri bozulmaları yaşanabilir.
Önemli Not: Gemalto gateway’ler 1200 Baud Rate - 230400 Baud Rate aralığını desteklemektedir.
Eclipse gateway’ler ise 300 Baud Rate - 230400 Baud Rate aralığını desteklemektedir.
Parity: None, Odd ve Even Parite kullanılabilmektedir.
Stop Bit: 1 ve 2 stop bit kullanılabilmektedir.
Data Bit: 7 ve 8 data bit kullanılabilmektedir.
Timeout (ms): ModBus sorguları sonucunda seri hattan cevap gelmesi için beklenecek maksimum
süredir.
Önemli Not: Timeout süresi Baud Rate değerine uygun olarak seçilmelidir.
Delay Between Polls (ms): İki ModBus sorgusu arasında beklenecek süre anlamına gelmektedir. Bazı
cihazlar bekleme yapılmadığında çok hızlı sorgulamalara cevap verememektedir. Bu durumda bu süreyi
sıfırdan büyük belirlemekte fayda vardır. Örnek olarak 100 milisaniye belirlenebilir.
Port: Gateway’in kullanılacak seri portudur.
Eclipse Gateway’ler için COM0 => RS232, COM1 => RS485’i ifade etmektedir.
Gemalto Gateway’lerde tek seri haberleşme desteği bulunduğu sadece COM0 geçerlidir.
9
Önemli Not: Eclipse gateway’ler için RS232 bağlantısı Tx, Rx ve GND uçlarından yapılmaktadır.
Gemalto Terminallerde ise RS232 bağlantısı 9 Pin (D-Sub) üzerinden yapılmaktadır. Flow Control
mümkündür.
Önemli Not: Eclipse gateway’ler için RS232 ve RS485 portları aynı anda kullanılmamaktadır. Ayardan
COM0 seçimi yapılırsa sadece RS232 portu, COM1 seçimi yapılırsa RS485 portu kullanılabilmektedir.
1.4. Modbus Okuma Ayarları
Modbus Protokolü üzerinden okunacak register’ların belirlendiği sekmedir.
10
Slave Id: Okuma yapılacak olan Slave’in adres bilgisidir.
ModBus Function: Gönderilecek ModBus sorgusu için geçerli olan fonksiyon numarasıdır.
Desteklenen fonksiyonlar alttaki gibidir.
Read Coils (0X),
Read Discrete Inputs(1X),
Read Holding Registers(4X),
Read Input Registers(3X).
Modbus Address: Tanımlanan verinin register adresidir. Adres alanı 0-65535 arasında olmak
zorundadır. Her fonksiyon için adres 0’dan başlanacak şekilde düşünülmelidir.
Data Type: Veri tipi bilgisidir.
Desteklenen veri tipleri alttaki gibidir.
Integer 32 Bit
Float 32 Bit
Integer 64 Bit (Long)
Float 64 Bit (Double)
Integer 16 Bit
Float 16 Bit
Unsigned Integer 32 Bit
Unsigned Integer 64 Bit
Unsigned Integer 16 Bit
Unix Time
Time 3 Registers(year/month, day/hour, minute/second)
Byte Order: Verinin Byte sıralamasıdır. Seçenekler alttaki gibidir.
Big Endian
Little Endian
Big Endian Byte Swap
Little Endian Byte Swap
Reading Period: Verinin okuma periyodudur. Okuma periyodu olarak alttaki 4 seçenek bulunmaktadır.
Dakikada bir okuma
11
5 dakikada bir okuma
15 dakikada bir okuma
60 dakikada bir okuma
Gateway enerjilendiği anda zaman bilgisi “2004-01-01 00:00:00” olarak ilerlemeye başlar.
Gateway’lerde pil bulunmadığı için güncel zaman bilgisi bulunmamaktadır. Varsayılan zaman bilgisinin
ilerlemesine göre okumalar periyodu geldiğinde gerçekleşecektir. Örnek olarak 60 dakikada bir okuma
seçeneği saat başlarında gerçekleşmektedir. 15 dakikalık okumalar 0, 15, 30 ve 45. dakikalarda
gerçekleşmektedir.
Live Mode: Canlı mod verinin sürekli olarak sorgulanması ve Broker’a gönderilmek istenmesi
durumunda kullanılır. Canlı modda ayarlanan veriler 2. önem derecesinde okunmaktadır. 1. önem
derecesinde bulunan veriler canlı modda olmayıp Reading Period bilgisine göre okunan verilerdir.
QoS: Mqtt Protokolü için geçerli olan Quality of Service parametresidir. Mqtt mesajının bir
parametresidir.
QoS 0, this service level guarantees a best-effort delivery. There is no guarantee of delivery. The recipient does not
acknowledge receipt of the message and the message is not stored and re-transmitted by the sender. QoS level 0 is often
called “fire and forget” and provides the same guarantee as the underlying TCP protocol.
QoS level 1 guarantees that a message is delivered at least one time to the receiver. The sender stores the message until it
gets a PUBACK packet from the receiver that acknowledges receipt of the message. It is possible for a message to be sent or
delivered multiple times.
QoS 2 is the highest level of service in MQTT. This level guarantees that each message is received only once by the intended
recipients. QoS 2 is the safest and slowest quality of service level. The guarantee is provided by at least two request/response
flows (a four-part handshake) between the sender and the receiver. The sender and receiver use the packet identifier of the
original PUBLISH message to coordinate delivery of the message.
Kaynak: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels/
Retain: Mqtt mesajının bir parametresidir. Retain olarak Broker’a gönderilen bir mesaj Broker’da
tutulur ve bu mesaja abone olan client’lara her abonelik sonrasında gönderilir.
Topic Name: Modbus üzerinden okunup ilgili veri tipine dönüştürülen veri ile hazırlanan Mqtt
mesajının konu bilgisidir.
Topic Name Konusunda Tavsiyeler:
1- Topic’ler belirlenirken her ModBus cihazın bir kimliği olmasına dikkat edilmelidir. Bu kimlik
cihazın seri numarası olabilir.
2- Topic belirlenirken ilk olarak cihazın model tipi belirlenmesinde fayda vardır. Örnek olarak bir
sıcaklık sensöründen veri alınacaksa Topic, “Sensor/Temperature/…” şeklinde başlayabilir.
Önemli Bilgi: Modbus MQTT Çeviricinin Tag Bazlı Çalışma Mantığı
Tag Bazlı çalışma prensibinde her ModBus register’ı kendi başına okuma yapılır ve okuma sonrasında
veri Broker’a gönderilir.
12
Üstteki ekran görüntüsü üzerinden örnek verilirse çalışma sırası alttaki gibi olacaktır.
İşlem 1: ModBus Slave Id’si 1 olan cihaza 0 adresinden 2 register sorgulama yap. Gelen cevabı float’a çevir.
İşlem 2: Çevrim yapılan veriyi Mqtt Mesajının payload’u olarak belirle. Alttaki topic ismiyle ve QoS/Retain bilgileriyle Broker’a gönder.
“EnergyAnalyzer/12345678/InstantMeasurement/VoltageAverage”
İşlem 3: ModBus Slave Id’si 1 olan cihaza 2 adresinden 2 register sorgulama yap. Gelen cevabı float’a çevir.
İşlem 4: Çevrim yapılan veriyi Mqtt Mesajının payload’u olarak belirle. Alttaki topic ismiyle ve QoS/Retain bilgileriyle Broker’a gönder.
“EnergyAnalyzer/12345678/InstantMeasurement/CurrentTotal”
İşlem 5: ModBus Slave Id’si 1 olan cihaza 4 adresinden 2 register sorgulama yap. Gelen cevabı float’a çevir.
İşlem 6: Çevrim yapılan veriyi Mqtt Mesajının payload’u olarak belirle. Alttaki topic ismiyle ve QoS/Retain bilgileriyle Broker’a gönder.
“EnergyAnalyzer/12345678/InstantMeasurement/ActivePowerTotal”
Örnekten anlaşılacağı üzere her bir register için bir ModBus sorgusu gönderilir ve alınan veri Broker’a
herhangi bir formata(JSON, XML, vb.) dönüştürülmeden text olarak gönderilir.
Broker’a gelen örnek veriler alttaki şekilde olacaktır.
Mesaj 1 Topic: EnergyAnalyzer/12345678/InstantMeasurement/VoltageAverage
Mesaj 1 Payload: 225.476
Mesaj 2 Topic: EnergyAnalyzer/12345678/InstantMeasurement/CurrentTotal
Mesaj 2 Payload: 26.47
Mesaj 3 Topic: EnergyAnalyzer/12345678/InstantMeasurement/ActivePowerTotal
Mesaj 3 Payload: 45.467
1.5. ModBus Yazma Ayarları
Gateway, ModBus üzerinden okuma yapıp bu verileri Broker’a gönderebildiği gibi Broker’dan
kendisiyle ilgili gelen verileri alıp ModBus cihazlara yazma yapabilmektedir.
Gateway üzerinden ModBus cihazlara yazma yapabilmek için tüm yazılabilir bilgilerin bu sekmede
belirtilmiş olması gerekmektedir.
Slave Id: Yazma yapılacak olan Slave’in adres bilgisidir.
ModBus Function: Yazma yapılacak olan ModBus fonksiyonudur.
13
Tag Bazlı çalışan ModBus Mqtt gateway için geçerli olan Modbus fonksiyonlar alttaki gibidir.
Write Single Register(06)
Write Multiple Registers (16)
Write Single Coil (05)
Tag Bazlı çalışan Modbus MQTT gateway için Int32, Float32, Int64, Float64 gibi veriler birden fazla
register olduğu için Write Multiple Registers fonksiyonu da desteklenmektedir. Fakat, Coil değerleri
sadece 1 bit olduğu ve her veri bir anlam ifade ettiği için Write Multiple Coils desteklenmemektedir.
Modbus Address: Yazma yapılacak olan verinin register adresidir.
Data Type: Yazma yapılacak olan verinin tip bilgisidir.
Byte Order: Yazma yapılacak olan register’ın byte sıralamasıdır.
Topic Name: Yazma yapılacak olan register için broker’a abone olunan topic’tir.
Gateway enerjilendiğinde Broker’a bağlantı sağlandıktan sonra yazma topic’lerine abonelik
yapılmaktadır. Broker’a herhangi bir kaynaktan gönderilen bir Mqtt mesajının topic bilgisi, yazma
topic’leri arasında bulunursa bu mesaj otomatik olarak Broker’dan gateway’e gönderilir. Mesajı alan
gateway bu yazma talebini yazma kuyruğuna ekler.
Sonrasında gateway okuma ve yazma kuyruğuna göre işlemleri gerçekleştirir. Yazma kuyruğunun
önceliği okuma kuyruğundan daha yüksektir. Eğer yazma kuyruğunda bir istek varsa önce bu istek
gerçekleştirilir. Sonrasında okuma kuyruğundaki işlemler gerçekleşir.
Önemli Not: Gateway hiçbir zaman ModBus için aynı anda 2 sorgulama yapmaz.
Dikkat Edilmesi Gereken Nokta:
1- Okuma topic’leri ve yazma topic’leri birbiriyle aynı olması halinde, okunan veri Broker’a
gönderildikten sonra Broker tarafından gateway’e geri iletilir. Bu veri gateway tarafından
cihaza yazmaya çalışılır. Bu durum, mantık hatasına sebep olur.
2- Yazma topic’lerine “+” ve “#” gibi ifadeler eklenmemelidir. Bu ifadelerin geçtiği yazma
register’larına ModBus yazma yapılmaz.
2. ModBus – MQTT Çevirici JSON Bazlı Çalışma
Firmware seçimi ekranında “Working JSON Based” seçeneği seçildikten sonra alttaki şekilde uygulama
açılmaktadır.
14
Konfigürasyona başlamadan önce ilk olarak yazılıma satın alınan gateway’lerle ilgili lisans dosyası
yükleme yapılmalıdır.
Bu işlem “Tag Bazlı Çalışma”daki işlemle birebir aynıdır.
2.1. APN Ayarları
Bu kısım “1.1. APN Ayarları” kısmı ile benzer şekilde konfigüre edilir.
2.2. Mqtt Broker Ayarları
Bu kısım “1.2. Mqtt Broker Ayarları” kısmı ile benzer şekilde konfigüre edilir.
2.3. Seri haberleşme Ayarları
Bu kısım “1.3. Seri Haberleşme Ayarları” kısmı ile benzer şekilde konfigüre edilir.
2.4. ModBus Okuma Ayarları
Modbus Protokolü üzerinden okunacak register’ların belirlendiği sekmedir.
Grid’de ilk satırın Edit butonuna basıldığında alttaki pencere karşımıza çıkar.
15
Önemli Bilgi: Modbus MQTT Çeviricinin JSON Bazlı Çalışma Mantığı
JSON Bazlı çalışma prensibinde Modbus üzerinden veriler okunduktan sonra veri grubu şeklinde JSON
formatında Broker’a gönderim yapılır. Broker’a veri gönderim ve verilerin okunması grup bazında
yapılmaktadır.
Gruba ait parametreler alttaki gibidir.
Slave Id: Okuma yapılacak olan Slave’in adres bilgisidir.
Reading Period: Verinin okuma periyodudur. Okuma periyodu olarak alttaki 4 seçenek bulunmaktadır.
Dakikada bir okuma
5 dakikada bir okuma
15 dakikada bir okuma
60 dakikada bir okuma
Live Mode: Canlı mod grup verilerinin sürekli olarak sorgulanması ve Broker’a gönderilmek istenmesi
durumunda kullanılır. Canlı modda okunacak veriler 2 önem derecesinde okunmaktadır. 1. önem
derecesinde bulunan gruplar canlı modda olmayıp Reading Period bilgisine göre okunan verilerdir.
QoS: Mqtt Protokolü için geçerli olan Quality of Service parametresidir. Mqtt mesajının bir
parametresidir.
QoS 0, this service level guarantees a best-effort delivery. There is no guarantee of delivery. The recipient does not
acknowledge receipt of the message and the message is not stored and re-transmitted by the sender. QoS level 0 is often
called “fire and forget” and provides the same guarantee as the underlying TCP protocol.
QoS level 1 guarantees that a message is delivered at least one time to the receiver. The sender stores the message until it
gets a PUBACK packet from the receiver that acknowledges receipt of the message. It is possible for a message to be sent or
delivered multiple times.
QoS 2 is the highest level of service in MQTT. This level guarantees that each message is received only once by the intended
recipients. QoS 2 is the safest and slowest quality of service level. The guarantee is provided by at least two request/response
flows (a four-part handshake) between the sender and the receiver. The sender and receiver use the packet identifier of the
original PUBLISH message to coordinate delivery of the message.
Kaynak: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels/
Retain: Mqtt mesajının bir parametresidir. Retain olarak Broker’a gönderilen bir mesaj Broker’da
tutulur ve bu mesaja abone olan client’lara her abonelik sonrasında gönderilir.
Topic Name: Modbus üzerinden okunup ilgili veri tipine dönüştürülen grup verileri ile hazırlanan Mqtt
mesajının konu bilgisidir. Topic Name grup için geçerlidir.
Block Read: Grup için, Modbus okumalarının tek tek mi yoksa bir sorguda birden fazla verinin
okunabileceğini belirleyen parametredir. Seçenek eğer seçilmezse her veri için bir Modbus sorgusu
gönderilir.
16
Seçenek seçilmesi durumunda üstteki konfigürasyon için alttaki Modbus sorguları gönderilir.
Modbus Sorgu 1: 0 adresinden 20 Register oku.
Modbus Sorgu 2: 2000 adresinden 4 Register oku.
Modbus Sorgu 3: 2016 adresinden 2 Register oku.
Bir grubun içindeki parametrelerin açıklaması alttaki gibidir.
Address: Tanımlanan Register’ın adresidir. Adres alanı 0-65535 arasında olmak zorundadır. Her
fonksiyon için adres 0’dan başlanacak şekilde düşünülmelidir.
ModBus Function: Gönderilecek ModBus sorgusu için geçerli olan fonksiyon numarasıdır.
Desteklenen fonksiyonlar alttaki gibidir.
Read Coils (0X),
Read Discrete Inputs(1X),
Read Holding Registers(4X),
Read Input Registers(3X).
Byte Order: Verinin Byte sıralamasıdır. Seçenekler alttaki gibidir.
Big Endian
Little Endian
Big Endian Byte Swap
Little Endian Byte Swap
Data Type: Veri tipi bilgisidir.
Desteklenen veri tipleri alttaki gibidir.
Integer 32 Bit
Float 32 Bit
Integer 64 Bit (Long)
Float 64 Bit (Double)
Integer 16 Bit
Float 16 Bit
Unsigned Integer 32 Bit
Unsigned Integer 64 Bit
Unsigned Integer 16 Bit
Unix Time
Time 3 Registers(year/month, day/hour, minute/second)
Register Description: Okunan verinin JSON formatındaki etiketidir.
17
Grup için geçerli olan örnek JSON formatındaki Mqtt Mesajı:
Topic: EnergyAnalyzer/12345678/InstantValue
Payload:
{
"PowerFactorAverage" : 4.123,
"VoltagePhase1Phase2" : 380.545,
"VoltagePhase2Phase3" : 356.488,
"VoltagePhase3Phase1" : 298.564,
"VoltageAverage" : 225.544,
"CurrentTotal" : 36.455,
"ActivePowerTotal" : 46.44,
"ReactivePowerTotal" : 5.54,
"ApperantPowerTotal" : 1.121,
"CosPhiAverage" : 0.998,
"CurrentTransformerRatio" : 8.0,
"VoltageTransformerRatio" : 1,
"DayStart" : 0
}
2.5. ModBus Yazma Ayarları
Gateway, ModBus üzerinden gruplar için okuma yapıp bu verileri Broker’a gönderebildiği gibi
Broker’dan kendisiyle ilgili gelen grup verilerini alıp ModBus cihazlara yazma yapabilmektedir.
Grid’de ilk satırın Edit butonuna basıldığında alttaki pencere karşımıza çıkar.
18
Gateway üzerinden ModBus cihazlara yazma yapabilmek için tüm yazılabilir bilgilerin bu sekmede
belirtilmiş olması gerekmektedir.
Yazma grubu için geçerli parametreler alttaki gibidir.
Slave Id: Yazma yapılacak olan Slave’in adres bilgisidir.
Block Write: ModBus yazmaların tek tek mi yoksa mümkün olması durumunda birden fazla verinin aynı
yazılması şeklinde mi gönderileceği bu seçenek ile belirlenir.
Topic Name: Yazma yapılacak olan grup için broker’a abone olunan topic’tir.
Gateway enerjilendiğinde Broker’a bağlantı sağlandıktan sonra yazma topic’lerine abonelik
yapılmaktadır. Broker’a herhangi bir kaynaktan gönderilen bir Mqtt mesajının topic bilgisi, yazma
topic’leri arasında bulunursa bu mesaj otomatik olarak Broker’dan gateway’e gönderilir. Mesajı alan
gateway bu yazma talebini yazma kuyruğuna ekler.
Sonrasında gateway okuma ve yazma kuyruğuna göre işlemleri gerçekleştirir. Yazma kuyruğunun
önceliği okuma kuyruğundan daha yüksektir. Eğer yazma kuyruğunda bir istek varsa önce bu istek
gerçekleştirilir. Sonrasında okuma kuyruğundaki işlemler gerçekleşir.
Önemli Not: Gateway hiçbir zaman ModBus için aynı anda 2 sorgulama yapmaz.
Dikkat Edilmesi Gereken Nokta:
1- Okuma topic’leri ve yazma topic’leri birbiriyle aynı olması halinde, okunan veri Broker’a
gönderildikten sonra Broker tarafından gateway’e geri iletilir. Bu veri gateway tarafından
cihaza yazmaya çalışılır. Bu durum, mantık hatasına sebep olur.
2- Yazma topic’lerine “+” ve “#” gibi ifadeler eklenmemelidir. Bu ifadelerin geçtiği yazma
register’larına ModBus yazma yapılmaz.
Tanımlanan bir yazma grubunun içerisinde bulunan parametreler alttaki gibidir.
Modbus Address: Yazma yapılacak olan verinin register adresidir.
ModBus Function: Yazma yapılacak olan ModBus fonksiyonudur.
JSON Bazlı çalışan ModBus Mqtt gateway için geçerli olan Modbus fonksiyonlar alttaki gibidir.
Write Single Register(06)
Write Multiple Registers (16)
Write Single Coil (05)
Write Multiple Coil (15)
Byte Order: Yazma yapılacak olan verinin’ın byte sıralamasıdır.
Data Type: Yazma yapılacak olan verinin tip bilgisidir.
Register Description: Grup yazma için Broker’dan alınan JSON formatındaki veride bulunan register
için açıklama bilgisidir.
19
Örnek olarak üstteki grup yazma konfigürasyonu için Broker’dan alttaki şekilde JSON formatında veri
gelebilir.
Topic: EnergyAnalyzer/12345678/ConfigSet
Payload:
{
“CurrentTransformerRatio”: 10,
“VoltageTransformerRatio”: 1,
“DayStart”: 0,
“MonthStart”: 1,
}
Bu mesaj Gateway’e ulaştıktan sonra grup için belirlenen 4 veri cihaza yazılmaya çalışılır.
Eğer mesaj alttaki şekilde gelirse sadece gelen veri ModBus üzerinden cihaza yazılmaya çalışılacaktır.
Topic: EnergyAnalyzer/12345678/ConfigSet
Payload:
{
“CurrentTransformerRatio”: 10
}
2.6. ModBus Arşiv Okuma Ayarları
Arşiv verileri, ModBus protokolü ile haberleşme yapılan cihazın dâhili hafızasında tutulan geçmişe
yönelik verilerdir.
Örnek olarak dâhili arşivi olan bir cihazda sıcaklık ölçümü, nem ölçümü ve pulse sayım işlevinin
bulunduğunu düşünelim. Bu cihazın alttaki şekilde ModBus tablosu olsun.
Data Function Address Data Type Byte Order
Instant Temperature Read Holding Register 0 Float32 Big Endian
Instant Humidity Read Holding Register 2 Float32 Big Endian
Instant Total Pulse Index Read Holding Register 4 Int32 Big Endian
Bu cihazın saatlik olarak ölçüm ve sayım verilerini hafızasında alttaki şekilde tutabilir. Cihazın
hafızasında 1920 adet saatlik(80 gün) arşiv verisi tutabildiği varsayılmıştır.
Data Function Address Data Type Byte Order
Minimum Temperature of 1 hour ago Read Holding Register 1000 Float32 Big Endian
Average Temperature of 1 hour ago Read Holding Register 1002 Float32 Big Endian
Maximum Temperature of 1 hour ago Read Holding Register 1004 Float32 Big Endian
Minimum Humidity of 1 hour ago Read Holding Register 1006 Float32 Big Endian
Average Humidity of 1 hour ago Read Holding Register 1008 Float32 Big Endian
Maximum Humidity of 1 hour ago Read Holding Register 1010 Float32 Big Endian
Pulse Count of 1 hour ago Read Holding Register 1012 Int32 Big Endian
Minimum Temperature of 2 hours ago Read Holding Register 1014 Float32 Big Endian
20
Üstteki örnekte gösterilen Modbus arşiv verileri JSON bazlı çalışan firmware ile okunabilmektedir.
Arşivin tipi; ölçüm ve sayım yapan cihazın kabiliyetine göre saatlik olabileceği gibi günlük ve aylık da
olabilir. Günlük olarak bulunması durumunda veriler bir önceki gün, iki önceki gün, …, 180 önceki gün,
vb. şekilde Modbus arşiv tablosunda bulunacaktır. Aylık olarak bulunması durumunda veriler bir önceki
ay, iki önceki ay, …., 36 önceki ay, vb. şekilde Modbus arşiv tablosunda bulunacaktır.
Gateway üzerinden arşiv verilerinin okunabilmesi için sadece birinci arşiv verisinin tanımlanması
yeterlidir.
Üstte bulunan saatlik arşiv verileri alttaki şekilde konfigürasyon yazılımının ModBus Arşiv sekmesine
tanımlanmalıdır.
Bilgilerin açıklaması alttaki gibidir.
Slave Id: Arşiv okuma yapılacak olan Slave’in adres bilgisidir.
Average Temperature of 2 hours ago Read Holding Register 1016 Float32 Big Endian
Maximum Temperature of 2 hours ago Read Holding Register 1018 Float32 Big Endian
Minimum Humidity of 2 hours ago Read Holding Register 1020 Float32 Big Endian
Average Humidity of 2 hours ago Read Holding Register 1022 Float32 Big Endian
Maximum Humidity of 2 hours ago Read Holding Register 1024 Float32 Big Endian
Pulse Count of 2 hours ago Read Holding Register 1026 Int32 Big Endian
Minimum Temperature of 3 hours ago Read Holding Register 1028 Float32 Big Endian
Average Temperature of 3 hours ago Read Holding Register 1030 Float32 Big Endian
Maximum Temperature of 3 hours ago Read Holding Register 1032 Float32 Big Endian
Minimum Humidity of 3 hours ago Read Holding Register 1034 Float32 Big Endian
Average Humidity of 3 hours ago Read Holding Register 1036 Float32 Big Endian
Maximum Humidity of 3 hours ago Read Holding Register 1038 Float32 Big Endian
Pulse Count of 3 hours ago Read Holding Register 1040 Int32 Big Endian
… … … … …
Minimum Temperature of 1920 hours ago Read Holding Register 26866 Float32 Big Endian
Average Temperature of 1920 hours ago Read Holding Register 26868 Float32 Big Endian
Maximum Temperature of 1920 hours ago Read Holding Register 26870 Float32 Big Endian
Minimum Humidity of 1920 hours ago Read Holding Register 26872 Float32 Big Endian
Average Humidity of 1920 hours ago Read Holding Register 26874 Float32 Big Endian
Maximum Humidity of 1920 hours ago Read Holding Register 26876 Float32 Big Endian
Pulse Count of 1920 hours ago Read Holding Register 26878 Int32 Big Endian
21
ModBus Function: Gönderilecek ModBus sorgusu için geçerli olan fonksiyon numarasıdır.
Desteklenen fonksiyonlar alttaki gibidir.
Read Coils (0X),
Read Discrete Inputs(1X),
Read Holding Registers(4X),
Read Input Registers(3X).
Archive Type: Arşiv verisinin zaman periyodudur. Saatlik, günlük ve aylık arşiv veri tipleri seçilebilir.
Day – Hour – Minute: 3 parametre arşiv verisinin ne zaman okunacağını belirlemektedir.
Aylık arşiv okumaları için; Gün parametresi arşivin okunacağını günü, Saat parametresi arşivin
okunacağı saati, Dakika parametresi de arşivin okunacağı dakikayı belirlemeyi sağlar.
Day: 1, Hour: 0, Minute: 15 şeklinde belirlenirse; ayın ilk gününün ilk saatin 15. dakikasında arşiv verileri
okunmaya başlanacaktır.
Day: 1, Hour: 8, Minute: 15 şeklinde belirlenirse; ayın ilk gününün 8. saatin 15. dakikasında arşiv verileri
okunmaya başlanacaktır.
Günlük arşiv okumaları için; Saat parametresi arşivin okunacağı saati, Dakika parametresi de arşivin
okunacağı dakikayı belirlemeyi sağlar. Bu arşiv tipi için Gün parametresi kullanılmamaktadır.
Hour: 8, Minute: 15 şeklinde belirlenirse; günün 8. saatin 15. dakikasında arşiv verileri okunmaya
başlanacaktır.
Saatlik arşiv okumaları için; Dakika parametresi de arşivin okunacağı dakikayı belirlemeyi sağlar. Bu
arşiv tipi için Gün ve Saat parametresi kullanılmamaktadır.
Minute: 15 şeklinde belirlenirse; saatin 15. dakikasında arşiv verileri okunmaya başlanacaktır.
Üstteki örnek için saatlik arşiv okumasının gerçekleşme zamanı saatin 10. dakikası olarak belirlenmiştir.
Bu parametre ile günün alttaki zamanlarında saatlik arşiv okuması başlatılacaktır.
00:10, 01:10, 02:10, 03:10, 04:10, 05:10, 06:10, 07:10, 08:10, 09:10, 10:10, 11:10,
12:10, 13:10, 14:10, 15:10, 16:10, 17:10, 18:10, 19:10, 20:10, 21:10, 22:10, 23:10,
Archive Count: Arşiv okuması zamanı geldiği durumda kaç adet arşivin okunup broker’a
gönderileceğinin belirlendiği parametredir. Üstteki örnek için bu parametre 24 olarak belirlenmiştir.
Her arşiv okuma zamanı geldiğinde geçmişe yönelik son 24 saate ait arşiv tek tek okunup broker’a
gönderim sağlanacaktır.
Start Address – Register Count: ModBus arşiv okumaları için her arşiv okuması bir ModBus sorgusu ile
yapılmaktadır. Bu iki ayar ilk Modbus arşivinin hangi adresten başladığını ve arşivin ne kadar register’da
tutulduğu bilgisini içermektedir.
Bu bilgilere göre Arşiv büyüklüğü 125 register’da büyük olamaz. Çünkü ModBus protokolünün
standardına göre bir sorguda maksimum 125 register sorgulanabilmektedir.
Bazı durumlarda arşiv verileri içindeki tüm bilgiler alınmak istenmeyebilir. Verilen örnekte arşivdeki son
veri olan Pulse Count alınmak istenmemesi durumunda Register Count azaltılmamalıdır. Azaltılması
durumunda 2. arşiv verisinin başlangıç adresi yanlış hesaplanır.
22
Verilen örnekte bir arşiv okuması toplam 14 register’da tutulduğu için Register Count 14 olarak
belirlenmiştir.
QoS: Mqtt Protokolü için geçerli olan Quality of Service parametresidir. Mqtt mesajının bir
parametresidir. Detay içim 2.4. bölümüne bakılabilir.
Retain: Mqtt mesajının bir parametresidir. Retain olarak Broker’a gönderilen bir mesaj Broker’da
tutulur ve bu mesaja abone olan client’lara her abonelik sonrasında gönderilir.
Topic Name: Okunan arşiv verisinin broker’a gönderildiği Mqtt mesajının konu bilgisidir. Topic Name
arşiv için geçerlidir.
Bir arşiv okumanın detay bilgileri alttaki gibidir.
Address: Arşiv için geçerli olan adres bilgisidir. Bu bilgi cihazın Modbus tablosunda bulunan adres
değildir. Arşivin içinde bulunduğu register sırasıdır. Örnek için “Minimum Temperature of x hour(s) ago
register”ı 0 adresinde tanımlanmıştır.
Byte Order: Verinin Byte sıralamasıdır. Seçenekler alttaki gibidir.
Big Endian
Little Endian
Big Endian Byte Swap
Little Endian Byte Swap
Data Type: Veri tipi bilgisidir.
Desteklenen veri tipleri alttaki gibidir.
Integer 32 Bit
Float 32 Bit
Integer 64 Bit (Long)
Float 64 Bit (Double)
Integer 16 Bit
Float 16 Bit
Unsigned Integer 32 Bit
23
Unsigned Integer 64 Bit
Unsigned Integer 16 Bit
Unix Time
Time 3 Registers(year/month, day/hour, minute/second)
Register Description: Okunan arşiv verisinin JSON formatındaki etiketidir.
Bu bilgilere göre örnek için broker’a gönderilen Mqtt mesajı alttaki gibi olabilir.
Topic: Sensor/2546546/HourlyArchive
Payload:
{
"ArchiveIndex" : 1
, "CurrentDateTime" : "2019-06-01 16:10:24"
, "MinimumTemperature" : 24.144
, "AverageTemperature" : 31.648
, "MaximumTemperature" : 41.456
, "MinimumHumidity" : 49.154
, "AverageHumidity" : 53.145
, "MaximumHumidity" : 55.987
, "PulseCount" : 545
}
ArchiveIndex değeri bu verinin hangi arşive karşılık geldiğini ifade eder. Örnek payload’da 1 olarak
görülmesi bunun 1 saat önceki saatlik arşiv verisi olduğunu göstermektedir.
CurrentDateTime parametresi okumanın yapıldığı zaman bilgisidir. Verilen örnekte çalışma dakika
parametresi “10” olarak belirlenmişti. Örnek Payload’da verinin 16. saatin 10. dakikasında arşiv
okumanın yapıldığı görülmektedir. Bu bilgiye ve ArchiveIndex değerine göre Payload’da bulunan arşiv
verilerinin “2019-06-01 15:00:00” ile “2019-06-01 16:00:00” arasına ait olduğu söylenebilir.
ArchiveIndex 2 olması durumunda verilerin “2019-06-01 14:00:00” ile “2019-06-01 15:00:00” arasına
ait olduğu söylenebilir.
ArchiveIndex ve CurrentDateTime parametreleri arşiv verilerinin anlaşılabilmesi için gerekli olan
gateway tarafından belirlenen değerlerdir.
Verilen örnek için Archive Count değeri 24 olarak belirlenmesi ile her saat bu şekilde 24 adet arşiv
verisinin okunup Broker’a gönderileceği yorumu yapılabilir.
Önemli Not: Arşiv verilerinin Gateway üzerinden okunabilmesi için cihazdaki arşiv verilerinin yapısının
en yeni arşivin ModBus tablosunda ilk sırada olması zorunludur.
Önemli Not: Bir cihazın arşiv yapısını desteklemesi için dâhili hafızasının bulunmasına ilave olarak
gerçek zaman saatinin de bulunması gerekmektedir.
Tavsiye: Cihaz ve gateway’in zaman bilgilerinin küçük miktarda sapma durumları olması durumu için
okuma dakikası parametresinin 1 dakika üzeri belirlenmesinde fayda vardır.
24
2.7. JSON Bazlı Çalışma Detayları
Cihazın açıldıktan sonra broker’a bağlanmadan önce zaman senkronizasyonu gerçekleştirilmektedir.
Zaman senkronizasyonu GSM baz istasyonu üzerinden gerçekleşir. Baz istasyonundan alınan zaman
bilgisi UTC formatındaki zaman bilgisi ve baz istasyonunun bulunduğu zaman dilimidir. Bu bilgilere göre
local zaman hesaplanıp zaman senkronizasyonu yapılarak cihazın işlevlerinin ilgili zamanlarda
gerçekleştirilmesi sağlanır.
Zaman senkronizasyonu Tag bazlı çalışma için gerçekleşmemektedir. JSON bazlı çalışma için Modbus
arşiv okuma için zaman bilgisine ihtiyaç olduğu için bu çalışmada senkronizasyon zorunlu kılınmıştır.
3. Konfigürasyon Verilerinin Gateway’e yüklenmesi
1 ve 2. bölümde anlatılan konfigürasyonlar XML formatında bulunan bir text dosya ile Gateway’e
aktarılmaktadır.
Tag Bazlı firmware için örnek gateway XML konfigürasyon dosyası alttaki gibidir.
Konfigürasyon dosyasının cihaza yüklenebilmesi Eclipse ve Gemalto terminalleri için ayrı ayrı
anlatılacaktır.
3.1. Eclipse Gateway için XML konfigürasyon yükleme
Eclipse gateway’lere XML konfügrasyon dosyası RS485 üzerinden yüklenmektedir. Bu yükleme işlemi
için USB-RS485 çeviriciye ihtiyacımız bulunmaktadır.
Gateway enerjilendikten sonra 60 saniye boyunca boot modunda kalmaktadır. 60 saniye boot modu
tamamlandıktan sonra Modbus Mqtt gateway olarak görev yapmaya devam etmektedir. Cihaza enerji
vermeden önce USB-RS485 çevirici gateway’ın RS485 portuna USB portu da PC’ye bağlı olmalıdır.
Gateway, PC’ye ilk defa bağlanmışsa alttaki ayar yapılmalıdır.
Adım 1: Bilgisayarım açılır. Adım 2: Module’e sağ tıklanıp Özellikler’e tıklanır.
25
Adım 3: Açılan pencereden port sekmesine gelinip çeviriciyle ilgili COM Port seçimi yapılır ve OK
butonuna basılır.
Gateway’e XML dosyasının yüklenmesi için alttaki adımlar takip edilmelidir.
XML dosyası, C:\\Program Files(x86)’nın içinde “MQTTGateway\MqttGateway\Data\Device”
klasöründen konfigüre edilecek gateway’in IMEI numarasına göre tespit edilir.
Tespit sonrasında cihaz enerjilenir ve XML dosyasını alttaki dizine kopyalanır. Eski dosyanın üzerine
yazılması sağlanmalıdır.
İşlem sonrasında konfigürasyon yükleme işlemi tamamlanmış olur.
3.2. Gemalto Gateway için XML konfigürasyon yükleme
Gemalto terminallerde RS232 ve RS485 portuna ilave olarak USB portu bulunmaktadır. PC üzerinden
USB portuna bağlantı yapabilmek için elimizde USB Type-B kablosuna ihtiyaç vardır.
26
Bu kabloyu PC’ye ve gateway’e bağladığımızda bilgisayar gateway’in driver’ını otomatik olarak
bulmalıdır.
Not: Driver problemi yaşamanız durumunda destek ekibiyle iletişime geçebilirsiniz.
Gateway, PC’ye ilk defa bağlanmışsa alttaki ayar yapılmalıdır.
Adım 1: Bilgisayarım açılır. Adım 2: Module’e sağ tıklanıp Özellikler’e tıklanır.
Adım 3: Açılan pencereden port sekmesine gelinip ilgili COM Port seçimi yapılır ve OK butonuna basılır.
Gateway’e XML dosyasının yüklenmesi için alttaki adımlar takip edilmelidir.
XML dosyası, C:\\Program Files(x86)’nın içinde “MQTTGateway\MqttGateway\Data\Device”
klasöründen konfigüre edilecek gateway’in IMEI numarasına göre tespit edilir. Bu XML dosyasını alttaki
dizine kopyalanır. Eski dosyanın üzerine yazılması sağlanmalıdır.
27
İşlem sonrasında cihaz yeniden başlatılarak konfigürasyon yükleme işlemi tamamlanmış olur.
4. ModBus Mqtt Gateway Testleri
Gateway ile testlerin yapılması için test.mosquitto.org sunucusu ile MQTT.Spy veya MQTT.Fx gibi
uygulamalar MQTT Client uygulaması kullanılabilir.
MQTT.Spy uygulaması alttaki linkten indirilebilir.
https://github.com/eclipse/paho.mqtt-spy/wiki/Downloads
MQTT.Fx uygulaması alttaki linkten indirilebilir.
https://mqttfx.jensd.de/