Endüstriyel IoT

MQTT SCADA: Report by Exception ile Telemetriyi Modernleştirmek

MQTT, SCADA telemetrisini nasıl değiştirir: sorgulama yerine report by exception, RTU'lar ile SCADA host'ları arasında merkez olarak bir broker, Last Will ve Sparkplug B ile durum farkındalığı ve adım adım bir geçiş yolu.

MQTT SCADA mimarisini gösteren, SCADA sunucularını ve panoları besleyen merkezi bir broker'a telemetri yayınlayan uzak RTU'lar
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

MQTT SCADA mimarileri, master'ın her RTU'yu sorguladığı klasik modelin yerine, merkezi bir broker'a report by exception ile veri bildiren cihazları ve ihtiyaç duyduklarına abone olan SCADA host'larını koyar. Bu rehber, bu değişimin neden bant genişliği tasarrufu sağladığını ve entegrasyonu basitleştirdiğini, hiçbir şey sorgulanmadığında durum farkındalığının nasıl çalıştığını ve mevcut bir sistemin adım adım nasıl taşınacağını açıklıyor. Ayrıca çevrimdışı ve bayat veri gönderen RTU'ları algılayan küçük bir Python host kuracaksınız; bu, MQTT tabanlı her SCADA'nın arkasındaki temel beceridir.

Geleneksel SCADA Telemetrisi Nasıl Çalışır?

Klasik bir SCADA sisteminde konuşmanın sahibi master istasyondur. Her RTU'yu veya PLC'yi sırayla Modbus, DNP3 veya bir üretici protokolü üzerinden sorgular ve bir şey değişmiş olsun ya da olmasın her döngüde aynı register'ları ister. Bu modelin gerçek güçlü yanları vardır: master bir cihazın yanıt verip vermediğini her zaman bilir ve zamanlama öngörülebilirdir.

Bilinen maliyetleri de vardır:

  • Değişmeyen veriye harcanan bant genişliği. Saatte iki kez değişen bir tank seviyesi yine de birkaç saniyede bir okunur.
  • Tarama süresi ağla birlikte büyür. Radyo veya uydu bağlantılarında RTU eklemek herkes için sorgu döngüsünü uzatır.
  • Sıkı bağlılık. Her yeni tüketici, yani bir historian, bir analitik aracı, ikinci bir kontrol odası, ya cihazları yeniden sorgular ya da SCADA sunucusunun arayüzlerine bağımlı olur.
  • Her yerde cihaz adresleri. Register haritaları ve protokol ayrıntıları veriye ihtiyaç duyan her sisteme sızar.

MQTT SCADA ile Neler Değişir?

MQTT ile RTU veya edge gateway bir broker'a giden bir bağlantı açar ve değerler anlamlı biçimde değiştiğinde yayınlar. SCADA host'ları, historian'lar ve panolar abonedir. Broker ortada durur ve mesajları dağıtır.

Özellik Sorgu-yanıt SCADA MQTT SCADA
Kim başlatır Master her cihazı sorgular Cihaz yayınlar, host'lar abone olur
Trafik Her nokta, her taramada Yalnızca değişiklikler ve heartbeat'ler
Tüketici eklemek Yeni sorgular veya SCADA arayüzü Yeni abonelik, cihazlara dokunulmaz
Bağlantı yönü Master'dan cihaza (sahaya gelen) Cihazdan broker'a (sahadan giden)
Cihaz sağlığı Örtük: yanıt yoksa sorun var Açık: Last Will, birth/death mesajları
Veri bağlamı Register adresleri Adlandırılmış topic'ler, çoğunlukla ISA-95 veya Sparkplug
Bağlantı verimliliği Yüksek gecikmeli bağlantılarda zayıf İyi: kalıcı oturum, küçük paketler

En büyük kavramsal değişim report by exception'dır (RBE). Sormak yerine saha bildirir. Her analog değerde bir ölü bant ve her dijital durum değişikliğinin anında yayınlanması, veriyi trafiğin küçük bir kısmıyla güncel tutar. Ölü bant boyutlandırmasını report-by-exception rehberi ayrıntılı olarak ele alıyor.

SCADA Merkezi Olarak Broker

Bir MQTT SCADA tasarımında broker merkezi sinir sistemi haline gelir. Saha cihazları verilerini kaç host'un tükettiğini bilmez ve umursamaz; host'ların da cihaz adreslerini bilmesi gerekmez. Bu ayrışma, sorgulamayla zahmetli olan modelleri mümkün kılar:

  • Yedekli SCADA host'ları saha trafiğini ikiye katlamadan aynı topic'lere abone olur.
  • Historian'lar ve analitik araçları gibi IT tüketicileri, kontrol sistemine dokunmadan paralel olarak abone olur.
  • Aşamalı geçişler, eski ve yeni SCADA'yı aynı canlı veri üzerinde yan yana çalıştırabilir.

Buradaki temel, bir MQTT broker'ın ne yaptığını anlamaktır: mesajları yönlendirir, retained değerleri ve oturum durumunu tutar ve kimin bağlanabileceğini denetler.

