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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: LibNoDave will nicht ManyBytes lesen

  1. #1
    Registriert seit
    04.04.2008
    Beiträge
    389
    Danke
    85
    Erhielt 39 Danke für 24 Beiträge

    Standard


    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
    Zitieren Zitieren LibNoDave will nicht ManyBytes lesen  

  2. #2
    Registriert seit
    22.06.2003
    Beiträge
    242
    Danke
    9
    Erhielt 19 Danke für 19 Beiträge

    Standard

    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
    Registriert seit
    27.11.2005
    Ort
    im Osten
    Beiträge
    1.183
    Danke
    141
    Erhielt 271 Danke für 248 Beiträge

    Standard

    Zitat Zitat von Earny Beitrag anzeigen
    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
    Registriert seit
    27.10.2005
    Ort
    Schwäbisch Gmünd
    Beiträge
    5.235
    Danke
    634
    Erhielt 955 Danke für 769 Beiträge

    Standard

    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

    Ein Computer kann das menschliche Gehirn nicht ersetzen. Engstirnigkeit kann unmöglich simuliert werden. (Gerd W. Heyse)

  5. #5
    Registriert seit
    27.11.2005
    Ort
    im Osten
    Beiträge
    1.183
    Danke
    141
    Erhielt 271 Danke für 248 Beiträge

    Standard

    Zitat Zitat von Rainer Hönle Beitrag anzeigen
    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
    Registriert seit
    27.10.2005
    Ort
    Schwäbisch Gmünd
    Beiträge
    5.235
    Danke
    634
    Erhielt 955 Danke für 769 Beiträge

    Standard

    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

    Ein Computer kann das menschliche Gehirn nicht ersetzen. Engstirnigkeit kann unmöglich simuliert werden. (Gerd W. Heyse)

  7. #7
    Earny ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.04.2008
    Beiträge
    389
    Danke
    85
    Erhielt 39 Danke für 24 Beiträge

    Standard

    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
    Registriert seit
    27.10.2005
    Ort
    Schwäbisch Gmünd
    Beiträge
    5.235
    Danke
    634
    Erhielt 955 Danke für 769 Beiträge

    Standard

    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

    Ein Computer kann das menschliche Gehirn nicht ersetzen. Engstirnigkeit kann unmöglich simuliert werden. (Gerd W. Heyse)

  9. #9
    Registriert seit
    31.10.2008
    Beiträge
    7
    Danke
    0
    Erhielt 3 Danke für 3 Beiträge

    Standard

    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
    Geändert von Andreas138 (07.12.2008 um 21:05 Uhr)

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

    Earny (07.12.2008)

  11. #10
    Earny ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.04.2008
    Beiträge
    389
    Danke
    85
    Erhielt 39 Danke für 24 Beiträge

    Standard


    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

Ähnliche Themen

  1. SZL lesen mit LibNoDave
    Von GvOdin im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 29.01.2014, 10:57
  2. Daten lesen aus DB mit libnodave
    Von Proxy im Forum Hochsprachen - OPC
    Antworten: 12
    Letzter Beitrag: 18.09.2013, 07:02
  3. Merker lesen mit Libnodave
    Von Snoopy123123 im Forum Hochsprachen - OPC
    Antworten: 29
    Letzter Beitrag: 14.07.2009, 17:40
  4. MW20 lesen mit LibNoDave
    Von Earny im Forum Hochsprachen - OPC
    Antworten: 8
    Letzter Beitrag: 23.11.2008, 20:36
  5. Mit libnodave subnetztübergreifend lesen?
    Von delphie im Forum Hochsprachen - OPC
    Antworten: 11
    Letzter Beitrag: 03.11.2005, 06:38

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •