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.
Mag. Andreas Bimminger; Raiffeisenstrasse 6; 2326 Maria Lanzendorf; Österreich; Tel.: +43/699/11685959
Sie befinden sich auf https://www.bimminger.at/
im Pfad: Tipps / ProgrammierenErstellt: 2006-02-07