-> 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):
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 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;
Ähnlich sieht es übrigens bei der Prozedur 'DoWriteBytes' aus...
Kann das einer der 'Spezi's' bestätigen?
Gruss Cliff