You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2020/11/11 17:55:01 UTC

[plc4x] branch feature/plc4go updated: - Implemented the correct KNX floating point decoding

This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch feature/plc4go
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/feature/plc4go by this push:
     new 2b25d39  - Implemented the correct KNX floating point decoding
2b25d39 is described below

commit 2b25d39a81950cff9a281def94ea3246d1004858
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Wed Nov 11 18:54:54 2020 +0100

    - Implemented the correct KNX floating point decoding
---
 .../language/go/GoLanguageTemplateHelper.java      |  4 +-
 plc4go/cmd/main/main.go                            |  1 +
 plc4go/go.mod                                      |  1 +
 plc4go/go.sum                                      |  2 +
 .../readwrite/model/BACnetTagApplicationDouble.go  |  2 +-
 .../readwrite/model/BACnetTagApplicationReal.go    |  2 +-
 .../knxnetip/readwrite/model/KnxDatapoint.go       | 66 +++++++++++++---------
 .../plc4go/modbus/readwrite/model/DataItem.go      |  8 +--
 .../internal/plc4go/s7/readwrite/model/DataItem.go |  4 +-
 plc4go/internal/plc4go/utils/ReadBuffer.go         | 61 +++++++++++++++-----
 .../resources/protocols/knxnetip/knxnetip.mspec    |  1 +
 11 files changed, 99 insertions(+), 53 deletions(-)

