Endüstriyel IoT

Sparkplug Şablonları (Template) ve UDT'ler Açıklandı

Sparkplug şablonları, PLC tarzı kullanıcı tanımlı tipleri MQTT'ye taşır. Bu rehber template tanımlarını ve örneklerini, parametreleri, iç içe yapıları ve sürümlemeyi; bir pompa şablonu oluşturan Python koduyla ve modelleri edge node'lar arasında tutarlı tutmaya yönelik ipuçlarıyla açıklıyor.

Tek bir pompa tanımını ve edge node'ların yayınladığı birkaç pompa örneğini gösteren Sparkplug şablonları diyagramı
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

Sparkplug şablonları (template'ler), Sparkplug B'de yeniden kullanılabilir ekipman tiplerini tanımlamanın yoludur; bir PLC veya SCADA sistemindeki kullanıcı tanımlı tipin (UDT) MQTT'deki karşılığıdır. Bu rehberde template tanımlarının ve örneklerinin nasıl çalıştığını, parametrelerin, iç içe yapıların ve sürümlerin nereye oturduğunu, Python'da bir pompa şablonunun nasıl oluşturulacağını ve aynı modelin birçok edge node'da nasıl tutarlı tutulacağını öğreneceksiniz.

Template'ler Neden Var?

Template'ler olmadan bir pompa, birbiriyle gevşek ilişkili metriklerden oluşan bir kümedir: Pump1/Speed, Pump1/Running, Pump1/Pressure. İkinci bir pompa aynı adları farklı bir önekle tekrarlar ve hiçbir şey host uygulamasına ikisinin de pompa olduğunu söylemez. Bir edge node metriğe Speed, diğeri RPM diyorsa, her tüketicinin bu farkı bilmesi gerekir.

Template'ler, tipi örnekten ayırarak bunu çözer. Bir Pump'ı üye metrikleri, veri tipleri ve varsayılan değerleriyle bir kez tanımlarsınız. Her fiziksel pompa ise bu tanıma referans veren bir örnektir (instance). Template'leri anlayan bir host uygulaması eşleşen nesneleri otomatik olarak oluşturabilir, her pompaya aynı ekranları ve alarmları uygulayabilir ve bir örneğin tipiyle uyuşmadığını algılayabilir.

Tanımlar ve Örnekler

Hem tanımlar hem de örnekler, değeri bir Template mesajı olan, veri tipi 19 (Template) olan metriklerdir:

Template alanı Amaç Tanımda Örnekte
version İsteğe bağlı sürüm dizesi Önerilir İsteğe bağlı
metrics Üye metrikler Veri tipleri ve varsayılanlarıyla üyeler Güncel değerleriyle üyeler
parameters Adlandırılmış, tipli sabitler Varsayılanlarla bildirilir Örnek başına geçersiz kılınır
template_ref Kullanılan tanımın adı Ayarlanmaz Zorunlu, tanımı gösterir
is_definition Bir tanımı işaretler true false

Tanımlar nerede bulunur?

Template tanımları, onları kullanan herhangi bir örnekten önce NBIRTH içinde yayınlanır. Veri mesajlarında tekrarlanmazlar. Bazı platformlar, tipleri canlı tag'lerden ayırmak için tanım adlarının önüne _types_/ gibi bir klasör ekler; bu bir zorunluluk değil, platform geleneğidir, bu yüzden host uygulamanız ne bekliyorsa onu izleyin.

Örnekler nerede bulunur?

Örnekler NBIRTH'te (node seviyesindeki ekipman) veya bir DBIRTH'te (bir cihazın arkasındaki ekipman) görünebilir. Her örnek, birth içinde üye metriklerin tam kümesini güncel değerleriyle taşır. Veri mesajları ise ardından değişiklikleri taşır.

Çözülmüş Bir Örnek

İşte çözüldükten sonra bir NBIRTH içinde görünen bir pompa tanımı:

{
  "name": "_types_/Pump",
  "datatype": 19,
  "templateValue": {
    "version": "1.2",
    "isDefinition": true,
    "parameters": [
      { "name": "RatedSpeed", "type": 9, "floatValue": 1500.0 }
    ],
    "metrics": [
      { "name": "Running", "datatype": 11, "booleanValue": false },
      { "name": "Speed", "datatype": 9, "floatValue": 0.0 },
      { "name": "DischargePressure", "datatype": 9, "floatValue": 0.0 },
      { "name": "StartCount", "datatype": 8, "longValue": "0" }
    ]
  }
}

Ve bir DBIRTH içindeki bir örneği:

{
  "name": "CoolingPump1",
  "alias": 20,
  "datatype": 19,
  "templateValue": {
    "templateRef": "_types_/Pump",
    "version": "1.2",
    "isDefinition": false,
    "parameters": [
      { "name": "RatedSpeed", "type": 9, "floatValue": 2900.0 }
    ],
    "metrics": [
      { "name": "Running", "datatype": 11, "booleanValue": true },
      { "name": "Speed", "datatype": 9, "floatValue": 2875.5 },
      { "name": "DischargePressure", "datatype": 9, "floatValue": 3.4 },
      { "name": "StartCount", "datatype": 8, "longValue": "1287" }
    ]
  }
}

Bu pompanın farklı bir motoru olduğu için örnek, RatedSpeed parametresini geçersiz kılar. Parametreler, varlık başına farklılık gösteren ancak çalışma sırasında değişmeyen etiket (nameplate) verileri ve limitler için idealdir.

Python'da Bir Template Oluşturun

Bu kod parçası, Eclipse Tahu sparkplug_b.proto dosyasından üretilmiş sınıfları kullanarak tanımı ve bir örneği oluşturur. Python ile Sparkplug B çözme eğitimimiz tek seferlik kod üretimi adımını gösteriyor.

import time

import sparkplug_b_pb2 as spb

BOOLEAN, FLOAT, UINT64, TEMPLATE = 11, 9, 8, 19
MEMBERS = [("Running", BOOLEAN), ("Speed", FLOAT),
           ("DischargePressure", FLOAT), ("StartCount", UINT64)]


def set_value(metric, datatype, value):
    metric.datatype = datatype
    if datatype == BOOLEAN:
        metric.boolean_value = value
    elif datatype == FLOAT:
        metric.float_value = value
    elif datatype == UINT64:
        metric.long_value = value


def add_pump_definition(payload):
    m = payload.metrics.add()
    m.name = "_types_/Pump"
    m.datatype = TEMPLATE
    t = m.template_value
    t.version = "1.2"
    t.is_definition = True
    p = t.parameters.add()
    p.name, p.type, p.float_value = "RatedSpeed", FLOAT, 1500.0
    for name, dtype in MEMBERS:
        member = t.metrics.add()
        member.name = name
        set_value(member, dtype, False if dtype == BOOLEAN else 0)


def add_pump_instance(payload, name, alias, rated_speed, values):
    m = payload.metrics.add()
    m.name = name
    m.alias = alias
    m.timestamp = int(time.time() * 1000)
    m.datatype = TEMPLATE
    t = m.template_value
    t.template_ref = "_types_/Pump"
    t.version = "1.2"
    t.is_definition = False
    p = t.parameters.add()
    p.name, p.type, p.float_value = "RatedSpeed", FLOAT, rated_speed
    for name, dtype in MEMBERS:
        member = t.metrics.add()
        member.name = name
        set_value(member, dtype, values[name])


nbirth = spb.Payload(timestamp=int(time.time() * 1000), seq=0)
add_pump_definition(nbirth)

dbirth = spb.Payload(timestamp=int(time.time() * 1000), seq=1)
add_pump_instance(dbirth, "CoolingPump1", 20, 2900.0,
                  {"Running": True, "Speed": 2875.5,
                   "DischargePressure": 3.4, "StartCount": 1287})

print(len(nbirth.SerializeToString()), "byte NBIRTH,",
      len(dbirth.SerializeToString()), "byte DBIRTH")

Gerçek bir edge node'da NBIRTH, Sparkplug birth ve death sertifikaları yazısında gösterildiği gibi bdSeq ve Node Control/Rebirth metriklerini de içerir. Bu payload'ları spBv1.0/{group}/NBIRTH/{node} ve spBv1.0/{group}/DBIRTH/{node}/{device} topic'lerine yayınlayın.

Template Değerlerini Çalışma Sırasında Güncellemek

Birth mesajları örneklerin tamamını taşır, ancak veri mesajları küçük kalmalıdır. Platformlar, bir template üyesindeki değişiklikleri raporlama biçimlerinde farklılık gösterir. Bazıları örnek metriğini NDATA veya DDATA içinde yalnızca değişen üyelerle yeniden gönderir. Diğerleri ise birth'ten sonra her üyeyi kendi alias'ına sahip ayrı bir metrik olarak sunar; böylece bir hız değişikliği tek bir skaler değer olarak taşınır. Her iki yaklaşım da adları, veri tiplerini ve alias'ları belirlemek için birth'e dayanır; birth'ü kaçıran bir host'un template güncellemelerini de yorumlayamamasının nedeni budur.

Bir tasarıma karar vermeden önce, edge platformunuzdan bir birth ve birkaç veri mesajı yayınlayın ve çözülmüş sonuca bakın. Host uygulamanızın doğru örnek üyesini güncellediğini, değişmeyen üyelerin değerlerini koruduğunu ve bir rebirth'ün örneği eksiksiz geri getirdiğini doğrulayın. Bunu bir test grubunda iki üç pompayla yapmak dakikalar sürer ve bir uyumsuzluğu yüzlerce varlık yapılandırıldıktan sonra keşfetmenizi önler.

İç İçe Yapılar ve Kompozisyon

Bir template'in üye metriği de bir template olabilir. Bir Skid template'i iki Pump örneği, bir Tank örneği ve birkaç skaler metrik içerebilir. Kompozisyon modelleri okunabilir tutar ve küçük, iyi test edilmiş tipleri yeniden kullanmanızı sağlar.

İç içe yapıyı sığ tutun. Her host her seviyeyi çözmek zorundadır ve derin hiyerarşiler birth mesajlarını büyütür. Paylaşımlı altyapıda büyük birth'ler önemlidir: herkese açık test broker'ı 64 KB'a kadar mesajları kabul eder ve her planın kendi mesaj boyutu sınırı vardır. Bir node yüzlerce varlığı modelliyorsa, birth boyutunu erkenden kontrol edin.

Template'leri Edge Node'lar Arasında Tutarlı Tutmak

Template'ler ancak her edge node aynı tanımı kullandığında karşılığını verir. Pratikte node'lar farklı kişiler tarafından yapılandırıldığında veya farklı zamanlarda güncellendiğinde sapmalar ortaya çıkar. Şu alışkanlıklar bunu önler:

  1. Tanımlardan oluşan tek bir merkezi kütüphaneyi sürüm kontrolü altında tutun ve edge node yapılandırmasını buradan üretin.

  2. version alanını ayarlayın ve üyelerde, veri tiplerinde veya parametrelerde yapılan her değişiklikte artırın.

  3. Bir üyenin veri tipini asla yerinde değiştirmeyin; yeni bir üye veya yeni bir sürüm ekleyin.

  4. Büyük/küçük harf dahil, her yerde aynı tanım adını kullanın.

  5. Varlık başına farklılıkları ek üyelere değil, parametrelere verin.

  6. Dağıtımdan sonra her node'dan gelen çözülmüş NBIRTH tanımlarını kütüphaneyle karşılaştırın.

  7. Yeni sürümleri node node yaygınlaştırın ve geçiş sırasında host'un her ikisini de kabul ettiğini doğrulayın.

  8. adım, çözülmüş bir görünümün işe yaradığı yerdir. ConnectMQ, portaldaki topic gezgininde Sparkplug B'yi çözer; böylece betik yazmadan her node'un NBIRTH'ünü açıp tanımları karşılaştırabilirsiniz. Birth mesajlarını yayınlandıkları anda gösterdiğini unutmayın; bir node zaten çevrimiçiyse, onları görmek için bir rebirth isteyin.

Yaygın Sorunlar

Belirti Olası neden Çözüm
Host örnek üyelerini bilinmeyen olarak gösteriyor NBIRTH'te tanım eksik Tanımları NBIRTH'te örneklerden önce yayınlayın
Örnek reddediliyor veya kısmen gösteriliyor template_ref tanım adıyla eşleşmiyor Birebir ad, büyük/küçük harfe duyarlı
Aynı tip node'a göre farklı davranıyor Tanımlar node'lar arasında sapmış Merkezi kütüphane ve sürüm kontrolleri
Birth'ler çok büyük Çok sayıda derin iç içe örnek Düzleştirin, cihazları bölün veya plan sınırlarını kontrol edin
Bazı tüketiciler template'leri yok sayıyor Araç veri tipi 19'u desteklemiyor Template destekleyen bir host kullanın veya o tüketici için düzleştirin

Template'ler, ISA-95 ve Unified Namespace

Template'ler bir ekipmanın ne olduğunu, ISA-95 ise nerede olduğunu modeller. İkisi birbirini tamamlar: saha, alan ve hat altında örneklenen bir Pump tipi. ConnectMQ, Sparkplug verisini connectmq/factory1/production/line1/cnc1/telemetry gibi ISA-95 topic'lerine yeniden yayınlayabilir; bu da Sparkplug kullanmayan tüketicilere okunabilir, konuma dayalı bir görünüm sunar. Tesis verisini yapılandırma hakkında daha fazlası için MQTT, Sparkplug B ve Unified Namespace yazısına, Sparkplug B veri tipleri referansına ve MQTT ile Endüstriyel IoT ana rehberine bakın.

ConnectMQ ile Başlayın

Template tabanlı edge node'larınızı altyapıyı kendiniz işletmeden barındırılan bir MQTT broker üzerinde çalıştırın veya önce rastgele bir grup ID'siyle herkese açık MQTT test broker'ında prototip oluşturun. app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun ve template tanımlarınızı ve örneklerinizi portalda çözülmüş olarak inceleyin.

Sık Sorulan Sorular

Sparkplug template'leri PLC UDT'leriyle aynı mı?

Aynı amaca hizmet ederler: adlandırılmış, tipli üyelere sahip yeniden kullanılabilir bir tip. Birçok edge platformu PLC veya SCADA UDT'lerini doğrudan Sparkplug template'lerine eşler.

Template tanımları nerede yayınlanmalı?

NBIRTH içinde, onlara referans veren herhangi bir örnekten önce. Örnekler ardından NBIRTH'te veya DBIRTH mesajlarında görünebilir.

Template parametreleri ne için kullanılır?

Parametreler; nominal hız, limitler veya etiket verileri gibi örnek başına sabitleri tutar. Tanım varsayılanları sağlar ve her örnek bunları geçersiz kılabilir.

Tüm Sparkplug host uygulamaları template'leri destekler mi?

Hayır. Destek farklılık gösterir; bu yüzden her şeyi template olarak modellemeden önce host'unuzu kontrol edin. Desteği olmayan tüketiciler için üyeleri normal metriklere düzleştirin veya okunabilir, yeniden yayınlanmış bir ISA-95 görünümü kullanın.

İlgili yazılar

CODESYS MQTT Client: PLC Değişkenlerini Bir Broker'a Yayınlama

CODESYS IIoT MQTT Client kütüphanesini PLC değişkenlerini JSON olarak yayınlayacak şekilde yapılandırın, broker.connectmq.com üzerinde doğrulayın, ardından kimlik bilgileri ve TLS içeren özel bir broker'a geçin.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.