Libnodave in SPS schreiben, ganze DB's lesen

AirKlaus

Level-2
Beiträge
19
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich beschäftige mich gerade mit Libnodave, da meine in VB6 geschriebene Visualisierung nun auch mit einer S7 kommunizieren soll. Mein altes OPC hat wunderbar mit der S5 115 944 funktioniert aber läuft natürlich nicht mit MPI. Jetzt soll endlich auf S7 gewechselt werden. Hardware ist da, S7 Programm ist fertig, VB6 Programm ist bis auf Libnodave fertig.

Hardware:
CPU 315-2DP
Serieller Siemens MPI Adapter

Das Auslesen mit Libnodave von einzelnen MW, EW, AW und DBW aus der CPU klappt inzwischen nach langem Üben einwandfrei, allerdings hakt bei mir die Umsetzung für das
- Schreiben von einzelnen MW, EW, AW, und DBW
- Lesen von kompletten DB's in einem Durchgang

Da die Lösung sicherlich schon lange in VB6 realisiert ist, würde ich mich freuen, wenn jemand mir einen funktionieren VB6 Code hier reinstellen könnten, damit ich das Rad nicht nochmals erfinden muß.

Die Suche nach Libnodave in Forum hat mich nicht so recht weiter gebracht.

Schon mal schönen Dank im voraus für Eure Hilfe
Gruß vom AirKlaus aus Hamburch
 
Nachtrag:

ich habe noch ein wenig in der Doku gestöbert, programmiert und eine Lösung für das
- Schreiben von MW, EW, AW, DB unter Libnodave
gefunden. :)

Fehlt nur noch das Lesen / Schreiben
- von kompletten DB's

Gruß vom AirKlaus aus Hamburch
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Testprogramme können mittels der Option --readout durchaus einen ganzen DB auslesen. Ob das sinnvoll ist, steht auf einem anderen Blatt. Es entspricht nämlich dem Laden desselben DBs aus der SPS in das PG. Zur Ausführung sind mehrere Anfragen an und Antworten von der Steuerung nötig, es ist also "langsam". Ferner müßtest du aus dem DB (mit Kopfinformation) die Nutzdaten "herausfischen".
Eine optimale Geschwindigkeit erzielst du immer dann, wenn alle Daten mit einer Anforderung gelesen werden können. Die Menge ist dabei durch die PDU-Größe beschränkt (z.B. 222 Byte bei PDU-Größe 240 Byte).
Am besten faßt du alle Daten, die häufig gelesen werden sollen, in einem DB zusammen. Das gilt prinzipiell auch für jede andere VISU oder OPC Server.

daveReadBytes liest eine Folge von Bytes aus dem Speicher der SPS. Wenn die Größe des Blocks nicht ausreicht, muß ein nachfolgender Block gelesen werden. Auf diese Weise kann man auch den gesamten Inhalt eines DBs auslesen.
Das Zerlegen eines Blocks in passende "Häppchen" wird bei daveReadManyBytes automatisch durchgeführt. Es setzt aber voraus, daß der Funktion daveReadManyBytes ein Zeiger auf einen vom Programm bereitgestellten Puffer übergeben wird. Hierin liegt bei .NET Anwendungen, ein zusätzliches Risiko, denn wenn man da Fehler macht, kann die Speicherverwaltung durcheinander kommen.
Es mag auch möglich sein, daß in zukünftigen (oder aktuellen?) Versionen von .NET eine Referenz auf ein Array nicht mehr die Speicheradresse angibt. Dann könnten weder daveReadManyBytes noch daveReadBytes mit Angabe eines eigenen Puffers funktionieren.
Insofern ist es sicherer, die Zerlegung selbst zu programmieren.
 
Hallo Zottel,
Danke für die schnelle und ausführliche Info. Ich werde mich dann nächstes Wochenende damit beschäftigen.

Ich lese die DB's bei der S5 im Moment nur beim Programmstart ein und schreibe sie in eine JET.Datenbank. Das soll auch bei der S7 so bleiben. Somit gibt es kein tatsächliches Zeitproblem. Die JET.Datenbank wird bei Änderungen einzelner EW, AW, MW und DBW währen des Betriebes jeweils mit geändert. Dies ermöglicht mir auch Offline in der VISU herum zu Programmieren, da die Daten dann statt aus der SPS aus der JET.Datenbank eingelesen werden.

Aber vielleicht gibt es da ja noch elegantere Lösungen?

Gruß vom AirKlaus aus Hamburch
 
Zurück
Oben