diff --git a/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
index e75a053..b4552fa 100644
--- a/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
+++ b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
@@ -301,10 +301,10 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             case FLOAT: {
                 FloatTypeReference floatTypeReference = (FloatTypeReference) simpleTypeReference;
                 if (floatTypeReference.getSizeInBits() <= 32) {
-                    return "io.ReadFloat32(" + floatTypeReference.getSizeInBits() + ")";
+                    return "io.ReadFloat32(true, " + floatTypeReference.getExponent() + ", " + floatTypeReference.getMantissa() + ")";
                 }
                 if (floatTypeReference.getSizeInBits() <= 64) {
-                    return "io.ReadFloat64(" + floatTypeReference.getSizeInBits() + ")";
+                    return "io.ReadFloat64(true, " + floatTypeReference.getExponent() + ", " + floatTypeReference.getMantissa() + ")";
                 }
             }
             case STRING: {
diff --git a/plc4go/cmd/main/main.go b/plc4go/cmd/main/main.go
index ca11c9e..b61336b 100644
--- a/plc4go/cmd/main/main.go
+++ b/plc4go/cmd/main/main.go
@@ -19,4 +19,5 @@
 package main
 
 func main() {
+    KnxMain()
 }
diff --git a/plc4go/go.mod b/plc4go/go.mod
index f14f276..d6384fd 100644
--- a/plc4go/go.mod
+++ b/plc4go/go.mod
@@ -26,4 +26,5 @@ require (
 	github.com/ajankovic/xdiff v0.0.1
 	github.com/icza/bitio v1.0.0
 	github.com/subchen/go-xmldom v1.1.2
+	github.com/willf/bitset v1.1.11
 )
diff --git a/plc4go/go.sum b/plc4go/go.sum
index e7a4d67..5a7055a 100644
--- a/plc4go/go.sum
+++ b/plc4go/go.sum
@@ -16,5 +16,7 @@ github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/subchen/go-xmldom v1.1.2 h1:7evI2YqfYYOnuj+PBwyaOZZYjl3iWq35P6KfBUw9jeU=
 github.com/subchen/go-xmldom v1.1.2/go.mod h1:6Pg/HuX5/T4Jlj0IPJF1sRxKVoI/rrKP6LIMge9d5/8=
+github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE=
+github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4=
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
index ad396a4..1d3a687 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
@@ -99,7 +99,7 @@ func (m *BACnetTagApplicationDouble) LengthInBytes() uint16 {
 func BACnetTagApplicationDoubleParse(io *utils.ReadBuffer, lengthValueType uint8, extLength uint8) (*BACnetTag, error) {
 
     // Simple Field (value)
-    value, _valueErr := io.ReadFloat64(64)
+    value, _valueErr := io.ReadFloat64(true, 11, 52)
     if _valueErr != nil {
         return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
     }
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
index fe18b28..2003bb4 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
@@ -99,7 +99,7 @@ func (m *BACnetTagApplicationReal) LengthInBytes() uint16 {
 func BACnetTagApplicationRealParse(io *utils.ReadBuffer, lengthValueType uint8, extLength uint8) (*BACnetTag, error) {
 
     // Simple Field (value)
-    value, _valueErr := io.ReadFloat32(32)
+    value, _valueErr := io.ReadFloat32(true, 8, 23)
     if _valueErr != nil {
         return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
     }
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapoint.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapoint.go
index 09429c2..2dfe421 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapoint.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapoint.go
@@ -119,8 +119,13 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
             return values.NewPlcSINT(value), nil
         case formatName == "F16": // REAL
 
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
             // Simple Field (value)
-            value, _valueErr := io.ReadFloat32(16)
+            value, _valueErr := io.ReadFloat32(true, 4, 11)
             if _valueErr != nil {
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
@@ -217,7 +222,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
         case formatName == "F32": // REAL
 
             // Simple Field (value)
-            value, _valueErr := io.ReadFloat32(32)
+            value, _valueErr := io.ReadFloat32(true, 8, 23)
             if _valueErr != nil {
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
@@ -1343,7 +1348,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
             _map := map[string]interface{}{}
 
             // Simple Field (tempFlowProdSegmH)
-            tempFlowProdSegmH, _tempFlowProdSegmHErr := io.ReadFloat32(16)
+            tempFlowProdSegmH, _tempFlowProdSegmHErr := io.ReadFloat32(true, 4, 11)
             if _tempFlowProdSegmHErr != nil {
                 return nil, errors.New("Error parsing 'tempFlowProdSegmH' field " + _tempFlowProdSegmHErr.Error())
             }
@@ -1393,7 +1398,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
             _map := map[string]interface{}{}
 
             // Simple Field (roomTemperatureDemand)
-            roomTemperatureDemand, _roomTemperatureDemandErr := io.ReadFloat32(16)
+            roomTemperatureDemand, _roomTemperatureDemandErr := io.ReadFloat32(true, 4, 11)
             if _roomTemperatureDemandErr != nil {
                 return nil, errors.New("Error parsing 'roomTemperatureDemand' field " + _roomTemperatureDemandErr.Error())
             }
@@ -1436,7 +1441,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
             _map := map[string]interface{}{}
 
             // Simple Field (flowTemperatureProdSegmC)
-            flowTemperatureProdSegmC, _flowTemperatureProdSegmCErr := io.ReadFloat32(16)
+            flowTemperatureProdSegmC, _flowTemperatureProdSegmCErr := io.ReadFloat32(true, 4, 11)
             if _flowTemperatureProdSegmCErr != nil {
                 return nil, errors.New("Error parsing 'flowTemperatureProdSegmC' field " + _flowTemperatureProdSegmCErr.Error())
             }
@@ -1479,7 +1484,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
             _map := map[string]interface{}{}
 
             // Simple Field (actualTemperature)
-            actualTemperature, _actualTemperatureErr := io.ReadFloat32(16)
+            actualTemperature, _actualTemperatureErr := io.ReadFloat32(true, 4, 11)
             if _actualTemperatureErr != nil {
                 return nil, errors.New("Error parsing 'actualTemperature' field " + _actualTemperatureErr.Error())
             }
@@ -1515,7 +1520,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
             _map := map[string]interface{}{}
 
             // Simple Field (flowTemperatureDemand)
-            flowTemperatureDemand, _flowTemperatureDemandErr := io.ReadFloat32(16)
+            flowTemperatureDemand, _flowTemperatureDemandErr := io.ReadFloat32(true, 4, 11)
             if _flowTemperatureDemandErr != nil {
                 return nil, errors.New("Error parsing 'flowTemperatureDemand' field " + _flowTemperatureDemandErr.Error())
             }
@@ -1631,21 +1636,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
             _map := map[string]interface{}{}
 
             // Simple Field (temperatureSetpointComfort)
-            temperatureSetpointComfort, _temperatureSetpointComfortErr := io.ReadFloat32(16)
+            temperatureSetpointComfort, _temperatureSetpointComfortErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointComfortErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointComfort' field " + _temperatureSetpointComfortErr.Error())
             }
             _map["Struct"] = temperatureSetpointComfort
 
             // Simple Field (temperatureSetpointStandby)
-            temperatureSetpointStandby, _temperatureSetpointStandbyErr := io.ReadFloat32(16)
+            temperatureSetpointStandby, _temperatureSetpointStandbyErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointStandbyErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointStandby' field " + _temperatureSetpointStandbyErr.Error())
             }
             _map["Struct"] = temperatureSetpointStandby
 
             // Simple Field (temperatureSetpointEco)
-            temperatureSetpointEco, _temperatureSetpointEcoErr := io.ReadFloat32(16)
+            temperatureSetpointEco, _temperatureSetpointEcoErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointEcoErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointEco' field " + _temperatureSetpointEcoErr.Error())
             }
@@ -1655,21 +1660,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
             _map := map[string]interface{}{}
 
             // Simple Field (temperatureSetpointShiftComfort)
-            temperatureSetpointShiftComfort, _temperatureSetpointShiftComfortErr := io.ReadFloat32(16)
+            temperatureSetpointShiftComfort, _temperatureSetpointShiftComfortErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointShiftComfortErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointShiftComfort' field " + _temperatureSetpointShiftComfortErr.Error())
             }
             _map["Struct"] = temperatureSetpointShiftComfort
 
             // Simple Field (temperatureSetpointShiftStandby)
-            temperatureSetpointShiftStandby, _temperatureSetpointShiftStandbyErr := io.ReadFloat32(16)
+            temperatureSetpointShiftStandby, _temperatureSetpointShiftStandbyErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointShiftStandbyErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointShiftStandby' field " + _temperatureSetpointShiftStandbyErr.Error())
             }
             _map["Struct"] = temperatureSetpointShiftStandby
 
             // Simple Field (temperatureSetpointShiftEco)
-            temperatureSetpointShiftEco, _temperatureSetpointShiftEcoErr := io.ReadFloat32(16)
+            temperatureSetpointShiftEco, _temperatureSetpointShiftEcoErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointShiftEcoErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointShiftEco' field " + _temperatureSetpointShiftEcoErr.Error())
             }
@@ -1679,28 +1684,28 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
             _map := map[string]interface{}{}
 
             // Simple Field (temperatureSetpointComfort)
-            temperatureSetpointComfort, _temperatureSetpointComfortErr := io.ReadFloat32(16)
+            temperatureSetpointComfort, _temperatureSetpointComfortErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointComfortErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointComfort' field " + _temperatureSetpointComfortErr.Error())
             }
             _map["Struct"] = temperatureSetpointComfort
 
             // Simple Field (temperatureSetpointStandby)
