Beckhoff TwinCAT MQTT desteği, bir Beckhoff endüstriyel PC'nin panoda ayrı bir gateway olmadan makine verilerini doğrudan PLC runtime'ından yayınlamasını sağlar. Bu eğitimde bir MQTT broker'a bağlanmak, yapılandırılmış bir veri tipini JSON'a serileştirmek, değişiklikte ve bir zamanlayıcıyla yayınlamak ve son olarak bağlantıyı TLS ve kimlik bilgileriyle güvenceye almak için TwinCAT 3 IoT fonksiyonlarını kullanacaksınız. Aynı model tek bir test tezgâhından bir makine filosuna kadar ölçeklenir.
TwinCAT MQTT Seçeneklerinin Karşılaştırması
Beckhoff MQTT'ye birden fazla yol sunar ve doğru olanı en baştan seçmek yeniden çalışmayı önler.
| Seçenek | Nedir | Kim yapılandırır | En uygun olduğu durum |
|---|---|---|---|
| TF6701 IoT Communication | MQTT client fonksiyon bloğu içeren PLC kütüphanesi (Tc3_IotBase) | Structured text ile PLC programcısı | Topic'ler, payload'lar ve zamanlama üzerinde tam kontrol |
| TF6720 IoT Data Agent | ADS sembollerini MQTT'ye eşleyen yapılandırma tabanlı gateway | Configurator GUI, PLC kodu gerekmez | PLC programını değiştirmeden mevcut sembolleri yayınlamak |
| Harici ADS gateway | Sembolleri ADS ile okuyup MQTT yayınlayan kendi servisiniz | Yazılım ekibi | Özel veri hatları, çok sayıda kontrolör, standart dışı formatlar |
Bu eğitim TF6701'i kullanıyor, çünkü MQTT davranışının sürümlenen PLC projesinin bir parçası olmasını isteyen makine üreticileri için en yaygın seçim budur. TF6701 ve TF6720'nin her ikisi de lisanslı TwinCAT fonksiyonlarıdır; eğitimi takip etmek için 7 günlük deneme lisansı yeterlidir.
Ön Koşullar
- TwinCAT 3.1 XAE (Visual Studio veya TwinCAT XAE Shell) ve bir hedef: bir Beckhoff IPC veya test için run modundaki mühendislik PC'niz.
- Hedefte kurulu TF6701 fonksiyonu ve etkinleştirilmiş deneme veya tam lisans.
- Hedeften broker'a, test için TCP 1883 ve TLS için 8883 üzerinden giden ağ erişimi.
- Proje referanslarına eklenmiş Tc3_IotBase ve Tc3_JsonXml PLC kütüphaneleri.
- Doğrulama için bir PC'de mosquitto client'ları.
Adım 1: Yapılandırılmış Bir Veri Tipi Tanımlayın
Dağınık değişkenler yerine bir yapı yayınlamak, ilişkili değerleri bir arada ve zaman damgalarını tutarlı tutar. Bir DUT ekleyin:
TYPE ST_PressData :
STRUCT
rForce_kN : REAL;
rTemperature_C : REAL;
nCycleCount : UDINT;
bRunning : BOOL;
sState : STRING(20);
END_STRUCT
END_TYPE
Adım 2: FB_IotMqttClient ile Bağlanın
Tc3_IotBase'deki FB_IotMqttClient, özellikler (property) aracılığıyla yapılandırılır ve Execute metodunun her döngüde çağrılmasıyla çalıştırılır. Onu 10 ms veya daha hızlı döngülü bir task'tan çağırın; client kendi iletişimini arka planda yönetir, ancak yalnızca Execute çağrıldığında ilerler.
PROGRAM MAIN
VAR
fbMqttClient : FB_IotMqttClient;
bSetParameter : BOOL := TRUE;
bConnect : BOOL := TRUE;
fbJson : FB_JsonSaxWriter;
stPress : ST_PressData;
stLastPress : ST_PressData;
sTopicData : STRING(255) := 'connectmq/demo/t3w9p1/plant1/stamping/cell4/press1/telemetry';
sPayload : STRING(1023);
fbHeartbeat : TON;
bPublish : BOOL;
END_VAR
// --- Tek seferlik client yapılandırması ---
IF bSetParameter THEN
bSetParameter := FALSE;
fbMqttClient.sHostName := 'broker.connectmq.com';
fbMqttClient.nHostPort := 1883;
fbMqttClient.sClientId := 'twincat-demo-t3w9p1'; // boş olmamalı ve benzersiz olmalı
fbMqttClient.nKeepAlive := 30;
END_IF
// --- Bağlantıyı her döngüde canlı tutun ---
fbMqttClient.Execute(bConnect);
// --- Ne zaman yayınlanacağına karar verin: değişiklikte veya 10 sn'de bir ---
fbHeartbeat(IN := NOT fbHeartbeat.Q, PT := T#10S);
bPublish := fbHeartbeat.Q
OR ABS(stPress.rForce_kN - stLastPress.rForce_kN) > 1.0
OR stPress.bRunning <> stLastPress.bRunning
OR stPress.sState <> stLastPress.sState;
// --- Serileştirin ve yayınlayın ---
IF bPublish AND fbMqttClient.bConnected THEN
fbJson.ResetDocument();
fbJson.StartObject();
fbJson.AddKey('force_kN'); fbJson.AddReal(stPress.rForce_kN);
fbJson.AddKey('temperature_C'); fbJson.AddReal(stPress.rTemperature_C);
fbJson.AddKey('cycle_count'); fbJson.AddUdint(stPress.nCycleCount);
fbJson.AddKey('running'); fbJson.AddBool(stPress.bRunning);
fbJson.AddKey('state'); fbJson.AddString(stPress.sState);
fbJson.EndObject();
fbJson.CopyDocument(sPayload, SIZEOF(sPayload));
fbMqttClient.Publish(
sTopic := sTopicData,
pPayload := ADR(sPayload),
nPayloadSize := LEN(sPayload),
eQoS := TcIotMqttQos.AtLeastOnceDelivery,
bRetain := FALSE,
bQueue := FALSE);
stLastPress := stPress;
END_IF
Yukarıdaki tercihler hakkında bazı notlar:
GetDocumentyerineCopyDocument.GetDocumentstandart 255 karakterlik bir string döndürür ve bu da daha büyük payload'ları sessizce keser. Boyutlandırılmış bir tampona kopyalamak bunu önler.- Report by exception. Kuvvet ölü bandı ve durum karşılaştırmaları gerçek değişiklikleri anında yayınlarken, 10 saniyelik heartbeat hiçbir şey değişmediğinde bile makinenin çalıştığını kanıtlar.
- Hata yönetimi. Devreye alma sırasında online görünümde
fbMqttClient.hrErrorCodevefbMqttClient.eConnectionStatedeğerlerini izleyin. Çoğu hata önce burada görünür.
Daha büyük yapılar için Tc3_JsonXml, birimler gibi öznitelikler dahil bütün bir veri tipini tek çağrıda serileştiren bir yardımcı da sunar. Yukarıdaki gibi elle yazılmış SAX çıktısı ise anahtar adları üzerinde tam kontrol sağlar; bu da veriyi başka ekipler tükettiğinde önemlidir.
Adım 3: Herkese Açık Broker'da Doğrulayın
Yapılandırmayı etkinleştirin, PLC'yi başlatın ve bir PC'den abone olun:
mosquitto_sub -h broker.connectmq.com -p 1883 -i twincat-watch-t3w9p1 \
-t 'connectmq/demo/t3w9p1/#' -v
Beklenen çıktı:
connectmq/demo/t3w9p1/plant1/stamping/cell4/press1/telemetry {"force_kN":412.5,"temperature_C":38.2,"cycle_count":10233,"running":true,"state":"AUTO"}
Online görünümde bir değeri zorlayın; değişiklik anında görünür. broker.connectmq.com adresindeki anonim test broker'ı bu tür ilk devreye almalar için mükemmeldir, ancak herkese açıktır; bu yüzden rastgele bir topic öneki kullanın ve gizli hiçbir şey göndermeyin.
Adım 4: Beckhoff TwinCAT MQTT Bağlantısını Güvenceye Alın
Üretim makineleri internete asla düz TCP üzerinden yayın yapmamalıdır. ConnectMQ portalında özel bir broker oluşturun, üretilen kullanıcı adını, parolayı ve client ID'yi not edin, ardından:
- ISRG Root X1 sertifikasını (ConnectMQ broker'ının kullandığı Let's Encrypt'in kökü) indirin ve hedefe kopyalayın; örneğin TwinCAT boot veya config dizini altındaki bir
Certificatesklasörüne. - Tek seferlik yapılandırmayı genişletin:
fbMqttClient.sHostName := 'YOUR_BROKER_HOST';
fbMqttClient.nHostPort := 8883;
fbMqttClient.sClientId := 'YOUR_CLIENT_ID';
fbMqttClient.sUserName := 'YOUR_USERNAME';
fbMqttClient.sUserPassword := 'YOUR_PASSWORD';
fbMqttClient.stTLS.sCA := 'C:\TwinCAT\3.1\Config\Certificates\isrgrootx1.pem';
- Client'ın will yapısı aracılığıyla bir Last Will yapılandırın; örneğin
plant1/stamping/cell4/press1/statusüzerinde retained birofflinemesajı. Bağlandıktan sonra da aynı topic'e retained bironlineyayınlayın. Böylece tüketiciler duran bir makineyi kopan bir bağlantıdan ayırt edebilir. - Demo önekini kaldırın ve tesisinizin ISA-95 topic hiyerarşisini kullanın.
Kimlik bilgilerini kaynak kontrolünün dışında tutun: paylaşılan bir projeye sabit olarak yazmak yerine onları hedefteki bir dosyadan veya devreye alma sırasında ayarlanan kalıcı bir değişkenden yükleyin.
Bir Makine Filosu İçin Topic Tasarımı
Makine üreticileri genellikle aynı TwinCAT projesini onlarca müşteriye gönderir; bu yüzden sabit kodlanmış topic'ler hızla bir bakım sorununa dönüşür. Birkaç alışkanlık yardımcı olur:
- Topic önekini bir parametre yapın. Kuruluş, saha, alan, hat ve makine adlarını devreye alma sırasında ayarlanan kalıcı değişkenlerde saklayın ve topic string'ini başlangıçta oluşturun.
- Veriyi, durumu ve olayları ayırın. Periyodik değerler için
.../telemetry, retained çevrimiçi ve durum bilgisi için.../status, alarmlar veya parti tamamlanmaları için.../eventskullanın. Tüketiciler yalnızca ihtiyaç duydukları şeye abone olur. - Payload'ınızı sürümleyin. Bir
"schema": 1anahtarı yalnızca birkaç bayta mal olur ve sonraki kodun alan ekleyen veya yeniden adlandıran bir firmware güncellemesini yönetmesini sağlar. - Payload'ları küçük tutun. İnsanların gerçekten kullandığı değerleri yayınlayın. Tanılama dökümleri ayrı, isteğe bağlı bir topic'e gidebilir.
Bu kurallar veriye göz atmayı da kolaylaştırır: ISA-95 tarzı yolları tanıyan bir broker, ek yapılandırma olmadan bir sahadaki her makineyi saha ve hat ağacında gösterebilir.
Devreye Alma Kontrol Listesi
| Kontrol | Neden önemli |
|---|---|
| Hedef saati NTP ile senkronize | Saat çok sapmışsa TLS sertifikaları reddeder |
| IPC'de DNS yapılandırılmış | Broker ana bilgisayar adının çözümlenmesi gerekir |
| Makine başına benzersiz client ID | Yinelenen kimlikler birbirini tekrar tekrar koparır |
| Payload tamponu en büyük JSON'a göre boyutlandırılmış | Sessiz kesilmeyi önler |
| Heartbeat ve report by exception | Düşük trafikle birlikte yaşam kanıtı |
| Last Will içeren retained durum topic'i | Güvenilir çevrimiçi ve çevrimdışı algılama |
| TF6701 lisansı etkinleştirilmiş | Deneme lisansı 7 gün sonra sona erer |
Sorun Giderme
hrErrorCodebir bağlantı reddi gösteriyor. Yanlış kimlik bilgileri veya client ID; client ID'leri kimlik bilgilerine bağlayan broker'larda her ikisi de verilenle eşleşmelidir.- Yeniden başlatmadan sonra TLS hataları. Hedefteki sertifika yolu yanlış veya CA dosyası boot projesiyle birlikte kopyalanmamış.
bConnectedolmasına rağmen hiçbir şey yayınlanmıyor.bPublishhiç true olmuyor veyaPublish, payload oluşturulmadan önce çağrılıyor.- Mesajlar toplu halde geliyor. Yavaş bir
Executeçağrı hızıyla birliktebQueue := TRUE;Execute'u hızlı bir task'tan her döngüde çağırın.
Bu Yaklaşımın Yeri
IPC'den yayın yapmak, makine verilerini dışarı almanın birkaç mimarisinden biridir; bunu PLC verisini buluta aktarma yazısındaki gateway tabanlı ve SCADA tabanlı tasarımlarla karşılaştırın. Karışık kontrolör markalarıyla çalışıyorsanız, CODESYS MQTT eğitimi çok benzer bir execute-ve-yayınla modeli kullanıyor. Çok sayıda makine tek bir hiyerarşiye yayın yaptığında ise MQTT ile endüstriyel IoT rehberi, bunu her uygulamanın MQTT broker üzerinden tüketebileceği bir unified namespace olarak nasıl modelleyeceğinizi açıklıyor.
Beckhoff Makinelerinizi ConnectMQ'ya Bağlayın
Her makinenin yanında kendi broker'ınızı çalıştırmak, her saha için sertifikalar, güncellemeler ve izleme demektir. Tam yönetilen bir MQTT servisi bu işi ortadan kaldırır. app.connectmq.com adresinde kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun ve TwinCAT verilerinizin dakikalar içinde canlı topic gezginine gelişini izleyin.
Sık Sorulan Sorular
MQTT için hangi TwinCAT lisansına ihtiyacım var?
PLC kütüphanesi yaklaşımı TF6701 TwinCAT 3 IoT Communication gerektirir. Yapılandırma tabanlı alternatif ise TF6720 IoT Data Agent'tır. Her ikisi de 7 günlük deneme lisansı sunar.
TwinCAT MQTT, TLS'i destekliyor mu?
Evet. Client'ın TLS yapısında CA sertifika yolunu ayarlayın, 8883 portuna bağlanın ve kimlik bilgilerini ekleyin. Broker'ınız gerektiriyorsa client sertifikaları da desteklenir.
TwinCAT MQTT topic'lerine abone olabilir mi?
Evet. FB_IotMqttClient, PLC'de okuduğunuz bir mesaj kuyruğuyla abonelikleri destekler. Alınan her değeri kontrol mantığına dokunmadan önce doğrulayın.
JSON payload'ım neden 255 karakterde kesiliyor?
GetDocument standart uzunlukta bir string döndürür. Yukarıda gösterildiği gibi daha büyük bir tampona CopyDocument kullanın.



