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 |
- 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:
- 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.
- 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.
- Yeniden bağlanma yönetimi. Program broker bağlantı kopmalarını sorunsuz yönetmeli ve kontrol mantığını bloke etmemelidir.
- 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:
- PLC'de etkinleştirebileceğiniz bir OPC UA sunucusu var mı? OPC UA ile 1. seçeneği kullanın.
- Güvenlik politikanız PUT/GET'e izin veriyor mu? S7 iletişimiyle 1. seçenek hızlı ve ucuzdur.
- PLC mantığında tanımlanan olay güdümlü verilere mi ihtiyacınız var? 2. seçenek.
- Kontrolör ayarları kilitli ama donanım değişikliği kabul edilebilir mi? 3. seçenek.
- 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.



