# S7 Libnodave und Excel



## uz71 (30 März 2006)

Hallo wer kann mir sagen wie ich mit Libnadave die Daten aus einem DB in Excel inportieren kann

Die Verbindung soll über TCP/IP erfolgen
CPU ist eine S7 315 2PN/DP

Daten liegen im DB84 ab byte 0 bis byte 200

Die Testprogramme habe ich schon ausgeführt und die Verbindung wird auch mit dem Testprogramm aufgebaut. Leider bekomme ich das ganze nicht mit MS Excel zum laufen.
Gruss
uz


----------



## Ralle (30 März 2006)

Hast du das VB-Programm "Modul12.bas" unter Excel getestet?


----------



## uz71 (30 März 2006)

Nein! wie kann ich das Testen


----------



## Zacka (31 März 2006)

in dem ordner ist ne readme datei dabei wo alles beschrieben ist, habe das programm gerade mal getestet mit (s7online) und wenn ich versuche daten auszulesen, kracht mir das programm nach jedem 3. durchlauf zusammen.
hat da vielleicht jemand ne erklärung?


----------



## Seppl (1 April 2006)

Hallo,

das libnodave soll zwar ganz gut sein, aber ich bevorzuge Aglink von Deltalogic.

http://www.deltalogic.de/download/aglink.htm

Da findest Du eine Demo-Version mit Excel-Beispielen.

Ciao Seppl


----------



## uz71 (2 April 2006)

Hallo 
Ich bekomme das einfach nicht hin ( bin kein  VB Freund) mit dem Libnodave und Excel, ich weis nicht wo ich die Parameter wie zb. IP Adresse  und zu lesender Datenbereich übergeben muss.

Ich denke, dass Libnodave für die 10 bis 20 Daten die ich aus der S7 lesen will die Günstigste Lösung ist.
Gruss
uz


----------



## Einstein (2 April 2006)

ich hänge mich mal mit meiner Frage, passend zum Thema Exel dran!


Ist es möglich auf ein Panel das unter dem Betriebssystem Windows CE läuft eine entsprechende Version von Exel zu installieren? dieses dan in ein SPS programm einbindet und dadurch eine Verbindung zu einem externen PC/PG sparen kann? 
Ich könnte dan eine Verbindung über USB zu einem Drucker aufbauen ...

Verbessert mich wenn ich falsch liege! müsste aber doch möglich sein!


----------



## Gerhard Bäurle (3 April 2006)

uz71 schrieb:
			
		

> Hallo
> Ich bekomme das einfach nicht hin ( bin kein  VB Freund) mit dem Libnodave und Excel, ich weis nicht wo ich die Parameter wie zb. IP Adresse  und zu lesender Datenbereich übergeben muss.uz



Hallo,
dann einfach mal direkt bei Zottel fragen:
http://www.sps-forum.de/member.php?u=30



			
				uz71 schrieb:
			
		

> Ich denke, dass Libnodave für die 10 bis 20 Daten die ich aus der S7 lesen will die Günstigste Lösung ist. uz



Nur bezogen auf die Lizenzkosten - ja. Ist aber 
unabhängig von der Datenmenge.


Viele Grüße

Gerhard Bäurle


----------



## Gerhard Bäurle (3 April 2006)

Einstein schrieb:
			
		

> ich hänge mich mal mit meiner Frage, passend zum Thema Exel dran!
> 
> Ist es möglich auf ein Panel das unter dem Betriebssystem Windows CE läuft eine entsprechende Version von Exel zu installieren? dieses dan in ein SPS programm einbindet und dadurch eine Verbindung zu einem externen PC/PG sparen kann?
> Ich könnte dan eine Verbindung über USB zu einem Drucker aufbauen ...
> ...



Hallo,

ja, ich Excel schon auf einem WinCE 3.0-Rechner gesehen.
Hat das Panel eine S7-Anbindung mit offener 
Schnittstelle?

