Endüstriyel IoT

Siemens S7 MQTT: S7-1200 ve S7-1500 PLC Verilerini Broker'a Yayınlama

Bir S7-1200 veya S7-1500'den MQTT ile veri almanın kanıtlanmış iki yolu: PLC'ye yerleşik LMQTT kütüphanesi ve python-snap7 kullanan harici bir Python gateway; TLS, ISA-95 topic'leri ve report-by-exception ile birlikte.

Siemens S7 MQTT bağlantısını gösteren, DIN rayı üzerinde tag değerlerini bulut broker'a gönderen bir Siemens S7-1500 PLC
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

Siemens S7 MQTT entegrasyonu, bir S7-1200 veya S7-1500'ün proses verilerini arada bir SCADA sunucusu olmadan doğrudan panolara, historian sistemlerine ve bulut uygulamalarına yayınlamasını sağlar. Bu eğitimde iki pratik yaklaşımı, yani PLC'ye yerleşik LMQTT kütüphanesini ve harici bir gateway'i karşılaştıracak, ardından bir veri bloğunu okuyup TLS üzerinden bir MQTT broker'a yayınlayan çalışan bir Python gateway kuracaksınız. Sonunda test edilmiş bir topic yapısına ve üretime geçiş için bir kontrol listesine sahip olacaksınız.

Siemens S7 MQTT İçin İki Yol

S7 PLC'ler S7 iletişimini, PROFINET'i veya OPC UA'yı konuştukları gibi kutudan çıktığı haliyle MQTT konuşmaz. İki gerçekçi seçeneğiniz vardır.

Seçenek 1: PLC içinde MQTT client. Siemens, TIA Portal için genellikle LMQTT olarak anılan ve open user communication blokları (TCON, TSEND, TRCV) üzerinde bir MQTT 3.1.1 client uygulayan ücretsiz bir kütüphane sunar. Broker'a TCP veya TLS bağlantısını PLC'nin kendisi açar ve yayın yapar. Bu yaklaşımın varyantları iletişim işlemcilerinde ve Siemens edge cihazlarında da mevcuttur.

Seçenek 2: Harici gateway. Küçük bir endüstriyel PC, edge cihazı veya container, S7 iletişimi (PUT/GET) ya da PLC'nin OPC UA sunucusu üzerinden PLC'den tag'leri okur ve MQTT'ye yayınlar. PLC programı değişmez veya çok az değişir.

Kriter PLC içinde LMQTT Harici gateway
Ek donanım Yok Endüstriyel PC, edge cihazı veya VM
PLC programı değişiklikleri Evet: FB çağrıları, tamponlar, JSON oluşturma Yok veya minimum
PLC döngü süresine etkisi Küçük ama gerçek; string işlemleri maliyetlidir Yok
TLS Güncel firmware'de TIA Portal'daki sertifikalarla desteklenir Gateway işletim sistemi ve kütüphanesi tarafından yönetilir
Payload biçimlendirme SCL ile oluşturulur, sınırlı string araçları Her format, kolay JSON veya Sparkplug
Store-and-forward PLC belleğiyle sınırlı Gateway'de disk tamponu
Bakımını kim yapar PLC programcısı IT/OT veya yazılım ekibi
En uygun olduğu durum Az sinyal, ek kutuya izin yok Çok sinyal, çok PLC, daha zengin mantık

Tek bir PLC'den yalnızca birkaç düzine değere ihtiyacınız varsa ve donanım eklemek zorsa LMQTT caziptir. Bir hattı veya bir tesisi bağlıyorsanız, gateway yaklaşımı daha iyi ölçeklenir ve PLC'nin kontrole odaklanmasını sağlar. Mimari ödünleşimler PLC verisini buluta aktarma yazısında daha geniş biçimde ele alınıyor.

Seçenek 1: Yerel LMQTT Kütüphanesi

