Endüstriyel IoT

CODESYS MQTT Client: PLC Değişkenlerini Bir Broker'a Yayınlama

CODESYS IIoT MQTT Client kütüphanesini PLC değişkenlerini JSON olarak yayınlayacak şekilde yapılandırın, broker.connectmq.com üzerinde doğrulayın, ardından kimlik bilgileri ve TLS içeren özel bir broker'a geçin.

CODESYS MQTT'yi gösteren, PLC değişkenlerini bulut broker'a yayınlayan structured text programı içeren CODESYS geliştirme ortamı
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

CODESYS MQTT desteği, bir üretici PLC'sinden CODESYS runtime çalıştıran bir Raspberry Pi'ye kadar CODESYS tabanlı her kontrolörü tesis verilerinin doğrudan yayıncısı haline getirir. Bu eğitimde CODESYS IIoT MQTT Client kütüphanesini bir projeye ekleyecek, PLC değişkenlerini structured text ile JSON olarak yayınlayacak, bunları herkese açık bir broker'da doğrulayacak ve ardından bağlantıyı kimlik bilgileri ve TLS ile güvenceye alacaksınız. Yol boyunca, genellikle devreye almada bir güne mal olan tuzakları da göreceksiniz.

CODESYS MQTT Neden Yapmaya Değer?

CODESYS, birçok üretici markası altında satılan, dünyadaki PLC'lerin ve endüstriyel kontrolörlerin büyük bir kısmının arkasındaki runtime'dır. Bu da tek bir entegrasyon yaklaşımının çok sayıda donanımı kapsaması demektir. Doğrudan kontrolörden yayın yapmanın net faydaları vardır:

  • Küçük kurulumlarda bakımı yapılacak ek gateway donanımı veya yazılımı yoktur.
  • Veri kontrolörden tam olarak PLC programcısının karar verdiği formatta ve anda çıkar.
  • Report-by-exception mantığı, ölü bantların ve durumların en iyi anlaşıldığı yerde, prosesin yanında yaşar.

Ödünleşim ise artık ağ kodunun da PLC programcısına ait olmasıdır. Farklı üreticilerden çok sayıda kontrolör bağlıyorsanız, karar vermeden önce bunu PLC verisini buluta aktarma yazısındaki gateway tabanlı tasarımlarla karşılaştırın.

Ön Koşullar

Öğe Notlar
CODESYS Development System V3.5 Güncel bir service pack; IIoT Libraries SL paketini CODESYS Installer ile kurun
Bir CODESYS runtime Bir üretici PLC'si, test için CODESYS Control Win veya CODESYS Control for Raspberry Pi
Lisans IIoT Libraries SL lisanslı bir eklentidir; lisans olmadan sınırlı bir süre demo modunda çalışır
Ağ Test için giden TCP 1883, TLS için TCP 8883 ve kontrolörde yapılandırılmış DNS
Test araçları mosquitto_sub veya herhangi bir masaüstü MQTT client'ı

MQTT Client SL kütüphanesi, JSON ve web client kütüphaneleriyle birlikte IIoT Libraries SL paketinin bir parçasıdır. Fonksiyon bloğu pin adları kütüphane sürümleri arasında küçük farklılıklar gösterebilir; bu yüzden çalışırken kütüphane dokümantasyonunu Library Manager'da açık tutun.

Adım 1: MQTT Kütüphanesini Ekleyin

  1. Uygulamanızda Library Manager'ı açın ve Add Library seçeneğini seçin.
  2. MQTT Client SL kütüphanesini arayıp ekleyin. Kütüphanenin namespace'i MQTT'dir.
  3. JSON'u kütüphane yardımcılarıyla oluşturmayı planlıyorsanız JSON Utilities SL kütüphanesini de ekleyin. Bu eğitim, bağımlılıkları minimumda tutmak için JSON'u elle oluşturuyor.
  4. Kütüphanenin hatasız çözümlendiğini doğrulamak için projeyi bir kez derleyin.

Adım 2: Değişkenleri Tanımlayın

20 ila 100 ms döngülü bir task'tan çağrılan, örneğin PRG_Mqtt adında bir program oluşturun. Ağ fonksiyon bloklarının iç durum makinelerini ilerletebilmeleri için her döngüde çağrılmaları gerekir.

PROGRAM PRG_Mqtt
VAR
    // Proses değerleri (gerçek bir projede bunlar kontrol mantığınızdan gelir)
    rTemperature   : REAL := 21.5;
    rPressure      : REAL := 1.82;
    xPumpRunning   : BOOL := TRUE;

    // MQTT client ve yayıncı
    mqttClient     : MQTT.MQTTClient;
    mqttPublish    : MQTT.MQTTPublish;

    sHost          : STRING := 'broker.connectmq.com';
    uiPort         : UINT := 1883;
    sClientId      : STRING := 'codesys-demo-k8q2x7';   // boş olmamalı ve benzersiz olmalı
    wsTopic        : WSTRING(255) := "connectmq/demo/k8q2x7/plant1/utilities/pumpstation1/telemetry";

    sPayload       : STRING(512);
    tonPublish     : TON;
    xTrigger       : BOOL;
    rLastTemp      : REAL;
    xLastRunning   : BOOL;
