Fehler in LibNoDave- Komponente (Delphi)?

Cliff

Level-1
Beiträge
162
Reaktionspunkte
15
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

ich beschäftige mich nun seit zwei Tagen intensiver mit NoDave, bzw. dem Delphi 'Wrapper'.
Ich habe versucht den Inhalt eines DB's aus einer 300er Steuerung ausgelesen und musste feststellen das ab einer Grösse von ca. 220 Bytes die Kommunikation nicht mehr funktioniert, bzw. NoDave Fehlermeldungen ausspuckt (PDU- Size).
Nun habe ich mir die Komponente einmal genauer angeschaut und bin der Meinung hier einen Schreibfehler entdeckt zu haben. Ich habe diesen einmal Testweise für das Lesen von Bytes in meinem Sinne geändert und es schaut so aus als wenn die Komponente nun funktioniert (Lesen von ca. 1kByte):

Code:
procedure TNoDave.DoReadBytes(Area: TNoDaveArea; DB, Start, Size: Integer; Buffer: Pointer);
var
  Index, Length, MaxLen: Integer;
  StartTime: Cardinal;
begin
  Index:=0;
  StartTime:=GetTickCount;
  MaxLen:=MaxPDUData;
  While (Index < Size) and (MaxLen > 0) do
  begin
    Length:=(Size - Index);
    If Length > MaxLen then Length:=MaxLen;
    try
      LockNoDave.Enter;
     // FLastError:=daveReadBytes(DaveConn, AreaCode(Area), DB, Index+Start, Size, Pointer(Integer(Buffer) + Index));
      FLastError:=daveReadBytes(DaveConn, AreaCode(Area), DB, Index+Start, Length, Pointer(Integer(Buffer) + Index));
    except
      On E: Exception do DoOnError('Error in function TNoDave.DoReadBytes: ' + E.Message);
    end;
    LockNoDave.Leave;
    Inc(Index, Length);
  end;
  try
    FCycleTime:=GetTickCount - StartTime;
  except
  end;
end;
Für mich sieht es so aus als wenn in der Zeile 'daveReadBytes' vergessen wurde die berechnete PDU- Size einzutragen (Length). Stattdessen wird als Parameter die Grösse des 'gesamt' zu lesenden Blockes angelegt (Size). Dieses quittiert NoDave dann aber später mit Fehler (Wenn der Block grösser als die PDU- Size wird).

Ähnlich sieht es übrigens bei der Prozedur 'DoWriteBytes' aus...

Kann das einer der 'Spezi's' bestätigen?

Gruss Cliff
 
Ich denke, du hast Recht. Ich benutze noch die vorherige Version, da sah die Funktion doReadBytes ein ganz klein wenig anders aus, aber dort war Length eingetragen, nicht Size!
 
Zurück
Oben