Installation des MQTT-Clients

Der benötigte Baustein "LMQTT_Client" und die entsprechenden Datentypen sind nicht Bestandteil der Basisinstallation des TIA-Portals. Hierfür muss die Bibliothek "LMQTT" installiert werden. 

Ein Link zum Herunterladen befindet sich hier: https://support.industry.siemens.com/cs/ww/de/view/109780503 (Der Download ist registrierungspflichtig, daher wird die gezippte Datei den Schülern und Studierenden der Werner-von-Siemens-Schule in Frankfurt am Main von mir zur Verfügung gestellt.)

Nach dem Auspacken in einem beliebigen Verzeichnis, wird die globale Bibliothek "LMQTT" geöffnet:

Öffnen der globalen Bibliothek
Öffnen der globalen Bibliothek

Im entpackten Verzeichnis wird zur "application library" navigiert und geöffnet:

Öffnen der "application library"
Öffnen der "application library"

Der Funktionsbaustein wird per Drag & Drop in den Ordner "Programmbausteine" der entsprechenden CPU eingefügt:

Einfügen des Funktionsbausteins LMQTT-Client in den Ordner "Programmbausteine".
Einfügen des Funktionsbausteins LMQTT-Client in den Ordner "Programmbausteine"

Die vom FB "LMQTT_Client" verwendeten Datentypen werden automatisch in den Ordner "PLC-Datentypen" eingefügt:

Automatisch eingefügte Datentypen des MQTT-Clients
Automatisch eingefügte Datentypen des MQTT-Clients


MQTT-Client konfigurieren

Zum Parametrisieren des MQTT-Clients wird ein globaler Datenbaustein benötigt:

Globalen Datenbaustein erstellen
Globalen Datenbaustein erstellen

Dem Datenbaustein werden nun Variablen hinzugefügt:

Dem Datenbaustein werden Variablen hinzugefügt.
Dem Datenbaustein werden Variablen hinzugefügt.


Folgende Tabelle enthält die Variablen des DB "MqttDb", um im nächsten Schritt die Ein- und
Ausgänge des FB "MQTT_Client" zu verschalten:

Static
     control Struct
         enable Bool true
         publish Bool false
         subscribe Bool true
         unsubscribe Bool false
    output Struct
        valid Bool false
        done Bool false
        busy Bool false
        error Bool false
        status Word 16#0
        diagnostics "typeDiagnostics"
    connParameter "LMQTT_typeConnParam"
        hwId HW_ANY 0
        connId CONN_OUC 16#0001
        broker String '172.17.10.253'
        port UInt 1884
        tls Struct
            enableTls Bool false
            validateServerIdentity Bool false
            brokerCert UDInt 0
            clientCert UDInt 0
        keepAlive UInt 0
    clientIdentifier WString[20] WSTRING#'plc_19'
    username WString[20] WSTRING#'mqttUser'
    password WString[20] WSTRING#'Password'
    willTopic WString[20] WSTRING#''
    willMsgPayload Array[0..99] of Byte
    willMsgLen UInt 0
    qos USInt 0
    mqttTopic WString[100] WSTRING#'temp/temp0'
    publishMsgPayload Array[0..999] of Byte
    publishMsgLen UDInt 0
    retain Bool false
    receivedTopic WString[200] WSTRING#''
    receivedMsgPayload Array[0..999] of Byte
    receivedMsgDataLen UDInt 0
    receivedMsgStatus USInt 0


Der Funktionsbaustein des MQTT-Clients wird im Anwenderprogramm aufgerufen, indem der Organisationsbaustein "Main" angewählt wird und von dort aus der FB "LMQTT_Client" per Drag & Drop in ein Netzwerk gezogen wird:

Funktionsbaustein "LMQTT_Client" im Hauptprogramm aufrufen
Funktionsbaustein "LMQTT_Client" im Hauptprogramm aufrufen

Daraufhin öffnet sich der Dialog "Aufrufoptionen" zur Generierung des Instanz-DB des FB "LMQTT_Client":

Der Dialog "Aufrufoptionen" zur Generierung des Instanz-DB
des FB "LMQTT_Client" öffnet sich automatisch
Der Dialog "Aufrufoptionen" ("Call options") zur Generierung des Instanz-DB des FB "LMQTT_Client"

Die Ein- und Ausgänge dieses Funktionsbausteins werden nun mit den Variablen, des globalen Datenbausteins "MqttDB" belegt:

Verschaltung der Variablen des DB "MqttDb" am
FB "MQTT_Client"
Verschaltung der Variablen des DB "MqttDb" am
FB "MQTT_Client"

