Kleiner Fehler in NoDaveComponent.pas

marcengbarth

Level-1
Beiträge
226
Reaktionspunkte
8
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich bin gerade etwas am rumspielen und habe einen kleinen Fehler in NoDaveComponent.pas gefunden.

Da fehlt ein Aufruf von DoOnRead;.

Code:
//Read the specified Data from the PLC into the buffer.
//~param Area Requested PLC-area.
//~param DB Number of requested datablock. Only used, if reading from Datablocks in the PLC.
//~param Start Start-address of the requested data within the address-range of the PLC.
//~param Size Length of the requested PLC-data in bytes.
//~param Buffer Pointer to the buffer for PLC-data. The internal buffer is used, if Nil (default).
procedure TNoDave.ReadBytes(Area: TNoDaveArea; DB, Start, Size: Integer; Buffer: Pointer);
begin
  If not Assigned(Buffer) then
  begin
    FArea:=Area;
    FDBNumber:=DB;
    FBufOffs:=Start;
    FBufLen:=Size;
    ReadBytes(Buffer);
  end else begin
    DoReadBytes(Area, DB, Start, Size, Buffer);
    DoOnRead; // -> hat gefehlt
  end;
end;
 
Zuletzt bearbeitet:
Naja, wenn schon, dann nach dem "end;", damit das bei allen Leseereignissen aufgerufen wird.

Aber das OnRead-Ereignis ist nur für den Thread, die die quick'n'dirty Geschichte nutzen! ;)
 
Weder vor noch hinter dem "end;" gehört das hin, da DoOnRead nur aufgerufen werden soll, wenn die Komponente selbständig im extra Thread das Lesen von der SPS durchführt (quick and dirty ;)), und dann wird das aus dem Thread heraus erledigt. Wenn die Methode ReadBytes aus dem Anwendungsprogramm heraus aufgerufen wird, dann ist das Event überflüssig, da die Anwendung nach dem Aufruf eh schon weiß, daß von der SPS was gelesen wurde ...


Gruß Axel
 
Ok, das verstehe ich zwar nicht so ganz...

Mir ist aufgefallen, dass wenn ich mit ReadBytes(daveDB, usw.) arbeite, dass das Event OnRead aufgerufen wird wenn ich mit dem internen Buffer arbeite. Deklariere ich mir jetzt z.B. Buf_DB1: Pointer; und benutze diesen, wird das Event nicht aufgerufen.

Wenn die Events nur für den internen Thread da sein sollen, dann dürfte es nicht aufgerufen werden, wenn ich die "große" Version von ReadBytes() mit dem internen Buffer nutze. Oder sehe ich das falsch?
 
Zurück
Oben