END_VAR

Burada iki ayrıntı önemlidir. Birincisi, client ID boş olmamalı ve benzersiz olmalıdır; aynı kimliği paylaşan iki kontrolör birbirini broker'dan tekrar tekrar düşürür. İkincisi, CODESYS'te varsayılan STRING uzunluğu 80 karakterdir; bu çoğu JSON payload için çok kısadır, bu yüzden açık bir uzunluk tanımlayın.

Adım 3: Structured Text ile Bağlanın ve Yayınlayın

Program client'ı etkinleştirir, bir JSON payload oluşturur ve ya 10 saniyede bir ya da sıcaklık 0,5 dereceden fazla değiştiğinde veya pompa durumu değiştiğinde anında yayınlar.

// 1. Client'ı her döngüde çalışır tutun
mqttClient(
    xEnable      := TRUE,
    sHostname    := sHost,
    uiPort       := uiPort,
    eMQTTVersion := MQTT.MQTT_VERSION.V3_1_1,
    sClientId    := sClientId,
    uiKeepAlive  := 30
);

// 2. Ne zaman yayınlanacağına karar verin: periyodik heartbeat veya report by exception
tonPublish(IN := NOT tonPublish.Q, PT := T#10S);
IF tonPublish.Q
   OR ABS(rTemperature - rLastTemp) > 0.5
   OR xPumpRunning <> xLastRunning THEN
    xTrigger := TRUE;
END_IF

// 3. JSON payload'ı oluşturun
IF xTrigger AND NOT mqttPublish.xBusy THEN
    sPayload := CONCAT('{"temperature":', REAL_TO_STRING(rTemperature));
    sPayload := CONCAT(sPayload, ',"pressure":');
    sPayload := CONCAT(sPayload, REAL_TO_STRING(rPressure));
    sPayload := CONCAT(sPayload, ',"pump_running":');
    IF xPumpRunning THEN
        sPayload := CONCAT(sPayload, 'true}');
    ELSE
        sPayload := CONCAT(sPayload, 'false}');
    END_IF
    rLastTemp := rTemperature;
    xLastRunning := xPumpRunning;
END_IF

// 4. xExecute'un yükselen kenarında yayınlayın
mqttPublish(
    xExecute       := xTrigger AND mqttClient.xConnectedToBroker,
    mqttClient     := mqttClient,
    wsTopicName    := wsTopic,
    pbPayload      := ADR(sPayload),
    udiPayloadSize := TO_UDINT(LEN(sPayload)),
    eQoS           := MQTT.QoS.AtLeastOnce,
    xRetain        := FALSE
);

IF mqttPublish.xDone OR mqttPublish.xError THEN
    xTrigger := FALSE;   // bir sonraki tetiklemenin yeni bir yükselen kenar oluşturması için xExecute'u düşürün
END_IF

Akılda tutulması gereken model, execute/done el sıkışmasıdır. MQTTPublish, xExecute'un yükselen kenarında başlar ve birkaç döngü sonra xDone veya xError raporlar. xExecute'u hiç düşürmezseniz ikinci kez hiçbir şey yayınlanmaz. Her döngüde yükseltirseniz broker'ı boğarsınız.

Adım 4: Herkese Açık Test Broker'ında Doğrulayın

Uygulamayı yükleyin, başlatın ve bir PC'den abone olun:

mosquitto_sub -h broker.connectmq.com -p 1883 -i codesys-watch-k8q2x7 \
  -t 'connectmq/demo/k8q2x7/#' -v

Her 10 saniyede bir mesaj, ayrıca online görünümden yeni bir sıcaklık yazdığınızda veya xPumpRunning değerini değiştirdiğinizde ek mesajlar görmelisiniz:

{"temperature":21.5,"pressure":1.82,"pump_running":true}

Herkese açık MQTT test broker'ı bu ilk devreye alma aşaması için idealdir: anonimdir, kurulum gerektirmez ve hızlı geri bildirim verir. Herkes tarafından okunabildiği için rastgele bir topic öneki kullanın ve gerçek proses verisi göndermeyin. Ayrıca her client'ı saniyede 10 mesaj ve mesaj başına 64 KB ile sınırlar; bu da tetikleyicilerinizi ayarlarken faydalı bir korkuluktur.

Adım 5: TLS ile Özel Bir Broker'a Geçin

Üretim için kimlik bilgileri ve şifreleme ile kendi broker'ınıza bağlanın:

  1. ConnectMQ portalında bir broker oluşturun ve üretilen kullanıcı adını, parolayı ve client ID'yi not edin.
  2. Kontrolörde CODESYS'teki Security Screen'i açın ve broker sertifikasının kök CA'sını güvenilen sertifikalar deposuna aktarın. Let's Encrypt sertifikalı broker'lar ISRG Root X1'e zincirlenir.
  3. uiPort := 8883 olarak ayarlayın, client fonksiyon bloğunda TLS'i etkinleştirin ve TLS bağlamını kütüphane dokümantasyonunda anlatıldığı gibi referans gösterin.
  4. sClientId := 'YOUR_CLIENT_ID' olarak ayarlayın ve YOUR_USERNAME ile YOUR_PASSWORD değerlerini client'ın kimlik bilgisi girişlerine verin.
  5. Topic'i plant1/utilities/pumpstation1/telemetry gibi üretim hiyerarşinizle değiştirin.

ConnectMQ ile client ID'ler verilen kimlik bilgilerine bağlıdır; bu yüzden aynı kimliğe sahip ikinci bir kontrolöre kopyalanmış bir proje, oturumu sessizce çalmak yerine reddedilir. Her kontrolöre kendi kimlik bilgilerini verin. Broker'ın canlı topic gezgini, TLS el sıkışması başarılı olduğu anda mesajlarınızı gösterir.

Bir broker'ı kendiniz çalıştırıp yamalamak zaman harcamak istediğiniz bir yer değilse, bir yönetilen MQTT broker sertifikaları, yükseltmeleri ve izlemeyi sizin yerinize üstlenir.

CODESYS MQTT Sorun Giderme

  1. Client hiç bağlanmıyor. Kontrolördeki DNS'i ve varsayılan ağ geçidini kontrol edin. Ad çözümleme sorunlarını ayırt etmek için doğrudan bir IP adresiyle test edin.
  2. TLS el sıkışması başarısız. CA sertifikası kontrolörün güvenilen deposunda yok veya kontrolör saati yanlış olduğu için sertifika henüz geçerli değilmiş gibi görünüyor. NTP'yi yapılandırın.
  3. Yalnızca bir kez yayınlıyor. xExecute hiç sıfırlanmıyor; 3. adımdaki el sıkışmaya bakın.
  4. Payload kesiliyor. STRING çok kısa veya udiPayloadSize farklı bir değişkenden hesaplanmış.
  5. Bağlantı birkaç saniyede bir kopuyor. Başka bir cihaz aynı client ID'yi kullanıyor veya task döngüsü o kadar yavaş ki keep alive paketleri gecikiyor.
  6. Demo modu bir süre sonra duruyor. IIoT Libraries SL lisansı hedef cihazda etkinleştirilmemiş.

Üretim Kontrol Listesi

  • Kontrolör başına benzersiz client ID ve kimlik bilgileri.
  • Güvenilen bir CA ve NTP zaman senkronizasyonuyla 8883 portunda TLS.
  • String taşmasına karşı korunan payload oluşturucu.
  • Report-by-exception ile birlikte periyodik heartbeat.
  • Tüketicilerin çevrimdışı ile boşta durumunu ayırt edebilmesi için Last Will içeren bir durum topic'i.
  • Topic'ler tesisin ISA-95 adlandırma kuralını izler.

Beckhoff kontrolörleri aynı iş için farklı bir kütüphane kullanır; karşılaştırma için Beckhoff TwinCAT MQTT yazısına, TIA Portal için ise Siemens S7 MQTT eğitimine bakın. Daha geniş mimari resim için MQTT ile endüstriyel IoT rehberiyle başlayın.

CODESYS Verilerinizi ConnectMQ'ya Yayınlayın

Kontrolörünüz test broker'ından ayrılmaya hazır olduğunda ona güvenli bir bulut MQTT broker verin. app.connectmq.com adresinde kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun ve üretilen kimlik bilgilerini CODESYS projenize yapıştırın.

Sık Sorulan Sorular

CODESYS MQTT kütüphanesi ücretsiz mi?

MQTT Client SL kütüphanesi, lisanslı olan IIoT Libraries SL paketinin bir parçasıdır. Demo modunda test edilebilir; demo modu, bir lisans etkinleştirilene kadar sınırlı bir çalışma süresinden sonra durur.

CODESYS MQTT, TLS'i destekliyor mu?

Evet. Broker'ın kök CA'sını Security Screen aracılığıyla kontrolörün sertifika deposuna aktarın, client'ta TLS'i etkinleştirin ve 8883 portuna bağlanın.

CODESYS MQTT topic'lerine abone de olabilir mi?

Evet, kütüphane bir abone olma fonksiyon bloğu içerir. Alınan her değeri kontrol mantığını etkilemeden önce dikkatle doğrulayın.

CODESYS client hangi MQTT sürümünü kullanıyor?

Kütüphane MQTT 3.1.1'i destekler, güncel sürümler MQTT 5'i de ekler; kurulu sürümünüzün dokümantasyonuna bakın. Maksimum uyumluluk için 3.1.1 ile başlayın.

İlgili yazılar

Endüstri 5.0 ve Endüstri 4.0: İnsan Odaklı Üretim Açıklandı

Endüstri 5.0, Endüstri 4.0'ın yerini almaz. Aynı bağlı teknolojilerin üzerine insan odaklı, sürdürülebilir ve dayanıklı hedefler ekler. Bu karşılaştırma farkları ve canlı tesis verisinin neden ikisinin de temeli olmaya devam ettiğini açıklıyor.

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