Sorgulamadan Durum Farkındalığı

MQTT SCADA'ya en sık yöneltilen itiraz şudur: "Sorgulamayı bırakırsam bir RTU'nun canlı olduğunu nasıl bileceğim?" MQTT bunu iki seviyede yanıtlar.

Keep alive ve Last Will. Her client bir keep alive aralığı bildirir. Broker bu aralığın 1,5 katı boyunca hiçbir şey duymazsa oturumu kapatır ve client'ın Last Will mesajını yayınlar; örneğin RTU'nun durum topic'inde retained bir offline. RTU yeniden bağlandığında retained bir online yayınlar. Sonradan başlayanlar dahil her abone mevcut durumu görür.

Sparkplug B. Sparkplug spesifikasyonu bunu SCADA için resmîleştirir: edge node'lar bağlandıklarında tüm metrikleri içeren NBIRTH ve DBIRTH mesajlarını, Last Will olarak NDEATH'i yayınlar; birincil host (primary host) da edge node'ların bir SCADA host'unun dinleyip dinlemediğini bilmesi için kendi STATE mesajını yayınlar. Host'lar bir boşluk algıladıklarında rebirth isteyebilir. Ignition ve birçok edge gateway bunu yerel olarak uygular; host tarafı için Sparkplug primary host uygulamaları yazısına bakın.

Düz JSON topic'leriyle bile bayat veriyi algılamalısınız: bağlı olan ancak örneğin saha I/O'su arızalandığı için değerleri güncellenmeyi bırakan bir cihaz.

Örnek: Python ile Minimal Bir MQTT SCADA Host

Bu host RTU durumuna ve telemetrisine abone olur, retained Last Will mesajlarından çevrimiçi durumu takip eder ve verisi beklenen heartbeat süresi içinde değişmeyen veya yenilenmeyen her RTU'yu işaretler. Önce bir simülatörle herkese açık broker'a karşı çalıştırın, ardından kendi broker'ınıza yönlendirin.

import json
import time
import uuid
import threading

import paho.mqtt.client as mqtt

BROKER, PORT = "broker.connectmq.com", 1883
PREFIX = "connectmq/demo/scada-7h2k"          # rastgele önek: herkese açık veriler herkes tarafından okunabilir
STALE_AFTER = 120                             # saniye; heartbeat 60 sn

rtus = {}   # rtu_id -> {"online": bool, "last_seen": float, "values": dict}
lock = threading.Lock()


def on_connect(client, userdata, flags, reason_code, properties):
    print("Connected:", reason_code)
    client.subscribe(f"{PREFIX}/+/status", qos=1)
    client.subscribe(f"{PREFIX}/+/telemetry/#", qos=1)


def on_message(client, userdata, msg):
    parts = msg.topic.split("/")
    rtu_id = parts[3]
    with lock:
        rtu = rtus.setdefault(rtu_id, {"online": False, "last_seen": 0.0, "values": {}})
        if parts[4] == "status":
            rtu["online"] = msg.payload.decode() == "online"
            print(f"[STATE] {rtu_id} is {'ONLINE' if rtu['online'] else 'OFFLINE'}")
        else:
            point = "/".join(parts[5:])
            rtu["values"][point] = json.loads(msg.payload)
            rtu["last_seen"] = time.time()


def watchdog():
    while True:
        time.sleep(10)
        now = time.time()
        with lock:
            for rtu_id, rtu in rtus.items():
                if rtu["online"] and now - rtu["last_seen"] > STALE_AFTER:
                    print(f"[STALE] {rtu_id}: no data for {int(now - rtu['last_seen'])} s")


client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=f"scada-host-{uuid.uuid4().hex[:6]}")
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER, PORT, keepalive=30)
threading.Thread(target=watchdog, daemon=True).start()
client.loop_forever()

Başka bir terminalde retained bir durum ve bir telemetri değeri yayınlayarak bir RTU'yu simüle edin:

mosquitto_pub -h broker.connectmq.com -p 1883 -i rtu-sim-7h2k \
  -t 'connectmq/demo/scada-7h2k/rtu07/status' -m online -r -q 1
mosquitto_pub -h broker.connectmq.com -p 1883 -i rtu-sim2-7h2k \
  -t 'connectmq/demo/scada-7h2k/rtu07/telemetry/tank1/level' -m '{"value":3.42,"unit":"m"}' -q 1

Gerçek bir Last Will'e sahip uzun süre çalışan bir simülatör için --will-topic connectmq/demo/scada-7h2k/rtu07/status --will-payload offline --will-retain parametreleriyle mosquitto_sub veya bir betik kullanın ve host'un tepkisini izlemek için onu sonlandırın. Ücretsiz herkese açık MQTT broker'ını yalnızca bunlar gibi simüle edilmiş değerler için kullanın.

Mevcut Bir SCADA Sistemini Taşımak

