Libnodave unterschiedliche Datenbereiche parallel auslesen

Grubba

Level-1
Beiträge
425
Reaktionspunkte
88
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe folgendes Problem:

Ich möchte mit Libnodave zyklisch aus einer S7 Daten auslesen, diese liegen aber in sowohl in DBs, als auch in Merkern etc.

Verwendet wird Delphi.

Wenn ich es richtig verstanden haben, wird in der Property Area der Datenbereich angegeben, aus dem ausgelesen werden soll. So müßte ich doch theoretisch immer zwischen Area=DaveDB und Area=DaveFlags wechseln, um die jeweiligen Werte zu erhalten.

Wenn ich jetzt im Ereignis OnRead zwischen den Bereichen switche, funktioniert das aber nicht.

Code:
procedure TForm1.NoDave1Read(Sender: TObject);
 
// je nach datenbereich auslesen
IF NoDave1.Area = DaveDB    then NoDave1.GetFloat(MyDbAdress);
IF NoDave1.Area = DaveFlags then NoDave1.GetFloat(MyFlagAdress);
 
// Umschalten zwischen DaveDB und DaveFlags
IF NoDave1.Area = DaveDB then
NoDave1.Area     := Daveflags
else
begin
NoDave1.Area         := DaveDB;
NoDave1.DBNumber  := MyDbNumber;
end;

end;
Im obigen Beispiel ist die die Größe des Buffers bei DaveDB und DaveFlags gleich.

Wenn ich den Wechsel von DaveDb auf DaveFlags einfach auf 2 Buttons lege, funktioniert das ganze.

Ich kann die Komponente auch 2 mal einfügen. Die eine liest den DB Bereich, die andere den Merkerbereich. Funktioniert aber nicht mit der "S7Online"-Geschichte. Per TCP funktioniert das.

Zum Schnelltesten auf dem Schreibtisch wäre es aber halt schön, wenns über den CP5511 funktionieren würde... :cry:
 
Wenn ich es richtig verstanden haben, wird in der Property Area der Datenbereich angegeben, aus dem ausgelesen werden soll. So müßte ich doch theoretisch immer zwischen Area=DaveDB und Area=DaveFlags wechseln, um die jeweiligen Werte zu erhalten.
Die Properties dienen eigentlich nur um schnell mal per Objektinspector die Kommunikation zum Laufen zu bringen, sozusagen um Anfängern den Einstieg zu erleichtern. Wenn aus mehreren Bereichen gelesen werden soll, dann geht das am Besten durch zyklisches Lesen mit der Methode ReadBytes (die Variante mit den vielen Parametern), der dann der zu lesende Bereich in den Parametern übergeben wird. Nach dem Aufruf von ReadBytes kann man dann wie gewohnt mit den Get...-Methoden die Werte aus den Buffer auslesen, und dann den nächsten Bereich mit ReadBytes in den Buffer einlesen. Das zyklische Lesen kann man ganz einfach mit einem Timer oder einem eigenen Thread implementieren. Das Property Interval von TNoDave muß in beiden Fällen auf 0 gesetzt werden.


Gruß Axel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Besten Dank für die Info. Spiele erst seit gestern ein wenig mit der Komponente herum. Es wäre halt schön gewesen, wenn man das Ereignis OnRead dafür verwenden könnte, weil das ja schon einen eingebauten Timer besitzt.

Das mit dem ReadBytes und anschließendem GetTypXYZ habe ich gerade probiert, funktioniert soweit einwandfrei.
 
Zurück
Oben