TIA Portal'daki iş akışı şöyledir:

  1. LMQTT kütüphanesini ve dokümantasyonunu Siemens Industry Online Support'tan indirin ve projenize global kütüphane olarak ekleyin.
  2. Client fonksiyon bloğunu programınıza sürükleyin ve bir instance veri bloğu oluşturun.
  3. Bağlantı parametrelerini yapılandırın: broker ana bilgisayar adı, port, client ID, kullanıcı adı ve parola, keep alive.
  4. TLS için broker'ın kök CA sertifikasını TIA Portal'daki global sertifika yöneticisine aktarın ve PLC'ye atayın. Let's Encrypt sertifikası kullanan bir broker için ISRG Root X1 sertifikası gerekir. Güvenli open user communication'ı destekleyen minimum CPU firmware sürümleri için kütüphane dokümantasyonuna bakın.
  5. Payload'ı SCL'de bir bayt dizisi veya string olarak oluşturun, ardından topic, QoS ve retain bayrağıyla yükselen kenarda bir yayın tetikleyin.
  6. Durum ve hata çıkışlarını izleyin; blok bağlantı hatalarını, zaman aşımlarını ve broker reddetmelerini raporlar.

Sahadan birkaç ders:

  • JSON'u dikkatle oluşturun. SCL'de string birleştirme uzun soluklu ve hataya açıktır. Payload'ları küçük tutun ve sabit formatlar kullanın ya da ayrı topic'lerde düz sayısal string'ler yayınlayın.
  • Her döngüde değil, değişiklikte tetikleyin. Her OB1 döngüsünde yayın yapmak broker'ı ve PLC'nin iletişim kaynaklarını boğar. Bir zamanlayıcı veya ölü bant karşılaştırması kullanın.
  • Client ID'ye dikkat edin. Aynı client ID'ye sahip iki PLC birbirini döngü halinde koparır. Client ID'leri kimlik bilgilerine bağlayan yönetilen bir broker'da her PLC'nin kendi kimlik bilgisi setine ihtiyacı vardır.
  • İlk günden TLS kullanın. Devreye almadan sonra sertifika eklemek, bir yükleme ve bir duruş penceresi daha demektir.

Seçenek 2: python-snap7 ile Python Gateway

Gateway yaklaşımı, bir veri bloğunu S7 iletişimiyle okumak için python-snap7'yi, yayınlamak için de paho-mqtt'yi kullanır. PLC'ye TCP 102 portu üzerinden erişebilen herhangi bir Linux veya Windows makinede çalışır.

PLC'yi TIA Portal'da hazırlayın

S7-1200 ve S7-1500 CPU'ları harici S7 okumalarını varsayılan olarak engeller. İki değişiklik yapıp yükleyin:

  1. CPU özelliklerinde, Protection and Security altında Permit access with PUT/GET communication from remote partner seçeneğini etkinleştirin.
  2. Okuyacağınız veri bloğunun özelliklerinde, değişkenlerin sabit bayt ofsetlerine sahip olması için Optimized block access işaretini kaldırın.

Ardından bu düzende, örneğin DB10 adında bir veri bloğu oluşturun:

Ofset Ad Tip
0.0 Temperature Real
4.0 Pressure Real
8.0 MotorSpeed Int
10.0 Running Bool

PUT/GET kimlik doğrulamasızdır; bu yüzden yalnızca gateway'in tek client olduğu segmentlere ayrılmış bir ağda etkinleştirin. Bu, tesisinizde kabul edilebilir değilse aynı veriyi OPC UA MQTT gateway eğitiminde anlatıldığı gibi S7-1500'ün OPC UA sunucusu üzerinden okuyun.

Kütüphaneleri kurun

python -m venv s7mqtt
source s7mqtt/bin/activate
pip install python-snap7 "paho-mqtt>=2.0"

Gateway betiği

Bu betik DB10'u her saniye okur, bir ölü bant uygular ve yalnızca anlamlı değişiklikleri yayınlar. Ayrıca tüketicilerin gateway'in ne zaman çevrimdışı olduğunu bilmesi için Last Will içeren retained bir durum topic'i tutar.

import json
import time
import uuid
from datetime import datetime, timezone

import snap7
from snap7.util import get_real, get_int, get_bool
import paho.mqtt.client as mqtt

PLC_IP = "192.168.0.10"
RACK, SLOT = 0, 1          # S7-1200 ve S7-1500 CPU'ları rack 0, slot 1 kullanır
DB_NUMBER, DB_SIZE = 10, 12

