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:
- 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.
- 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, port102 - Mod: Rack/Slot, rack
0, slot1(S7-1200/1500) - Döngü süresi:
1000ms - Zaman aşımı:
2000ms
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:
- Bir
mqtt innode'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. - Bir function node'u değeri doğrular.
setpointdeğişkeni için yapılandırılmış bir s7 out node'u değeri yazar.- 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
- Gateway arayüzü olarak özel, optimize edilmemiş bir data block kullanın.
- Port 102'ye ağ erişimini yalnızca gateway ile sınırlayın.
- Her döngüde değil, değişiklikte ve periyodik bir heartbeat ile yayınlayın.
- Gateway sağlığını retained bir durum topic'i olarak yayınlayın.
- Her yazma işlemini Node-RED'de ve ayrıca PLC'de doğrulayın.
- TLS ve gateway başına kimlik bilgileriyle özel bir MQTT broker kullanın.
- 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.



