Bir Node-RED OPC UA akışı, modern PLC'lerden, CNC kontrolörlerinden ve SCADA sunucularından değerleri alıp MQTT'ye yayınlamanızı sağlar; böylece her biri ayrı bir OPC UA oturumu açmadan birçok tüketici bu verileri kullanabilir. Bu rehberde node-red-contrib-opcua ile OPC UA değişkenlerine abone olacak, node ID'lerini ISA-95 tarzı MQTT topic'lerine eşleyecek ve her değişikliği kalite bilgisi ve kaynak zaman damgasıyla yayınlayacaksınız. Ücretsiz bir simülasyon sunucusu ve ücretsiz bir MQTT broker ile adım adım takip edebilirsiniz.
OPC UA ve MQTT Neden Birlikte Kullanılır
OPC UA tesis içinde mükemmeldir: zengin bir bilgi modeli, gezilebilir adres alanları, veri tipleri, güvenlik ve abonelikler sunar. Geniş çaplı dağıtım için ise daha az kullanışlıdır. Her istemci sunucuyla bir oturum tutar, tesis ile bulut arasındaki güvenlik duvarları doğrudan bağlantıları zahmetli hale getirir ve kontrolörler kabul ettikleri oturum sayısını sınırlayabilir.
MQTT bunu tamamlar. Tek bir gateway tek bir OPC UA oturumu tutar, değişiklikleri bir OPC UA aboneliği üzerinden alır ve bir broker'a yayınlar. Oradan panolar, historian'lar, MES ve bulut analitiği anladıkları topic'lere abone olur. OPC UA ile MQTT karşılaştırması ödünleşimleri ayrıntılı olarak ele alır. Kısacası OPC UA makineyi tanımlar, MQTT veriyi dağıtır ve Node-RED pilot projeler ile küçük ve orta ölçekli tesisler için ikisi arasında pratik bir köprüdür.
Neye İhtiyacınız Var
| Bileşen | Amaç | Örnek |
|---|---|---|
| Node-RED 4.x | Gateway | Dizüstü bilgisayar, endüstriyel PC veya Raspberry Pi |
node-red-contrib-opcua |
OPC UA istemci node'ları | Palette manager'dan kurun |
| OPC UA sunucusu | Veri kaynağı | Bir PLC veya test için ücretsiz bir simülasyon sunucusu |
| MQTT broker | Dağıtım | Test için broker.connectmq.com, üretim için özel bir broker |
OPC UA node'larını kurun:
cd ~/.node-red
npm install node-red-contrib-opcua
# ardından Node-RED'i yeniden başlatın
Paket, node-opcua yığınını içerdiği için büyüktür; bu nedenle kurulum bir Raspberry Pi'da birkaç dakika sürebilir.
Test sunucusu olarak ücretsiz Prosys OPC UA Simulation Server yaygın şekilde kullanılır. Varsayılan endpoint'i opc.tcp://<your-pc>:53530/OPCUA/SimulationServer biçimindedir ve Counter, Random ve Sinusoid gibi simüle edilmiş değişkenler sunar. Node ID'leri sürüme göre değişir, bu yüzden tam ID'leri sunucunun Objects görünümünden okuyun; birçok sürümde ns=3;i=1001 gibi görünürler.
Adım 1: Node ID'lerini Bulun
Her OPC UA değişkeninin, bir namespace indeksi ve bir tanımlayıcıdan oluşan bir node ID'si vardır; örneğin ns=3;i=1001 (sayısal) veya ns=4;s=Line2.Filler.Temperature (dize). Abone olmadan önce bu ID'lere ihtiyacınız var.
Bunları bulmanın iki yolu:
- Node-RED'de OpcUa-Browser node'unu kullanın: endpoint'e yönlendirin ve Objects klasöründen gezinin.
- UaExpert gibi bir masaüstü istemci kullanın, bir değişken seçin ve NodeId değerini kopyalayın.
Veri tipini de not edin (Double, Int32, Boolean). İstemci node'u yazma sırasında bunu kullanır ve değeri MQTT'de nasıl biçimlendireceğinizi de bu belirler.
Adım 2: OPC UA İstemcisini Yapılandırın
Bir OpcUa-Client node'u ekleyin ve bir endpoint yapılandırması oluşturun:
- Endpoint:
opc.tcp://<server-host>:53530/OPCUA/SimulationServer - Güvenlik politikası: ilk test için
None, modNone - Action:
SUBSCRIBE - Interval:
1000ms (OPC UA aboneliğinin yayın aralığı)
Ardından her değişken için, item değeri node ID ve tipi değişkenin veri tipi olan bir OpcUa-Item node'u ekleyin. 2 saniye sonra bir kez tetiklenecek şekilde ayarlanmış tek bir inject node'unu tüm item node'larına, item node'larını da istemciye bağlayın. Akış başladığında her item, istemciden o node'u izlemesini ister ve bundan sonra istemci bir değer her değiştiğinde değer msg.payload içinde, node ID de msg.topic içinde olacak şekilde bir mesaj üretir.
Deploy edin ve istemcinin arkasına bir debug node'u ekleyin. Counter'ın arttığını ve Random'ın her saniye değiştiğini görmelisiniz. İstemci durumu bir bağlantı hatası gösteriyorsa endpoint URL'sini, özellikle de hostname'i kontrol edin: birçok sunucu kendi hostname'ini bildirir ve bunun Node-RED makinesinden çözümlenebilmesi gerekir.
Adım 3: OPC UA Node ID'lerini ISA-95 MQTT Topic'lerine Eşleyin
opcua/ns=3;i=1001 gibi bir topic'e yayın yapmak teknik olarak çalışır, ancak aşağı akıştaki kimse bunun ne anlama geldiğini bilmez. Bunun yerine her node ID'sini ekipman hiyerarşinizde bir yere eşleyin: işletme veya tesis, alan, hat, hücre ve etiket. ISA-95 topic yapılarının ve Unified Namespace'in arkasındaki fikir budur. ISA-95 MQTT topic'leri rehberi seviyeleri açıklar.
Bir function node'undaki arama tablosu eşlemeyi açık ve gözden geçirilebilir tutar:
// Function node "opc ua to isa-95 topic"
// OPC UA node ID'lerini ekipman yollarına ve etiket adlarına eşle.
const PREFIX = "connectmq/demo/a7f3k2"; // herkese açık broker için demo öneki
const MAP = {
"ns=3;i=1001": { path: "plant1/packaging/line2/filler", tag: "counter", unit: "" },
"ns=3;i=1002": { path: "plant1/packaging/line2/filler", tag: "pressure", unit: "bar" },
"ns=3;i=1004": { path: "plant1/packaging/line2/capper", tag: "torque", unit: "Nm" }
};
const nodeId = String(msg.topic);
const entry = MAP[nodeId];
if (!entry) {
node.warn("Unmapped node ID: " + nodeId);
return null;
}
// Kalite: node-opcua durum kodları "Good" veya "Bad..." gibi bir ad sunar
let quality = "Good";
if (msg.statusCode && typeof msg.statusCode === "object" && msg.statusCode.name) {
quality = msg.statusCode.name;
}
const value = typeof msg.payload === "number"
? Math.round(msg.payload * 1000) / 1000
: msg.payload;
msg.topic = `${PREFIX}/${entry.path}/${entry.tag}`;
msg.payload = {
value: value,
unit: entry.unit,
quality: quality,
sourceTimestamp: msg.sourceTimestamp || new Date().toISOString(),
nodeId: nodeId
};
msg.retain = true;
return msg;
Ortaya çıkan topic, örneğin connectmq/demo/a7f3k2/plant1/packaging/line2/filler/pressure, sekiz seviyelidir. Bu, herkese açık broker'ın sekiz topic seviyesi sınırına uyar; özel bir broker'da demo önekini kaldırır ve bir işletme seviyesi ekleyebilirsiniz.
retain ile yayın yapmak, her yeni subscriber'ın her etiketin en son değerini anında almasını sağlar; bir Unified Namespace tam olarak böyle davranmalıdır: topic ağacı mevcut durumu temsil eder. Kalite ve kaynak zaman damgasını payload içinde tutun. Bir historian, değerin Node-RED'in iletme zamanını değil, kaynakta ne zaman değiştiğini bilmelidir ve "Bad" kaliteli bir değer gerçekmiş gibi trend grafiğine dökülmemelidir.
Adım 4: MQTT'ye Yayınlayın
Topic ve retain alanları boş bırakılmış bir mqtt out node'u ekleyin; böylece mesaj özellikleri kullanılır. Test için benzersiz bir client ID ile port 1883 üzerinden broker.connectmq.com adresine bağlanın; bu, ücretsiz herkese açık MQTT broker'dır, bu yüzden a7f3k2 yerine kendi rastgele dizenizi kullanın ve oraya gerçek üretim verisi yayınlamayın.
Çıktıyı bir terminalden kontrol edin:
mosquitto_sub -h broker.connectmq.com -p 1883 -i sub-opcua-a7f3k2 -v \
-t 'connectmq/demo/a7f3k2/plant1/#'
Her satır bir topic ve değer, birim, kalite ve zaman damgası içeren bir JSON payload gösterir.
OPC UA'ya Geri Yazma (Dikkatle)
Aynı istemci node'u bir WRITE eylemini destekler. Bir MQTT komut akışı özel bir komut topic'ine abone olur, değeri ve aralığı bir function node'unda doğrular, msg.topic değerini sabit bir node ID'sine ayarlar ve doğru veri tipiyle yapılandırılmış bir OpcUa-Item üzerinden gönderir. Her OT yazma yolunda olduğu gibi gelen mesajın node ID'sini seçmesine asla izin vermeyin, her yazma işlemini kaydedin ve bir onay topic'i yayınlayın. Birçok tesis, net bir ihtiyaç ortaya çıkana kadar gateway'i salt okunur tutar.
Üretim için Güvenlik
Test kurulumu hiçbir güvenlik kullanmaz. Gerçek bir kontrolör için:
- Güvenli bir politika kullanın. Endpoint yapılandırmasında
SignAndEncryptmoduylaBasic256Sha256seçin. - Sertifikalara güvenin. İlk bağlantıda sunucu genellikle Node-RED istemci sertifikasını reddeder. Sertifikayı sunucudaki güvenilir listeye taşıyın (Prosys'te Certificates sekmesinde), ardından yeniden bağlanın.
- Özel bir kullanıcı kullanın. Sunucu kullanıcı kimlik doğrulamasını destekliyorsa gateway için salt okunur bir OPC UA kullanıcısı yapılandırın.
- MQTT tarafını koruyun. Herkese açık test broker'ı yerine port 8883 üzerinden TLS ve kimlik bilgileriyle özel bir broker'a bağlanın.
Node-RED OPC UA Akışlarında Sorun Giderme
| Belirti | Olası neden | Çözüm |
|---|---|---|
BadCertificateUntrusted veya bağlantı reddedildi |
İstemci sertifikasına güvenilmiyor | Sunucuda güvenilir yapın, ardından yeniden deploy edin |
| Bağlanıyor, sonra hostname hatasıyla başarısız oluyor | Sunucu çözümlenemeyen bir hostname bildiriyor | Bir hosts kaydı ekleyin veya sunucunun bildirdiği adresi yapılandırın |
BadNodeIdUnknown |
Yanlış namespace indeksi veya tanımlayıcı | Yeniden gezinin; namespace indeksleri sunucular arasında farklı olabilir |
| Deploy sonrası mesaj yok | Item'lar istemciye hiç gönderilmedi | Inject'in başlangıçta bir kez tetiklendiğinden emin olun |
| Değerler yalnızca birkaç saniyede bir geliyor | Büyük yayın aralığı veya örnekleme aralığı | Sunucunun izin verdiği sınırlar içinde aralığı düşürün |
| Gateway belleği zamanla büyüyor | Yüzlerce item tek tek abone edilmiş | Item'ları gruplayın ve abonelik sayısını düşük tutun |
Deseni Ölçeklendirme
Birkaç makine için, eşleme tablosuyla tesis başına bir Node-RED örneği iyi çalışır. Tablo büyüdükçe, mühendislerin koda dokunmadan değişiklikleri gözden geçirebilmesi için tabloyu başlangıçta yüklenen bir JSON dosyasına veya flow context'e taşıyın. Birçok üretici ve protokol söz konusu olduğunda bu akışı eski cihazlar için Node-RED Modbus gateway ile birleştirin ve tüketicileriniz Sparkplug'ın birth, death ve durum yönetimini bekliyorsa Node-RED Sparkplug B seçeneğini değerlendirin. Merkezi yapılandırmayla tesis başına yüzlerce etikete ihtiyaç duyduğunuzda ticari gateway'ler değerlendirilmeye değer.
Bu gateway'lerin hepsi güvenebilecekleri bir broker'a ihtiyaç duyar. Bir bulut MQTT broker, birden fazla tesisteki gateway'lerin giden TLS bağlantıları üzerinden tek bir namespace'e yayın yapmasını sağlar. ConnectMQ, ISA-95 ve Unified Namespace topic yapılarını algılar ve portalında cihazları işletme, tesis, alan, hat ve hücreye göre gösterir; bu da eşleme tablonuzun amaçladığınız hiyerarşiyi üretip üretmediğini kontrol etmeyi kolaylaştırır. Bu mimaride bir MQTT broker'ın ne yaptığını hatırlamak veya MQTT node'larını yapılandırmak için Node-RED MQTT rehberine bakın.
OPC UA Verilerinizi ConnectMQ'ya Yayınlayı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'unuza yapıştırın, TLS ile port 8883'e geçin ve demo önekini eşleme tablosundan kaldırın. OPC UA etiketleriniz böylece ConnectMQ portalında ISA-95 seviyelerine göre düzenlenmiş olarak görünür.
Sık Sorulan Sorular
OPC UA için hangi Node-RED paketi kullanılır?
En yaygın kullanılan paket, node-opcua yığını üzerine kurulu node-red-contrib-opcua'dır. Okuma, yazma, abone olma ve test için istemci, item, browser ve sunucu node'ları sağlar.
Node-RED'de OPC UA değerlerini sorgulamalı mıyım yoksa abone mi olmalıyım?
Sunucu desteklediği sürece abone olun. Sunucu bu durumda yalnızca değişiklikleri belirlediğiniz aralıkta gönderir; bu, kontrolörü daha az yorar ve sorgulamaya göre daha hızlı güncelleme sağlar.
OPC UA node ID'leri neden ISA-95 MQTT topic'lerine eşlenmeli?
Node ID'leri yalnızca tek bir sunucunun içinde anlamlıdır. ISA-95 tarzı topic'ler verinin tesiste nereden geldiğini tanımlar; böylece her tüketici OPC UA adres alanını bilmeden veriyi bulabilir ve anlayabilir.
Node-RED güvenliği etkin OPC UA sunucularına bağlanabilir mi?
Evet. SignAndEncrypt ile Basic256Sha256 gibi bir güvenlik politikası seçin ve Node-RED istemci sertifikasını sunucuda güvenilir yapın. Kullanıcı adı ve parola ile kimlik doğrulama da desteklenir.



