www.bimminger.at

Tipps / Programmieren

Programmieren

Visual Basic / PRODAVE und Übertragung von Gleitkommazahlen (Float/Single)


Bei der Datenübertragung zwischen PC und PRODAVE S7 ist die unterschiedliche High- Lowbyte Anordnung bei Datenworten zu beachten. Während in der PC-Welt meist die gebräuchliche Intel-Notation verwendet wird, setzt das Siemens-Produkt auf STEP5.

Das folgende Beispiel ist erfolgreich im Einsatz und betrifft eine Siemens Simatic Prodave/MPI S7-Mini Steuererung. Dieser Programmauszug soll nur die allgemeine Vorgehensweise veranschaulichen.

Die Datenübertragung ohne Umwandlung würde die 4 Byte einer Gleitkommazahl falsch übertragen und zu unerklärlichen Zahlen führen. Um die 4 Byte Gleitkommawerte dennoch richtig zu übertragen, kann man mit folgender Funktion arbeiten:

'Funktion um standard-Float Werte (Single) in Siemens-Floatwerte umzuwandeln
'
'@version   2006-01-24
'@author    Andreas Bimminger 
'@return    Float-Wert für Prodave als Long

Private Function stdFloatToProdave(floatwert As Single) As Long
	Dim singleToProdaveFloat As Single
	Dim prodaveFloat As Long

	singleToProdaveFloat = floatwert
	float_to_gp singleToProdaveFloat, prodaveFloat
	stdFloatToProdave = prodaveFloat
End Function


Diese Funktion benötigt zusätzlich noch die DLL "komfort.dll". Im gesamten Programmkontext der Übertragung kann dies folgendermaßen aussehen:

'Funktionen aus Prodave verlinken
Private Declare Function load_tool Lib "w95_s7m" (ByVal no As Byte, ByVal name As String, adr As structPlcAdrTable) As Long
Private Declare Function db_write Lib "w95_s7m" (ByVal dbno As Long, ByVal dwno As Long, amount As Long, buffer As structPcToSps) As Long
Private Declare Function unload_tool Lib "w95_s7m" () As Long
Declare Sub float_to_gp Lib "komfort.dll" (s As Single, gp As Long)

'Struct für Write
Private Type structPcToSps
	floatWert As Long
	StatusA As Byte
	StatusB As Byte
End Type

'Adressliste der angeschlossenen Teilnehmer
Private Type structPlcAdrTable
	adr As Byte             'Stationsadresse Teilnehmer
	segmentId As Byte       'Segment-ID des Teilnehmers
	slotNo As Byte          'Steckplatznummer des Teilnehmers
	rackNo As Byte          'Baugruppenträgernummer des Teilnehmers
End Type

'Funktion um standard-Float Werte (Single) in Siemens-Floatwerte umzuwandeln
'
'@version   2006-01-24
'@author    Andreas Bimminger 
'@return    Float-Wert für Prodave als Long

Private Function stdFloatToProdave(floatwert As Single) As Long
	Dim singleToProdaveFloat As Single
	Dim prodaveFloat As Long

	singleToProdaveFloat = floatwert
	float_to_gp singleToProdaveFloat, prodaveFloat
	stdFloatToProdave = prodaveFloat
End Function

'Eigentliche Übertragung
'
'@version   2006-01-20
'@author    Andreas Bimminger 

Public Function transfer
	Dim res As Long
	Dim dbno As Long
	Dim dwno As Long
	Dim amount As Long
	Dim adresse As structPlcAdrTable
	Dim daten As structPcToSps

	'Hier die notwendigen Adressparameter eintragen
	adresse.adr = 2
	adresse.segmentId = 0
	adresse.slotNo = 2
	adresse.rackNo = 0
	'verbindung herstellen
	res = load_tool(1, "S7Online", adr)
	If res <> 0 Then
		dbno = 80      'Adressierung des Datenbausteins Bausteins
		dwno = 0       'Beginnend bei Byte 0
		amount = 3     'Anzahl der zu übertragenden Datenworte
		'schreiben
		res = db_write(dbno, dwno, amount, werte)
		If res <> 0 Then
			MsgBox("Fehler")
		End If
		'verbindung lösen
		res = unload_tool()
	Else
		MsgBox("Fehler")
	End If
End Function


Weitere Informationen findet man möglicherweise in der Doku.


Um einen Diskussionsbeitrag zu posten müssen Sie eingeloggt sein.