TIA LMQTT-Client

Fabster

Level-2
Beiträge
35
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Ich nutze den LMQTT-Client von Siemens.
Ich habe das Problem, dass ich gerne zwei unterschiedliche Topics verwenden würde, für Publish und Subscribe.
Aktuell ist es so, dass ich zwei unterschiedliche Topics eintrage ("data" für das versenden und "alarm" für das empfangen). Wenn ich per MQTT an das Topic "alarm" schicke passiert nichts und wenn ich an das Topic "data" schicke, ändert der Client das subscribe Topic automatisch auf "data".

Warum passiert das?

Vielen Dank im Voraus
Fabi
 
Subscribe und Publish sind ja verschiedene Funktionen, diese können auch nur funktionieren wenn die andere nicht aktiv ist.

Mach dir doch einen CASE und starte/beende beides nacheinander sauber.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kannst du etwas mehr über deinen Aufbau verraten?
Ich nehme an, du hast die Siemens-Steuerung, einen externen Broker und irgend einen anderen MQTT-Client?
Wer schickt an das Topic "alarm"? Deine Steuerung soll ja nur auf das Topic subscriben, wenn ich dich richtig verstanden habe.
So müsste es wahrscheinlich aussehen:
Steuerung:
-publish-> "data"
-subscribe-> "alarm"

anderer Client:
-subscribe-> "data"
-publish-> "alarm"

Wenn der andere Client etwas an "alarm" published, müsste das in deiner Steuerung ankommen.
Wenn die SPS etwas an "data" published, müsste das im anderen Client ankommen.

Beide müssen natürlich mit dem Broker connected sein.
 
Hallo malloc,

Ja richtig, du hast das schon ganz korrekt aufgelistet.

Mein (Python-)Backend sendet über den Broker and das Topic "alarm".
Meine SPS sendet über den selben Broker an das Topic "data".

Aktuell funktioniert es, allerdings nur auf das gleiche Topic, was natürlich nicht so sinnvoll ist, ich möchte auf das Topic "data" verschicken und auf dem Topic "alarm" empfangen. Aktuell kann ich zwar das Subscribe Topic "alarm" einstellen, allerdings wird hier nichts empfangen und sobald auf das Topic "data" geschickt wird, ändert es sich im DB automatisch von "alarm" auf "data".

Mit einem zweiten LMQTT Client Block funktioniert es auch nicht, da sich dann zwei Instanzen auf den Broker verbinden und daraus ein Fehler entsteht.
 
Code:
## Ready signals subscribe

#tempReady := #constBOOL;
#tempMessageAvailable := #constBOOL;

IF (NOT #ioInterface.Out.Error)
    AND (#ioInterface.Out.Status = "MQTT_STATUS_CONNECTED")
    AND ((#iPublishControl.Ready OR #iPublishControl.Done))
    AND (NOT #iPublishControl.Start)
    AND (NOT #ioInterface.In.Publish)
    AND (NOT #ioInterface.In.Unsubscribe) THEN
    #tempReady := 1;
ELSE
    #tempReady := 0;
END_IF;

IF #ioInterface.Out.Done
    AND (#ioInterface.InOut.ReceivedTopic = #ioInterface.InOut.MqttTopic)
    AND (#ioInterface.Out.ReceivedMessageDataLength <> "MQTT_MESSAGE_EMPTY") THEN
    #tempMessageAvailable := 1;
ELSE
    #tempMessageAvailable := 0;
END_IF;

Code:
 ## Case subscribe
        //===============================================================================
    1: // Subscribe to topic remote
        #ioSubscribeControl.StepName := 'Subscribe to topic remote';
        IF #tempReady THEN
            #ioInterface.InOut.MqttTopic := "MQTT_TOPIC_SUBSCRIBE_TOPIC_REMOTE";
            #ioInterface.In.Subscribe := 1;
        END_IF;
        
        IF #tempMessageAvailable THEN
            #ioInterface.In.Subscribe := 0;
            #statJsonDeserializer.execute := 1;
            IF #statJsonDeserializer.done THEN
                #ioSubscribeControl.Done := 1;
                #ioSubscribeControl.Start := 0;
                IF #iPublishControl.Start THEN
                    #ioSubscribeControl.StepNumber := 0;
                END_IF;
            ELSIF #statJsonDeserializer.error THEN
                #ioSubscribeControl.StepNumber := 0;
            END_IF;
        ELSIF #ioInterface.Out.Error OR (#ioInterface.Out.ReceivedMessageStatus = "MQTT_MESSAGE_CORRUPT") THEN
            #ioInterface.In.Subscribe := 0;
            #ioSubscribeControl.Start := 0;
            #ioSubscribeControl.StepNumber := 0;
        END_IF;

Code:
## Ready signals publish

#tempReady := #constBOOL;
#tempSerialized := #constBOOL;

IF (NOT #ioInterface.Out.Error)
    AND (#ioInterface.Out.Status = "MQTT_STATUS_CONNECTED")
    AND ((#iSubscribeControl.Ready OR #iSubscribeControl.Done))
    AND (NOT #iSubscribeControl.Start)
    AND (NOT #ioInterface.In.Subscribe)
    AND (NOT #ioInterface.In.Unsubscribe) THEN
    #tempReady := 1;
ELSE
    #tempReady := 0;
END_IF;

IF #statJsonSerializer.done
    AND (NOT #ioInterface.Out.Done)
    AND (NOT #ioInterface.In.Publish) THEN
    #tempSerialized := 1;
ELSE
    #tempSerialized := 0;
END_IF;

Code:
## Case publish

    1: // Publish data axis x
        IF #tempDataAxisX <> #statDataAxisXOld THEN
            #ioInterface.InOut.MqttTopic := "MQTT_TOPIC_PUBLISH_AXIS_X";
            IF #ioPublishPrepare.Prepared.AxisX THEN
                #ioPublishControl.StepName := 'Publish message axis x';
                #statJsonSerializer.execute := 1;
                IF #tempSerialized AND #tempReady THEN
                    #ioInterface.In.Publish := 1;
                END_IF;
                
                IF #ioInterface.Out.Done THEN
                    #statDataAxisXOld := #tempDataAxisX;
                    #tempDataAxisX := #ioPublishPrepare.AxisEmpty;
                    #ioInterface.In.Publish := 0;
                    #statJsonSerializer.execute := 0;
                    #ioPublishControl.StepNumber := 2;
                END_IF;
            END_IF;
        ELSE
            #ioPublishControl.StepNumber := 2;
 
Zurück
Oben