-            temperatureSetpointStandby, _temperatureSetpointStandbyErr := io.ReadFloat32(16)
+            temperatureSetpointStandby, _temperatureSetpointStandbyErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointStandbyErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointStandby' field " + _temperatureSetpointStandbyErr.Error())
             }
             _map["Struct"] = temperatureSetpointStandby
 
             // Simple Field (temperatureSetpointEco)
-            temperatureSetpointEco, _temperatureSetpointEcoErr := io.ReadFloat32(16)
+            temperatureSetpointEco, _temperatureSetpointEcoErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointEcoErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointEco' field " + _temperatureSetpointEcoErr.Error())
             }
             _map["Struct"] = temperatureSetpointEco
 
             // Simple Field (temperatureSetpointBProt)
-            temperatureSetpointBProt, _temperatureSetpointBProtErr := io.ReadFloat32(16)
+            temperatureSetpointBProt, _temperatureSetpointBProtErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointBProtErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointBProt' field " + _temperatureSetpointBProtErr.Error())
             }
@@ -1710,28 +1715,28 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
             _map := map[string]interface{}{}
 
             // Simple Field (temperatureSetpointLegioProtect)
-            temperatureSetpointLegioProtect, _temperatureSetpointLegioProtectErr := io.ReadFloat32(16)
+            temperatureSetpointLegioProtect, _temperatureSetpointLegioProtectErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointLegioProtectErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointLegioProtect' field " + _temperatureSetpointLegioProtectErr.Error())
             }
             _map["Struct"] = temperatureSetpointLegioProtect
 
             // Simple Field (temperatureSetpointNormal)
