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
- Uygulamanızda Library Manager'ı açın ve Add Library seçeneğini seçin.
- MQTT Client SL kütüphanesini arayıp ekleyin. Kütüphanenin namespace'i
MQTT'dir. - 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.
- 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:
- ConnectMQ portalında bir broker oluşturun ve üretilen kullanıcı adını, parolayı ve client ID'yi not edin.
- 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.
uiPort := 8883olarak 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.sClientId := 'YOUR_CLIENT_ID'olarak ayarlayın veYOUR_USERNAMEileYOUR_PASSWORDdeğerlerini client'ın kimlik bilgisi girişlerine verin.- Topic'i
plant1/utilities/pumpstation1/telemetrygibi ü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
- 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.
- 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.
- Yalnızca bir kez yayınlıyor.
xExecutehiç sıfırlanmıyor; 3. adımdaki el sıkışmaya bakın. - Payload kesiliyor.
STRINGçok kısa veyaudiPayloadSizefarklı bir değişkenden hesaplanmış. - 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.
- 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.



