Applikationsbeispiel
Erstellung des SPS-Programms
Struktur definieren
Erzeugen Sie eine Struktur, innerhalb der Sie die zu sendenden Prozessdaten definieren. Weisen Sie dabei den deklarierten Variablen Attribute zu, um deren Darstellung in der App zu definieren (siehe Attribute).
TYPE ST_ProcessData :
STRUCT
{attribute 'iot.DisplayName' := 'Kitchen Lights'}
bLamp1 : BOOL;
{attribute 'iot.DisplayName' := 'Living Room Lights'}
bLamp2 : BOOL;
{attribute 'iot.DisplayName' := 'Outside Temperature'}
{attribute 'iot.ReadOnly' := 'true'}
{attribute 'iot.Unit' := 'Celsius'}
{attribute 'iot.MinValue' := '5'}
{attribute 'iot.MaxValue' := '30'}
nTemp : REAL;
stSecondLevel : ST_Test;
END_STRUCT
END_TYPE
Konfiguration
Deklarieren Sie im Hauptprogramm eine Instanz des Funktionsbausteins FB_IotCommunicator. Definieren Sie die Ausgänge entsprechend Ihren Verbindungsdaten (siehe FB_IotCommunicator). Deklarieren Sie außerdem die Struktur mit den zu sendenden Prozessdaten sowie eine Instanz des Timer-Funktionsbausteins TON.
fbIoT : FB_IotCommunicator := (
sHostName := 'YOUR_MQTT_BROKER', // MQTT Broker Adress
nPort := 1883, // MQTT Port
sMainTopic := 'plants', // Main Topic
sDeviceName := 'Building 12.3', // Device Name
sUser := 'engineer1', // MQTT Username
sPassword := 'abcdefg'); // MQTT Password
stData: ST_ProcessData; // Values to send
timer : TON; // Timer to send data
Verbindung aufbauen
Rufen Sie im Implementierungsteil des Hauptprogramms über die Instanz des Funktionsbausteins FB_IotCommunicator die Execute-Methode zyklisch auf, um die Verbindung zum Broker aufrechtzuerhalten und somit das Senden und Empfangen von Daten und Nachrichten zu ermöglichen (siehe Execute).
fbIoT.Execute(TRUE);
Daten senden
Senden Sie die Prozessdaten mit einer Sample-Rate von 500 ms an den Broker. Rufen Sie dazu die Instanz des Timer-Funktionsbausteins mit den entsprechenden Eingabevariablen sowie die SendData-Methode des Funktionsbausteins FB_IotCommunicator auf (siehe SendData).
timer(IN := NOT timer.Q, PT := T#500MS);
IF fbIoT.bConnected AND timer.Q THEN
fbIoT.SendData(ADR(stData), SIZEOF(stData));
END_IF
Für eine Strukturierung über mehrere Ebenen muss hier eine verschachtelte Struktur übergeben werden. Die folgende Struktur zeigt ein einfaches Beispiel, die Verschachtelung kann je nach Belieben fortgeführt werden.
TYPE ST_Test :
STRUCT
stLevel1 : ST_Level_1;
nCounter : INT;
END_STRUCT
END_TYPE
TYPE ST_Level_1 :
STRUCT
nDoubleCounter: INT;
stLevel2 : ST_Level_2;
END_STRUCT
END_TYPE
Befehle empfangen und auswerten
Rufen Sie den Funktionsbaustein FB_IotCommand und deren Methoden auf, um Befehle zu empfangen und auszuwerten (siehe FB_IotCommand).
IF fbIoT.fbCommand.bAvailable THEN
IF fbIoT.fbCommand.sVarName = 'bLamp1' THEN
fbIoT.fbCommand.GetValue(ADR(stData.bLamp1), SIZEOF(stData.bLamp1), E_IotCommunicatorDatatype.type_BOOL);
ELSIF fbIoT.fbCommand.sVarName = 'stSecondLevel.nDoubleCounter' THEN
fbIoT.fbCommand.GetValue(ADR(stData.stSecondLevel.stLevel1.nDoubleCounter), SIZEOF(stData.stSecondLevel.stLevel1.nDoubleCounter), E_IotCommunicatorDatatype.type_BOOL);
END_IF
fbIoT.fbCommand.Remove();
END_IF
(Push-) Nachrichten senden
Rufen Sie die SendMessage-Methode des Funktionsbausteins FB_IotCommunicator auf, um eine (Push-)Nachricht an den Broker zu senden (siehe SendMessage).
fbIoT.SendMessage('This is a test alarm message!');