Node-RED

Node-RED S7: Siemens PLC Değişkenlerini Okuyup MQTT'ye Yayınlama

Node-RED'i node-red-contrib-s7 ile bir Siemens S7 PLC'ye bağlayın: TIA Portal'da PUT/GET'i etkinleştirin, data block değişkenlerini doğru adresleyin, değişiklikleri MQTT'ye yayınlayın ve setpoint yazma işlemlerini güvenle yönetin.

Bir Siemens PLC data block'unu okuyan ve makine değerlerini MQTT topic'lerine yayınlayan Node-RED S7 akışı
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

Node-RED S7 akışları, PLC programını pek değiştirmeden Siemens S7-1200, S7-1500 ve eski S7-300/400 PLC'lerden veri alıp MQTT'ye aktarmanın pratik bir yoludur. Bu rehberde PLC'yi TIA Portal'da hazırlayacak, node-red-contrib-s7 ile data block değişkenlerini okuyacak ve değiştikleri her seferde bunları JSON olarak bir MQTT broker'a yayınlayacaksınız. Ayrıca setpoint'ler için korumalı bir yazma yolu ekleyecek ve ilk denemelerdeki hataların çoğuna yol açan adresleme kurallarını öğreneceksiniz.

Node-RED bir S7 PLC ile Nasıl Konuşur

node-red-contrib-s7, Siemens mühendislik araçlarının ve HMI'ların da kullandığı S7 iletişim protokolünü (ISO-on-TCP, port 102) kullanır. Node-RED bir istemci olarak çalışır: CPU'ya bağlanır, sabit bir döngü süresinde bir adres listesini okur ve isteğe bağlı olarak değerleri geri yazar. Ek donanım veya PLC lisansı gerekmez, ancak CPU'nun bu tür erişime izin vermesi gerekir; modern CPU'lar bunu varsayılan olarak engeller.

Değerler Node-RED'e geldiğinde dağıtımı MQTT devralır. Her panonun, historian'ın ve analitik aracın PLC'ye bağlanması yerine tek bir gateway PLC'yi okur ve bir broker adlandırılmış değerleri tüm subscriber'lara iletir. Yaklaşımların daha geniş bir karşılaştırmasını istiyorsanız Siemens S7 ve MQTT rehberi yerel PLC MQTT istemcilerini ve ticari gateway'leri de ele alır.

Adım 1: PLC'yi TIA Portal'da Hazırlayın

S7-1200 ve S7-1500 CPU'lar için iki değişiklik yapın ve bunları PLC'ye yükleyin:

  1. PUT/GET'e izin verin. CPU özelliklerini açın, Protection & Security → Connection mechanisms bölümüne gidin ve "Permit access with PUT/GET communication from remote partner" seçeneğini etkinleştirin.
  2. Node-RED'in okuması gereken her data block için optimized block access'i devre dışı bırakın. Data block'a sağ tıklayın, Properties → Attributes bölümünü açın ve "Optimized block access" işaretini kaldırın. Bloğu derleyin; artık her değişken için sabit offset'ler gösterir.

İkinci adım, DB10,REAL0 gibi mutlak adresleri anlamlı kılan şeydir. Optimize erişimde PLC değişkenleri dahili olarak yeniden düzenler ve S7 protokolü bunları offset ile adresleyemez.

PUT/GET erişimi bir güvenlik ödünleşimidir: port 102'ye ulaşan her istemci bu alanları okuyabilir ve yazabilir. PLC'yi yalıtılmış bir OT ağında tutun, ona yalnızca gateway'in ulaşmasına izin verin ve yalnızca dışarı açmak istediğiniz değerleri içeren özel bir data block tercih edin.

S7-300 ve S7-400 CPU'lar bu ayarlara ihtiyaç duymaz. Bunlar için yeni ailelerdeki slot 1 yerine rack 0 ve slot 2 kullanın.