Falls nicht, in Kürze gibt es das oben erwähnte AGLink 
für Linux und Windows CE.  

Viele Grüße

Gerhard Bäurle


----------



## Ralle (3 April 2006)

@uz71

Da ich alles mit Delphi mache und auch kein VB-Fan bin, kann ich dir leider nicht viel mehr helfen, was Excel betrifft. Es wird sicher noch jemand anderes in Forum damit gearbeitet haben.


----------



## uz71 (4 April 2006)

Hat denn wirklich keiner erfahrung mit Libnodave und Excel?

Ich habe jetzt nochmals den gaanzen Tag versucht einen Weg zu finden allerdings nochmal ohne Erfolg.......

Gruss
uz


----------



## Gerhard Bäurle (5 April 2006)

uz71 schrieb:
			
		

> Hat denn wirklich keiner erfahrung mit Libnodave und Excel?


Doch, gibt es einige hier. Besser wäre die Frage in "Hochsprache & OPC" 
aufgehoben. Bitte Sie doch Markus oder Lorenz den Beitrag dort hinzuschieben.

Oder Sie Fragen direkt das Mitglied Zottel.



			
				uz71 schrieb:
			
		

> Ich habe jetzt nochmals den gaanzen Tag versucht einen Weg zu finden allerdings nochmal ohne Erfolg.......



Haben Sie schon mal AGLink ausprobiert?



			
				uz71 schrieb:
			
		

> Ich denke, dass Libnodave für die 10 bis 20 Daten die ich aus der S7 lesen will die Günstigste Lösung ist.
> uz



Ihre Arbeitszeit kostet ja auch was. 

Viele Grüße

Gerhard Bäurle


----------



## Ralle (5 April 2006)

Funktioniert doch prima.
Habs ebend mal mit Excel2000, S7Online, und CP5511 gestestet, nach 15 Minuten gings.

Zuerst mal, sieh in das Verzeichnis 'Excel AND VB'. Lies die readme.vb.
Mach ein neues Excelsheet auf, öffne den VB-Editor, importiere Modul12.bas.
In der Funktion initialize mßt du die für dich richtigen Initialisierungen auskommentieren, die falschen als Kommentar markieren.

Makro 'InitTable' laufen lassen. Dei richtigen Daten in die Zellen eintragen (IP etc.).
Danach sollte es gehen.


----------



## uz71 (5 April 2006)

Das mit der neuen Tabelle und das Importieren mit dem Modul12 habe ich verstanden, aber beim Rest hörts dann bei mir auf.


----------



## Ralle (5 April 2006)

Folgendes steht in der Initialisierungs-Funktion:


```
Private Function initialize(ByRef ph As Long, ByRef di As Long, ByRef dc As Long)
ph = 0
di = 0
dc = 0
Rem uncomment the daveSetDebug... line, save your sheet
Rem run excel from dos box with: excel yoursheet >debugout.txt
Rem send me the file debugout.txt if you have trouble.
Rem call daveSetDebug(daveDebugAll)
initialize = -1
baud$ = Cells(3, 5)
If (baud$ = "") Then Call initTable
Cells(12, 2) = "Running"
res = -1
port = Cells(2, 5)
baud$ = Cells(3, 5)
parity$ = Cells(4, 5)
peer$ = Cells(7, 5)
acspnt$ = Cells(8, 5)
Rem ph = setPort(port, baud$, Asc(Left$(parity$, 1)))
' Alternatives:
[B]ph = openSocket(102, peer$)    ' for ISO over TCP
[/B]Rem ph = openSocket(1099, peer$)' for IBH NetLink
Rem ph = openS7online(acspnt$) ' to use Siemes libraries for transport (s7online)
Cells(2, 1) = "port handle:"
Cells(2, 2) = ph
If (ph > 0) Then
'    di = daveNewInterface(ph, ph, "IF1", 0, daveProtoMPI, daveSpeed187k)
' Alternatives:
'di = daveNewInterface(ph, ph, "IF1", 0, daveProtoPPI, daveSpeed187k)
'di = daveNewInterface(ph, ph, "IF1", 0, daveProtoMPI_IBH, daveSpeed187k)
[B]di = daveNewInterface(ph, ph, "IF1", 0, daveProtoISOTCP, daveSpeed187k)
[/B]'di = daveNewInterface(ph, ph, "IF1", 0, daveProtoS7online, daveSpeed187k)
'
'You can set longer timeout here, if you have  a slow connection
'    Call daveSetTimeout(di, 500000)
    res = daveInitAdapter(di)
    Cells(3, 1) = "result from initAdapter:"
    Cells(3, 2) = res
    If res = 0 Then
        MpiPpi = Cells(6, 5)
'
' with ISO over TCP, set correct values for rack and slot of the CPU
'
        dc = daveNewConnection(di, MpiPpi, Rack, Slot)
        res = daveConnectPLC(dc)
        Cells(4, 1) = "result from connectPLC:"
        Cells(4, 2) = res
        If res = 0 Then
            initialize = 0
        End If
    End If
End If
End Function
```
 
Die Fett geschrieben Zeilen mußt du auf jeden Fall aktivieren, die anderen entsprechend auskommentieren. Außerdem das Macro InitTable aufrufen und die richtige IP-Adresse angeben. Zu dem Teil mit Slot-und Rack-nummer kann ich nicht sagen, mußt du mal ausprobieren.

Die Macros lesen und schreiben erstmal Testbytes, du mußt das dann (wenn die Mestbytes funktioniern) auf deinen Anwendungsfall DBx, 200 Worte etc. anpassen.


----------



## afk (5 April 2006)

Ralle schrieb:
			
		

> Zu dem Teil mit Slot-und Rack-nummer kann ich nicht sagen, mußt du mal ausprobieren.


Rack ist fast immer 0, Slot ist bei 300er CPUs meistens 2 und bei 400er CPUs meistens 3. Wenn das nicht funktioniert, dann muß man in der HW-Config des SPS-Projekts nachschauen.


Gruß Axel


----------



## Rainer Hönle (5 April 2006)

afk schrieb:
			
		

> Rack ist fast immer 0, Slot ist bei 300er CPUs meistens 2 und bei 400er CPUs meistens 3. Wenn das nicht funktioniert, dann muß man in der HW-Config des SPS-Projekts nachschauen.
> 
> 
> Gruß Axel


Rack ist bei der 300er immer 0, bei der 400er immer 0 wenn die CPU im ersten Rack steckt (ist eigentlich fast immer der Fall). Slot ist bei der 300er immer 2, bei der 400er mit 4A (schmalem) Netzteil 2 ansonsten bei breitem Netzteil 3.


----------



## Ralle (5 April 2006)

Ja danke, das ist schon klar, ich meinte, ob die Rack-und Slotnummer in der Initialisierungs-Funktion korrekt eingetragen wird, bzw. ist. Das kann man im Debug-Modus direkt in der Funktion vielleicht am Besten überprüfen.


----------



## uz71 (5 April 2006)

Zuerst einmal Danke für die Arbeit 
Ich habe es dann geschaft die Verbindung aufzubauen und mir ReadFromPLC Daten aus der S7 in Excel zu schreiben, es werden mit dem Makro MD0 MD4 MD8 und MD12 gelesen.
Jetzt muss ich nur noch das ganze anpassen auf meinen DB, ich hoffe dass es funktioniert.
Gruss
uz


----------



## uz71 (5 April 2006)

Nun funktioniert es auch bei mir, allerdings habe ich jetzt noch ein Problem bei unterschidlichen S7 CPU's

ohne Probleme läuft das ganze auf einer 315 "PN/DP
wenn ich dann auf eine 315 2DP mit CP 343-1 oder 343-1 IT zugreifen will läuft es nicht mehr.
Ich glaube das ligt an der Rack bzw Slot Nr.. evt. muss man die Slotnummer des CP angeben.
Wo kann ich die Slotnummer ändern