-            temperatureSetpointNormal, _temperatureSetpointNormalErr := io.ReadFloat32(16)
+            temperatureSetpointNormal, _temperatureSetpointNormalErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointNormalErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointNormal' field " + _temperatureSetpointNormalErr.Error())
             }
             _map["Struct"] = temperatureSetpointNormal
 
             // Simple Field (temperatureSetpointReduced)
-            temperatureSetpointReduced, _temperatureSetpointReducedErr := io.ReadFloat32(16)
+            temperatureSetpointReduced, _temperatureSetpointReducedErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointReducedErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointReduced' field " + _temperatureSetpointReducedErr.Error())
             }
             _map["Struct"] = temperatureSetpointReduced
 
             // Simple Field (temperatureSetpointFrostProtect)
-            temperatureSetpointFrostProtect, _temperatureSetpointFrostProtectErr := io.ReadFloat32(16)
+            temperatureSetpointFrostProtect, _temperatureSetpointFrostProtectErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointFrostProtectErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointFrostProtect' field " + _temperatureSetpointFrostProtectErr.Error())
             }
@@ -1741,28 +1746,28 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
             _map := map[string]interface{}{}
 
             // Simple Field (temperatureSetpointShiftComfort)
-            temperatureSetpointShiftComfort, _temperatureSetpointShiftComfortErr := io.ReadFloat32(16)
+            temperatureSetpointShiftComfort, _temperatureSetpointShiftComfortErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointShiftComfortErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointShiftComfort' field " + _temperatureSetpointShiftComfortErr.Error())
             }
             _map["Struct"] = temperatureSetpointShiftComfort
 
             // Simple Field (temperatureSetpointShiftStandby)
-            temperatureSetpointShiftStandby, _temperatureSetpointShiftStandbyErr := io.ReadFloat32(16)
+            temperatureSetpointShiftStandby, _temperatureSetpointShiftStandbyErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointShiftStandbyErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointShiftStandby' field " + _temperatureSetpointShiftStandbyErr.Error())
             }
             _map["Struct"] = temperatureSetpointShiftStandby
 
             // Simple Field (temperatureSetpointShiftEco)
-            temperatureSetpointShiftEco, _temperatureSetpointShiftEcoErr := io.ReadFloat32(16)
+            temperatureSetpointShiftEco, _temperatureSetpointShiftEcoErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointShiftEcoErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointShiftEco' field " + _temperatureSetpointShiftEcoErr.Error())
             }
             _map["Struct"] = temperatureSetpointShiftEco
 
             // Simple Field (temperatureSetpointShiftBProt)
-            temperatureSetpointShiftBProt, _temperatureSetpointShiftBProtErr := io.ReadFloat32(16)
+            temperatureSetpointShiftBProt, _temperatureSetpointShiftBProtErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointShiftBProtErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointShiftBProt' field " + _temperatureSetpointShiftBProtErr.Error())
             }
@@ -2295,21 +2300,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
             _map := map[string]interface{}{}
 
             // Simple Field (temperatureSetpointComfort)
-            temperatureSetpointComfort, _temperatureSetpointComfortErr := io.ReadFloat32(16)
+            temperatureSetpointComfort, _temperatureSetpointComfortErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointComfortErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointComfort' field " + _temperatureSetpointComfortErr.Error())
             }
             _map["Struct"] = temperatureSetpointComfort
 
             // Simple Field (temperatureSetpointShiftStandby)