# Önce herkese açık broker'da test edin. Rastgele bir önek kullanın: herkese açık alan herkes tarafından okunabilir.
BROKER = "broker.connectmq.com"
PORT = 1883
USE_TLS = False
USERNAME = None            # üretim: "YOUR_USERNAME"
PASSWORD = None            # üretim: "YOUR_PASSWORD"
CLIENT_ID = f"s7-gw-{uuid.uuid4().hex[:8]}"   # üretim: "YOUR_CLIENT_ID"
BASE = f"connectmq/demo/{uuid.uuid4().hex[:6]}/plant1/packaging/line2/filler"

DEADBANDS = {"temperature": 0.2, "pressure": 0.05, "motor_speed": 5}


def read_plc(plc):
    data = plc.db_read(DB_NUMBER, 0, DB_SIZE)
    return {
        "temperature": round(get_real(data, 0), 2),
        "pressure": round(get_real(data, 4), 3),
        "motor_speed": get_int(data, 8),
        "running": get_bool(data, 10, 0),
    }


def changed(name, new, last):
    if name not in last:
        return True
    if isinstance(new, bool):
        return new != last[name]
    return abs(new - last[name]) >= DEADBANDS.get(name, 0)


def on_connect(client, userdata, flags, reason_code, properties):
    print("MQTT connected:", reason_code)
    client.publish(f"{BASE}/status", "online", qos=1, retain=True)


def main():
    mq = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=CLIENT_ID)
    if USERNAME:
        mq.username_pw_set(USERNAME, PASSWORD)
    if USE_TLS:
        mq.tls_set()       # sistem CA deposu Let's Encrypt sertifikasını doğrular
    mq.will_set(f"{BASE}/status", "offline", qos=1, retain=True)
    mq.on_connect = on_connect
    mq.connect(BROKER, PORT, keepalive=30)
    mq.loop_start()

    plc = snap7.client.Client()
    last = {}
    last_full = 0.0
    print("Publishing under", BASE)

    while True:
        try:
            if not plc.get_connected():
                plc.connect(PLC_IP, RACK, SLOT)
            values = read_plc(plc)
            now = time.time()
            force = now - last_full > 300      # 5 dakikada bir tam yenileme
            ts = datetime.now(timezone.utc).isoformat(timespec="seconds")
            for name, value in values.items():
                if force or changed(name, value, last):
                    payload = json.dumps({"value": value, "ts": ts, "quality": "good"})
                    mq.publish(f"{BASE}/{name}", payload, qos=1)
                    last[name] = value
            if force:
                last_full = now
        except Exception as exc:              # PLC'ye erişilemiyor, yanlış DB düzeni vb.
            print("PLC read failed:", exc)
            mq.publish(f"{BASE}/quality", "bad", qos=1, retain=True)
            try:
                plc.disconnect()
            except Exception:
                pass
            time.sleep(5)
        time.sleep(1)


if __name__ == "__main__":
    main()

Verinin gelişini izleyin

Betiği çalıştırın, yazdırılan öneki not edin ve başka bir terminalden ona abone olun:

mosquitto_sub -h broker.connectmq.com -p 1883 -i s7-watch-01 \
  -t 'connectmq/demo/+/plant1/packaging/line2/filler/#' -v

PLC izleme tablosunda bir değeri değiştirin; ilgili topic bir saniye içinde güncellenir. Ölü bandından daha az değişen değerler sessiz kalır; yoğun bir tesis ağında tam olarak istediğiniz davranış budur. Ücretsiz herkese açık MQTT broker bu test için uygundur, ancak oraya asla gerçek üretim verisi göndermeyin.

TLS ile Özel Bir Broker'a Geçiş

Üretim için özel bir broker oluşturun ve üç ayarı değiştirin: PORT = 8883, USE_TLS = True ve portalda verilen kullanıcı adı, parola ve client ID. ConnectMQ bir Let's Encrypt sertifikası kullandığından, sistem CA deposuyla tls_set() özel bir CA dosyası gerektirmeden sertifikayı doğrular. connectmq/demo/... önekini kaldırın ve plant1/packaging/line2/filler/temperature gibi temiz bir ISA-95 yolu kullanın; ConnectMQ portalı ISA-95 tarzı topic'leri tanır ve cihazları kuruluş, saha, alan ve hatta göre düzenlenmiş olarak gösterir.

