Genel Bilgiler
Tanım
MASS protokolünde tanımlanan yönergeler (directive) haberleşme ünitesi ile ölçüm cihazı arasındaki iletişimi yönetmek içindir. Haberleşme ünitesi, merkezi yazılım tarafından tanımlanan bu yönergelerdeki adımları (step) sıra ile (order) uygulayarak ölçüm cihazı ile haberleşecektir.
Her adımda yapılacak bir işlem ve bu işlemi gerçekleştiremek için ihtiyaç duyacağı bir parametre (parameter) vardır.
Operasyon çeşitleri
setBaud
Haberleşme ünitesi ile sayaç haberleşmesi seri (serial) bir haberleşme olduğu için haberleşme ünitesinin ve sayacın aynı haberleşme hızına sahip olmaları gerekmektedir. Sayacın haberleşme hızı üretim esnasında belirlendiğinden dolayı haberleşme ünitesi iletişim hızını ayarlamalıdır.
setBaud basamağında yer alan parametrede (parameter) bu hızın değeri yer alır. IEC-62056 standardında belirlenen hızlar şunlardır:
300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200
setBaud operasyonunda parameter alanının veri tipi int olarak kullanılacaktır.
Örnek
//mesajın öncesi
{
"order": 1,
"operation": "setBaud",
"parameter": 300
}
//mesajın sonrası
setFraming
Haberleşme ünitesi ile sayaç seri haberleşmesinde bir diğer önemli husus da framing dir. Haberleşme ünitesi bu basamakta kendi framingini parametredeki değere göre değiştirmelidir.
Aşağıda haberleşme ünitelerin desteklemesi gereken framing tipleri verilmiştir:
| Data Bits | Parity | Stop Bits |
|---|---|---|
| 7 | E | 1 |
| 7 | E | 2 |
| 7 | O | 1 |
| 7 | O | 2 |
| 7 | N | 1 |
| 7 | N | 2 |
| 8 | E | 1 |
| 8 | E | 2 |
| 8 | O | 1 |
| 8 | O | 2 |
| 8 | N | 1 |
| 8 | N | 2 |
| 9 | E | 1 |
| 9 | E | 2 |
| 9 | O | 1 |
| 9 | O | 2 |
| 9 | N | 1 |
| 9 | N | 2 |
setFraming operasyonunda parameter alanının veri tipi string olarak kullanılacaktır.
Örnek
//mesajın öncesi
{
"order": 2,
"operation": "setFraming",
"parameter": "8N1"
}
//mesajın sonrası
wait
Haberleşme ünitesi ile sayaç haberleşmesinde sayaç bir komut aldıktan sonra buna vereceği cevabı hazırlaması için bir zamana ihtiyaç duymaktadır. Haberleşme ünitesi bu sürede okuma yapmadan bekler. Bu süre sayaç markasına ve hatta modeline göre değişir. Bu yüzden bu süreyi merkezi yazılım belirler.
Bu basamakta parameter olarak değer bekleme süresidir.
Bekleme süresinin değeri her zaman milisaniye birimindedir.
1 sn = 1000 ms
wait operasyonunda parameter alanının veri tipi int olarak kullanılacaktır.
Örnek
//mesajın öncesi
{
"order": 3,
"operation": "wait",
"parameter": 200
}
//mesajın sonrası
sendData
Bu basamakta haberleşme ünitesiin sayaca göndereceği veri belirtilir. Bu veri parameter alanında dizi olarak yer alır. Bu dizi gönderilecek byte'ların sayısal karşılığıdır. Örnek bir tablo aşağıda paylaşılmıştır. Tüm tablo ASCII/Hex/Sayısal dönüşüm tablosu sayfasından incelenebilir.
| ASCII | Hex | Sayısal Değer (Desimal) |
|---|---|---|
| NUL | 0x00 | 0 |
| SOH | 0x01 | 1 |
| ! | 0x21 | 33 |
| 7 | 0x37 | 55 |
parameter alanında gönderilen dizi içerisinde string veri tipinde öğe var ise, bu öğe bir argümanı işaret etmektedir ve doğrudan sayaca gönderilmeyecektir.
sendData operasyonunda parameter alanının veri tipi array olarak kullanılacaktır.
Örnek 1 (Argüman olmadan gönderim)
Gidecek mesaj;
ASCII : /?![CR][LF]
HEX : 0x2F 0x3F 0x21 0x0A
SAYISAL: 47, 63, 33, 13, 10
//mesajın öncesi
{
"order": 4,
"operation": "sendData",
"parameter": [47, 63, 33, 13, 10]
}
//mesajın sonrası
Örnek 2 (Argüman string veri tipinde)
sendData basamağında parametre (parameter) olarak gelen dizide sayısal olmayan değerler argüman anlamına gelir ve haberleşme ünitesi tarafından gönderilen değer, karakterlerin ASCII sayısal değerleri ile değiştirilir.
- Eğer doğrudan bir okuma komutu geldiyse bu argüman o komut içerisinde yer alır.
- Takvimsel bir okuma ise takvimsel okuma kaydının içerisinde yer alır.
//mesajın öncesi
"request": {
"directive": "ReadoutDirective1",
"parameters": {
"METERSERIALNUMBER": "12345678"
}
}
//mesajın sonrası
Gidecek mesaj;
ASCII : /?12345678![CR][LF]
HEX : 0x2F 0x3F 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x21 0x0A
SAYISAL: 47, 63, 49, 50, 51, 52, 53, 54, 55, 56, 13, 10
//mesajın öncesi
{
"order": 4,
"operation": "sendData",
"parameter": [47, 63, "METERSERIALNUMBER", 33, 13, 10]
}
//mesajın sonrası
Örnek 3 (Argüman array veri tipinde)
sendData basamağında parametre (parameter) olarak gelen dizide sayısal olmayan değerler argüman anlamına gelir ve haberleşme ünitesi tarafından gönderilen değer argüman dizisi ile yer değiştirilir.
- Eğer doğrudan bir okuma komutu geldiyse bu argüman o komut içerisinde yer alır.
- Takvimsel bir okuma ise takvimsel okuma kaydının içerisinde yer alır.
//mesajın öncesi
"request": {
"directive": "ReadRegisterDirective",
"parameters": {
"SLAVEADDRESS": [17],
"REGISTER": [0, 107]
}
}
//mesajın sonrası
Gidecek mesaj;
ASCII : Değerlerin ASCII gösterimi uygun olmadığından örnek eklenmemiştir.
HEX : 0x11 0x03 0x00 0x6B 0x00 0x03 0x76 0x87
SAYISAL: 17, 3, 0, 107, 0, 3, 118, 135
//mesajın öncesi
{
"order": 4,
"operation": "sendData",
"parameter": ["SLAVEADDRESS", 3, "REGISTER", 0, 3, 118, 135]
}
//mesajın sonrası
readData
Haberleşme ünitesi bu basamağa geldiğinde sayaçtan okuma yapmalıdır. Okuduğu değeri ise parameter alanındaki isimle kaydedip tüm basamaklar tamamlandığında bu isimle merkezi yazılıma göndermelidir. Örneğin:
readData operasyonunda parameter alanının veri tipi string olarak kullanılacaktır. dataType alanı ise ASCII veya HEX olabilir.
Örnek 1 (dataType:ASCII)
Yönergede readData adımının kullanımı.
//mesajın öncesi
{
"order": 5,
"operation": "readData",
"parameter": "rawData",
"dataType": "ASCII"
}
//mesajın sonrası
Daha sonra haberleşme ünitesi okuma yapıp gelen veriyi rawData alanına atadıktan sonra merkeze ASCII formatında gönderilmelidir. ASCII/Hex/Sayısal dönüşüm tablosunda HEX değeri 0x20 (hariç) (SAYISAL değeri 32 (hariç)) küçük olan karakterleri merkeze gönderirken köşeli parantez içerisinde HEX formatında göndermelidir. Burada sadece [CR][LF] (HEX:0x0D 0x0A) (SAYISAL: 13, 10) istisna durumdadır. Bu karakterler, \r\n şeklinde gönderilecektir. " karakteri ise gönderim sırasında \" şeklinde gönderilecektir.
//mesajın öncesi
"data": {
"rawData": "[02]0.0.0(23660088)\r\n0.9.2(2021-06-22)\r\n0.9.1(10:18:42)\r\n1.8.0(0000004891.722)\r\n![03]"
}
//mesajın sonrası
Okunan veri rawData örnektir, gerçek bir sayaç okuması sonucunu göstermez.
Örnek 2 (dataType:HEX)
Yönergede readData adımının kullanımı.
//mesajın öncesi
{
"order": 5,
"operation": "readData",
"parameter": "register",
"dataType": "HEX"
}
//mesajın sonrası
Daha sonra haberleşme ünitesi okuma yapıp gelen veriyi register alanına atadıktan sonra merkeze HEX formatında gönderir.
//mesajın öncesi
"data": {
"register": "110306AE415652434049AD"
}
//mesajın sonrası
loop
Bu basamak tekrarlanacak işlemler için kullanılacaktır. loop basamağının steps alanı bir çok basamaktan oluşan bir JSON dizisi olacaktır. Bu alt basamaklar döngü adedince tekrarlanacaktır.
Bu döngünün adedini ise parameter alanındaki değer belirleyecektir. parameter alanında bir argüman ismi belirtilecek, okuma komutu bu argümanı sağlayan bir liste gönderecektir. Bu listenin elemanlarının değerine argüman isminin başına * karakteri eklenerek ulaşılacaktır.
Haberleşme ünitesi loop altındaki alt stepsleri bu listenin elemanları adedince tekrarlayacaktır.
loop operasyonunda parameter alanının veri tipi array olarak kullanılacaktır.
Örnek 1 (Argüman array[string] veri tipinde)
Liste argümanın okuma ya da takvim tanımlama sırasında kullanımı:
//mesajın öncesi
"request": {
"directive": "ReadObisDirective1",
"parameters": {
"METERSERIALNUMBER": "12345678",
"OBIS":["1.8.0","1.8.1","1.8.2","1.8.3","0.9.1","0.9.2","0.0.0"]
}
}
//mesajın sonrası
Yönerge tanımlama sırasında argüman kullanımı:
{
//mesajın öncesi
"order": 10,
"operation": "loop",
"parameter": "OBIS",
"steps": [
{
"order": 1,
"operation": "sendData",
"parameter": ["METERSERIALNUMBER"]
},
{
"order": 2,
"operation": "wait",
"parameter": 100
},
{
"order": 3,
"operation": "sendData",
"parameter": [2, 3, "*OBIS", 40, 41, 4, 5]
},
{
"order": 4,
"operation": "wait",
"parameter": 100
},
{
"order": 5,
"operation": "readData",
"parameter": "*OBIS"
}
]
//mesajın sonrası
}
Okuma sonucu dönüşü sonrasında argüman kullanımı:
//mesajın öncesi
"data": {
"1.8.0": "00001.258*kwh",
"1.8.1": "00000.258*kwh",
"1.8.2": "00000.500*kwh",
"1.8.3": "00000.500*kwh",
"0.9.1": "18:12:56",
"0.9.2": "2022-09-28",
"0.0.0": "123456789"
}
//mesajın sonrası
Örnek 2 (Argüman array[array] veri tipinde)
Liste argümanın okuma ya da takvim tanımlama sırasında kullanımı:
//mesajın öncesi
"request": {
"directive": "ReadRegisterDirective1",
"parameters": {
"SLAVEADDRESS": [17],
"REGISTER": [[0, 107],[0,111],[0,121]]
}
}
//mesajın sonrası
Yönerge tanımlama sırasında argüman kullanımı:
{
//mesajın öncesi
"order": 10,
"operation": "loop",
"parameter": "REGISTER",
"steps": [
{
"order": 1,
"operation": "sendData",
"parameter": ["SLAVEADDRESS", 3, "*REGISTER", 0, 3, 118, 135]
},
{
"order": 2,
"operation": "readData",
"parameter": "*REGISTER"
}
]
//mesajın sonrası
}
Eğer parameter içerisinde bulunan argüman array ise merkezi yazılıma veri gönderimi sırasında dizi elemanının değerinin hex karşılığı, field isimlendirmesinde kullanılacaktır.
Okuma sonucu dönüşü sonrasında argüman kullanımı:
//mesajın öncesi
"data" : {
"006B": "00001.258*kwh",
"006F": "00000.258*kwh",
"0079": "00000.500*kwh"
}
//mesajın sonrası
calculate
Seri haberleşme sırasında, bazı kontrol karakterlerinin hesaplanması haberleşme ünitesi tarafından yapılacaktır. MASS protokolü kapsamında haberleşme üniteleri bcc, crc-16/modbus, hcs, fcs kontrol hesaplamalarını destekleyeceklerdir.
calculate operasyonunda parameter alanının veri tipi calculate nesnesi olarak kullanılacaktır. calculate nesnesi 3 alan içermektedir.
| Parametre | Veri Tipi | Zorunluluk | Açıklama |
|---|---|---|---|
| type | string | Zorunlu | Kontrol hesaplama tipi. bcc, crc-16/modbus, hcs, fcs değerleri olabilir. |
| argument | string/array | Zorunlu | Kontrol hesabı yapılacak veri |
| out | string | Zorunlu | Kontrol hesabı yapıldıktan sonra kullanılacak değer için yer tutucu. |
{
//mesajın öncesi
{
"order": 1,
"operation": "calculate",
"parameter": {
"type": "hcs",
"argument": [160, 22, 3, 0, 2, 0, 35],
"out": "hcs1"
}
},
{
"order": 2,
"operation": "calculate",
"parameter": {
"type": "fcs",
"argument": [160, 22, 3, 0, 2, 0, 35, 82, 162, 94, 230, 231, 0, 196, 1, 193,0, 18, 0, 2],
"out": "fcs1"
}
},
{
"order": 3,
"operation": "sendData",
"parameter": [126, 160, 22, 3, 0, 2, 0, 35, "hcs1", 94, 230, 231, 0, 196, 1,193, 0, 18, 0, 2, "fcs1", 126]
}
//mesajın sonrası
}