MQTT in ST

Numax

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Tach Zusammen,
ich versuche aktuell MQTT Topics mit einer Codesys-Steuerung zu empfangen, komme da aber nicht weiter.
Zur Bibliothek MQTT_Client_SL gibt es ein Beipielprojekt (in FUP) mit dem es soweit funktioniert. Nun soll das ganze aber in ST umgesetzt werden.
Da ich mich mit ST nicht wirkich auskenne, wird der Fehler bestimmt nicht am System oder der Bibliothek liegen, sondern daran wie der Baustein aufzurufen ist.
Das Programm sieht im ersten Schitt so aus:

C-ähnlich:
CASE uiPRG OF
    0:
        IF mqttClient.xConnectedToBroker = FALSE THEN
            mqttClient(sHostname:=sHostname, uiPort:=uiPort, eMQTTVersion:=eMQTTVersion, eCommunicationMode:=eCommunicationMode, sWebSocketUrl:=sHostname);
            mqttClient.StartModel(TRUE);
        ELSE
            uiPRG := uiPRG + 1;
        END_IF
    1:
        IF mqttClient.xConnectedToBroker = TRUE AND mqttSubscriber.xSubscribeActive = FALSE THEN
            mqttSubscriber(mqttClient:=mqttClient, wsTopicFilter:=wsSubcribeTopicFilter, udiMaxPayloadSize:=SIZEOF(sSubscribeMessage), pbPayload:=ADR(sSubscribeMessage));
            mqttSubscriber.StartModel(TRUE);
        ELSE
            uiPRG := uiPRG + 1;
        END_IF
    2:
        IF mqttSubscriber.eMQTTError = MQTT.MQTT_ERROR.NO_ERROR AND mqttSubscriber.xSubscribeActive = TRUE AND mqttSubscriber.xError = FALSE AND mqttSubscriber.xBusy = FALSE AND mqttSubscriber.xReceived = TRUE THEN
            uiPRG := uiPRG + 1;
        END_IF   
END_CASE

Case 2 dient aktuell erstmal nur zu Testen.
Nun zum Problem:
Das verbinden mit dem MQTT-Broker funktioniert, also die Variable xConnectedToBroker wird TRUE. Der Subscribe-Baustein tut dann aber nicht was er soll. xBusy wird TRUE und bleibt dort, eMQTTError bleibt bei NO_ERROR und xSubscribeActive bleibt bei FALSE.
Woran kann es nun liegen, dass xSubscribeActive nicht TRUE wird, es gibt ja scheinbar auch keine andere Fehlermeldung?

Gruß
Markus
 
Ich könnte vermuten, dass es daran liegt dass du mqttClient() und mqttSubscriber() in deiner State-Maschine aufrufst. Sprich wenn du in Schritt 1 bist wird mqttClient() nicht mehr aufgerufen.
Besser die beiden Aufrufe außerhalb deiner CASE-Anweisung aufrufen und nur die Parameter dort entsprechend setzen.
 
Zurück
Oben