Wireshark Plugin für S7-Protokoll

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Ich bin noch Anfänger im Bereich, und ich wollte die Kommunikation zwischen WinCC und SPS mit Wireshark untersuchen. Die Kommunikation erfolgt mit Ethernet. Also Wer mit Wireshark die Kommunikation prüft, sucht bestimmt irgend ein Problem in der Kommunikation.
Wie kann man die Daten aus Wireshark sinnvoll visualisieren, um Probleme zu erkennen?

für jede Hilfe oder Quellen wäre ich sehr dankbar

Liebe Grüße
Welche Kenntnisse zum Thema Ethernet, TCP/IP, Protokolle bringst du denn mit?
Wireshark ist ein Tool von Spezialisten für Spezialisten.
Da musst du schon einiges an Zeit für die Einarbeitung investieren
 
Zum Beispiel die Stabilität und Kommunikationsleistung des Systems. dies ist die Problemstellung meiner Thesis. Ich habe ein Beispielprojekt erstellt und mit Hilfe von Wireshark den gegenseitigen Austausch von Informationen zwischen sps und WinCC gemessen. Kann ich die Stabilität und Kommunikationsleistung des Systems visualisieren.

Liebe Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zum Beispiel die Stabilität und Kommunikationsleistung des Systems. dies ist die Problemstellung meiner Thesis. Ich habe ein Beispielprojekt erstellt und mit Hilfe von Wireshark den gegenseitigen Austausch von Informationen zwischen sps und WinCC gemessen. Kann ich die Stabilität und Kommunikationsleistung des Systems visualisieren.

Liebe Grüße

Für Netzwerkanalyse ist ntop ein ganz brauchbares Tool mit einigen Visualisierungen.
Wireshark bringt ein paar Infos unter Statistics.
 
Wireshark ist eher das Werkzeug zur statischen Analyse, und nicht unbedingt geeignet um Live-Daten für z.B. ein Dashboard zu generieren. Die Frage ist, was mit Stabilität und Kommunikationsleistung gemeint ist, und ob das generell für TCP/IP gelten oder spezifisch auf Siemens SPS zugeschnitten sein soll, wobei hier noch zwischen S7-300/400 und S7-1200/1500 zu unterscheiden wäre (S7-300/400 einfach, S7-1200/1500 schwer dort aus den Analysen verwertbare Informationen herauszufinden).

Ich hatte mir z.B. schon mal für den Wireshark Statistik Menüpunkt überlegt, dort zu erfassen auf welche Speicherbereiche wie oft lesend und schreibend zugegriffen wird. Also z.B. DB1.DBW0 mit 120 lesenden Zugriffen, usw. Dafür musst du aber den Wireshark Dissector Code erweitern, und der Statistik Menüpunkt hat ein mehr oder weniger starres Format, darum habe ich das nicht weiter verfolgt.

Was für eine weitere statische Analyse auch möglich ist, wäre eine Aufzeichnung der Kommunikation zu erstellen (pcap Datei), mittels tshark die gewüschten Felder die du vom S7-Protokoll oder auch tcp/ip benötigst zu exportieren, und dann auf die Daten dein eigenes Programm loszulassen.

Bei einer S7 SPS würde mir als Analyse der Kommunikationsleistung z.B. die Antwortzeit der SPS einfallen, d.h. welche Zeit von Request zu Response wird benötigt, ggf. Lese- oder Schreibvorgänge die mit Fehler beantwortet wurden oder ähnliches. So etwas habe ich mir selber mal für Profinet gebaut, welches den Jitter berechnet, die Teilnehmer auflistet, nach Verbindungsaufbau Telegrammen sucht usw.
 
welches den Jitter berechnet
Hallo Thomas,
ich bedanke mich für die Zahlreiche Informationen, ich muss noch recherchieren, damit ich in die Reihe einsteigen kann, ich habe JITTER-Werte dargestellt, aber ich finde dass das Diagramm irgendwie komisch aussieht, ich werde mich auf jeden fall nochmal melden.

Liebe Grüße
 

Anhänge

  • JITTER (1) (1).jpg
    JITTER (1) (1).jpg
    47,7 KB · Aufrufe: 36
Zuviel Werbung?
-> Hier kostenlos registrieren
Effekte in erier PC <-> SPS Kommunikation -
: Klar, Ping muss laufen
: Auch klar - WinCC muss die S7 Verbindung aufbauen können. Da ich Ihren SPS Typ nicht kenne - Siemens hat diverse S7 Protokolle, aktuell drei unterschiedliche. Wenn WinCC die Verbinung nicht hinbekommt dann reichen die Diagnosedinge in WinCC
: Kommen nun nicht alle Daten so helfen auch oft die WinCC Diagnosen. Es wird genau angezeigt welche Daten nicht kommen.
: Aber auch Wireshark zeigt diese Details. Die Analyse ist aber mehr Aufwand und setzt etwas Basiswissen über die SPS voraus. Handelt es sich um eine Siemens S5 oder eine S7 300/400 so zeigt der Wireshark s7comm Decoder an was angefragt oder geschrieben wird und was die SPS antwortet. Bei S7 1200/1500 wird zum Einen der s7comm_plus Decoder benötigt. Zum Anderen arbeiten diese SPS symbolisch - eine S7 300/400 kann da nur DBxDWyLEnz. Aber in der 1500 sehen Sie beim Verbindungsstart das Symbolbrowsen, später fragt WinCC dann über die damit gesammelten ID die eigentlichen daten an. Wenn Sie eine ganz neue S7 1500 mit TIA 17 und Firmware 2.9 haben dann benötigt der Wireshark Decoder für eine Anzeige die Zertifikate mit denen Sie die Verbindung gesichert haben. Diese können Sie in TIA17 exportieren und Wireshark geben.
Fazit: Immer zuerst die Netzwerk Basis und WinCC Diagnosen nutzen. Dann erst Wireshark.
 
Effekte in erier PC <-> SPS Kommunikation -
: Klar, Ping muss laufen
: Auch klar - WinCC muss die S7 Verbindung aufbauen können. Da ich Ihren SPS Typ nicht kenne - Siemens hat diverse S7 Protokolle, aktuell drei unterschiedliche. Wenn WinCC die Verbinung nicht hinbekommt dann reichen die Diagnosedinge in WinCC
: Kommen nun nicht alle Daten so helfen auch oft die WinCC Diagnosen. Es wird genau angezeigt welche Daten nicht kommen.
: Aber auch Wireshark zeigt diese Details. Die Analyse ist aber mehr Aufwand und setzt etwas Basiswissen über die SPS voraus. Handelt es sich um eine Siemens S5 oder eine S7 300/400 so zeigt der Wireshark s7comm Decoder an was angefragt oder geschrieben wird und was die SPS antwortet. Bei S7 1200/1500 wird zum Einen der s7comm_plus Decoder benötigt. Zum Anderen arbeiten diese SPS symbolisch - eine S7 300/400 kann da nur DBxDWyLEnz. Aber in der 1500 sehen Sie beim Verbindungsstart das Symbolbrowsen, später fragt WinCC dann über die damit gesammelten ID die eigentlichen daten an. Wenn Sie eine ganz neue S7 1500 mit TIA 17 und Firmware 2.9 haben dann benötigt der Wireshark Decoder für eine Anzeige die Zertifikate mit denen Sie die Verbindung gesichert haben. Diese können Sie in TIA17 exportieren und Wireshark geben.
Fazit: Immer zuerst die Netzwerk Basis und WinCC Diagnosen nutzen. Dann erst Wireshark.

Hallo,

ich hätte eine Frage zum Zertifikat Export aus TIA V17 und Import in Wireshark:
Ich finde nur die Möglichkeit das öffentliche Zertifikat zu exportieren (Unter Schutz & Security->Zertifikatsmanager->Gerätezertifikate). Zur Analyse bräuchte Wireshark wohl den privaten Schlüssel, welcher dort nicht enthalten ist ( Import in Wireshark unter Protokolle->TLS oder RSA-Schluessel?)
Gibt es hier eine mir noch unbekannte Möglichkeit für den Export und Import?
Oder muss ich hier selbst ein Zertifikate erstellen (*.der und *.pem) und diese dem TIA Portal und Wireshark geben? Wenn ja wie? Beim Tia Portal Gerätezertifikate Einstellungsseite gibt es eine Import Moeglichkeit ("Hinzufügen" Button) aber die tut nichts.

Danke und Gruss MyName
 
Hallo Thomas,
ich bedanke mich für die Zahlreiche Informationen, ich muss noch recherchieren, damit ich in die Reihe einsteigen kann, ich habe JITTER-Werte dargestellt, aber ich finde dass das Diagramm irgendwie komisch aussieht, ich werde mich auf jeden fall nochmal melden.

