- Beiträge
- 3.741
- Reaktionspunkte
- 1.069
-> Hier kostenlos registrieren
Hallo zusammen,
TIA V18 Update 3
1217C DCDCDC V4.6
Folgender Sachverhalt:
Für meine MQTT Nachrichten abzusetzen habe ich einen SwitchCase,
über das MQTT Topic "starte" ich dann bedingt IF-Abfragen, welche mir dann passend die Daten für den JSON Tree (Array of UDT) bereitstellen.
Da ich jetzt nicht jedes Fach händisch befüllen möchte sondern gerne etwas faul wäre, hab ich mir für den Zeiger des Faches eine temporäre Variable geschnappt und diese verwerndet.
Diese setze ich im Netzwerk in dem ich die Daten aufbereite, ganz am Anfang direkt auf 0
Und zähle diese nach jedem Key-Value-Pair um eins hoch, bevor ich dann das nächste Key-Value-Pair befülle
Ich würde jetzt gerne dafür sorgen, dass diese IF-Befehle (pro Topic eines), nur einmalig ausgeführt werden, bedingt ist es ja schon.
Mein Weg wäre jetzt gewesen, eine zusätzliche AND NOT Abfrage im IF Teil mit einer boolschen Variable, welche ich am Ende der IF auf TRUE setze und dann in dem SwitchCase nach der Abarbeitung wieder FALSE setze.
Was sind denn eure Vorgehensweisen dafür? Würde es noch einfacher gehen?
TIA V18 Update 3
1217C DCDCDC V4.6
Folgender Sachverhalt:
Für meine MQTT Nachrichten abzusetzen habe ich einen SwitchCase,
Code:
0:
#ioControlPublish.StepName := 'Init';
#ioControlPublish.Start := 0;
#ioControlPublish.Done := 0;
#ioControlPublish.Ready := 1;
#ioMqtt.In.Publish := 0;
#statJsonSerializer.execute := 0;
IF #statReadyPublish THEN
#ioControlPublish.Ready := 0;
#ioControlPublish.Start := 1;
#ioControlPublish.StepNumber := 1;
END_IF;
1:
#ioControlPublish.StepName := 'Publish message general information';
#ioMqtt.InOut.MqttTopic := #constMQTT_TOPIC_PUBLISH_INFORMATION;
#statJsonSerializer.execute := 1;
IF #statReadyData AND #statReadyPublish THEN
#ioMqtt.In.Publish := 1;
END_IF;
IF #ioMqtt.Out.Done THEN
#ioMqtt.In.Publish := 0;
#statJsonSerializer.execute := 0;
#ioControlPublish.StepNumber := 2;
ELSIF #statJsonSerializer.error THEN
#ioControlPublish.StepNumber := 0;
END_IF;
....
///// Hier gehts natürlich noch weiter /////
....
über das MQTT Topic "starte" ich dann bedingt IF-Abfragen, welche mir dann passend die Daten für den JSON Tree (Array of UDT) bereitstellen.
Da ich jetzt nicht jedes Fach händisch befüllen möchte sondern gerne etwas faul wäre, hab ich mir für den Zeiger des Faches eine temporäre Variable geschnappt und diese verwerndet.
Diese setze ich im Netzwerk in dem ich die Daten aufbereite, ganz am Anfang direkt auf 0
Code:
REGION Prepare stuff
#tempCount := 0;
IF "DB_Global".OperatingMode.Mode.AutoActive THEN
#tempOperatingMode := 'Automatic';
ELSIF "DB_Global".OperatingMode.Mode.EndOfCycleActive THEN
#tempOperatingMode := 'EndOfCycle';
ELSIF "DB_Global".OperatingMode.Mode.Error THEN
#tempOperatingMode := 'Error';
ELSIF "DB_Global".OperatingMode.Mode.HomePosActive THEN
#tempOperatingMode := 'HomePosition';
ELSIF "DB_Global".OperatingMode.Mode.SetupActive THEN
#tempOperatingMode := 'Setup';
ELSIF "DB_Global".OperatingMode.Mode.StepActive THEN
#tempOperatingMode := 'Step';
ELSE
#tempOperatingMode := 'Undefined';
END_IF;
END_REGION
Und zähle diese nach jedem Key-Value-Pair um eins hoch, bevor ich dann das nächste Key-Value-Pair befülle
Code:
REGION General information
IF #ioMqtt.InOut.MqttTopic = #constMQTT_TOPIC_PUBLISH_INFORMATION THEN
"DB_MqttData".JsonTreePublish[#tempCount].closingElement := 0;
"DB_MqttData".JsonTreePublish[#tempCount].depth := 0;
"DB_MqttData".JsonTreePublish[#tempCount].key := 'ControlVoltageOn';
"DB_MqttData".JsonTreePublish[#tempCount].type := #constJSON_TYPE_BOOL;
"DB_MqttData".JsonTreePublish[#tempCount].value := "FC_BOOL_TO_STRING"("DB_Global".OperatingMode.Mode.ControlOn);
#tempCount := #tempCount + 1;
"DB_MqttData".JsonTreePublish[#tempCount].closingElement := 0;
"DB_MqttData".JsonTreePublish[#tempCount].depth := 0;
"DB_MqttData".JsonTreePublish[#tempCount].key := 'CurrentState';
"DB_MqttData".JsonTreePublish[#tempCount].type := #constJSON_TYPE_TEXT_STRING;
"DB_MqttData".JsonTreePublish[#tempCount].value := #tempOperatingMode;
#tempCount := #tempCount + 1;
....
///// Hier gehts natürlich noch weiter /////
....
END_IF;
END_REGION
Ich würde jetzt gerne dafür sorgen, dass diese IF-Befehle (pro Topic eines), nur einmalig ausgeführt werden, bedingt ist es ja schon.
Mein Weg wäre jetzt gewesen, eine zusätzliche AND NOT Abfrage im IF Teil mit einer boolschen Variable, welche ich am Ende der IF auf TRUE setze und dann in dem SwitchCase nach der Abarbeitung wieder FALSE setze.
Was sind denn eure Vorgehensweisen dafür? Würde es noch einfacher gehen?