Uygulamalı Eğitimler

LabVIEW'da MQTT: Test Tezgâhları için Kütüphaneler ve Desenler

LabVIEW'da MQTT: yerel G kütüphanelerini, paho-mqtt ile Python Node'u ve bridge'leri karşılaştırın, sonuçları güvenilir yayınlayan bir test tezgâhı kurun.

Güncellendi · 8 dk okuma

LabVIEW'da MQTT: Test Tezgâhları için Kütüphaneler ve Desenler

LabVIEW'un temel paletinde MQTT fonksiyonları yoktur ama eklemek kolaydır: bir G kütüphanesi kurun, Python Node üzerinden paho-mqtt çağırın ya da VI'ınızın yanında küçük bir bridge çalıştırın. Zor olan kısım mimaridir. Ölçüm döngüsünün içinden yayın yapan bir test tezgâhı, ağ bir an aksadığında er geç bir testi kilitler. Bu rehber seçenekleri karşılaştırıyor ve ölçümleri deterministik, sonuçları güvenilir tutan bir desen gösteriyor.

Seçeneklerinize genel bakış

YaklaşımUygun olduğu durumBilinmesi gerekenler
Yerel G kütüphanesi (VIPM / NI Tools Network)Çoğu proje; LabVIEW'un çalıştığı her yerde çalışır, bazı paketlerde gerçek zamanlı hedefler dahilPakette MQTT sürümünü, TLS desteğini ve desteklenen LabVIEW sürümlerini kontrol edin
Python Node + paho-mqttZaten Python kullanan ekipler; MQTT 3.1.1/5'in tüm özellikleriLabVIEW 2018 veya üstü ve aynı mimaride (bit) bir Python kurulumu gerekir
.NET kütüphanesi (ör. MQTTnet) ve .NET düğümleriMevcut .NET kodu olan Windows tezgâhlarıAsenkron API'leri ve olayları G'de bağlamak zahmetlidir
Bridge süreci (Python, Node-RED) + TCP/UDP veya dosyalarSürümü sabitlenmiş LabVIEW kurulumları, eski kodDağıtılması ve izlenmesi gereken bir süreç daha

En yaygın kullanılan açık kaynak seçenek, LabVIEW Open Source Project'in VIPM üzerinden sunulan ve GitHub'da geliştirilen MQTT Client kütüphanesidir. NI Tools Network'te ticari araç setleri de vardır. Hepsi aynı modeli izler: istemci oluştur, bağlan, abone ol, mesajları bir olay veya kuyruk üzerinden al, yayınla, bağlantıyı kes. Özellikler sürümden sürüme değişir; karar vermeden önce paket açıklamasında protokol sürümünü ve TLS seçeneklerini okuyun.

Önce topic'leri tasarlayın

Herhangi bir kablo çekmeden önce topic düzeninde anlaşın. Bir test laboratuvarı için istasyon başına bir alt ağaç iyi çalışır:

TopicYönQoSRetainedİçerik
testmqtt/labview/<station>/statustezgâh → herkes1evetonline / offline
testmqtt/labview/<station>/cmd/<action>MES/operatör → tezgâh1hayırBaşlat, iptal, reçete seçimi
testmqtt/labview/<station>/resulttezgâh → MES1hayırTest edilen her ünite için bir JSON belgesi
testmqtt/labview/<station>/telemetrytezgâh → dashboard'lar0hayırSaniyede birkaç canlı değer

Retained durum topic'i, offline yayınlayan bir Last Will ile birleştiğinde, bir çökme veya çekilen bir ağ kablosundan sonra bile her dashboard'a her istasyonun gerçek durumunu verir. İkisinin nasıl davrandığı için MQTT Last Will ve retained mesajlar yazılarına bakın. Daha büyük laboratuvarlarda topic tasarımı en iyi uygulamaları içindeki genel kurallar geçerlidir.

Payload'lar için bir cluster (seri numarası, test adımı sonuçları, limitler, pass/fail, zaman damgaları) oluşturup Flatten To JSON ile dönüştürün. Alıcı tarafta aynı cluster tipiyle Unflatten From JSON, komutları yeniden tipli veriye çevirir.

Testleri kilitlemeyen mimari

Zamanlanmış bir ölçüm döngüsünün içinde asla Publish çağırmayın. İstemci yeniden bağlanırken bir publish saniyelerce bloklayabilir ve testinizin zamanlaması sessizce kayar.