Bei "normaler" S7-Kommunikation ist der Jitter nicht sonderlich sinnvoll, da das Standard TCP/IP Kommunikation und kein Echtzeitprotokoll wie Profinet verwendet. Bei Profinet hast du einen festen Aktualisierungszyklus, z.B. 10 ms, wenn dann je nach Einstellungen z.B. nach 3 Zyklen der Teilnehmer sich nicht meldet, dann gilt er als gestört. Wenn du hier nach Daten über Profinet z.B. eine Regelung aufbaust und der Zyklus schwankt stark dann führt das u.U. bei deiner Regelung zu Problemen, auch wenn der Teilenehmer noch nicht ausgefallen ist.

Bevor du da anfängst du programmieren, würde ich mir im Detail überlegen was überhaupt sinnvoll ist. Du kannst dir ja Stichpunkte überlegen und hier zur Diskussion stellen. Wenn es sinnvoll ist, kannst du das ggf. auch direkt in Wireshark integrieren, dann hat es jeder Benutzer direkt zur Verfügung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

gibt es einen s7comm-Paketfilte, die mir nur ein Ereignis oder einen bestimmten Eingang oder Ausgang in Wireshark anzeigt ?
Im Anhang findet ihr einer Aufzeichnung für Timer 10s

Danke im voraus.
 

Anhänge

  • WireShark_Test.zip
    295,7 KB · Aufrufe: 7
Am einfachsten ist es, wenn du dir ein entsprechendes Paket heraussuchst, und wenn du auf eine für dich interessante Eigenschaft stößt, dann kannst du dieses Feld markieren und das Kontextmenü mit der rechten Maustaste aufrufen. Dort hast du im Kontextmenü "Als Filter anwenden" und dann wählst du "Ausgewählt". Dann wird diese Eigenschaft mit dem Wert automatisch als Filter gesetzt.

Bei s7comm wäre das als Filter für Eingänge "s7comm.param.item.area == 0x81". Du kannst das noch auf Byte und Bitadressen erweitern. Z.B. Alle Eingänge mit E1.x wäre dann "s7comm.param.item.area == 0x81 && s7comm.param.item.address.byte == 1". Die beiden && stehen für logisch UND, du kannst auch || für ODER, oder noch weitere Vergleichsmöglichkeiten einsetzen.

Bei s7comm-plus was in der Aufzeichnung auch vorhanden ist, ist das nicht ganz so einfach.
 
Hallo,

durch die Darstellung der Lese-Schreibvorgänge und die Verbindungsaufbau aus Wireshark, können die Ergebnis als Performance Wert dargestellt werden? Wenn ja, welche Aussagen können hier erläutert werden, um zu wissen, wie gut das System funktioniert oder bzw. ab welchem Wert ein Performance Wert im Zusammenhang mit der Übertragungsgeschwindigkeit zu einem Problem wird.
Im Anhang findet ihr ein Diagramm, das meine Vorstellungen beschreibt.

Für jede Hilfe oder Quellen wäre ich sehr dankbar.

Danke im voraus.
 

Anhänge

  • Screenshot 2021-08-13 192923.png
    Screenshot 2021-08-13 192923.png
    86,1 KB · Aufrufe: 24
Zuviel Werbung?
-> Hier kostenlos registrieren
Nur mit den Zeiten alleine kannst du nichts bewerten. Im übrigen würde ich wenn dann auch nicht den Verbindungsaufbau mit einrechnen, denn üblicherweise wird die Verbindung einmal aufgebaut und offen gehalten.

Ich schildere dir mal ein mögliches Problem: Jemand möchte auf dem HMI einige Werte möglichst schnell im 100ms Zyklus einlesen, alles übrige im 1 Sekunden Zyklus. Für die Daten die im 1s Zyklus gelesen werden, sind sagen wir mal 20 PDUs notwendig. Bei 6ms pro PDU wären das 120ms um diese Daten zu lesen. D.h. für deine 100ms Daten bleibt keine Zeit mehr. Das hängt dann davon am wie das HMI die Kommunikation organisiert.

