# LibNoDave will nicht ManyBytes lesen



## Earny (6 Dezember 2008)

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
> ...


 

Gruß
Earny


----------



## tobias (7 Dezember 2008)

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.


----------



## MW (7 Dezember 2008)

Earny schrieb:


> 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 ?


----------



## Rainer Hönle (7 Dezember 2008)

231 Worte sind 462 Bytes, und dies ist die maximale PDU-Nutzdatengröße bei einer 400er CPU. Splittet libnodave automatisch die Anfrage?


----------



## MW (7 Dezember 2008)

Rainer Hönle schrieb:


> 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


```
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;
    }
```


----------



## Rainer Hönle (7 Dezember 2008)

Tja, dann muss wohl res != 0 sein. Sonst würde die Schleife ja bis zum Ende (= 2000 Bytes gelesen) ausgeführt.


----------



## Earny (7 Dezember 2008)

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".


```
[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


----------



## Rainer Hönle (7 Dezember 2008)

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?


----------



## Andreas138 (7 Dezember 2008)

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:


```
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
```


----------



## Earny (7 Dezember 2008)

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


----------



## Zottel (9 Dezember 2008)

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:
> 
> ```
> ...


----------

