ProDave mit VB

andrej_f

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum !

Ich verwende Prodave 6.0 mit VisualBasic 6.0 und habe ein Problem mit der Prodave-funktion "gp_2_float_ex6".
So habe ich die Funktion deklariert:
Code:
Declare Function gp_2_float_ex6 Lib "Prodave6.dll" (ByVal gp As Long, pieee As Single) As Long
Lesen von 4 Bytes mit der Funktion "field_read_ex6". pReadBuffer ist Bytearray.
Code:
erg = field_read_ex6(Asc("d"), vDBnr, vByte, Amount, BufLen, pReadBuffer(0), pDatLen)
Das Ergebnis gebe ich direkt an "gp_2_float_ex6" weiter.
Code:
Dim sng As Single
erg = gp_2_float_ex6(pReadBuffer(0), sng)
Das Ergebnis stimmt aber überhaupt nicht. Als Rückgabewert erhalte ich zwar eine Gleitkommazahl, die hat aber den falschen Wert.

Vielleicht hat das schon mal jemand gemacht. Ich wäre für jede Hilfe dankbar.

lg Andrej
 
Durch die ByVal-Übergabe wird das erste Byte in eine Long gewandelt und dieses übergeben. Das kann so nicht funktionieren.
Ich würde diese Funktion empfehlen:
Code:
Public Declare Sub MemMove Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbMove As Long)

Aufruf dann mit:
Code:
Dim sng As Single
MemMove sng, pReadBuffer(0), 4
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich arbeite jetzt seid 2 Jahren mit Prodave 5.5 und VB.


Code:
  Dim Temp_druck as Single
  StartDW = 141
  MyError = db_read(ProzessDB, StartDW, AnzahlDW_Druck, S7_RETVAL(0))
  Call FehlerCodeWandeln(MyError)
  Call gp_to_float(S7_RETVAL(0), TEMP_Druck)

das wäre der Aufruf für auslesen mit Wandlung dannach.

Hier nochmal die Deklarationen. Ich weiss leider nicht wie die Datentypen deklariert werden müssen bei dem neuen Prodave. Da liegt aber auf jedenfall dein Fehler.

Code:
Declare Function db_read Lib "w95_s7.dll" (ByVal Db As Long, ByVal dw As Long, anz As Long, Value As Integer) As Long
Declare Sub gp_to_float Lib "komfort.dll" (gp As Integer, S As Single)

mfg Bossi
 
Hallo!
Ich benutze diese Prodave-Funktionen nicht.Mir erscheint das auch etwas seltsam das man bei "gp_2_ieee_ex6" den Quellwert als long angeben muss. Hier mal ein Beispiel wie man das machen könnte:

Public Sub byte2sng(Buffer() As Byte, Startbyte As Integer, Dest As Single)
Dim temp(1 To 4) As Byte
temp(1) = Buffer(Startbyte + 3)
temp(2) = Buffer(Startbyte + 2)
temp(3) = Buffer(Startbyte + 1)
temp(4) = Buffer(Startbyte)
CopyMemory Dest, temp(1), 4

End Sub

Aufgerufen wird das dann so:
Call byte2sng(readbuffer,0,Ausgabe)

readbuffer = Dein Bytearray mit den ausgelesenen Daten

Die CopyMemory-API muss natürlich auch noch deklariert sein.

Gruß Ronnie
 
Hallo !
Hier nochmal die Deklarationen. Ich weiss leider nicht wie die Datentypen deklariert werden müssen bei dem neuen Prodave. Da liegt aber auf jedenfall dein Fehler.
Ja, der Meinung bin ich auch. Ich habe schon alle möglichen Datentyp-Kombinationen für die Deklaration durchprobiert aber leider ohne Erfolg. In der Prodave-Doku ist zu lesen, das für die Parameter Unsigned-Datentypen zu verwenden sind, vielleicht liegt hier das Problem da VB ja ansich keine Unsigned-Datentypen unterstützt.
In der VB-Demoanwendung welche mit Prodave geliefert wird ist diese Funktion auch nicht eingebunden ...
Trotzdem Danke für die Hilfe.

lg Andrej
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ronnie.b !

Diese Funktion (gp_2_float_ex6) kopiert nicht nur einfach den Inhalt sondern führt auch Berechnungen aus. Im Buffer liegt eine Gleitkommazahl nach IEEE 754 und diese ist in eine VB-Gleitkommazahl zu wandeln.

lg Andrej

Hallo!
Ich benutze diese Prodave-Funktionen nicht.Mir erscheint das auch etwas seltsam das man bei "gp_2_ieee_ex6" den Quellwert als long angeben muss. Hier mal ein Beispiel wie man das machen könnte:

Public Sub byte2sng(Buffer() As Byte, Startbyte As Integer, Dest As Single)
Dim temp(1 To 4) As Byte
temp(1) = Buffer(Startbyte + 3)
temp(2) = Buffer(Startbyte + 2)
temp(3) = Buffer(Startbyte + 1)
temp(4) = Buffer(Startbyte)
CopyMemory Dest, temp(1), 4

End Sub

Aufgerufen wird das dann so:
Call byte2sng(readbuffer,0,Ausgabe)

readbuffer = Dein Bytearray mit den ausgelesenen Daten

Die CopyMemory-API muss natürlich auch noch deklariert sein.

Gruß Ronnie
 
Hallo!
Welche Berechnungen führt die denn aus??
Wenn ich das richtig sehe wird doch nur ein S7-Realwert in ein VB-Singlewert gewandelt und das funktioniert wie ich schon geschrieben habe.

Ronnie
 
Hallo ronnie.b !

Da habe ich mich jetzt von der Prodave-Doku in die Irre führen lassen. Ich habe das so interpretiert, dass die Gleitkommazahlen auf der S7 ein anderes Format haben als die Gleitkommazahlen im VB. Natürlich funktioniert es nach deiner Anleitung bestens ! Vielen Dank nochmals. Das Problem ist hiermit gelöst.

lg Andrej

Hallo!
Welche Berechnungen führt die denn aus??
Wenn ich das richtig sehe wird doch nur ein S7-Realwert in ein VB-Singlewert gewandelt und das funktioniert wie ich schon geschrieben habe.

Ronnie
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!
Kein Problem. Ich hatte das Problem ja schließlich auch schon :)
Das Format bei der S7 ist soweit anders, das die Bytes einfach nur verdreht sind. sprich von den beiden Datenwörtern des Real-wertes sind immer High und Low-Byte vertauscht. Das ist übrigens bei Integer-Werten auch so. da müssen auch die beiden Bytes im VB getauscht werden.

Dann mal noch einen schönen Restarbeitstag :)
Ronnie
 
Zurück
Oben