Endüstriyel IoT

PROFINET MQTT Dönüşümü: Saha Veriyolu Verilerini Buluta Taşımak İçin Gateway Seçenekleri

PROFINET IO döngüsel, gerçek zamanlı ve kontrolör merkezlidir; bu yüzden Modbus gibi doğrudan sorgulanamaz. PROFINET verisini MQTT'ye taşımanın pratik yollarını karşılaştırın ve bir Siemens PLC'yi okuyup broker'a yayınlayan çalışan bir örneği inceleyin.

PLC, sürücüler ve I/O'dan oluşan bir PROFINET ağı ile PROFINET verilerini MQTT üzerinden bulut broker'a gönderen edge gateway
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

PROFINET MQTT dönüşümü, makine verilerini panolarda veya bulutta görmek isteyen birçok otomasyon ekibinin sorduğu bir sorudur ve cevabı Modbus veya OPC UA'daki kadar açık değildir. Bu rehber PROFINET verisinin neden doğrudan sorgulanamayacağını açıklıyor, dört pratik gateway seçeneğini karşılaştırıyor ve bir Siemens S7 kontrolöründen proses değerlerini okuyup bir MQTT broker'a yayınlayan çalışan bir örneği adım adım gösteriyor. Sonunda tesisinize hangi seçeneğin uyduğunu ve nelere dikkat etmeniz gerektiğini bileceksiniz.

PROFINET Neden Farklı?

PROFINET IO, bir IO controller (genellikle bir PLC) ile IO device'lar (uzak I/O, sürücüler, valf terminalleri, sensörler) arasında gerçek zamanlı, döngüsel veri alışverişi için kullanılan endüstriyel bir Ethernet standardıdır. Kontrolör, mühendislik aracındaki donanım yapılandırmasına göre her cihazla uygulama ilişkileri kurar, ardından proses verilerini sabit bir döngüde, çoğunlukla birkaç milisaniyede bir değiş tokuş eder. Alarmlar ve döngüsel olmayan kayıt verileri de bunların yanında taşınır.

MQTT entegrasyonu için üç özellik önemlidir:

  • Cihazların sahibi kontrolördür. Bir IO device, döngüsel veriyi yalnızca için yapılandırıldığı kontrolörle değiş tokuş eder. Ağdaki rastgele bir client, bir Modbus master'ın bir sayaçtan register istemesi gibi bir sürücüden hızını isteyemez.
  • Proses verisi ham baytlardır. Döngüsel veri, anlamı hatta değil PLC projesinde ve cihaz tanım (GSDML) dosyalarında tanımlanan bir giriş ve çıkış baytları bloğudur.
  • Gerçek zamanlı ağ değerlidir. Bir PROFINET ağına trafik veya cihaz eklemek, kontrol mühendisiyle birlikte planlanmalı, asla doğaçlama yapılmamalıdır.

Pratik sonuç şudur: neredeyse her durumda PROFINET verisinin en iyi kaynağı, cihazları zaten kontrol eden PLC'dir; çünkü veri, bağlam ve adlar ondadır.

Dört PROFINET MQTT Seçeneği

Seçenek Nasıl çalışır Artıları Eksileri Tipik uygunluk
1. PLC'yi bir edge gateway'den okumak Gateway PLC belleğini yerel protokolü veya OPC UA sunucusu aracılığıyla okur, ardından MQTT yayınlar PROFINET ağında değişiklik yok; mevcut tag adlarını kullanır Sorgulama; PLC ayarlarının değişmesi gerekebilir (erişim hakları, OPC UA'nın etkinleştirilmesi) Çoğu mevcut (brownfield) tesis
2. PLC'nin kendisinin MQTT yayınlaması PLC programında bir üretici MQTT client kütüphanesi çalışır Ek donanım yok; veri PLC mantığında değişiklik olduğunda yayınlanır PLC programlama eforu; PLC'de CPU yükü ve TLS yönetimi Yeni (greenfield) projeler veya PLC programlama şirket içinde yapılıyorsa
3. PROFINET cihaz gateway'i Gateway PLC yapılandırmasında bir IO device olarak görünür; PLC verileri onun giriş/çıkış alanına yazar ve gateway MQTT yayınlar Temiz döngüsel arayüz; PLC sorgulanmaz Donanım yapılandırma değişikliği ve PLC'ye yükleme gerektirir Sabit arayüzlü donanım gateway'lerini tercih eden tesisler
4. Pasif izleme Bir tap veya ayna port, tanılama için PROFINET çerçevelerini yakalar Kontrolörde değişiklik yok Proje olmadan verinin anlamı bilinmez; bir veri entegrasyon yöntemi değildir Yalnızca ağ tanılama
  1. seçenek tartışmalarda gündeme geldiği için listelenmiştir, ancak bu bir veri hattı kurmanın sağlam bir yolu değil, bir tanılama tekniğidir. Bu rehberin geri kalanı ilk üç seçeneğe odaklanıyor.

Seçenek 1: PLC'yi Bir Edge Gateway'den Okumak

Bu en az müdahaleci yaklaşımdır ve çoğu ekibin başladığı yerdir. Gateway tesis ağında durur, PLC'den değerleri okur ve MQTT'ye yayınlar. Siemens kontrolörlerinde iki erişim yolu yaygındır:

  • OPC UA sunucusu. S7-1500 kontrolörleri (ve güncel firmware'e sahip S7-1200) bir OPC UA sunucusu çalıştırabilir. Bunu donanım yapılandırmasında etkinleştirir ve hangi tag'lerin sunulacağını seçersiniz. Ardından gateway, OPC UA MQTT gateway eğitimimizdeki gibi bir OPC UA client kullanır. Mevcut olduğunda tercih edilen yol budur: güvenli, sembolik ve desteklenen.
  • S7 iletişimi (PUT/GET). python-snap7 gibi açık kaynak kütüphaneler veri bloklarını adrese göre okur. S7-1200 ve S7-1500'de bu, CPU koruma ayarlarında PUT/GET erişiminin etkinleştirilmesini ve bayt ofsetlerinin sabit kalması için veri bloğunun optimize edilmemiş erişime ayarlanmasını gerektirir. PUT/GET'i etkinleştirmek CPU'nun koruma seviyesini düşürür; bu yüzden PLC güvenliğinden sorumlu kişiyle mutabık kalın.

PROFINET kontrolörleri sunan diğer üreticiler de genellikle bir OPC UA sunucusu veya üreticiye özgü bir okuma protokolü gibi benzer seçenekler sunar.

Örnek: python-snap7 ile S7 Veri Bloğundan MQTT'ye

PLC programcısının paylaşılacak değerleri toplayan, optimize edilmemiş bir DB10 veri bloğu oluşturduğunu varsayalım; arayüz bloğu (interface block) adı verilen bu yaygın ve önerilen bir modeldir:

Ofset Ad Tip
0.0 LineSpeed Real
4.0 MotorCurrent Real
8.0 GoodCount DInt
12.0 Running Bool
12.1 Fault Bool
pip install python-snap7 "paho-mqtt>=2.0"
# s7_profinet_mqtt.py - bir S7 arayüz DB'sini oku ve MQTT'ye yayınla
import json, logging, time, uuid
import paho.mqtt.client as mqtt
import snap7
from snap7.util import get_real, get_dint, get_bool

logging.basicConfig(level=logging.INFO)
log = logging.getLogger("s7")

PLC_IP, RACK, SLOT = "192.168.0.10", 0, 1   # S7-1200/1500: rack 0, slot 1 tipiktir
DB_NUMBER, DB_SIZE = 10, 14
TOPIC_ROOT = "connectmq/demo/p3x8/plant1/assembly/line3"   # kendi rastgele kimliğiniz
MQTT_HOST, MQTT_PORT = "broker.connectmq.com", 1883        # üretim: TLS ile 8883
MQTT_USER, MQTT_PASS = None, None                          # üretim: "YOUR_USERNAME", "YOUR_PASSWORD"
CLIENT_ID = f"s7-bridge-{uuid.uuid4().hex[:8]}"            # üretim: "YOUR_CLIENT_ID"


def decode(buf):
    return {
        "line_speed": round(get_real(buf, 0), 2),
        "motor_current": round(get_real(buf, 4), 2),
        "good_count": get_dint(buf, 8),
        "running": get_bool(buf, 12, 0),
        "fault": get_bool(buf, 12, 1),
    }


def main():
    mq = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=CLIENT_ID)
    if MQTT_USER:
        mq.username_pw_set(MQTT_USER, MQTT_PASS)
        mq.tls_set()
    mq.will_set(f"{TOPIC_ROOT}/bridge", "offline", qos=1, retain=True)
    mq.on_connect = lambda c, u, f, rc, p: c.publish(f"{TOPIC_ROOT}/bridge", "online", qos=1, retain=True)
    mq.connect(MQTT_HOST, MQTT_PORT, keepalive=30)
    mq.loop_start()

    plc = snap7.client.Client()
    last = {}
    while True:
        try:
            if not plc.get_connected():
                plc.connect(PLC_IP, RACK, SLOT)
                log.info("connected to PLC %s", PLC_IP)
            values = decode(plc.db_read(DB_NUMBER, 0, DB_SIZE))
            ts = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
            for name, value in values.items():
                if last.get(name) != value:            # yalnızca değişiklikte yayınla
                    mq.publish(f"{TOPIC_ROOT}/{name}",
                               json.dumps({"value": value, "ts": ts}), qos=1, retain=True)
                    last[name] = value
        except Exception as exc:                       # snap7 iletişim hatalarında RuntimeError fırlatır
            log.error("PLC read failed: %s", exc)
            plc.disconnect()
            time.sleep(5)
        time.sleep(1)


if __name__ == "__main__":
    main()

Sürekli dalgalanan analog değerler için, köprünün her küçük değişikliği yayınlamaması amacıyla bir ölü bant ekleyin; report by exception rehberimiz bunun nasıl yapılacağını gösteriyor. Sonucu izlemek için herkese açık MQTT test broker'ında abone olun; herkesin okuyabileceğini unutmayın ve yalnızca test verisi kullanın:

mosquitto_sub -h broker.connectmq.com -p 1883 -i s7-viewer-p3x8 -t "connectmq/demo/p3x8/#" -v

Seçenek 2: PLC'nin MQTT'yi Doğrudan Yayınlaması

Birçok PLC üreticisi MQTT client fonksiyon blokları sunar. Örneğin Siemens S7-1500 ve S7-1200 için TIA Portal'da, CPU'nun TLS destekli open user communication özelliği üzerine kurulu bir MQTT client kütüphanesi mevcuttur. Bu durumda ne zaman yayın yapılacağına tam olarak PLC programı karar verir; bu da parti tamamlanmaları veya alarmlar gibi olay güdümlü veriler için idealdir.

Planlamanız gerekenler:

  1. Sertifikalar. TLS için CPU'nun broker'ın CA'sına güvenmesi gerekir. Broker bir Let's Encrypt sertifikası kullanır; ilgili kök sertifikayı PLC'nin sertifika deposuna yükleyin.
  2. CPU ve iletişim yükü. PLC'den yüksek hızlarda çok sayıda değer yayınlamak kontrol görevleriyle rekabet eder. Her taramayı değil, özetleri ve olayları yayınlayın.
  3. Yeniden bağlanma yönetimi. Program broker bağlantı kopmalarını sorunsuz yönetmeli ve kontrol mantığını bloke etmemelidir.
  4. Değişiklik yönetimi. Her topic veya payload değişikliği bir PLC yüklemesi demektir. PLC tarafını basit tutun, ağır eşleme işlerini sonraki aşamalarda yapın.

Siemens S7 MQTT yazımız PLC tarafındaki kurulumu daha ayrıntılı ele alıyor.

Seçenek 3: Bir PROFINET Cihaz Gateway'i

Birçok üreticinin donanım gateway'leri bir tarafta PROFINET IO device, diğer tarafta MQTT client olarak çalışır. Gateway'in GSDML dosyasını mühendislik aracına aktarır, donanım yapılandırmasına ekler ve PLC verilerini onun döngüsel giriş/çıkış alanına eşlersiniz. Gateway bu baytları kendi yapılandırmasına göre MQTT mesajlarına dönüştürür.

Bu, temiz ve deterministik bir arayüz sağlar: PLC her döngüde değerleri gateway'in çıkış alanına kopyalar ve hiçbir şey PLC'yi sorgulamaz. Ödünleşimler ise bir donanım değişikliği, cihazı eklemek için bir PLC yüklemesi ve veri eşlemesinin yaşadığı ikinci bir yerdir (gateway'in web arayüzü). Kontrolörlerde PUT/GET veya OPC UA'nın etkinleştirilmesine karşı katı kuralları olan tesislere uygundur.

Doğru Seçeneği Belirlemek

Bu kontrol listesini kontrol mühendisiyle birlikte kullanın:

  1. PLC'de etkinleştirebileceğiniz bir OPC UA sunucusu var mı? OPC UA ile 1. seçeneği kullanın.
  2. Güvenlik politikanız PUT/GET'e izin veriyor mu? S7 iletişimiyle 1. seçenek hızlı ve ucuzdur.
  3. PLC mantığında tanımlanan olay güdümlü verilere mi ihtiyacınız var? 2. seçenek.
  4. Kontrolör ayarları kilitli ama donanım değişikliği kabul edilebilir mi? 3. seçenek.
  5. Bu tek bir hatta yapılan bir pilot mu? 1. seçenekle başlayın; ölçeklenirken her zaman 2. veya 3. seçeneğe geçebilirsiniz.

Hangisini seçerseniz seçin, PROFINET kaynaklı değerlerin Modbus, EtherNet/IP ve OPC UA verileriyle tek bir isim alanında yan yana durması için veriye ISA-95 tarzı bir topic yapısı verin; ISA-95 MQTT topic'leri rehberimize bakın.

Broker Tarafı

Üç seçeneğin de sonunda bir broker'a yayın yapan bir MQTT client vardır; dolayısıyla broker seçimi saha protokolünden bağımsızdır. ConnectMQ gibi bir barındırılan MQTT broker, 8883'te TLS üzerinden MQTT 3.1.1 ve 5.0'ı destekler, ISA-95 ve Unified Namespace topic'lerini algılar ve bunları canlı bir topic gezgininde ve ISA-95 seviyelerine göre düzenlenmiş bir cihazlar görünümünde gösterir. Eşik tabanlı alarm kuralları da ek kod gerektirmeden bir arıza bitini veya limitinin üzerindeki bir motor akımını işaretleyebilir. Genel referans mimari için endüstriyel IoT MQTT rehberini okuyun.

ConnectMQ ile Başlayın

PROFINET yolunuzu seçin, broker kısmı kolay olsun. app.connectmq.com adresinden kaydolun, ücretsiz Serverless planını seçin (kredi kartı gerekmez), bir broker oluşturun ve üretilen kullanıcı adı, parola ve client ID bilgilerini gateway'inizde veya PLC MQTT client'ınızda kullanın. Hat verileriniz dakikalar içinde ConnectMQ portalında görünür olacaktır.

Sık Sorulan Sorular

Bir MQTT gateway PROFINET cihazlarını doğrudan okuyabilir mi?

Bir Modbus master'ın bir sayacı sorguladığı şekilde okuyamaz. PROFINET IO device'lar döngüsel veriyi yapılandırıldıkları kontrolörle değiş tokuş eder; bu yüzden gateway'ler ya kontrolörü okur ya da kendileri IO device olarak yapılandırılır.

S7-1200 veya S7-1500'de PUT/GET'i etkinleştirmek güvenli mi?

CPU'nun erişim korumasını düşürür; bu nedenle ağ segmentasyonu yerindeyken bilinçli ve belgelenmiş bir karar olmalıdır. Mevcutsa PLC'nin OPC UA sunucusu daha güvenli bir alternatiftir.

PROFINET MQTT gateway için GSDML dosyalarına ihtiyacım var mı?

Yalnızca gateway'in PLC donanım yapılandırmasına IO device olarak eklendiği 3. seçenek için. PLC'yi OPC UA veya S7 iletişimiyle okumak bunları gerektirmez.

PLC'yi okumak PROFINET gerçek zamanlı performansını etkiler mi?

Okumalar döngüsel IO alışverişine değil CPU'nun iletişim arayüzüne gider ve makul düzeyde sorgulamanın etkisi azdır. Sorgulama hızlarını mantıklı tutun ve kompakt arayüz blokları okuyun.

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