PLC'lerin yanında kendi broker'ınızı çalıştırmakla bir barındırılan MQTT broker kullanmak arasında karar veriyorsanız, gece 3'te onu kimin yamalayacağını, sertifikaları kimin yenileyeceğini ve bağlantı limitlerini kimin izleyeceğini düşünün.

Üretim Kontrol Listesi

  1. Her PLC veya gateway için bir kimlik bilgisi seti ve benzersiz bir client ID.
  2. 8883 portunda TLS; tesis ağı dışında düz TCP yok.
  3. PUT/GET yalnızca segmentlere ayrılmış bir ağda etkin, ya da bunun yerine OPC UA kullanın.
  4. Periyodik tam yenilemeyle birlikte sinyal başına boyutlandırılmış ölü bantlar.
  5. Çevrimiçi ve çevrimdışı durum için Last Will içeren retained durum topic'i.
  6. Ölçümler için QoS 1; QoS 0 yalnızca kaybetmeyi göze alabileceğiniz yüksek hızlı veriler için.
  7. Gateway, otomatik yeniden başlatma ve günlük kaydıyla bir servis olarak çalışır.
  8. Topic adları tüm hatlarda üzerinde mutabık kalınmış bir ISA-95 hiyerarşisini izler.

Siemens S7 MQTT Bağlantılarında Sorun Giderme

  • snap7 hatası "CLI : function refused by CPU". PUT/GET etkin değil veya değiştirdikten sonra CPU'ya yükleme yapılmamış.
  • "Address out of range". DB istenen bayt sayısından küçük veya hâlâ optimize edilmiş durumda. TIA Portal'daki ofset sütununu kontrol edin.
  • Değerler anlamsız görünüyor. Ofsetler yanlış. Real'in 4 bayt, Int'in 2 bayt olduğunu ve Bool'un bitlere paketlendiğini unutmayın.
  • MQTT yeniden bağlanma döngüsü. Yinelenen client ID, yanlış kimlik bilgileri veya gateway'in TLS ile 1883 portuna bağlanması.
  • LMQTT bağlanma aşamasında takılı kalıyor. CPU'da DNS yapılandırılmamış veya CA sertifikası PLC'nin sertifika deposunda yok.

Sparkplug B, edge gateway'ler ve isim alanı tasarımı dahil endüstriyel resmin geri kalanı için MQTT ile endüstriyel IoT rehberini okuyun. Rockwell donanımı da mı kullanıyorsunuz? Allen-Bradley MQTT eğitimi aynı modeli EtherNet/IP ile izliyor.

Siemens PLC'lerinizi ConnectMQ'ya Bağlayın

S7 gateway'inizin yayın yapacağı güvenli bir bulut MQTT broker gerekir. app.connectmq.com adresinde kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun, üretilen kimlik bilgilerini betiğe kopyalayın ve PLC tag'lerinizin canlı topic gezgininde belirmesini izleyin.

Sık Sorulan Sorular

Bir S7-1200 doğrudan MQTT yayınlayabilir mi?

Evet. Siemens LMQTT kütüphanesiyle bir S7-1200 veya S7-1500 MQTT client olarak çalışabilir. Özellikle TLS'e ihtiyacınız varsa desteklenen firmware sürümleri için kütüphane dokümantasyonuna bakın.

Siemens S7 MQTT, MQTT 5'i destekliyor mu?

PLC'ye yerleşik kütüphane MQTT 3.1.1'i uygular. Mesaj süresinin dolması (message expiry) gibi MQTT 5 özelliklerine ihtiyacınız varsa, paho-mqtt gibi bir kütüphaneyle harici bir gateway kullanın.

PUT/GET erişimini etkinleştirmek güvenli mi?

PUT/GET'te kimlik doğrulama yoktur; bu yüzden yalnızca gateway'in tek client olduğu segmentlere ayrılmış bir ağda etkinleştirin. S7-1500'de kullanıcı kimlik doğrulamalı OPC UA sunucusu daha güvenli bir alternatiftir.

PLC verileri hangi QoS seviyesini kullanmalı?

Ölçümler ve durum için QoS 1 iyi bir varsayılandır. Yeni abonelerin mevcut değeri hemen alması için durum topic'lerinde retained mesajlar 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.