Bunun yerine producer/consumer veya Queued Message Handler düzeni kullanın:

  1. Ölçüm döngüsü: test sekansını çalıştırır, sonuçları ve telemetriyi bir LabVIEW kuyruğuna ekler. Ağa asla dokunmaz.
  2. MQTT döngüsü: istemci referansının sahibidir. Kuyruktan öğeleri alıp yayınlar, komutları (kütüphanenin user event'i veya timeout'lu bir dequeue ile) alır ve ikinci bir kuyrukla ölçüm döngüsüne iletir.
  3. Bağlantı yönetimi: MQTT döngüsü back-off ile yeniden bağlanır ve her yeniden bağlantıdan sonra tekrar abone olur. Bağlantı yokken oluşan sonuçlar kuyrukta (veya yerel bir dosyada) bekler ve bağlantı geri geldiğinde yayınlanır.

Bu ayrım tezgâhı test edilebilir de kılar: MQTT döngüsünü dosyaya yazan bir stub ile değiştirip ölçüm döngüsünü çalıştırabilirsiniz.

Seçenek A: yerel bir G kütüphanesi

VIPM'den kurulmuş bir G kütüphanesiyle MQTT döngüsünün blok diyagramı genelde şöyle görünür:

  1. Create/Open client: broker host'u broker.connectmq.com, port 1883 (TLS ile 8883), labview-bench01-<random> gibi benzersiz bir client ID, 30 sn keep-alive.
  2. Set Will: topic testmqtt/labview/bench01/status, payload offline, QoS 1, retain true.
  3. Connect: kullanıcı adı ve parolayı VI'a gömmeden bir yapılandırma dosyasından okuyun.
  4. Durum topic'ine retained online Publish edin, ardından QoS 1 ile testmqtt/labview/bench01/cmd/# topic'ine Subscribe olun.
  5. Event structure / while döngüsü: "mesaj alındı" olaylarını işleyin ve giden öğeleri kuyruktan alın.
  6. Kapanışta: retained offline yayınlayın, ardından temiz bir Disconnect yapın (temiz bağlantı kesme Will'i tetiklemez).

Kütüphane TLS destekliyorsa genellikle LabVIEW'un yerleşik TLS fonksiyonlarını kullanır ve broker'ın CA sertifikasına ihtiyaç duyar. Sertifika sorunları LabVIEW hatası gibi görünmesin diye TLS'i önce bir PC'den test edin.

Seçenek B: Python Node üzerinden paho-mqtt

Python Node (LabVIEW 2018+) bir Python modülündeki fonksiyonları çağırır. Bir Python oturumu çağrılar arasında modül durumunu koruduğu için bir paho istemcisini modülde tutup LabVIEW'dan küçük bir API gibi çağırabilirsiniz. Kütüphaneyi LabVIEW'un kullandığı Python'a pip install paho-mqtt ile kurun.

mqtt_bridge.py
import queue
import uuid
import paho.mqtt.client as mqtt

_client = None
_inbox = queue.Queue()
_station = ""

def _on_connect(client, userdata, flags, reason_code, properties):
    if reason_code.is_failure:
        return
    client.publish(f"testmqtt/labview/{_station}/status", "online", qos=1, retain=True)
    client.subscribe(f"testmqtt/labview/{_station}/cmd/#", qos=1)

def _on_message(client, userdata, msg):
    _inbox.put((msg.topic, msg.payload.decode("utf-8", "replace")))

def connect(host, port, username, password, station):
    global _client, _station
    _station = station
    _client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
                          client_id=f"labview-{station}-{uuid.uuid4().hex[:6]}")
    if username:
        _client.username_pw_set(username, password)
    _client.will_set(f"testmqtt/labview/{station}/status", "offline", qos=1, retain=True)
    _client.on_connect = _on_connect
    _client.on_message = _on_message
    _client.reconnect_delay_set(min_delay=1, max_delay=30)
    _client.connect(host, int(port), keepalive=30)
    _client.loop_start()           # ağ thread'i: otomatik yeniden bağlanır
    return True

def publish(topic, payload, qos, retain):
    info = _client.publish(topic, payload, qos=int(qos), retain=bool(retain))
    return info.rc == mqtt.MQTT_ERR_SUCCESS

def poll(max_items):
    items = []
    while len(items) < int(max_items) and not _inbox.empty():
        items.append(_inbox.get_nowait())
    return items                   # (topic, payload) tuple listesi

def disconnect():
    _client.publish(f"testmqtt/labview/{_station}/status", "offline", qos=1, retain=True).wait_for_publish(5)
    _client.disconnect()
    _client.loop_stop()
    return True

LabVIEW tarafında:

  • Başlangıçta bir kez Open Python Session çağırın (sürüm 3.x, LabVIEW ile aynı mimari) ve oturum referansını MQTT döngüsünün shift register'ında tutun.
  • Broker bilgileriyle connect çağırın, ardından yaklaşık her 100 ms'de poll çağırın. Dönüş tipi olarak iki string'den oluşan cluster dizisi bağlayın: her tuple bir cluster'a (topic, payload) dönüşür.
  • Flatten To JSON'dan gelen JSON string'iyle publish çağırın.
  • Kapanışta disconnect, ardından Close Python Session çağırın.