Gruss


----------



## HighTec (15 November 2006)

Irgendwie habe ich das gleiche Problem mir der 315-2DP und dem CP343.
Obwohl ich mit allen Einstellungen bei Rack und Slot experimentiert habe, bekomme ich keine Werte von der CPU gelesen.
Wenn ich Rack = 0 und Slot = 0 benutzte und davePLCStop und dave PLCStart benutze, stopt oder startét nur der CP aber nicht die CPU.

Kann da evtl. jemand bitte weiterhelfen?

Danke


----------



## Rainer Hönle (15 November 2006)

HighTec schrieb:


> Irgendwie habe ich das gleiche Problem mir der 315-2DP und dem CP343.
> Obwohl ich mit allen Einstellungen bei Rack und Slot experimentiert habe, bekomme ich keine Werte von der CPU gelesen.
> Wenn ich Rack = 0 und Slot = 0 benutzte und davePLCStop und dave PLCStart benutze, stopt oder startét nur der CP aber nicht die CPU.
> 
> ...


Mit Rack- und Slotnummer 0 wird immer die Baugruppe adressiert, auf der das Kabel steckt. In diesem Fall die CP. Wenn das nicht gewünscht sein sollte, dann einfach die Rack- und Slotnummer der CPU verwenden. Die kann ganz leicht aus der Hardwarekonfig abgelesen werden. Als Faustformel gilt: Racknummer 0 (außer CPU steckt auf ER) und bei 300er Slotnummer 2, bei 400er mit 4A PS Slotnummer 2 und mit 10A PS Slotnummer 3 verwenden. Dann sollte es klappen.


----------



## HighTec (15 November 2006)

Hallo,

ja, das ist schon klar wie das mit Rack und Slot gemeint ist.

Mein Rack als Schema      1. Steckplatz CPU 315-2DP
                                   2. Steckplatz DI32
                                   3. Steckplatz DO32
                                   4. Steckplatz ASi-CP
                                   5. Steckplatz CP343

Gebe ichn nun Rack 0 und Slot 0 an und benutzte davePLCStop oder davePLCStart, startet und stopt nur mein CP obwohl er ja garnicht auf Steckplatz 0 steckt. Wie schon gesagt, ich habe mit vielen Einstellungen von Rack und Slot experimentiert und nichts hat zum Erfolg geführt.

Desweiteren kann ich mit testISO_TCP die festgelegten Merkerbytes aus der CPU lesen, aber mit meinen Einstellungen in VBA scheint das nicht zu funktionieren.

Zum Lesen der Merkerbytes benutze ich daveReadBytes. Muß ich sonst was anderes benutzen.

Danke erstmal.


----------



## Rainer Hönle (15 November 2006)

HighTec schrieb:


> ja, das ist schon klar wie das mit Rack und Slot gemeint ist.


Wohl doch noch nicht ganz. Wie bereits geschrieben: wenn Rack 0 und Slot 0 verwendet wird, wird damit automatisch die Baugruppe adressiert, in der das Kabel steckt. In diesem Falle die CP. Es gibt physikalisch keinen Slot 0 (wohl aber Rack 0, ist ja logisch )!



> Mein Rack als Schema      1. Steckplatz CPU 315-2DP
> 2. Steckplatz DI32
> 3. Steckplatz DO32
> 4. Steckplatz ASi-CP
> ...


Was in der Auflistung fehlt und von Siemens immer implizit angenommen wird ist das PS. Dies steckt in Slot 1 und die CPU dann in Slot 2. Dies ist auch aus der Hardwarekonfig so ersichtlich. OK, vielleicht ist Slot 1 leer aber die CPU steckt bei einer 300er in Slot 2. Deshalb muss zur Kommunikation mit der CPU bei einer 300er Rack 0 / Slot 2 angegeben werden. Die 400er Einstellungen habe ich ja auch bereits beschrieben.
Ich hoffe, dass jetzt wirklich alles was die Adressierung anbelangt klar ist.