Adım 2: Gateway için bir Data Block Tasarlayın

Optimize edilmemiş bir data block oluşturun, örneğin DB10 "GatewayData", ve yayınlamak istediğiniz değerleri programınızdan buna kopyalayın. Özel bir blok, ana program değişse bile arayüzü kararlı tutar.

Değişken Tip Offset node-red-contrib-s7 adresi
temperature Real 0.0 DB10,REAL0
speed Int 4.0 DB10,INT4
running Bool 6.0 DB10,X6.0
partCount DInt 8.0 DB10,DINT8
setpoint Real 12.0 DB10,REAL12

Diğer alanlar da aynı sözdizimini kullanır: marker'lar için M0.0 ve MW10, girişler için I0.0 ve IW64, çıkışlar için Q0.1 ve offset 20'de maksimum uzunluğu 16 olan bir dize için DB10,S20.16. Offset'leri her zaman elle sayarak değil, TIA Portal'ın derlenmiş data block'undan alın.

Adım 3: node-red-contrib-s7'yi Kurun ve Yapılandırın

Paketi kurun:

cd ~/.node-red
npm install node-red-contrib-s7
# ardından Node-RED'i yeniden başlatın

Bir s7 in node'u ekleyin ve yeni bir endpoint yapılandırması oluşturun:

  • Transport: Ethernet (ISO-on-TCP)
  • Adres: PLC'nin IP adresi, örneğin 192.168.0.10, port 102
  • Mod: Rack/Slot, rack 0, slot 1 (S7-1200/1500)
  • Döngü süresi: 1000 ms
  • Zaman aşımı: 2000 ms

Variables sekmesinde yukarıdaki tablodaki her satırı bir ad ve adresle ekleyin. Ardından s7 in node'unun kendisini yapılandırın:

  • Mod: "All variables"; bu, payload'u her değişkeni içeren bir nesne olan tek bir mesaj üretir.
  • Değişmeyen döngülerin mesaj üretmemesi için "Emit only when value changes" seçeneğini etkinleştirin.

Deploy edin ve bir debug node'u ekleyin. {"temperature":61.4,"speed":1480,"running":true,"partCount":20391,"setpoint":60} gibi payload'lar görmelisiniz. Bağlantı sağlıklı olduğunda node durumu "online" gösterir.

Adım 4: Veriyi Biçimlendirin ve MQTT'ye Yayınlayın

Ham nesne MQTT için neredeyse hazırdır, ancak bir zaman damgası eklemek, ondalık sayıları yuvarlamak ve makinenin tesisteki yerini yansıtan bir topic oluşturmak faydalıdır. Bunu bir function node'u yapar:

// Function node "s7 to mqtt"
const v = msg.payload;
if (typeof v !== "object" || v === null) {
    return null;
}

const round = (x, d) => Math.round(x * Math.pow(10, d)) / Math.pow(10, d);

msg.topic = "connectmq/demo/a7f3k2/plant1/line3/press2/telemetry";
msg.payload = {
    temperature: round(Number(v.temperature), 1),
    speed: Number(v.speed),
    running: v.running === true,
    partCount: Number(v.partCount),
    setpoint: round(Number(v.setpoint), 1),
    ts: Date.now()
};
return msg;

Bunu topic alanı boş bir mqtt out node'una bağlayın. Test için benzersiz bir client ID ile port 1883 üzerinden broker.connectmq.com kullanın; bu, herkese açık MQTT test broker'ıdır. a7f3k2 yerine kendi rastgele dizenizi kullanın ve herkes abone olabildiği için oraya asla gerçek üretim verisi göndermeyin.

Bir terminalden doğrulayın:

mosquitto_sub -h broker.connectmq.com -p 1883 -i sub-s7-a7f3k2 -v \
  -t 'connectmq/demo/a7f3k2/plant1/#'

Unified Namespace tasarımlarına uygun olan değişken başına bir topic tercih ediyorsanız bunun yerine "All variables, one per message" modunu seçin. Her mesaj bu durumda değişken adını msg.topic içinde taşır ve function node'u bunu makine yoluna ekleyebilir.

Gateway'in kendi sağlık durumunu da yayınlayın. Kapsamı s7 in node'u olan bir status node'u ekleyin ve metnini retain etkin olarak .../press2/gateway/status topic'ine yayınlayın. Subscriber'lar böylece "makine durdu" ile "gateway PLC bağlantısını kaybetti" arasındaki farkı anlayabilir.

Adım 5: Korumalarla MQTT'den Setpoint Yazma

s7 out node'u, endpoint yapılandırmasında tanımlanmış tek bir değişkeni yazar. Güvenli bir komut yolu şöyle görünür:

  1. Bir mqtt in node'u tek bir özel topic'e abone olur: connectmq/demo/a7f3k2/plant1/line3/press2/setpoint/set. Gerçek bir sistemde bu, özel ve kimlik doğrulamalı bir broker olmalıdır.
  2. Bir function node'u değeri doğrular.
  3. setpoint değişkeni için yapılandırılmış bir s7 out node'u değeri yazar.
  4. Bir sonraki okuma döngüsü yeni setpoint'i telemetride yayınlar; bu da onay işlevi görür.
// Function node "validate setpoint" -> s7 out (variable: setpoint)
const MIN = 40.0;
const MAX = 80.0;
const value = Number(msg.payload);

if (!Number.isFinite(value) || value < MIN || value > MAX) {
    node.warn(`Rejected setpoint ${msg.payload}; allowed ${MIN}-${MAX}`);
    return null;
}

msg.payload = Math.round(value * 10) / 10;
node.status({ fill: "blue", shape: "dot", text: "wrote " + msg.payload });
return msg;

Güvenliğin sorumluluğunu PLC'de bırakın. PLC programı yine de setpoint'i sınırlamalı ve uzaktan değişikliğe izin verilmeyen modlarda onu yok saymalıdır. PLC'de bu tür kontroller olmadan doğrudan kontrol mantığına yazan bir gateway, gerçekleşmeyi bekleyen bir kazadır.

Node-RED S7 Bağlantılarında Sorun Giderme

Belirti Olası neden Çözüm
Bağlantı zaman aşımı Yanlış IP, güvenlik duvarı, port 102 engelli Gateway'den PLC'ye ping atın ve port 102'yi test edin
Bağlı, ancak okumalar başarısız PUT/GET'e izin verilmemiş CPU özelliklerinde etkinleştirin ve yükleyin
"Address out of range" veya yanlış değerler Optimized block access hâlâ açık Özelliği kaldırın, yeniden derleyin, yeni offset'leri kullanın
Değerler karışık görünüyor DB düzenlendikten sonra offset'ler değişti Offset'leri TIA Portal'dan yeniden okuyun ve değişkenleri güncelleyin
S7-1200'de çalışıyor, S7-300'de çalışmıyor Yanlış slot S7-300/400 için rack 0, slot 2 kullanın
PLC CPU yükü artıyor Döngü süresi çok kısa, çok sayıda dağınık okuma Değerleri tek bir DB'de gruplayın, döngü süresini artırın

Gateway makinesinden hızlı bir port kontrolü çok fazla tahmin yürütmekten kurtarır:

# Linux: port 102'ye ulaşılabiliyorsa başarılı olur
nc -zv 192.168.0.10 102

Üretim Kontrol Listesi

  1. Gateway arayüzü olarak özel, optimize edilmemiş bir data block kullanın.
  2. Port 102'ye ağ erişimini yalnızca gateway ile sınırlayın.
  3. Her döngüde değil, değişiklikte ve periyodik bir heartbeat ile yayınlayın.
  4. Gateway sağlığını retained bir durum topic'i olarak yayınlayın.
  5. Her yazma işlemini Node-RED'de ve ayrıca PLC'de doğrulayın.
  6. TLS ve gateway başına kimlik bilgileriyle özel bir MQTT broker kullanın.
  7. Adres değişikliklerinin gözden geçirilmesi için akışlarınızı sürüm kontrolünde tutun.

