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!');