[Libnodave] Beispiel TCP Verbindung zu S7-Welt

Zottel

Level-3
Beiträge
2.299
Reaktionspunkte
278
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht interessiert es ja noch mehr Leute, wie man die Testprogramme nutzt. Hier eine Anleitung mit Bildern:

1. Du öffnest im Windows-Startmenü "Ausführen"
2. Du gibst "cmd" ein. An diesen Punkt kommst du in XP auch über Zubehör/Eingabeaufforderung.
3. Du hast jetzt ein Kosolenfenster wie dieses (Screenshot cmd.gif)
Anhang anzeigen 20459
4. Darin zum Ort wechseln, wo du libnodave abgespeichert hast, darin zum Verzeichnis win (cmd2.gif)
Anhang anzeigen 20460
5. Jetzt kannst du das Testprogramm testISO_TCP.exe mit der IP-Adresse deiner SPS aufrufen (cmd3.gif). Bei mir hat es mit dem default-mäßigen Slot 2 funktioniert.
Anhang anzeigen 20461
6. Mit --slot=1 kannst du eine Slot-Nummer angeben: Hier funktioniert es dann aber nicht mehr...(cmd4.gif)
Anhang anzeigen 20462
7. Wenn du wissen willst, was genau passiert, füge Option -d hinzu (cmd5.gif). Man sieht die Daten enes Paketes, das an die SPS gesendet wird, aber die SPS antwortet nie: "timeout in ReadISOpacket".
Anhang anzeigen 20463
8. Wenn du die Ausgabe mit der Debug-Option in eine Datei leiten willst, hängst du ">degug.txt" an die Befehlszeile an (cmd6.gif).
Du wirst keine Ausgabe mehr sehen. Statt dessen wurde die Datei debug.txt geschrieben, die ich hier auch anhänge.

Schade, ich darf nur 5 Dateien anhängen...
 

Anhänge

  • cmd.GIF
    cmd.GIF
    9,8 KB · Aufrufe: 917
  • cmd2.GIF
    cmd2.GIF
    10,9 KB · Aufrufe: 869
  • cmd3.GIF
    cmd3.GIF
    16,4 KB · Aufrufe: 882
  • cmd4.GIF
    cmd4.GIF
    16,8 KB · Aufrufe: 825
  • cmd5.GIF
    cmd5.GIF
    17,1 KB · Aufrufe: 849
Also gehts hier weiter...
8. Wenn du die Ausgabe mit der Debug-Option in eine Datei leiten willst, hängst du ">degug.txt" an die Befehlszeile an (cmd6.gif).

Du wirst keine Ausgabe mehr sehen. Statt dessen wurde die Datei debug.txt geschrieben, die ich hier auch anhänge.Anhang anzeigen 20464
Anhang anzeigen 20465
 

Anhänge

  • cmd6.GIF
    cmd6.GIF
    18,3 KB · Aufrufe: 590
  • debug.txt
    3,9 KB · Aufrufe: 345
Zuviel Werbung?
-> Hier kostenlos registrieren
Programmbeispiel für grafische Datenanzeige mit EXCEL + LIBNODAVE

OK, anbei ein komplettes Excel-Beispiel für zwei Tankstandanzeigen mit dem Auslesen der Daten per Ethernet aus drei verschiedenen SPS
  • CPU 315-2DP + CP 343-1
  • CPU 314C + S7LAN Ethernet/MPI-Adapter
  • CPU 316 + IBH NetLink Lite Ethernet Gateway


Für die vielfältigen und speziellen Wünsche von Produktionsleitung, Abteilungsleitern, Schichtleitern, ... verwende ich oft Excel und LIBNODAVE (0.8.4.5)
(siehe z.B. den Ausdruck einer etwas aufwendiger formatierten Tankanzeige GAP-Tanks.JPG - ist nicht im Beispiel enthalten :cool:)