Das wird zumindest nicht ganz einfach das automatisch sinnvoll auszuwerten. Interessanter wäre hier evtl. sogar wie viel Pausenzeit zwischen Abfragen sind, wobei das dann immer in Chunks geschehen wird, wenn jemand mal angenommen 100 Variablen auf 5 Sekunden Aktualisierung stehen hat und die in 5 PDUs passen, dann hast du alle 5 Sekunden eine kurze Last ohne oder mit kurzer Pause zwischen den PDUs, und dann entsprechend lang. Das macht aber jeder Kommunikationstreiber eines Herstellers auch noch anders.
 
Ich bräuchte für das alte S7-Protokoll vielleicht mal etwas Input.
Es gibt nämlich noch eine Kommunikationsart die ich bisher noch nie im Einsatz hatte, und zwar USEND/URECV. Dabei werden Daten ohne Bestätigung vom Partner verschickt. Auf jeden Fall ist mir jetzt, und eigentlich auch schon bei den letzten Änderungen bezüglich NC-Funktionen, sowie des Datensatz-Routings, aufgefallen, dass meine bisherigen Annahmen zum Aufbau des Parameterteils bei den sog. "Userdata" Telegrammen nicht so ganz korrekt waren.

Bisher war ich davon ausgegangen, dass die ersten 3 Bytes fest sind (000112), dann folgt ein Byte für eine Länge, dann ein Byte mit der Methode (Request/Response/Push) und ein Byte welches ich in zwei Nibbles aufgeteilt habe. Wovon das Linke noch einmal für Request/Response stand, und das rechte für die Funktionsgruppe. Das passte am Anfang auch recht gut zusammen.

Nur bei eben den letzten Änderungen, passt das mit den beiden Nibbles nicht zusammen. Diese würde ich einfach zu einem Byte für die Funktion zusammenführen.
Das Byte davor mit 0x11 oder 0x12 was ich vorher als Request/Response angenommen habe, könnte auch vlt. codiert bedeuten, ob am Ende des Parameterteils Dataunit-Ref, Lastdataunit, Errorcode vorhanden sind. Aber warum dann die Längenangabe in Byte 3. Und bei USEND/URECV passt es dann auch nicht mehr, weil dort eine 0x13 steht, und anschließend noch die R_ID von den Kommunikations (S)FBs folgt.

Und beispielsweise bei Betriebszustandsübergängen wie Stop/Run ist der Aufbau komplett anders, weil der Kopf anders ist. Das war mir bisher überhaupt noch nicht aufgefallen, da ich das nur versucht habe an den anderen Bytes festzumachen. Das muss ich auf jeden Fall auch noch korrigieren.

Ich habe die Varianten im PDF im Anhang zusammengefasst. Vielleicht hat ja jemand noch eine Idee, z.B, @Rainer Hönle?
 

Anhänge

  • s7comm Parameterteil.pdf
    13,4 KB · Aufrufe: 17
@Thomas_v2.1: zu USend habe ich nichts. Hast Du mir ein wireshark-Log, in dem es vorkommt, dann schaue ich mir das einmal an.
btw: Das was Du als Push bezeichnest, heist bei mir Indication, da ausgelöst ohne Anfrage
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Den Aufbau von USEND habe ich eigentlich, ich muss nur noch einen Test mit einer 400er mit allen vier möglichen Bereichen machen. Wenn ich das mit den Siemens Zahlen rechne, sollten sich da 4 Byte wiederholen. Ich hänge ein Aufzeichnung mal an.

Mit geht es eigentlich um den Aufbau des allgemeinen Parameterteils. Also welche Bedeutung haben die ersten 3 Bytes 000112? Dann kommt ein Byte mit der Längenangabe, und dann noch ein Byte mit 0x11, 0x12 oder hier bei USEND eben 0x13. Darum muss ich die Erkennung in Wireshark grundsätzlich überarbeiten. Wenn man die Kommunikation selber programmiert, kann man ja einfach die Konstanten einsetzen ohne zu wissen um was es sich handelt. Bei Wireshark muss oder sollte schon etwas sinnvolles dran stehen. Zumindest wenn an einem Wert eine Entscheidung getroffen wird, wie die weitere Verarbeitung erfolgt.

So in der Art müsste ich es zumindest verarbeiten:
s7comm-param.jpg
 

Anhänge

  • usend-urecv-s7-400-zu-s7-1500-tcpdump_100Bytes-R_ID 0xdeadbeef.zip
    2 KB · Aufrufe: 5
