JSON Dokument für MQTT

DCDCDC

Level-3
Beiträge
3.588
Reaktionspunkte
1.038
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Umgebung:
CX9020 4024.7 (Windows CE 7 ARM)
Twincat 3 4024.47
Tc3_IotBase 3.1.19.0
Tc3_JsonXml 3.3.19.0

Ich hab ein Json Dokument welche ich gerne zyklisch einmal übers Mqtt absetzen möchte:
JSON:
{
    "general":{
        "stateControlVoltage": false,
        "stateEmergencyStop": false,
        "stateError": false,
        "stateErrorLamp": false,
        "stateMagnetStation": false,
        "stateButtonUnlock": false
    },
    "conveyorUpFront":{
        "motor":{
            "noError": false,
            "start": false,
            "backwards": false,
            "Active": false,
            "quickSwitch": false          
        },
        "seperator":{
            "switchExtend": false,
            "switchRetract": false,
            "SeperatorExtend": false
        },
        "recognitionWpc":{
            "wpcInFrontOfSeperator": false,
            "wpcInSwitch": false,
            "wpcAfterSeperator": false
        }
    },
    "conveyorTransfer":{
        "motor":{
            "noError": false,
            "start": false,
            "backwards": false,
            "Active": false,
            "quickSwitch": false          
        },
        "recognitionWpc":{
            "wpcOnConveyor": false
        }
    },
    "conveyorAtBack":{
        "motor":{
            "noError": false,
            "start": false,
            "backwards": false,
            "Active": false,
            "quickSwitch": false          
        },
        "seperator":{
            "switchExtend": false,
            "switchRetract": false
        },
        "recognitionWpc":{
            "wpcInFrontOfSeperator": false,
            "wpcInSwitch": false,
            "wpcAfterSeperator": false
        }
    }
}
Also geht um reine I/O Signale die ich übergebe, könnte ich auch in eine DUT schreiben

Der FB_JsonSaxWriter besitzt ja verschiedene Methoden zum Hinzufügen von verschiedenen Variablen..

In dem Projekt passiert schon bisschen was mit Mqtt usw.. aber nicht so wirklich sauber umgesetzt.

Ich würde das ganze gerne in einen FB packen, welchen ich zyklisch einmal aufrufe.

Meine Fragen sind jetzt:
Wie muss ich die Methoden anwenden um das Json Dokument sauber übertragen bekomme.

Bekomme ich von der Publish Methode vom FB_IotMqttClient eine Status Signal wenn die Nachricht abgesetzt wurde? Sieht zumindest von den Variablen her nicht so aus.. im gesamten Programm wird die Publish Methode verwendet ohne auszuwerten ob die Nachricht auch sauber rausging.

Ich bin nicht sooo oft auf Twincat unterwegs, weswegen mir Hinweise etc erstmal denke ich genügen würden.
 
Zuletzt bearbeitet:
Screenshot 2024-07-19 150528.png

Screenshot 2024-07-19 150152.png

Screenshot 2024-07-19 150158.png

Und wenn ich die Solution speichern will / mit Änderungen online einspielen gehe habe ich wunderschöne Meldungen..

Ich kann auch Twincat nicht mehr schliessen :)
 
Diese Meldung hatte ich auch schon paarmal.
Es ist nicht immer das selbe, aber meistens hat es eines der folgenden Dinge gelöst:
- Clean, Rebuild
- Speichern --> Da wird wahrscheinlich die Meldung sofort wieder kommen
- Shell schliessen und erneut öffnen.
- In der DateiStruktur nachschauen ob die Objekte in der Shell gleich heissen wie in der Projekt(Datei) struktur. Wenn nicht, dann anpassen.
- Projekt removen und dann als existing Item neu laden. (Ich weiss nicht genau ob es so heisst, aber du kannst ein Projekt Löschen oder entfernen. Eines der beiden entfernt die "referenz" zur Shell ohne die Daten in der Dateistruktur zu entfernen. Dann kannst du es neu laden und siehst evtl die Fehler.

Gruess Samus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok.. die Funktion kann nur 255 Bytes verarbeiten.. ganzer Tag umsonst :)