-            temperatureSetpointShiftStandby, _temperatureSetpointShiftStandbyErr := io.ReadFloat32(16)
+            temperatureSetpointShiftStandby, _temperatureSetpointShiftStandbyErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointShiftStandbyErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointShiftStandby' field " + _temperatureSetpointShiftStandbyErr.Error())
             }
             _map["Struct"] = temperatureSetpointShiftStandby
 
             // Simple Field (temperatureSetpointShiftEco)
-            temperatureSetpointShiftEco, _temperatureSetpointShiftEcoErr := io.ReadFloat32(16)
+            temperatureSetpointShiftEco, _temperatureSetpointShiftEcoErr := io.ReadFloat32(true, 4, 11)
             if _temperatureSetpointShiftEcoErr != nil {
                 return nil, errors.New("Error parsing 'temperatureSetpointShiftEco' field " + _temperatureSetpointShiftEcoErr.Error())
             }
@@ -2900,6 +2905,11 @@ func KnxDatapointSerialize(io *utils.WriteBuffer, value api.PlcValue, formatName
             }
         case formatName == "F16": // REAL
 
+            // Reserved Field (Just skip the bytes)
+            if _err := io.WriteUint8(8, uint8(0x0)); _err != nil {
+                return errors.New("Error serializing reserved field " + _err.Error())
+            }
+
             // Simple Field (value)
             if _err := io.WriteFloat32(16, value.GetFloat32()); _err != nil {
                 return errors.New("Error serializing 'value' field " + _err.Error())
diff --git a/plc4go/internal/plc4go/modbus/readwrite/model/DataItem.go b/plc4go/internal/plc4go/modbus/readwrite/model/DataItem.go
index e2c4b4f..74e5697 100644
--- a/plc4go/internal/plc4go/modbus/readwrite/model/DataItem.go
+++ b/plc4go/internal/plc4go/modbus/readwrite/model/DataItem.go
@@ -295,7 +295,7 @@ func DataItemParse(io *utils.ReadBuffer, dataType string, numberOfValues uint16)
         case dataType == "IEC61131_REAL" && numberOfValues == 1: // REAL
 
             // Simple Field (value)
-            value, _valueErr := io.ReadFloat32(32)
+            value, _valueErr := io.ReadFloat32(true, 8, 23)
             if _valueErr != nil {
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
@@ -305,7 +305,7 @@ func DataItemParse(io *utils.ReadBuffer, dataType string, numberOfValues uint16)
             // Array Field (value)
             var value []api.PlcValue
             for i := 0; i < int(numberOfValues); i++ {
-                _item, _itemErr := io.ReadFloat32(32)
+                _item, _itemErr := io.ReadFloat32(true, 8, 23)
                 if _itemErr != nil {
                     return nil, errors.New("Error parsing 'value' field " + _itemErr.Error())
                 }
@@ -315,7 +315,7 @@ func DataItemParse(io *utils.ReadBuffer, dataType string, numberOfValues uint16)
         case dataType == "IEC61131_LREAL" && numberOfValues == 1: // LREAL
 
             // Simple Field (value)
-            value, _valueErr := io.ReadFloat64(64)
+            value, _valueErr := io.ReadFloat64(true, 11, 52)
             if _valueErr != nil {
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
@@ -325,7 +325,7 @@ func DataItemParse(io *utils.ReadBuffer, dataType string, numberOfValues uint16)
             // Array Field (value)
             var value []api.PlcValue
             for i := 0; i < int(numberOfValues); i++ {
-                _item, _itemErr := io.ReadFloat64(64)
+                _item, _itemErr := io.ReadFloat64(true, 11, 52)
                 if _itemErr != nil {
                     return nil, errors.New("Error parsing 'value' field " + _itemErr.Error())
                 }
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/DataItem.go b/plc4go/internal/plc4go/s7/readwrite/model/DataItem.go
index f283a0e..2cb1ed0 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/DataItem.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/DataItem.go
@@ -155,7 +155,7 @@ func DataItemParse(io *utils.ReadBuffer, dataProtocolId string, stringLength int
         case dataProtocolId == "IEC61131_REAL": // REAL
 
             // Simple Field (value)
-            value, _valueErr := io.ReadFloat32(32)
+            value, _valueErr := io.ReadFloat32(true, 8, 23)
             if _valueErr != nil {
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
@@ -163,7 +163,7 @@ func DataItemParse(io *utils.ReadBuffer, dataProtocolId string, stringLength int
         case dataProtocolId == "IEC61131_LREAL": // LREAL
 
             // Simple Field (value)
-            value, _valueErr := io.ReadFloat64(64)
+            value, _valueErr := io.ReadFloat64(true, 11, 52)
             if _valueErr != nil {
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
diff --git a/plc4go/internal/plc4go/utils/ReadBuffer.go b/plc4go/internal/plc4go/utils/ReadBuffer.go
index 2268e6f..99413bc 100644
--- a/plc4go/internal/plc4go/utils/ReadBuffer.go
+++ b/plc4go/internal/plc4go/utils/ReadBuffer.go
@@ -19,9 +19,10 @@
 package utils
 
 import (
-	"bytes"
-	"github.com/icza/bitio"
-	"math"
+    "bytes"
+    "errors"
+    "github.com/icza/bitio"
+    "math"
 )
 
 type ReadBuffer struct {
@@ -137,18 +138,48 @@ func (rb *ReadBuffer) ReadInt64(bitLength uint8) (int64, error) {
 	return res, nil
 }
 
-func (rb *ReadBuffer) ReadFloat32(bitLength uint8) (float32, error) {
-	rb.pos += uint64(bitLength)
-	uintValue := uint32(rb.reader.TryReadBits(bitLength))
-	res := math.Float32frombits(uintValue)
-	if rb.reader.TryError != nil {
-		return 0, rb.reader.TryError
-	}
-	return res, nil
-}
-
-func (rb *ReadBuffer) ReadFloat64(bitLength uint8) (float64, error) {
-	rb.pos += uint64(bitLength)
+func (rb *ReadBuffer) ReadFloat32(signed bool, exponentBitLength uint8, mantissaBitLength uint8) (float32, error) {
+    bitLength := exponentBitLength + mantissaBitLength
+    if signed {
+        bitLength++
+    }
+	if signed && exponentBitLength == 8 && mantissaBitLength == 23 {
+        rb.pos += uint64(bitLength)
+        uintValue := uint32(rb.reader.TryReadBits(bitLength))
+        res := math.Float32frombits(uintValue)
+        if rb.reader.TryError != nil {
+            return 0, rb.reader.TryError
+        }
+        return res, nil
+    } else if bitLength < 32 {
+        // TODO: Note ... this is the format as described in the KNX specification
+        sign := true
+        var err error
+        if signed {
+            sign, err = rb.ReadBit()
+            if err != nil {
+                return 0.0, errors.New("error reading sign")
+            }
+        }
+        exp, err := rb.ReadInt32(exponentBitLength)
+        if err != nil {
+            return 0.0, errors.New("error reading exponent")
+        }
+        mantissa, err := rb.ReadUint32(mantissaBitLength)
+        // In the mantissa notation actually the first bit is omitted, we need to add it back
+        f := (0.01 * float64(mantissa)) * math.Pow(float64(2), float64(exp))
+        if sign {
+            return -float32(f), nil
+        }
+        return float32(f), nil
+    } else {
+        return 0.0, errors.New("too many bits for float32")
+    }
+}
+
+func (rb *ReadBuffer) ReadFloat64(signed bool, exponentBitLength uint8, mantissaBitLength uint8) (float64, error) {
+    bitLength := 1 + exponentBitLength + mantissaBitLength
+    rb.pos += uint64(bitLength)
 	uintValue := rb.reader.TryReadBits(bitLength)
 	res := math.Float64frombits(uintValue)
 	if rb.reader.TryError != nil {
diff --git a/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec b/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
index b326285..d332ad7 100644
--- a/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
+++ b/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
@@ -437,6 +437,7 @@
         ['V16' INT]
             [simple   int 16 'value']
         ['F16' REAL
+            [reserved uint 8     '0x0']
             [simple   float 4.11 'value']
         ]
         // TODO Not sure how to encode the day in this