e!Cockpit MQTT FbSubscribeMQTT

Jproject

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

ich habe eine Steuerung PFC100 mit e!Cockpit projektiert. Daten sollen über den Mosquitto Broker per MQTT ausgetauscht werden.

Ich habe jetzt mal Testweise ein Topic mit Daten angelegt, die Daten werden per Openhab gesendet und sollen von der Steuerung ausgelesen werden.
Jetzt habe ich folgendes Problem, wenn ich einen FB Subscribe anlege funktioniert das Senden der Date nicht immer. Ich muss die Steuerung komplett neu starten dann geht es manchmal. Wenn ich einen 2. Instanzbaustein vom FbSubscribeMQTT hinzufüge und ihn lade geht nichts mehr. Die Daten werden ordentlich von Openhab versendet, ich habe das per MQTT.FX überprüft aber die Wago PFC100 empfängt sie nicht.

Hat jemand eine Idee wie man das lösen kann?
Screenshot 2021-09-20 110653.pngScreenshot 2021-09-20 110817.png

Normal sollte der Wert in der Variable: sMessage_Licht1_Dimmer erscheinen aber sie tut es nicht.
 
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Oberchefe,

das hat leider nicht funktioniert aber danke. Die Verbindungen habe ich alle auf Connected=1
Wenn ich den FbSubscribeMQTT im Programm PLC_PRG mehrfach aufrufe dann geht es. Sobald ich den Baustein mehrfach in einen FB aufrufe bekomme ich keine Daten.
 
Ich habe die Firmware und die Bibliothek auf den neusten Standgebracht, leider ohne Erfolg.
Ich kann den FbSubscribeMQTT in einem anderen FB nur einmal aufrufen, wenn ich ihn ein 2.mal aufrufe und Instanziiere bekomme ich keine Werte.Wago1.PNGWago2.PNG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Jproject,
hast du den FbSubscribeMQTT_2 verwendet (der alte Baustein (FbSubscribeMQTT) ist für FW<17)?
Da gibt es eine FB_INIT Methode, mit der du den Baustein auf eine Connection hängen musst. Das machst du bei der Deklaration der Instanz: "mySubscriber: FbSubscribeMQTT_2(WagoAppCloud.eConnectionId.Connection1);"

Die Connection ist nötig, da im WBM 2 verschiedene Verbindungen parametriert werden können, die unterschiedliche Protokolle verwenden.
Desweiteren würde ich prüfen, ob folgendes eingestellt ist:
  1. Cloud Platform: MQTT Any Cloud
  2. Hostname: 127.0.0.1
  3. Port number: 1883
  4. Data protocol: Native MQTT
Außerdem könntest du den Status im WBM abfragen: Configuration>Cloud Connectivity>Status
Meistens sieht man da schon, wo es hakt.

Viel Erfolg!
 
Du kannst den Baustein nicht debuggen, da er übersetzt in der WagoAppCloud gespeichert ist. Also mit F10 die Bausteininstanz überspringen und nicht mit F8.
 
Ok, das sieht gut aus.
Es gibt noch Parameter zum Verstellen des Payload und der Anzahl der Subscriptions:
1632310171586.png
Eventuell musst du die Anzahl da hochsetzen, wenn ein Fehler kommt. Welche Beschreibung hat der Fehler?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nach den Werten habe ich geschaut, diese sind soweit ok.
Wenn ich das Programm starte passiert erstmal nichts, wenn ich einen neuen Wert sende kommt sofort diese beiden Fehlermeldungen:
Screenshot 2021-09-22 134110.jpgScreenshot 2021-09-22 134131.jpg

Die Steuerung geht in Stop und lässt sich nur durch einen Neustart retten.
 
Zuletzt bearbeitet:
Probiere mal bitte ohne die MemCopySecure Bausteine, ob die Steuerung immer noch in den Ausnahmezustand geht. Wie es scheint, stürzt er erst ab, nachdem was empfangen wurde.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde die SysMem.SysMemCpy Fuktion verwenden und diese nicht zyklisch aufrufen wie in deinem Code, sondern nur, wenn der Baustein Daten empfangen hat. Da geht nämlich das "xDataReceived" Flag auf TRUE. Also so, oder ähnlich:

IF mySubscriber.xDataReceived THEN SysMem.SysMemCpy(ADR(myDestination),ADR(mySource),MIN(mySubscriber.dwRxNBytes,SIZEOF(myDestination))); END_IF
Du kannst das Ganze noch verbessern, indem du das empfangene Topic auswertest und dann der Variable via CASE zuordnest. Das brauchst du, wenn du Wildcards benutzt.
 
Hey Wago Soluteer,

danke für die Hilfe. Wenn ich die Funktion SysMem.SysMemCpy aufrufe, bekomme ich die Fehlermeldung, dass er die Funktion nicht kennt. Muss ich die Funktion über eine Bibliothek einfügen?
 
Zurück
Oben