Veri Bundan Sonra Nereye Gider

S7 değerleri MQTT'de olduğunda diğer her şey bir subscriber olur: panolar, OEE hesaplamaları, historian'lar ve bulut analitiği. Aynı yaklaşım diğer kontrolörler için de çalışır; Node-RED Modbus rehberi ve Node-RED OPC UA rehberi bunu Modbus cihazları ve OPC UA sunucuları için gösterir. Kontrolör verilerini atölyeden çıkarmaya daha geniş bir bakış için PLC'den buluta rehberini okuyun.

Gateway broker'a yalnızca giden yönde bağlanır; bu da OT ağını gelen trafiğe kapalı tutar. ConnectMQ gibi tam yönetilen bir MQTT hizmeti, bu gateway'e port 8883 üzerinde bir TLS endpoint'i, portalda üretilen kimlik bilgileri ve tekrarlanan başarısız girişlerden sonra IP engelleme sağlar. ConnectMQ ayrıca plant1/line3/press2/telemetry gibi ISA-95 tarzı topic'leri tanır ve cihazları bu seviyelere göre listeler; böylece hangi makinelerin veri gönderdiğini bir bakışta görebilirsiniz. Mimari konusunda hâlâ karar veriyorsanız bir MQTT broker'ın ne yaptığıyla başlayın ve MQTT node temelleri için Node-RED MQTT rehberine bakın.

S7 Gateway'inizi ConnectMQ'ya Bağlayın

app.connectmq.com adresinde kredi kartı gerektirmeyen ücretsiz Serverless planıyla kaydolun. Bir broker oluşturun, üretilen kullanıcı adı, parola ve client ID'yi Node-RED MQTT yapılandırma node'una yapıştırın, port 8883'te TLS'i etkinleştirin ve demo önekini kaldırın. PLC değerleriniz böylece özel olarak yayınlanır ve canlı topic gezgininde gelişlerini izleyebilirsiniz.

Sık Sorulan Sorular

Hangi Siemens PLC'ler node-red-contrib-s7 ile çalışır?

Ethernet üzerinden S7-1200 ve S7-1500'ün yanı sıra eski S7-300 ve S7-400 CPU'ları da destekler. Yeni aileler için PUT/GET erişiminin etkinleştirilmesi ve optimize edilmemiş data block'lar gerekir.

Node-RED neden S7-1500 data block'umu okuyamıyor?

Data block büyük olasılıkla sabit offset'leri olmayan optimized block access kullanıyor. Bunu blok özelliklerinde devre dışı bırakın, yeniden derleyin, yükleyin ve Node-RED'de yeni offset'leri kullanın.

Bir S7 PLC için hangi rack ve slot değerlerini kullanmalıyım?

S7-1200 ve S7-1500 CPU'lar için rack 0 ve slot 1, çoğu S7-300 ve S7-400 CPU için rack 0 ve slot 2 kullanın.

MQTT'den PLC değerleri yazmak güvenli mi?

Yalnızca korumalarla: kimlik doğrulamalı bir broker'da özel bir komut topic'i, Node-RED'de doğrulama ve PLC programının kendisinde aralık kontrolleri.

İlgili yazılar

ISA-95 Topic'leriyle Node-RED OPC UA İstemcisinden MQTT'ye

Bir PLC veya simülasyon sunucusundaki OPC UA değişkenlerine node-red-contrib-opcua ile abone olun, node ID'lerini ISA-95 tarzı MQTT topic'lerine eşleyin ve değerleri kalite bilgisi ve zaman damgalarıyla yayınlayın.

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