Gerne mit Ideen melden wie ich das Json Ding in einem Rutsch übertragen bekomme
Hallo, falls jemand die Lösung sucht für große Datenmengen:

Das Beispiel für Tc3JsonXmlSampleJsonSaxWriter von hier: https://infosys.beckhoff.com/englis...c3_iot_communication_mqtt/3391755403.html&id=

ist recht umständlich.. bei mir kamen auch nur unvollständige Strings raus.

Eigentlich wollte ich es initial schön aufteilen wie oben beschrieben.. hab mich dann doch dagegen entschieden, weil ich nicht unendlich viele Stunden auf der Funktion verbraten wollte und es nur eine Person für seine eigene Arbeit braucht.

Stattdessen nutze ich jetzt vom FB_JsonReadWriteDataType die Funktion AddJsonKeyValueFromSymbol, hier zu finden:

Code sieht so aus:
Code:
            // Create json document hardware
            FB_DutHardware(DutHardware=> DutHardware);
            fbJson.ResetDocument();
            fbJson.StartObject();
            fbJsonDataType.AddJsonKeyValueFromSymbol(fbJson, 'hardware', 'DUT_Hardware', SIZEOF(DutHardware), ADR(DutHardware));
            fbJson.EndObject();
            // Parse json document hardware
            iLengthJsonHardware := fbJson.CopyDocument(sJsonHardware, SIZEOF(sJsonHardware));
            // Publish json document hardware
            IF iLengthJsonHardware > 0 THEN
                fbMqttClient.Publish('/logic/hardware',ADR(sJsonHardware),iLengthJsonHardware,1,FALSE,FALSE);
            END_IF

Screenshot 2024-07-24 103312.png

Json sieht so aus:
JSON:
{
    "hardware": {
        "generalControlVoltage": true,
        "generalEmergencyStop": true,
        "generalErrorLamp": false,
        "generalMagnetStation": false,
        "generalButtonUnlock": false,
        "conveyorUpFrontMotorNoError": false,
        "conveyorUpFrontMotorStart": false,
        "conveyorUpFrontMotorBackwards": false,
        "conveyorUpFrontMotorActive": false,
        "conveyorUpFrontMotorQuickSwitch": false,
        "conveyorUpFrontSeparatorShuntExtend": false,
        "conveyorUpFrontSeparatorShuntRetract": false,
        "conveyorUpFrontSeparatorInFrontOfShuntExtend": false,
        "conveyorUpFrontRecognitionWpcWpcInFrontOfSeparator": true,
        "conveyorUpFrontRecognitionWpcWpcInShunt": false,
        "conveyorUpFrontRecognitionWpcAfterSeparator": false,
        "conveyorTransferMotorNoError": false,
        "conveyorTransferMotorStart": false,
        "conveyorTransferMotorBackwards": false,
        "conveyorTransferMotorActive": false,
        "conveyorTransferMotorQuickSwitch": false,
        "conveyorTransferRecognitionWpcWpcOnConveyor": false,
        "conveyorAtBackMotorNoError": false,
        "conveyorAtBackMotorStart": false,
        "conveyorAtBackMotorBackwards": false,
        "conveyorAtBackMotorActive": false,
        "conveyorAtBackMotorQuickSwitch": false,
        "conveyorAtBackSeparatorShuntExtend": false,
        "conveyorAtBackSeparatorShuntRetract": false,
        "conveyorAtBackRecognitionWpcWpcInFrontOfShunt": false,
        "conveyorAtBackRecognitionWpcWpcInShunt": false,
        "conveyorAtBackRecognitionWpcAfterShunt": false
    }
}

Ist auch ein valid Json
Screenshot 2024-07-24 103407.png

Auch wenns im Mqtt Explorer nicht danach aussieht, normalerweise formatiert der Explorer valide Json Strings schön sauber:
Screenshot 2024-07-24 103606.png
 
Zurück
Oben