----------



## Zottel (15 November 2006)

HighTec schrieb:


> Hallo,
> 
> ja, das ist schon klar wie das mit Rack und Slot gemeint ist.
> 
> ...


Ja, aber 0,0 ist wohl immer das Ding, was die Verbindung unterhält, selbst.


> Wie schon gesagt, ich habe mit vielen Einstellungen von Rack und Slot experimentiert und nichts hat zum Erfolg geführt.


Es sollte halt Rack 0, Slot 2 sein bein deinem Aufbau.


> Desweiteren kann ich mit testISO_TCP die festgelegten Merkerbytes aus der CPU lesen...


testISO_TCP nimmt standardmäßig 0 und 2...


> ...aber mit meinen Einstellungen in VBA scheint das nicht zu funktionieren.


Komisch...


> Zum Lesen der Merkerbytes benutze ich daveReadBytes. Muß ich sonst was anderes benutzen.


Mmmhh.. wenn du meine Makros nutzt, erfolgt vor dem readBytes irgendwo immer auch ein Aufruf von daveInitAdapter und daveConnectPLC. initAdapter macht bei ISOTCP nix, aber connectPLC brauchst du.


----------



## HighTec (15 November 2006)

Nur wenn ich Rack 0 und Slot 0 benutze bekomme ich  res = 0 ansonsten bei allen anderen Einstellungen -1.

Habe ich aber res = 0 mit Rack 0 und Slot 0 und lese nun mit daveReadByte die Merkerbytes aus der CPU bekomme ich als res2 irgendwas mit 33000 als RetVal.


----------



## Rainer Hönle (15 November 2006)

Ich würde da folgendes vorschlagen: Rack 0 und Slot 2 einstellen und den Versuch mit Etherreal aufzeichnen. Dann sieht man genau, was fehlschlug. Danach auch den geglückten Versuch von Zottels Beispielprogramm aufzeichnen. Dann sind die Unterschiede leicht zu erkennen. 
@Zottel: Oder wie siehts Du das? 

OffTopic: Kommst Du dieses Jahr wieder auf die Messe?


----------



## Zottel (15 November 2006)

Rainer Hönle schrieb:


> Ich würde da folgendes vorschlagen: Rack 0 und Slot 2 einstellen und den Versuch mit Etherreal aufzeichnen. Dann sieht man genau, was fehlschlug. Danach auch den geglückten Versuch von Zottels Beispielprogramm aufzeichnen. Dann sind die Unterschiede leicht zu erkennen.
> @Zottel: Oder wie siehts Du das?


Ich kann mir nur vorstellen, daß er connectPLC nicht macht oder das die Parameterübergabe von VB an die DLL nicht in Ordnung ist :-(
Beides sieht man auch ohne Ethereal in der debug-Ausgabe von Libnodave und das ohne TCP/IP drumherum.

Entweder, die Anwendung schickt die Anforderung zu connectPLC oder nicht.

Und wenn sie sich mit slot=0 nicht von der mit slot=2 unterscheidet, ist's die Parameterübergabe.

Wie aber paßt er dann den VB-Code an?

Gut wäre es, wenn er einen C-Compiler hätte und bedienen könnte. Dann könnte er in nodave.c 
//#define DEBUG_CALLS
"unkommentieren", in daveNewConnection() die Zeilen:
#ifdef DEBUG_CALLS
    LOG5("daveNewConnection(di:%p MPI:%d rack:%d slot:%d)\n",
    di, MPI, rack, slot);
    FLUSH;    
#endif    
ergänzen, einmal neu übersetzen und dann sagt ihm daveNewConnection(), was es für Parameter aus VB bekommt.

Wenn allerdings die Parameterübergabe nicht ok ist, dürfte es noch keiner geschafft haben. Und seit 8 Monaten meckert keiner?



> OffTopic: Kommst Du dieses Jahr wieder auf die Messe?


Nein.


----------

