-> Hier kostenlos registrieren
Hallo,
ich grübel momentan über folgendem Problem.
Ich möchte gerne Variablen aus einem Beckhoff IPC CX5120 per MQTT an einen MQTT MessageBroker publishen. Diese Variablen subscribe ich dann später mit NodeRED wieder. Das funktioniert auch sehr gut. Dazu habe ich mich an das Beispiel von Beckhoff gehalten.
Auf folgendes Problem bin ich aber gestoßen:
Ich möchte ein Set aus 3 Variablen als JSON übertragen und muss dafür in TwinCAT eine Struktur anlegen.
Aus diesem Struct mache ich ein JSON und übergebe das dann dem FunctionBlock FB_IotMqttClient.
Der Programm Code sieht so aus:
Das ganze funktioniert, allerdings verändert sich der Wert der Variable ST_Teststruktur_MQTT.Test2 von 10.4 auf 10.399999618530274. Komischerweise gibt es diesen Fehler bei der anderen REAL Variable mit dem Wert 10.5 nicht.
Diese Ungenauigkeit passiert schon in TwinCAT3 selbst, siehe Screenshot. Nun die Preisfrage, wo liegt der Fehler?
Gruß
Perold

ich grübel momentan über folgendem Problem.
Ich möchte gerne Variablen aus einem Beckhoff IPC CX5120 per MQTT an einen MQTT MessageBroker publishen. Diese Variablen subscribe ich dann später mit NodeRED wieder. Das funktioniert auch sehr gut. Dazu habe ich mich an das Beispiel von Beckhoff gehalten.
Auf folgendes Problem bin ich aber gestoßen:
Ich möchte ein Set aus 3 Variablen als JSON übertragen und muss dafür in TwinCAT eine Struktur anlegen.
Code:
TYPE ST_Teststruktur_MQTT :
STRUCT
Test1 : REAL;
Test2 : REAL;
Test3 : DINT;
END_STRUCT
END_TYPE
Aus diesem Struct mache ich ein JSON und übergebe das dann dem FunctionBlock FB_IotMqttClient.
Der Programm Code sieht so aus:
Code:
IF bSetParameter THEN
bSetParameter := FALSE;
fbMqttClient.sHostName := '172.17.10.111';
fbMqttClient.nHostPort := 1883;
// fbMqttClient.sClientId := 'MyTcMqttClient';
fbMqttClient.sTopicPrefix := '';
// fbMqttClient.nKeepAlive := 60;
// fbMqttClient.sUserName := ;
// fbMqttClient.sUserPassword := ;
// fbMqttClient.stWill := ;
// fbMqttClient.stTLS := ;
fbMqttClient.ipMessageQueue := fbMessageQueue;
END_IF
fbMqttClient.Execute(bConnect);
IF fbMqttClient.bConnected THEN
fbTimer(IN:=TRUE);
IF fbTimer.Q THEN // publish new payload every second
fbTimer(IN:=FALSE);
// Fill data
ST_Teststruktur_MQTT.Test1 := 10.5; //fix eingetragene Werte zum testen
ST_Teststruktur_MQTT.Test2 := 10.4; //fix eingetragene Werte zum testen
ST_Teststruktur_MQTT.Test3 := 33; //fix eingetragene Werte zum testen
//Convert to JSON string
fbJsonWriter.ResetDocument();
fbJsonDataType.AddJsonValueFromSymbol(fbJsonWriter, 'ST_Teststruktur_MQTT', SIZEOF(ST_Teststruktur_MQTT), ADR(ST_Teststruktur_MQTT));
MessageToPublishJson := fbJsonWriter.GetDocument();
//Publish
fbMqttClient.Publish(sTopic:= TopicToPublishJson,
pPayload:= ADR(MessageToPublishJson),
nPayloadSize:= LEN2(ADR(MessageToPublishJson)), //+1 weg? im Beispiel von Beckhoff ist eine +1 dahinter
eQoS:= TcIotMqttQos.AtMostOnceDelivery,
bRetain:= FALSE,
bQueue:= FALSE);
END_IF
END_IF
Das ganze funktioniert, allerdings verändert sich der Wert der Variable ST_Teststruktur_MQTT.Test2 von 10.4 auf 10.399999618530274. Komischerweise gibt es diesen Fehler bei der anderen REAL Variable mit dem Wert 10.5 nicht.
Diese Ungenauigkeit passiert schon in TwinCAT3 selbst, siehe Screenshot. Nun die Preisfrage, wo liegt der Fehler?
Gruß
Perold