paho, otomatik yeniden bağlanan kendi ağ thread'ini çalıştırır; bu yüzden LabVIEW tarafı sade kalır ve ağ yüzünden uzun süre bloklanmaz. İstemciye protocol=mqtt.MQTTv5 verirseniz aynı modül MQTT 5 ile de çalışır. Kütüphanenin kendisi hakkında daha fazlası için Python ile MQTT yazısına bakın.

Tezgâhı donanım olmadan test edin

Gerçek cihazları bağlamadan önce MQTT tarafını uçtan uca kontrol edin. Bir terminalde (veya online istemcide) istasyonun yayınladığı her şeyi izleyin:

İstasyonu izle
mosquitto_sub -h broker.connectmq.com -p 1883 -t 'testmqtt/labview/#' -v

Başka bir terminalde MES'in yapacağı gibi bir komut gönderin:

Başlat komutu gönder
mosquitto_pub -h broker.connectmq.com -p 1883 -q 1 \
  -t 'testmqtt/labview/bench01/cmd/start' -m '{"serial":"SN-0001","recipe":"A"}'

status = online ve ardından SN-0001 için bir result mesajı görmelisiniz. Şimdi LabVIEW sürecini öldürün (temiz durdurma değil): keep-alive aralığının yaklaşık 1,5 katı içinde broker Will'i yayınlar ve durum offline olur. Bu tek kontrol; Will'in, retained durumun ve yeniden bağlanma mantığının çalıştığını kanıtlar.

Test istasyonlarınızı tarayıcıda izleyin

Otomatik regresyon testleri için aynı adımları betiğe dökün: bir komut yayınlayın, sonucu timeout ile bekleyin ve alanlarını doğrulayın. Bu yaklaşım eksiksiz hardware-in-the-loop testlerine kadar ölçeklenir.

Sık yapılan hatalar

  • Bir projeyi kopyaladıktan sonra iki tezgâhta aynı client ID: istasyonlar birbirini döngü halinde düşürür. ID'yi istasyon adı artı rastgele bir sonekten üretin.
  • Yayını zaman kaynağı olarak kullanmak: sonuçlar yalnızca ağ ayaktayken gidiyorsa test kaydı ile MQTT verisi uyuşmaz. Sonuçlara yayınlandıkları anda değil, ölçüldükleri anda zaman damgası verin.
  • Devasa payload'lar: milyonlarca örnekli dalga formları dosyalara veya veritabanına aittir; bir özet ve bir bağlantı yayınlayın. Canlıya çıkmadan önce mesaj boyutlarını broker limitleriyle karşılaştırın.
  • Retained sonuçlar: ünite başına sonuçları retained göndermeyin, yoksa her yeni abone son ünitenin eskimiş sonucunu alır. Yalnızca durumu retain edin.

Ağ kendi döngüsünde yaşadığında LabVIEW ile MQTT iyi anlaşır: bakımını yapabileceğiniz bir kütüphane seçin, topic'lerde ve QoS'ta baştan anlaşın, Last Will'li retained bir durum kullanın ve ilk gerçek ünite tezgâha gelmeden önce tüm yolu bir komut satırı istemcisiyle test edin. Analizi sonrasında MATLAB yapıyorsa MATLAB'da MQTT yazısına bakın.

Sıkça sorulan sorular

LabVIEW MQTT'yi yerel olarak destekliyor mu?

Temel üründe hayır. MQTT'yi VIPM'den veya NI Tools Network'ten bir kütüphaneyle, Python Node üzerinden paho-mqtt çağırarak, Windows'ta bir .NET kütüphanesiyle ya da LabVIEW'un yanında küçük bir bridge süreci çalıştırarak eklersiniz.

Bir LabVIEW test tezgâhı hangi QoS'u kullanmalı?

Test sonuçları ve komutlar kaybolmamalı, bu yüzden onlar için QoS 1 kullanın ve alıcıyı ara sıra gelen tekrarlara dayanıklı tasarlayın. Her örneğin bir öncekinin yerini aldığı yüksek frekanslı canlı telemetri için QoS 0 kullanın.

Bir test istasyonunun çevrimdışı olduğunu nasıl görürüm?

Retained bir durum topic'ine payload'ı offline olan bir Last Will tanımlayın, bağlandıktan sonra online'ı retained mesaj olarak yayınlayın ve temiz bir kapanıştan önce offline'ı kendiniz yayınlayın. Durum topic'ine abone dashboard'lar her zaman güncel durumu görür.