Skip to main content

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 BitsParityStop Bits
7E1
7E2
7O1
7O2
7N1
7N2
8E1
8E2
8O1
8O2
8N1
8N2
9E1
9E2
9O1
9O2
9N1
9N2

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.

ÖNEMLİ

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.

ASCIIHexSayısal Değer (Desimal)
NUL0x000
SOH0x011
!0x2133
70x3755
ÖNEMLİ

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ı
}
ÖNEMLİ

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.

ParametreVeri TipiZorunlulukAçıklama
typestringZorunluKontrol hesaplama tipi. bcc, crc-16/modbus, hcs, fcs değerleri olabilir.
argumentstring/arrayZorunluKontrol hesabı yapılacak veri
outstringZorunluKontrol 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ı
}