# libnodave und MPI



## bool (9 Mai 2010)

Hallo zusammen,

ich hatte die direkte MPI Kommunikation etwas auf Eis gelegt, aber es gibt noch immer noch das selbe Problem bei meiner MPI Kommunikationversuchen unter libnodave (0.8.4.5) und Visual Basic 2008 Express.

Mein Ziel ist es einen Datenlogger zu programmieren, welcher konfigurierbare Datenbereiche (E,A,M,DB...) einer S7 317 PN/DP in ebenfalls konfigurierbaren Formaten (bin, dez,hex...) in eine simple Datei schreibt. Dies möchte ich absichtlich mit einem autarken Programm erstellen, da ich ohne Excel oder ähnliches auskommen möchte.

So weit so gut, über ISO TCP funktioniert das ganze schon ganz passabel, jedoch scheitere ich bei dem Versuch über den SSW7 USB nach MPI Adapter von Helmholz Daten zu lesen. 

Mit dem Protokoll "*libnodave.daveProtoMPI*" scheint die SPS Verbindung erfolgreich initiert zu werden (der Rückgabewert von "di.initAdapter" und "dc.connectPLC" ist "0", also eigentlich alles ok, auch leuchten beim Adapter alle Kommunikations LEDs). Beim Leseversuch per "dc.readBytes" oder auch das Multiread "dc.execReadRequest" jedoch schmiert mir das Programm mit Speicherverletzungsfehler (Rückgabewert von "dc.execReadRequest": -5) ab, auch lässt sich die "erfolgreich" geöffnete Verbindung nicht mehr schliessen.


Mit den Protokollen "*libnodave.daveProtoMPI2*" oder "*libnodave.daveProtoMPI3*", "*libnodave.daveProtoMPI4*" und "*libnodave.daveProtoMPI_IBH*" bekomme ich leider gar keine Verbindung aufgebaut. 

Bei "*libnodave.daveProtoMPI2*" ist der Rückgabewert von "di.initAdapter" "0" und "dc.connectPLC" ist Fehlercode "3", ich weiss jedoch leider nicht wo die Fehlercodes dokumentiert sind. Wenn mir vielleicht jemand mitteilen könnte wo die Rückgabewerte inkl Fehlercodes der libnodave Funktionen und auch deren Parameteroptionen aufgelistet sind würde mir dies evtl auch schon helfen den Fehler eingrenzen zu können. 
Bei "*libnodave.daveProtoMPI3*" ist der Rückgabewert von "di.initAdapter" bereits -1, ich weiss jedoch wie gesagt leider nicht was dieser Code aussagt, da bei mir dei Funktion libnodave.daveStrerror(res) nur kryptische Zeichenketten zurück gibt.

Ich habe bei allen Versuchen, sowohl 19,2 als auch 187,5kBaud probiert, auch habe ich die Tests einmal auf einem Rechner ohne und einmal mit installiertem SIMATIC Manager durchgeführt. 

Eine Frage habe ich da mal ausserdem. Wieso wird auch in diversen MPI Beispielen bei libnodave.setPort() eine niedrigere Baudrate als bei libnodave.daveInterface() angegeben. Da das Interface ja über den Port kommuniziert müsste doch eigentlich nach meinem Verständnis der Port eine höhere Rate haben als das Interface.

Für libnodave.daveInterface() gint es ja ausserdem nur eine eingeschränkte Auswahl an Baudraten wie z.B. 
libnodave.daveSpeed9k '9600Baud
libnodave.daveSpeed19k '19200Baud
libnodave.daveSpeed45k '45000Baud?
libnodave.daveSpeed93k '93000Baud?
libnodave.daveSpeed187k '187500Baud
libnodave.daveSpeed500k '500000Baud
libnodave.daveSpeed1500k '1500000Baud
 
Bei den Beispielen wird libnodave.setPort() hingegen oftmals mit 38400Baud parametriert, welche es bei libnodave gar nicht zur AUswahl gibt. Was sind die Hintergründe und wie spielen diese Parametrierungen zusammen?

Ich bin für jede neue Erkenntnis offen und dankbar.


Gruss,

bool


----------



## Rainer Hönle (9 Mai 2010)

Das eine sind die Geschwindigkeiten auf der MPI/PROFIBUS-Seite, das andere ist die Geschwindigkeit auf der seriellen Seite des PC-Adapters. Diese haben nichts miteinander zu tun.


----------



## Jochen Kühner (9 Mai 2010)

*Neee...*

Die Baudrate bei Setport ist für die Serielle Schnittstelle, und die andere für die dews MPI Bus!


----------



## bool (9 Mai 2010)

Jochen Kühner schrieb:


> Die Baudrate bei Setport ist für die Serielle Schnittstelle, und die andere für die dews MPI Bus!


 
... das klingt einerseits plausibel. Was mich jedoch etwas verwirrtist, dass ja eigentlich der MPI Adapter zunächst am seriellen COM Port hängt und dieser per libnodave.setPort() in den ganzen Beispielprogrammen mit 19200 oder 38400Baud parametriert ist. Wie kann es dann sein dass ich per libnodave.daveInterface() eine Baudrate von 187500 fahren kann welche ja eigentlich weit über der Parametrierung meines Phsikalischen Ports liegt?
Wie muss ich mir das vorstellen?
Funktioniert libnodave.daveInterface() eigenlich auch mit anderen Baudraten als 187500? Ich frage da in den meisten Beispielen diese Rate hardcodiert ist.

Danke bereits im voraus.

Gruss,

bool


----------



## Rainer Hönle (9 Mai 2010)

Wie bereits geschrieben handelt es sich bei dieser um Baudrate um die MPI/PROFIBUS-Baudrate. Und der PC-Adapter kann auf der Busseite eben diese Geschwindigkeiten (bis zu 1,5 MBit/s). Die Beispiele funktionieren, das MPI meistens auf 187500 Baud eingestellt ist.


----------



## Jochen Kühner (9 Mai 2010)

*Hmm...*

Der Serille Port muss ja auch nicht so schnell wie der Bus sein...


----------



## Zottel (10 Mai 2010)

bool schrieb:


> ... das klingt einerseits plausibel. Was mich jedoch etwas verwirrtist, dass ja eigentlich der MPI Adapter zunächst am seriellen COM Port hängt und dieser per libnodave.setPort() in den ganzen Beispielprogrammen mit 19200 oder 38400Baud parametriert ist. Wie kann es dann sein dass ich per libnodave.daveInterface() eine Baudrate von 187500 fahren kann welche ja eigentlich weit über der Parametrierung meines Phsikalischen Ports liegt?
> Wie muss ich mir das vorstellen?


So ein MPI-Adapter ist nicht nur ein Pegelwandler. Es steckt ein eigener kleiner Rechner darin, der 2 serielle Schnittstellen hat, eine zum PC und die andere zum MPI-Bus.


----------



## bool (10 Mai 2010)

Zottel schrieb:


> So ein MPI-Adapter ist nicht nur ein Pegelwandler. Es steckt ein eigener kleiner Rechner darin, der 2 serielle Schnittstellen hat, eine zum PC und die andere zum MPI-Bus.


 
Hallo Zottel,
Danke fürs Feedback. 

Wenn die Geschwindigkeiten des Adapters in beide Richtungen auf Bus-/Protokollebene unterschiedlich sein können bedeutet dies dann aber trotzdem, dass die Nutzdaten von der SPS über den Adapter in den PC zur Applikation maximal mit der kleineren Baudrate (minus dem Zeitverlust durch Protokollumsetzung im Adapter) transportiert werden können. Kann man das so sagen?

Gruss,

bool


----------



## Zottel (11 Mai 2010)

bool schrieb:


> Hallo Zottel,
> Danke fürs Feedback.
> 
> Wenn die Geschwindigkeiten des Adapters in beide Richtungen auf Bus-/Protokollebene unterschiedlich sein können bedeutet dies dann aber trotzdem, dass die Nutzdaten von der SPS über den Adapter in den PC zur Applikation maximal mit der kleineren Baudrate (minus dem Zeitverlust durch Protokollumsetzung im Adapter) transportiert werden können....?


Ja. Und deshalb ist die Geschwindigkeit mit ISO over TCP oder Netlinks  bedeutend höher.
Aber: Profibus und MPI sind für mehr als 2 Teilnehmer gedacht, die sich die Bandbreite teilen. Und für eine S7 ist die Beantwortung von Kommunikationsanfragen eine eher nachrangige Aufgabe.


----------



## bool (11 Mai 2010)

Zottel schrieb:


> Ja. Und deshalb ist die Geschwindigkeit mit ISO over TCP oder Netlinks bedeutend höher.
> Aber: Profibus und MPI sind für mehr als 2 Teilnehmer gedacht, die sich die Bandbreite teilen. Und für eine S7 ist die Beantwortung von Kommunikationsanfragen eine eher nachrangige Aufgabe.


 
ok, glaube ich habs verstanden.

Jetzt bräuchte ich "nur noch" eine Lösung zu dem Problem, dass ich über meinen USB<>MPI Adapter keine Daten lesen kann und nach ?Verbindungsaufbau? (Alle "res" beim Verb.Aufbau =0) bei den Lesefunktionen immer den Fehlercode "-5" erhalte. Hierzu hatte ich bereits einen Thread zum explizit definierten Adapter (Helmholz SSW7-USB) eröffnet (siehe: http://sps-forum.de/showthread.php?t=35034 ) 

Gruss und Danke,

bool


----------