Meine Anwendungen sind meistens nach dem gleichen Schema aufgebaut:
  • ein Excel-Blatt mit einer Tabelle und/oder grafisches Diagramm und ein Button "Werte aus PLC lesen"
  • der Button ruft eine für dieses Blatt programmierte VBA-Routine readFrom...() auf, um die Daten einmalig aus der SPS zu lesen
  • readFrom...()
    - baut die Verbindung zu einer CPU auf: res = connect...(ph, di, dc)
    - liest Werte aus der CPU: res2 = daveReadBytes(dc, ...) und kopiert diese dann in das Tabellenblatt
    - schreibt bei Erfolg einen Lese-Zeitstempel in das Tabellenblatt
    - schließt die Verbindung wieder und gibt die verwendeten Ports frei: cleanUp(ph, di, dc)

Für eigene Anwendungen sind in den connect...() die Verbindungsparameter anzupassen, z.B. die IP-Adresse der SPS.
Meine ausführlichen Kommentare im VBA-Code sollten zum Verstehen und Anpassen des Beispiels ausreichen. :cool:
Wie man Excel bedient und wie man in Excel mit VBA programmiert sollte man schon wissen oder in der Excel/VBA-Hilfe nachlesen.
Ich verwende Excel 2002 als Entwicklungsplattform. Die xls-Dateien funktionieren auch unter neueren Excel-Versionen.
Das Ausführen von Makros muß in Excel erlaubt sein.

Um die Excel-Anwendungen vor "versehentlichen" Änderungen durch Anwender zu schützen haben die Blätter einen Blattschutz (ohne Passwort) und das VBA-Modul ist passwortgeschützt - Passwort ist: 100
Im VBA-Modul sind nur die "ungefährlichen" Funktionen der libnodave.dll deklariert - die Deklarationen der in-die-SPS-schreibenden Funktionen habe ich absichtlich weggelassen.
Ich lese immer nur einmalig "auf Knopfdruck" die Daten aus den SPS. Zyklisches lesen ist mit Excel zwar möglich, ich verwende es aber nicht - meine Anwender schafften es immer wieder, Excel dabei zu crashen. :roll:

In den beteiligten SPS stelle ich die Daten meistens extra in einem zusammenhängenden DB-Bereich zusammen. Dann reicht meist ein einziges Lese-Kommando und ein versehentliches Schreiben auf diese Datenkopien hat keinen Einfluß auf das SPS-Programm.


Anbei die Excel-Datei Tankanzeigen_mit_Libnodave.xls
Zum Lesen des VBA-Programmcodes ohne Excel die Tankanzeigen_mit_Libnodave.xls.vba.txt, welche nur den projektspezifisch programmierten VBA-Teil aus der xls-Datei enthält.


Die lizenzkostenfreie Library LIBNODAVE gibt es hier:
http://libnodave.sourceforge.net/
unter Windows XP kopiere die libnodave.dll nach C:\WINDOWS\system

Zum Thema "Excel-Funktionen periodisch aufrufen":
http://www.cpearson.com/excel/OnTime.aspx

Harald
 

Anhänge

  • GAP-Tanks.JPG
    GAP-Tanks.JPG
    57,4 KB · Aufrufe: 1.249
  • Tankanzeigen_mit_Libnodave.xls.zip
    61,7 KB · Aufrufe: 1.131
  • Tankanzeigen_mit_Libnodave.xls.vba.txt
    17,5 KB · Aufrufe: 1.062
Zuletzt bearbeitet von einem Moderator:
Programmbeispiel für EXCEL 64-Bit und 32-Bit

Hier ein Excel-Beispiel, das sowohl unter Excel (64-Bit) als auch Excel (32-Bit) funktioniert.
Es liest Daten aus S7-300, einmal über CP343-1 bzw. PN-CPU, einmal über einen IBH NetLink Lite Ethernet Adapter. Im VBA-Modul sind die Deklarationen zur Einbindung der libnodave.dll-Funktionen (64-Bit und 32-Bit).

Eine für 64-Bit kompilierte Version der libnodave.dll findet man hier:
https://github.com/dotnetprojects/DotNetSiemensPLCToolBoxLibrary /externalDlls/ libnodave_jfkmod64.dll
siehe auch http://www.sps-forum.de/hochsprachen-opc/61647-libnodave-64-bit.html

