Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Page 1 of 2 12 LastLast
Results 1 to 10 of 11

Thread: LibNoDave will nicht ManyBytes lesen

  1. #1
    Join Date
    04.04.2008
    Posts
    422
    Danke
    91
    Erhielt 39 Danke für 24 Beiträge

    Default


    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
    Reply With Quote Reply With Quote LibNoDave will nicht ManyBytes lesen  

  2. #2
    Join Date
    22.06.2003
    Posts
    244
    Danke
    9
    Erhielt 19 Danke für 19 Beiträge

    Default

    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.

  3. #3
    Join Date
    27.11.2005
    Location
    im Osten
    Posts
    1,186
    Danke
    141
    Erhielt 271 Danke für 248 Beiträge

    Default

    Quote Originally Posted by Earny View Post
    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 ?
    Es ist nicht schwierig, mit noch nicht erreichten Zielen zu Leben; schwierig ist, ohne Ziele zu Leben !
    (Günther Kraftschik)

  4. #4
    Join Date
    27.10.2005
    Location
    Schwäbisch Gmünd
    Posts
    5,646
    Danke
    716
    Erhielt 1,001 Danke für 813 Beiträge

    Default

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

    Die Kritik an anderen hat noch niemandem die eigene Leistung erspart (Noël Coward)

  5. #5
    Join Date
    27.11.2005
    Location
    im Osten
    Posts
    1,186
    Danke
    141
    Erhielt 271 Danke für 248 Beiträge

    Default

    Quote Originally Posted by Rainer Hönle View Post
    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;
        }
    Es ist nicht schwierig, mit noch nicht erreichten Zielen zu Leben; schwierig ist, ohne Ziele zu Leben !
    (Günther Kraftschik)

  6. #6
    Join Date
    27.10.2005
    Location
    Schwäbisch Gmünd
    Posts
    5,646
    Danke
    716
    Erhielt 1,001 Danke für 813 Beiträge

    Default

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

    Die Kritik an anderen hat noch niemandem die eigene Leistung erspart (Noël Coward)

  7. #7
    Earny is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    04.04.2008
    Posts
    422
    Danke
    91
    Erhielt 39 Danke für 24 Beiträge

    Default

    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:
    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, 464, buf)
    txtRes1.Text = res
    txtLesen.Text = GetTickCount - Zeit
    End If
    End Sub

    Gruß
    Earny

  8. #8
    Join Date
    27.10.2005
    Location
    Schwäbisch Gmünd
    Posts
    5,646
    Danke
    716
    Erhielt 1,001 Danke für 813 Beiträge

    Default

    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?
    Rainer Hönle
    DELTA LOGIC GmbH

    Die Kritik an anderen hat noch niemandem die eigene Leistung erspart (Noël Coward)

  9. #9
    Join Date
    31.10.2008
    Posts
    7
    Danke
    0
    Erhielt 3 Danke für 3 Beiträge

    Default

    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
    Last edited by Andreas138; 07.12.2008 at 21:05.

  10. Folgender Benutzer sagt Danke zu Andreas138 für den nützlichen Beitrag:

    Earny (07.12.2008)

  11. #10
    Earny is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    04.04.2008
    Posts
    422
    Danke
    91
    Erhielt 39 Danke für 24 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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

Similar Threads

  1. Libnodave Strings schreiben/lesen
    By Hocheck in forum Hochsprachen - OPC
    Replies: 14
    Last Post: 04.12.2017, 15:09
  2. SZL lesen mit LibNoDave
    By GvOdin in forum Simatic
    Replies: 4
    Last Post: 29.01.2014, 10:57
  3. libnodave s7-1200 DB lesen
    By bommel in forum Hochsprachen - OPC
    Replies: 19
    Last Post: 11.11.2010, 18:21
  4. MW20 lesen mit LibNoDave
    By Earny in forum Hochsprachen - OPC
    Replies: 8
    Last Post: 23.11.2008, 20:36
  5. Libnodave Daten lesen/schreiben
    By Acidic in forum Simatic
    Replies: 4
    Last Post: 02.06.2008, 08:32

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •