tomlei
Level-2
- Beiträge
- 137
- Reaktionspunkte
- 11
Ich nutze die Bibliothek von Siemens LSQL zum Schreiben und Lesen von Daten aus einem SQL Server.
Die Verbindung habe ich hinbekommen und ich kann Daten schreiben und lesen.
Für das Lesen der Daten gibt es in der Bib den FB DeserializeRows. Dort gibt es Beispiele für das Lesen und Verarbeiten von Integer und String Variablen. Jetzt habe ich versucht dieses zu Erweitern um die Umwandlung von Real Daten (Float Zahlen positiv und negativ).
Vorhandener Code für Integer und String:
Den Code habe ich jetzt versucht damit zu ergänzen:
Allerdings bekomme ich da kein sinnvolles Ergebnis. Als DWord erhalte ich schon Ergebnisse, die nicht dem in der SQL Datenbank gespeicherten Float Wert entspricht. Also ich bekomme irgendwelche "sinnlosen" negativen Werte.
Testweise habe ich in einem anderen FC eine REAL Zahl in ein DWord und wieder zurück umgewandelt - ohne Probleme. Ich gehe momentan davon aus, dass das Problem schon bei der Umwandlung der Bytes vom Array zum DWord besteht. Aber wieso funktioniert die Umwandlung der Byte Daten des Arrays nach Integer und String?
Ich komme hier nicht weiter. Kann mir jemand einen Hinweis geben?
Die Verbindung habe ich hinbekommen und ich kann Daten schreiben und lesen.
Für das Lesen der Daten gibt es in der Bib den FB DeserializeRows. Dort gibt es Beispiele für das Lesen und Verarbeiten von Integer und String Variablen. Jetzt habe ich versucht dieses zu Erweitern um die Umwandlung von Real Daten (Float Zahlen positiv und negativ).
Vorhandener Code für Integer und String:
Code:
REGION --> use case deserializaition
//IF - ELSIF case selection on the columName
IF #columns[#tempColumnLoopCounter].columnName = 'entityName' THEN
REGION example String
//move Bytes to temporary array
MOVE_BLK(IN := #tdsTelegramArray[#statByteAddressCounter],
COUNT := UDINT_TO_UINT(#tempValueLength),
OUT => #tempByteCharArray[0]);
//convert BYTE array to STRING
#rows[#tempRowLoopCounter].entityName := "LSql_BytesToString"(columnType := #columns[#tempColumnLoopCounter].columnType, byteArray := #tempByteCharArray, numberOfBytes := UDINT_TO_UINT(#tempValueLength));
END_REGION example String
ELSIF #columns[#tempColumnLoopCounter].columnName = 'entityValueInteger' THEN
REGION example INT
//merge next two BYTE to WORD and then convert to INT
#rows[#tempRowLoopCounter].entityValueInteger := WORD_TO_INT("LGF_MergeBytesToWord"(byte0 := #tdsTelegramArray[#statByteAddressCounter], byte1 := #tdsTelegramArray[#statByteAddressCounter + 1]));
END_REGION example Int
ELSIF #columns[#tempColumnLoopCounter].columnName = 'entityValueString' THEN
REGION example String
//move Bytes to temporary array
MOVE_BLK(IN := #tdsTelegramArray[#statByteAddressCounter],
COUNT := UDINT_TO_UINT(#tempValueLength),
OUT => #tempByteCharArray[0]);
//convert BYTE array to STRING
#rows[#tempRowLoopCounter].entityValueString := "LSql_BytesToString"(columnType := #columns[#tempColumnLoopCounter].columnType, byteArray := #tempByteCharArray, numberOfBytes := UDINT_TO_UINT(#tempValueLength));
END_REGION example String
ELSE
//column name is not handled by user program case
#statWarning := TRUE;
//check if there has not been any other major error yet
IF (#statStatus = #ERR_NOERROR) THEN
#statStatus := #ERR_COULMNS_COLUMNNOTEXISTING;
END_IF;
END_IF;
END_REGION --> use case deserializaition
Den Code habe ich jetzt versucht damit zu ergänzen:
Code:
ELSIF #columns[#tempColumnLoopCounter].columnName = 'entityValueFloat' THEN
REGION example REAL
//merge next two BYTE to DWORD and then convert to REAL
#rows[#tempRowLoopCounter].entityValueFloat := DWORD_TO_REAL("LGF_MergeBytesToDWord"(byte3:=#tdsTelegramArray[#statByteAddressCounter+3], byte2:=#tdsTelegramArray[#statByteAddressCounter + 2], byte1:=#tdsTelegramArray[#statByteAddressCounter + 1], byte0:=#tdsTelegramArray[#statByteAddressCounter]));
END_REGION example REAL
Allerdings bekomme ich da kein sinnvolles Ergebnis. Als DWord erhalte ich schon Ergebnisse, die nicht dem in der SQL Datenbank gespeicherten Float Wert entspricht. Also ich bekomme irgendwelche "sinnlosen" negativen Werte.
Testweise habe ich in einem anderen FC eine REAL Zahl in ein DWord und wieder zurück umgewandelt - ohne Probleme. Ich gehe momentan davon aus, dass das Problem schon bei der Umwandlung der Bytes vom Array zum DWord besteht. Aber wieso funktioniert die Umwandlung der Byte Daten des Arrays nach Integer und String?
Ich komme hier nicht weiter. Kann mir jemand einen Hinweis geben?