# LibNoDave Zugriffsart vs. Performance



## benwen (22 Juli 2009)

Hallo zusammen!

Ich verwende die libnodave komponente (btw: Danke an den Programmierer!) zum Auslesen der Ein- und Ausgänge an einer S7 300 SPS in ein Delphi-Programm, gekoppelt über USB-MPI-Adapter. Momentan funktioniert das so:
Eine Timer-Komponente liest alle 500ms entweder die "daveInputs" oder die "daveOutputs" aus. Gleichzeitig geht das aber leider nicht, falls doch wie?

Es wär schön, wenn ich die Daten etwas schneller bereit gestellt bekomme. Das Heruntersetzten des Timer-Intervalls führt aber zu Problemen (NoDave-Komponente schaltet nicht rechtzeitig die Area um und liest die Inputs als Outputs oder umgekehrt). Welche Vorgehensweise schlagt ihr zur Beschleunigung vor?

Und noch eine weitere Frage: Ist es möglich die Eingänge der SPS auf true oder false zu setzen? Bisher ist mir das nur bei den Ausgängen gelungen.

Vielen Dank im Voraus,
benwen


----------



## Ralle (22 Juli 2009)

Wie macht die Timerkomponente das denn?
Normalerweise sollte die nur das lesen anstoßen und dann werden die Daten über das OnRead-Ereignis der libnodave-Komponente angenommen. Erst danach sollte man erneut ein Lesen anstoßen, vorher das Area umschalten. Im Prinzip ist dazu kein Timer nötig, dann kann man dann frei hintereinander weg machen. 
Du könntest mal versuchen 2 Komponenten zu erzeugen, eine für die E eine für die A.
Ich weiß nicht, ob Eingänge schreiben gar nicht geht oder ob du es bloß nicht siehst, denn die SPS liest ja das Prozessabbild ein und "zerstört" somit seine geschriebenen Eingänge.


----------



## Zottel (22 Juli 2009)

benwen schrieb:


> ...entweder die "daveInputs" oder die "daveOutputs" aus. Gleichzeitig geht das aber leider nicht, falls doch wie?


Variablen aus mehreren Speicherbereichen lassen sich durchaus mit einer Anfrage lesen. Die Komponente unterstützt das nicht, aber nodave.pas schon:
davePrepareReadRequest(dc, @einePDU);
daveAddVarToReadRequest(@einePDU, daveInputs, 0, startAdresse, zahlBytes);
daveAddVarToReadRequest(@einePDU, daveOutputs, 0, startAdresse, zahlBytes);
daveExecReadRequest(dc, @einePDU, daveOutputs, @einResultSet);

Anschließend müssen die Ergebnisse aus dem ResultSet geholt werden. Die Beispielprogramme testMPI.c oder testISO_TCP.c enthalten ein Beispiel. Alle Variablen zusammen müssen in eine Antwort-PDU passen.



benwen schrieb:


> Und noch eine weitere Frage: Ist es möglich die Eingänge der SPS auf true oder false zu setzen?


Ja, aber nur wenn keine Eingangsmodule auf diesen Adressen vorhanden sind, sonst werden die Werte vor Zyklusbeginn überschrieben. Es ist ähnlich wie im Step7-Programm: Du kannst E20.0 wie einen Merker verwenden, wenn kein Eingangsmodul EB20 nutzt.


----------



## benwen (24 Juli 2009)

*Danke!*



Ralle schrieb:


> Wie macht die Timerkomponente das denn?
> Normalerweise sollte die nur das lesen anstoßen und dann werden die Daten über das OnRead-Ereignis der libnodave-Komponente angenommen. Erst danach sollte man erneut ein Lesen anstoßen, vorher das Area umschalten. Im Prinzip ist dazu kein Timer nötig, dann kann man dann frei hintereinander weg machen.



Ja das ist genau das Problem, das Area-Umschalten geht zu langsam. Mit dem Timer lese ich abwechselnd die Inputs oder Outputs (bisher mit GetBit, also bitweise, liegt dort das Problem?).  Sobald ich mit der Timer-Komponente unter 500 ms gehe, treten wieder die beschriebenen Probleme auf.



Ralle schrieb:


> Du könntest mal versuchen 2 Komponenten zu erzeugen, eine für die E eine für die A.



Das hatte ich schon versucht, klappt leider nicht so ganz.



Zottel schrieb:


> Variablen aus mehreren Speicherbereichen lassen sich durchaus mit einer Anfrage lesen. Die Komponente unterstützt das nicht, aber nodave.pas schon:
> davePrepareReadRequest(dc, @einePDU);
> daveAddVarToReadRequest(@einePDU, daveInputs, 0, startAdresse, zahlBytes);
> daveAddVarToReadRequest(@einePDU, daveOutputs, 0, startAdresse, zahlBytes);
> ...



Danke, dann werde ich die Komponenten bei Gelegenheit mal erweitern.




Zottel schrieb:


> Ja, aber nur wenn keine Eingangsmodule auf diesen Adressen vorhanden sind, sonst werden die Werte vor Zyklusbeginn überschrieben. Es ist ähnlich wie im Step7-Programm: Du kannst E20.0 wie einen Merker verwenden, wenn kein Eingangsmodul EB20 nutzt.



Ok, also forcen geht nicht über nodave!?

Grüße benwen


----------



## Ralle (24 Juli 2009)

benwen schrieb:


> Ja das ist genau das Problem, das Area-Umschalten geht zu langsam. Mit dem Timer lese ich abwechselnd die Inputs oder Outputs (bisher mit GetBit, also bitweise, liegt dort das Problem?).  Sobald ich mit der Timer-Komponente unter 500 ms gehe, treten wieder die beschriebenen Probleme auf.



Nochmal dazu, du solltest das OnRead-Ereignis benutzen. Danach erst Area umschalten, Lesen starten, wieder auf OnRead warten. Der Timer liest sonstwas bzw. ale Daten, wenn du den zu kurz einstellst, das ist ja klar, erst das OnRead-Ereignis zeigt dir an, daß die Daten da sind.


----------