Tek seferde tam değişim nadiren gereklidir. Aşamalı bir yol operasyonları güvende tutar:

  1. Önce yansıtın. Mevcut master'ın yanına bir MQTT yayıncısı ekleyin; ya tag'leri ileten bir SCADA modülü ya da aynı RTU'ları yalnızca dinleme modunda okuyan bir edge gateway. Kontrol tarafında hiçbir şey değişmez.
  2. İsim alanını tanımlayın. Çok sayıda kaynak oluşmadan önce topic yapısında (ISA-95 yolları veya Sparkplug grup ve node kimlikleri) ve payload formatında anlaşın.
  3. Salt okunur tüketicileri bağlayın. Historian'lar, panolar ve analitik broker'a taşınır. Değerleri SCADA ekranlarıyla karşılaştırarak doğrulayın.
  4. Sahaları RBE'ye dönüştürün. Her seferinde bir saha veya bağlantı tipinde sorgulamayı RBE destekli RTU'lar veya edge gateway'lerle değiştirin. Bant genişliğini ve veri güncelliğini karşılaştırın.
  5. Kontrolü dikkatle taşıyın. MQTT üzerinden komutlar; onay modelleri, zaman aşımları ve kilitlemeler gerektirir. Sparkplug'ın komut mesajları veya response topic'leriyle MQTT 5 request/response bunu yapılandırmaya yardımcı olur.
  6. Eski sorgulamayı ancak her tüketici taşındığında ve alarm davranışı doğrulandığında devreden çıkarın.

Tasarım Tuzakları

  • Heartbeat yok. Periyodik yenilemesi olmayan saf RBE, donmuş bir değeri sessiz bir değerden ayırt edilemez hale getirir.
  • Senkronizasyonsuz cihaz saati zaman damgaları. RTU saatleri kayarsa olay sırası (sequence-of-events) analizi bozulur. Kaynakta NTP veya GPS zamanı kullanın.
  • Her yerde QoS 2. Yavaş bağlantılarda gidiş-dönüş ekler. Telemetri için olağan seçim, idempotent tüketicilerle QoS 1'dir.
  • Her şeyi retain etmek. Yüksek hızlı akışları değil, durumu ve son değerleri retain edin.
  • Düz topic'ler. rtu07/ai3 ölçeklenmez; saha ve varlığa göre adlandırın.

ConnectMQ'nun Rolü

Bir SCADA merkezi broker'ı TLS, cihaz başına kimlik bilgileri ve hatalı davranan client'lara karşı koruma gerektirir. ConnectMQ TLS ile MQTT 3.1.1 ve 5.0 sunar, her client ID'yi verilen kimlik bilgilerine bağlar ve taşkın koruması ile tekrarlanan başarısız oturum açma denemelerinden sonra IP engelleme uygular. Portal Sparkplug B payload'larını çözer, Sparkplug verilerini okunabilir ISA-95 topic'lerine yeniden yayınlayabilir ve bir alarm günlüğüyle birlikte eşik tabanlı alarm kuralları sunar; bu da SCADA host'unuzun yanında hızlı bir operasyon görünümü için kullanışlıdır. SCADA yazılımları, historian'lar ve betikler sıradan MQTT client'ları olarak bağlanır. Her kontrol merkezinde broker altyapısı çalıştırmak istemiyorsanız tam yönetilen bir MQTT servisini değerlendirmeye değer; belirli bir SCADA paketiyle uygulama ayrıntıları için MQTT ile Ignition, daha geniş bağlam için ise MQTT ile endüstriyel IoT rehberine bakın.

SCADA Telemetrinizi ConnectMQ ile Modernleştirin

Tek bir saha veya tek bir RTU tipiyle başlayın. app.connectmq.com adresinde kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun, bir gateway'i ve SCADA host'unuzu bağlayın ve verileri mevcut sorgulamanızla yan yana karşılaştırın.

Sık Sorulan Sorular

MQTT, SCADA'da DNP3 veya Modbus'ın yerini alabilir mi?

MQTT çoğu zaman saha noktaları ile kontrol merkezi arasındaki taşıma katmanının yerini alır; Modbus veya DNP3 ise bir edge gateway ile saha cihazları arasında yerel olarak kullanılmaya devam edebilir.

Bir MQTT SCADA host'u bir cihazın çevrimdışı olduğunu nasıl bilir?

Keep alive süresi dolduğunda broker tarafından yayınlanan cihazın Last Will mesajıyla veya Sparkplug NDEATH mesajlarıyla. Bağlı kalan ama güncellenmeyi bırakan cihazlar için bayat veri algılaması ekleyin.

MQTT SCADA için Sparkplug B zorunlu mu?

Hayır, ancak birth ve death mesajlarını, metrik tanımlarını ve host durumunu standartlaştırır; bu da SCADA host'ları ile edge cihazları arasındaki birlikte çalışabilirliği çok kolaylaştırır.

SCADA telemetrisi hangi QoS seviyesini kullanmalı?

Retained durum topic'leriyle birlikte QoS 1 yaygın tercihtir. QoS 0, bir sonraki örneğin kaybolanın yerini aldığı yüksek hızlı veriler için uygundur.

İ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.