Die DLL am besten nach C:\WINDOWS\system32 kopieren (auch die 64-Bit-Version).

Hinweise zur VBA-Kompilierungskonstante Win64 und zur Declare-Anweisung mit PtrSafe-Attribut
Kompatibilität zwischen der 32-Bit-Version und der 64-Bit-Version von Office 2010
 

Anhänge

  • Tankanzeigen_mit_Libnodave_64.xls.vba.txt
    35,8 KB · Aufrufe: 711
  • Tankanzeigen_mit_Libnodave_64.xls.zip
    65,6 KB · Aufrufe: 826
Logbuch auslesen

Ein weiteres Excel-Beispiel: Auslesen eines Logbuch-Ringpuffers mit Libnodave
Es funktioniert unter Excel 64-Bit und auch Excel 32-Bit.

Das Logbuch liegt in einer S7-300 (PN oder mit CP343-1) in DB10.DBB2...DBB1001 und hat diese Struktur:
Code:
TYPE "Logbucheintrag"
  STRUCT
   TimeStamp : DATE_AND_TIME ;
   EventID   : BYTE ;
   ExtraInfo : BYTE ;
  END_STRUCT ;
END_TYPE

DATA_BLOCK "Logbuch"
  STRUCT
   LastIndex : INT  := -1;     //Schreibzeiger: Index des zuletzt beschriebenen Arrayplatzes
   LBA : ARRAY  [0 .. 99 ] OF  //Logbuch-Array (als Ringpuffer genutzt)
   "Logbucheintrag";
  END_STRUCT ;
BEGIN
   LastIndex := -1; 
   LBA[0].TimeStamp := DT#90-1-1-0:0:0.000;
   LBA[0].EventID := B#16#0;
   LBA[0].ExtraInfo := B#16#0;
...
   LBA[99].ExtraInfo := B#16#0;
END_DATA_BLOCK
Programmierung und Step7-Projekt des Logbuchs siehe Überwachung von Digital Eingängen mit Uhrzeit

Zum Ausprobieren den DB10 in die Test-SPS laden und im VBA-Modul10 in der Function initialize_xyz() die IP-Adresse der SPS anpassen (für S7-400/1200/1500 zusätzlich die Slot-Nummer auf den Steckplatz der CPU anpassen).

VBA-Function zum Konvertieren eines S7-DATE_AND_TIME (1990..2089) in einen Excel-Zeitwert
Code:
[COLOR="#008000"]'*******************************************************************************
' S7-DATE_AND_TIME zu Excel-Zeitwert konvertieren
'*******************************************************************************[/COLOR]
Function CS7DT2xlTime(DTH As Long, DTL As Long) As Double
[COLOR="#008000"]' Den VBA-Datentyp "LongLong" (8 Byte) gibt es nur auf 64-Bit-Plattformen,
' deshalb den S7-DATE_AND_TIME in 2 Teilen je 4 Byte (DWord) übergeben.[/COLOR]
Dim s$, dblT#
s = Right$("00000000" & Hex$(DTH), 8) & Right$("00000000" & Hex$(DTL), 8)
dblT = DateSerial(CInt(Mid$(s, 1, 2)) + 2000 - (Asc(s) \ 57) * 100, CInt(Mid$(s, 3, 2)), CInt(Mid$(s, 5, 2))) _
     + TimeSerial(CInt(Mid$(s, 7, 2)), CInt(Mid$(s, 9, 2)), CInt(Mid$(s, 11, 2))) _
     + CInt(Mid$(s, 13, 3)) / 86400000
CS7DT2xlTime = dblT
End Function
 

Anhänge

  • Logbuch.xls.zip
    42,4 KB · Aufrufe: 565
  • Logbuch.Step7.zip
    31,5 KB · Aufrufe: 387
  • Logbuch.AWL.txt
    14,1 KB · Aufrufe: 413
Zuletzt bearbeitet:
Zurück
Oben