LibNoDave will nicht ManyBytes lesen

Earny

Level-1
Beiträge
422
Reaktionspunkte
38
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
habe wieder mal ein Problem mit LibNoDave. Es gibt eine Methode "readManyBytes", die sollte doch in der Lage sein, z. B. 1000 Integerwerte aus einem Datenbaustein zu lesen. Das klappt aber nicht. Es werden nur 231 der 1000 Integerwerte gelesen.
Ich teste mit Accontrol.
Der Test mit einer wirklichen CPU führt zu einem ähnlichen Ergebnis. Es scheint nicht möglich zu sein, mit "readManyBytes" viele Bytes zu lesen. Mir ist auch aufgefallen, dass "readBytes" die gleichen Argumente besitzt wie "readManyBytes".
Ich habe auch hier im Forum nach diesem Thema Ausschau gehalten, bin aber aus den Antworten nicht schlau geworden.

Hier der Code.
Private Sub btnDatenLesen_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnDatenLesen.Click
Dim Zeit As Integer
Zeit = GetTickCount
If fds.rfd > 0 Then
res = dc.readManyBytes(libnodave.daveDB, 1, 0, 2000, buf)
'res = dc.readBytes(libnodave.daveDB, 1, 0, 2000, buf)
txtLesen.Text = GetTickCount - Zeit
End If
End Sub


Gruß
Earny
 
Hallo
die einzelnen Längen genau habe ich so auch nicht im Kopf, aber grundsätzlich ist das bei 256Bytes 'abgeschnitten'. Die Header geben auch nur ein Längen-Byte (0-255)her, abzüglich der 256 geht der Protokoll'aufwand' da von der Nutzlast ab.

Mit readmany... habe ich so zwar eigentlich noch nicht probiert (ob das vielleicht denn mehrere Verbindungen nacheinander automatisch starten sollte ?), um aber längere Sequenzen aus dem DB zu holen benutze ich deswegen aber von Anfang an immer mehrere Aufrufe nacheinander.
Dto. ist ja auch bei Kommunikation generell - die Tabellen haben alle nur ein Längenbyte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
habe wieder mal ein Problem mit LibNoDave. Es gibt eine Methode "readManyBytes", die sollte doch in der Lage sein, z. B. 1000 Integerwerte aus einem Datenbaustein zu lesen. Das klappt aber nicht. Es werden nur 231 der 1000 Integerwerte gelesen.
Ich teste mit Accontrol.
Der Test mit einer wirklichen CPU führt zu einem ähnlichen Ergebnis. Es scheint nicht möglich zu sein, mit "readManyBytes" viele Bytes zu lesen. Mir ist auch aufgefallen, dass "readBytes" die gleichen Argumente besitzt wie "readManyBytes".

Dein Zielpuffer(buf) ist aber ausreichend groß ?

Was sagt der Rückgabewert von ReadmanyBytes ?
 
231 Worte sind 462 Bytes, und dies ist die maximale PDU-Nutzdatengröße bei einer 400er CPU. Splittet libnodave automatisch die Anfrage?
 
231 Worte sind 462 Bytes, und dies ist die maximale PDU-Nutzdatengröße bei einer 400er CPU. Splittet libnodave automatisch die Anfrage?

in nodave.c stehts

Code:
while (len>0) {
    if (len>dc->maxPDUlength-18) readLen=dc->maxPDUlength-18; else readLen=len;
    res=daveReadBytes(dc,area, DBnum, start, readLen, pbuf);
    if (res!=0) return res;
    len-=readLen;
    start+=readLen;
    pbuf+=readLen;
    }
 
Hallo MW,

habe
Dim buf(2000) As Byte
formweit deklariert.

Der Rückgabewert = 0. Das habe ich auch noch getestet.


hallo Rainer,
das mit dem Splitten versteh ich nicht. readManyBytes sollte doch solange Daten aus dem Datenbaustein lesen, bis es am Ende angekommen ist. Ich habe auch nochmal im Datenbaustein nachgesehen. Da sind tatsächlich 1000 Integerwerte drin.

Dann habe ich nochmal mit readBytes zusammen mit Accontrol getestet. readBytes liest 462 Bytes. Wenn ich 464 Bytes anfordere gibt es einen Fehler. Der Rückgabewert ist dann "10".

Code:
[SIZE=3][COLOR=#0000ff][SIZE=2]Private[/SIZE][/COLOR][/SIZE] [COLOR=#0000ff]Sub[/COLOR] btnDatenLesen_Click([COLOR=#0000ff]ByVal[/COLOR] sender [COLOR=#0000ff]As[/COLOR] System.Object, _
[COLOR=#0000ff]ByVal[/COLOR] e [COLOR=#0000ff]As[/COLOR] System.EventArgs) [COLOR=#0000ff]Handles[/COLOR] btnDatenLesen.Click
[COLOR=#0000ff]Dim[/COLOR] Zeit [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]Integer[/COLOR]
Zeit = GetTickCount
[COLOR=#0000ff]If[/COLOR] fds.rfd > 0 [COLOR=#0000ff]Then[/COLOR]
[COLOR=#008000]'res = dc.readManyBytes(libnodave.daveDB, 1, 0, 2000, buf)[/COLOR]
res = dc.readBytes(libnodave.daveDB, 1, 0, 464, buf)
txtRes1.Text = res
txtLesen.Text = GetTickCount - Zeit
[COLOR=#0000ff]End[/COLOR] [COLOR=#0000ff]If[/COLOR]
[COLOR=#0000ff]End[/COLOR] [COLOR=#0000ff]Sub[/COLOR]


Gruß
Earny
 
Zu Zeiten von VB6 durfte man nicht buf sondern musste buf(0) übergeben. Bin aber bei libnodave und .net nicht auf dem aktuellsten Stand.
Was bedeutet eigentlich 10?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Earny,

ich habe mal ausprobiert, ob der ManyBytes-Aufruf bei mir funktioniert:

Wenn ich die 1000 Int-Werte auslese, und sie dann mit "dc.getU16"
weiterverabeiten will, sind alle Werte 0.
Wenn ich die Werte allerdings mittels "daveGetU16from()" verarbeite,
werden sie alle korrekt angezeigt. Die Get..from-Funktion muss allerdings vorher deklariert worden sein.

Ich habe folgenden Code verwendet, um die ausgelesenen Werte in einer ListBox anzuzeigen:

Code:
ListBox1.Items.Clear()
        Dim counter As Integer
        res = dc.readManyBytes(libnodave.daveDB, 1, 0, 2000, buf)
        For counter = 0 To 2000 Step 2
            ListBox1.Items.Add(counter & " " & daveGetU16from(buf(counter)))
        Next
    End Sub
 
Zuletzt bearbeitet:
Hallo Andreas,
ja, mit

"daveGetS16from(buf(2 * i))"

funktioniert die Sache. Ich lasse den Index mit der Schrittweite 1 von 0 bis 999 laufen.
Die 1000 Integerwerte schreibe ich anschließend in eine Excel-Tabelle und kann dort das Ergebnis leicht kontrollieren.

Gruß
Earny
 
Andreas138;171118 Wenn ich die 1000 Int-Werte auslese schrieb:
Das ist Zufall! Da könnte jeder Scheiß drin stehen! dc.getU16() ließt vom internen Puffer der Struktur auf die dc zeigt. Dessen Größe ist so gewählt, daß ein einzelnes Paket (Anfrage/Antwort/Schreibdaten) immer darin Platz hat, aber nicht mehrere.
Bei daveReadManyBytes mußt du deinen eigenen Puffer angeben. Das Lesen geht dann so:
Code:
Puffer von dc-> Dein Puffer:
"xxxxx"      "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
"ABCDE"      "ABCDExxxxxxxxxxxxxxxxxxxxxxxx"
"FGHIJ"      "ABCDEFGHIJxxxxxxxxxxxxxxxxxxx"
"KLMNO"      "ABCDEFGHIJKLMNOxxxxxxxxxxxxxx"
usw.
daveGetU16() würde nun beim ersten Aufruf den Wert 256*ord('K')+ord('L') liefern und den internen Lesezeiger auf das M richten
Wenn ich die Werte allerdings mittels "daveGetU16from()" verarbeite,
werden sie alle korrekt angezeigt.
Kein Wunder. Dieser Funktion kannst du ja auch sagen , daß sie von DEINEM Puffer liest...
 
Zurück
Oben