0xFF = Success
0x02 = Datentype Byte
0x0001 = Itemcount (vermutlich)
Rest könnte sein:
0x00 = Success (beim Schreiben)
0x04 = Datentyp 16 Bit, macht hier keinen Sinn => keine Ahnung
0x0320 = Länge in Bits

Alternative Idee:
0xFF = Success
0x02 = Datentype Byte
0x0001 = Datalen
0x00 = Data
0x04 = Füllbyte??? Steht hier immer 0x04???
0x0320 = Länge in Bits
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Manchmal hat man echt ein Brett vorm Kopf, wenn ich nur die obersten 2 Bits und nicht die vier für Request/Response/Indication verwende, wie von dir geschrieben, dann passt das doch alles zusammen wie bisher. Dann muss ich meine letzten Änderungen mal wieder rückgängig machen und von vorne starten.

Indication hört sich zudem auch besser an, den Text habe ich bei den Alarm-Meldeblöcken auch verwendet. Ich meine bei Profibus wird diese Nomenklatur auch verwendet. Push hatte ich aufgrund der Verwendung in Webdiensten verwendet.
 
Also wenn ich das richtig sehe, dann scheint für die Syntax-IDs eine globale Liste zu bestehen, die zwar theoretisch überall, aber praktisch nicht überall erlaubt sind:
0x10 = S7 Any-Pointer
0x11 = Parametersatz kurz
0x12 = Parametersatz lang
0x13 = BSEND/USEND R_ID
0x14 = Alarm lock/free Datensatz
usw.

Und vor der Spezifikation steht immer ein Byte für die Länge, und davor scheint es immer 0x12 zu geben (ich meine da gibt es auch eine andere, finde ich aber in meinen Aufzeichnungen gerade nicht wieder).

Dann könnte man annehmen, dass das 3. Byte in den Parametern von 0x07er "Userdata" Telegrammen, wo immer eine 0x12 steht, das ebenfalls dafür steht. Dann fehlt nur noch für die beiden ersten Bytes die konkrete Bedeutung.

Wenn man jetzt annehmen würde, dass der Aufbau gleich ist wie beim Parameterteil beim Lesen von Variablen, also 1. Byte Funktion und 2. Byte Anzahl der Bereiche, dann würde das für die "normalen" 0x07er Telegramme sogar passen.
1. Byte Funktion: Ist immer 0x00, eben Funktionscode 0x00
2. Byte Anzahl: Ist immer 0x01, also es folgt eine Bereich je nach Spezifikation.

So wie ich das sehe gibt es dann von den 0x07er Telegrammen nur noch die Betriebszustandsübergangs-Meldungen (z.B. Run->Stop), die enthalten:
1. Byte Funktion: Ist immer 0x01, ->Betriebszustandsübergangs-Meldung
2. Anzahl: Ist immer 0, also hier folgt keine Bereich und Spezifikation.

Von den folgenden 6 Bytes kenne ich nur die Bedeutung von einem, welches den aktuellen Betriebszustand enthält. Die anderen Bytes sind aber immer gleich.
 
@Thomas_v2.1: Habe dir einmal meine Erkenntnisse zu den Strukturen 0x11, 0x12 und 0x13 angehängt. Das log schaue ich mir noch an.
Hallo Rainer,

Bezüglich des Bytes vor der R_ID bei BSEND sehe ich keine Änderung wenn dort ein Wert 0 oder ungleich 0 eingetragen wird. Ich habe mal ein Test zwischen WinCC und einer S7 gemacht bei dem beide Seiten auf der Verbindung senden. Die eine Seite trägt 0xcc ein, und die andere 0x00. Bei anderen Aufzeichnungen die mir vorliegen sehe ich noch andere Werte, aber mir scheint egal zu sein was dort steht. Vermutung, dass es etwas mit aktiver/passiver Seite zu tun hat?

Ich hänge mal ein pdf mit ein paar Screenshots von BSEND an, und auch wie ich den Parameterteil jetzt interpretieren würde. Ich will nicht zu viel ändern, falls jemand irgendwelche Scripte zur Analyse anhand der Filteroptionen programmiert hat. Aber ganz ohne Änderung geht es nicht. Ich habe noch ein paar andere Exoten ergänzt, wie Datensatzrouting und AR_SEND.
 

Anhänge

  • S7comm-param.pdf
    405,1 KB · Aufrufe: 10
Zurück
Oben