Sub OnClick(ByVal Item)
' REAL-Werte an Rohdatenblock übergeben und in SPS-Schreiben
' von mortontower, mit freundlicher Unterstützung von Ulri
' es werden die in Anz angegebenen Variabelen übergeben
'lokale VB-Variablen deklarieren als Variant
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 = HMIRuntime.Tags("Anzahl").Read '1 'Anzahl von Variabelen
Prefix = "RealWert_" 'Prefix für die Variabelen aus denen gelesen wird
strSend = "RohDatenReal" 'Name der Rohdatenvariable
' Bytearray via Rohdatenvariable synchron lesen
arrSend = HMIRuntime.Tags(strSend).Read (1)
'Prüfen ob Ergebnis auch ein Array ist
If VarType(arrSend) < vbArray Then
' Hier erfolgt eine Fehlerbahandlung
MsgBox " kein Array in der Variable"
Exit Sub
End If
' Grenzen abfragen, nicht mehr als 400 Bytes im Rohdatum
If Anz < 1 Then Anz = 1
If Anz > 100 Then Anz = 100
' 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 = HMIRuntime.Tags(prefix & k).Read (1) '123.55
'==============================================================================
' 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((k * 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 Sub