Überprüfen des Verbindungsaufbaus und des Datenempfangs

Nach dem Laden des Anwenderprogramms und starten der CPU, kann mit den Beobachtungswerten überprüft werden, ob Daten empfangen werden können. Hier wird ein Fehler angezeigt:

Fehlersuche mit Hilfe der Beobachtungswerte
Fehlersuche mit Hilfe der Beobachtungswerte

Der subfunctionStatus 80C5 wird im Dokument https://support.industry.siemens.com/cs/mdm/109815056?c=146683338379&lc=en-WW erläutert: The connection partner refuses to establish the connection, has terminated the connection or actively ended it.

Der Grund hierfür liegt in der Konfiguration des Ports. Wie aus der Aufgabenstellung ersichtlich, muss es Port 1884 heißen.


Wenn alle Fehler beseitigt sind, können die Beobachtungswerte z.B. wie folgt interpretiert werden:

Interpretieren der empfangenen Daten
Interpretieren der empfangenen Daten

Die hexadezimalen ASCII-Werte 32 33 2E 33 38 entsprechen der Zeichenkette 23.38 (der gemessenen Temperatur in °Celsius).


Konvertierung der Zeichenfolge in ein Zahlenformat und Vergleich mit einer Stellgröße

Um die Temperaturdaten mit einer Stellgröße vergleichen zu können, sollte die ASCII-Zeichenfolge in ein Zahlenformat umgewandelt werden. 

  1. Umwandlung der Folge einzelner ASCII-Zeichen in einen String
  2. Umwandlung des Strings in ein Zahl im REAL-Format
  3. Vergleich der Zahl mit einem konstanten Wert

Hierfür wird zunächst ein Datenbaustein benötigt:

Datenbaustein um String in das Realformat umzuwandeln
Datenbaustein um String in das Realformat umzuwandeln

Danach werden die benötigten Anweisungen per Drag & Drop in ein freies Netzwerk der Motorsteuerung gezogen und entsprechend konfiguriert: 

Konvertierung und Vergleich der Daten
Konvertierung und Vergleich der Daten

Chars_TO_Strg

STRG_VAL

CMP 

(Bemerkenswert ist, dass Siemens den Pointer auf den zu konvertierenden String auf 1 und nicht - wie üblich - auf 0 gesetzt haben will, um das erste Zeichen zu adressieren.)

Der Motorschütz wird angesteuert, wenn 25°C überschritten werden. Ein Lüfter startet. 

Die Schaltung kann leicht erweitert werden, wenn die Temperatur absinkt und einen bestimmten Wert unterschreitet (Zweipunkt-Regelung).


Absicherung der MQTT-Verbindung per TLS

Im Folgenden wird die MQTT-Verbindung per TLS abgesichert. Dabei authentifiziert die SPS, also der MQTT-Client den MQTT-Broker.

Der MQTT-Broker verwendet hier ein selbst-signiertes Zertifikat, das beim Verbindungsaufbau vom Broker zur SPS als MQTT-Client gesendet wird und mit dem dort hinterlegten Zertifikat verglichen wird und übereinstimmen muss.

Import des Zertifikats in den globalen Zertifikatsmanager

Daher muss das Zertifikat des MQTT-Brokers importiert werden und auf der SPS konfiguriert werden (hierfür muss das TIA-Portal-Projekt - wie unter OPC UA bereits beschrieben - mit Benutzername und Kennwort geschützt worden sein):

Import des Zertifikats in den globalen Zertifikatsmanager
Import des Zertifikats in den globalen Zertifikatsmanager

Der Gültigkeitszeitraum des Zertifikats kann mit Rechter-Maus-Klick => anzeigen überprüft werden. Die Uhrzeit der SPS muss natürlich innerhalb dieses Zeitraums liegen:

Überprüfung des Gültigkeitszeitraums
Überprüfung des Gültigkeitszeitraums

Uhrzeit aktualisieren

Uhrzeit aktualisieren
Uhrzeit aktualisieren


Konfigurieren des lokalen Zertifikatmanagers

Das Zertifikat muss in die CPU geladen werden. Dafür muss es auch dem lokalen Zertifikatsmanager als Partnergerätezertifikat zugeordnet werden:

Konfigurieren des lokalen Zertifikatmanagers
Konfigurieren des lokalen Zertifikatmanagers

Auswahl des MQTT-Broker-Zertifikats
Auswahl des MQTT-Broker-Zertifikats




Last modified: Wednesday, 7 May 2025, 10:37 AM