Function Real2Bytes (Rohdata, Name, n, Wert )
Dim arrSend, strSend
Dim i, j, k, Anz, Prefix
Dim sign : sign = 0 ' Vorzeichen
Dim Exp : Exp = 127 ' Offset für Single entspr. IEEE 754
Dim dblFract : dblFract = 1
Dim arrResult : arrResult = Array (0,0,0,0)
Dim invar
' konstanten vorbesetzen
Anz = n-2 'Position von Variable
Prefix = Name 'Prefix für die Variabelen aus denen gelesen wird
strSend = Rohdata 'Name der Rohdatenvariable
' Bytearray via Rohdatenvariable synchron lesen
arrSend = HMIRuntime.Tags(strSend).Read (1)
' Variabelen in Rohdaten kopieren
'For k = 0 To (Anz - 1)
' Initialisierungswerte vorbelegen
sign = 0
Exp = 127
dblFract = 1
arrResult = Array (0,0,0,0)
' Variabele einlesen
invar = Wert'+0.0000001'HMIRuntime.Tags(prefix & k).Read (1) '123.5
' invar = Wert'-0.0000001
'==============================================================================
' IEEE 754 Single (Float32) in ein Byte-Array entspr. der internen
' PLC-Darstellung wandeln.
' BEACHTE! Denormalisierte Zahlen werden (noch) nicht unterstützt.
'==============================================================================
If invar <> 0 Then
If invar < 0 Then invar = invar * -1 : sign = 1
' Normalisieren
Do While invar >= 2 : invar = invar / 2 : Exp = Exp + 1 : Loop
Do While invar < 1 : invar = invar * 2 : Exp = Exp -1 : Loop
If (Exp And 1) = 0 Then invar = invar - 1
arrResult(0) = sign * 128 + Exp \ 2
For i=1 To 3
For j=7 To 0 Step -1
If invar > dblFract Then
arrResult(i) = arrResult(i) + 2^j
invar = invar - dblFract
End If
dblFract = dblFract/2
Next
Next
' End If
' Temporäres Array an Rohdaten übergeben
For i = 0 To 3
arrSend((Anz * 4) + i) = arrResult(i)
'HMIRuntime.Trace "Wert_" & ((k * 4) + i) &" : " & arrResult(i) & vbCrLf
Next
' Next
' Bytearray via Rohdatenvariable asynchron (direkt) schreiben
HMIRuntime.Tags(strSend).Write arrSend
End Function