- Beiträge
- 3.588
- Reaktionspunkte
- 1.038
-> Hier kostenlos registrieren
Hallo zusammen,
V18 - alle Updates
1212C DCDCDC - aktuellste V18 Firmware
--
Hat schon mal jemand den Fifo Baustein von Siemens aus der Lgf Bib verwendet? Ich würde gerne meine Mqtt Nachrichten zum versenden wegspeichern und dann auch parallel dazu wieder den Fifo leeren.. es sind schon viele Nachrichten, da ich zyklisch über 15s verteilt Messwerte versenden/wegspeichern muss.
Mein Aufbau aktuell:
Aufrufe aller globalen Funktionen findet im FB_Global statt:

In meiner Sequenz mit CASE hab ich dann hier den Schritt der Messung:
FC_FifoEnqueue sieht so aus:
Aus dem Puffer entfernen sieht so aus, im Mqtt Baustein:
Irgendwie will das gar nicht so wie ich wollte gestern nach 17 Uhr.. wenn ich die Bits im Datenbaustein für Einreihen und Entfernen triggere, funktioniert das.. ansonsten nicht.. liegts einfach nur an der mehrfachen Zuweisung der Enqueue und Dequeue Signale?
Ich würde gerne beide Funktionen "parallel" verwenden, da der Arbeitsspeicher der 1212C recht klein ist und ich nicht so viele Nachrichten zwischenspeichern kann.. aktuell sinds 20 Fächer im Puffer.
Danke soweit!
V18 - alle Updates
1212C DCDCDC - aktuellste V18 Firmware
--
Hat schon mal jemand den Fifo Baustein von Siemens aus der Lgf Bib verwendet? Ich würde gerne meine Mqtt Nachrichten zum versenden wegspeichern und dann auch parallel dazu wieder den Fifo leeren.. es sind schon viele Nachrichten, da ich zyklisch über 15s verteilt Messwerte versenden/wegspeichern muss.
Mein Aufbau aktuell:
Aufrufe aller globalen Funktionen findet im FB_Global statt:

In meiner Sequenz mit CASE hab ich dann hier den Schritt der Messung:
Code:
#CONST_STEP_MEAS_START: // Start measurement
// Publish value pressure sensor 01
"FC_FifoEnqueue"(iMessage := "FC_REAL_TO_STRING"(#tempRng01),
iTopic := CONCAT(IN1 := #CONST_PUB_TOPIC_PRE, IN2 := #CONST_PUB_TOPIC_VALUE_01));
"DB_Fifo".Control.Enqueue := 0;
// Publish value pressure sensor 02
"FC_FifoEnqueue"(iMessage := "FC_REAL_TO_STRING"(#tempRng02),
iTopic := CONCAT(IN1 := #CONST_PUB_TOPIC_PRE, IN2 := #CONST_PUB_TOPIC_VALUE_02));
"DB_Fifo".Control.Enqueue := 0;
// Publish value pressure sensor difference
"FC_FifoEnqueue"(iMessage := "FC_REAL_TO_STRING"(#tempRngDiff),
iTopic := CONCAT(IN1 := #CONST_PUB_TOPIC_PRE, IN2 := #CONST_PUB_TOPIC_VALUE_DIFF));
"DB_Fifo".Control.Enqueue := 0;
IF #statTimerMeasurement.Q THEN
#statMeasurementStart := 0;
#statMeasurementStop := 1;
// Publish timestamp measurement stop
"FC_FifoEnqueue"(iMessage := #iTime,
iTopic := CONCAT(IN1 := #CONST_PUB_TOPIC_PRE, IN2 := #CONST_PUB_TOPIC_TIMESTAMP_STOP));
"DB_Fifo".Control.Enqueue := 0;
// Publish measurement start signal
"FC_FifoEnqueue"(iMessage := "FC_BOOL_TO_STRING"(#statMeasurementStart),
iTopic := CONCAT(IN1 := #CONST_PUB_TOPIC_PRE, IN2 := #CONST_PUB_TOPIC_SIGNAL_START));
"DB_Fifo".Control.Enqueue := 0;
// Publish measurement stop signal
"FC_FifoEnqueue"(iMessage := "FC_BOOL_TO_STRING"(#statMeasurementStop),
iTopic := CONCAT(IN1 := #CONST_PUB_TOPIC_PRE, IN2 := #CONST_PUB_TOPIC_SIGNAL_STOP));
"DB_Fifo".Control.Enqueue := 0;
#ioStep := #CONST_STEP_PUMP_FINISHED;
END_IF;
FC_FifoEnqueue sieht so aus:
Code:
"DB_Fifo".ItemWork.Message := STRING_TO_WSTRING(#iMessage);
"DB_Fifo".ItemWork.Topic := STRING_TO_WSTRING(#iTopic);
"DB_Fifo".Control.Enqueue := 1;
Aus dem Puffer entfernen sieht so aus, im Mqtt Baustein:
Code:
ELSIF NOT "DB_Mqtt".Client.Busy AND NOT "DB_Mqtt".Client.Done AND ("DB_Fifo".Control.ElementCount <> 0) AND NOT ("DB_Fifo".Control.Enqueue) THEN
"DB_Fifo".Control.Dequeue := 1;
"DB_Mqtt".Client.ParameterPub.publishMessageData := "DB_Fifo".ItemWork.Message;
"DB_Mqtt".Client.ParameterPub.publishTopic := "DB_Fifo".ItemWork.Topic;
"DB_Fifo".Control.Dequeue := 0;
//nochmal prüfen, ob überhaupt was in der Variable drinsteht..
IF "DB_Mqtt".Client.ParameterPub.publishMessageData <> "WSTRING_EMPTY" THEN
//prüfen ob aktuelle message <> letzte message
//IF "MQTT_DATA".mqttDataPublish.publishMessageData <> "MQTT_FIFO".last_send_payload THEN
"DB_Mqtt".Client.ParameterPub.publishMessage := 1;
// END_IF;
END_IF;
Irgendwie will das gar nicht so wie ich wollte gestern nach 17 Uhr.. wenn ich die Bits im Datenbaustein für Einreihen und Entfernen triggere, funktioniert das.. ansonsten nicht.. liegts einfach nur an der mehrfachen Zuweisung der Enqueue und Dequeue Signale?
Ich würde gerne beide Funktionen "parallel" verwenden, da der Arbeitsspeicher der 1212C recht klein ist und ich nicht so viele Nachrichten zwischenspeichern kann.. aktuell sinds 20 Fächer im Puffer.
Danke soweit!