Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 18 von 27 ErsteErste ... 81617181920 ... LetzteLetzte
Ergebnis 171 bis 180 von 262

Thema: Wireshark Plugin für S7-Protokoll

  1. #171
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.645
    Danke
    208
    Erhielt 409 Danke für 328 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    .Net nutzt das ganze z.B. beim Serialisieren für die String Länge, aber dann nur für UInts, und da sieht der Algorithmus ja viel einfacher aus...
    ---------------------------------------------
    Jochen Kühner
    http://jfk-solutions.de/ - Softwareentwicklung, Programmierung, ...
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    IPhoneS7 - Inbetriebnahme Tool fürs IPhone (VarTab, Baustein-, PLC-Status)

  2. #172
    Avatar von Thomas_v2.1
    Thomas_v2.1 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2004
    Beiträge
    5.077
    Danke
    128
    Erhielt 1.477 Danke für 1.088 Beiträge

    Standard

    Also was ich so gesehen habe, hat sich Siemens beim TIA-Portal wirklich viel bei Microsoft abgeguckt. Sei es hier, oder beim Bytecode für die 1200er.

    Aber die Sache hier mit dem varuint Typ war wirklich ein Schlüssel. Es lüftet sich der Schleier, und man findet altbekannte Werte wie die CRC aus dem anderen Adressierungsmodus den die V11 verwendet hat wieder.

  3. #173
    Registriert seit
    19.06.2003
    Beiträge
    2.197
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von Jochen Kühner Beitrag anzeigen
    Also mein Algorythmus zum Codieren ist ja großer Müll... Aber hab im Moment keinen besseren Parat...
    Wie ist es damit?
    http://msdn.microsoft.com/en-us/libr...ncodedint.aspx

    Mono macht das so:
    https://github.com/mono/mono/blob/ma...inaryWriter.cs
    Code:
    protected void Write7BitEncodedInt(int value) {
    do {
    int high = (value >> 7) & 0x01ffffff;
    byte b = (byte)(value & 0x7f);
    if (high != 0) {
    b = (byte)(b | 0x80);
    }
    Write(b);
    value = high;
    } while(value != 0);
    }
    Geändert von Zottel (16.09.2014 um 12:09 Uhr)

  4. #174
    Avatar von Thomas_v2.1
    Thomas_v2.1 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2004
    Beiträge
    5.077
    Danke
    128
    Erhielt 1.477 Danke für 1.088 Beiträge

    Standard

    Das Siemens Format ist aber etwas anders.
    Bei den .Net Funktionen werden negative Zahlen zwar komprimiert aber immer noch als Zweierkomplement abgelegt.
    -127 = 0x 81 ff ff ff 0f
    +127 = 0x 7f

    Da ist das Siemens Format bei negativen Zahlen platzsparender.

  5. #175
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.645
    Danke
    208
    Erhielt 409 Danke für 328 Beiträge

    Standard

    Das .NET Format ist auch bei Positiven Zahlen anderst... schau dir mal

    +126 = 80 7e 00 00
    +127 = 80 7f 00 00
    +128 = 81 00 00 00
    +129 = 81 01 00 00

    an...
    ---------------------------------------------
    Jochen Kühner
    http://jfk-solutions.de/ - Softwareentwicklung, Programmierung, ...
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    IPhoneS7 - Inbetriebnahme Tool fürs IPhone (VarTab, Baustein-, PLC-Status)

  6. #176
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.645
    Danke
    208
    Erhielt 409 Danke für 328 Beiträge

    Standard

    Hab mal beide Funktionen in eine Klasse gebaut... wie gesagt, meine gehört noch verbessert, aber funzt im Moment...

    Code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    
    namespace DotNetSiemensPLCToolBoxLibrary.PLCs.S7_1xyy
    {
    publicstaticclassVariableLengthQuantityHelper
        {
            public static int DecodeInt(byte[] bytes, int offset)
            {
                int n;
                uint val = 0;
                byte b;
    
    
                for (n = 1; n <= 4 + 1; n++)
                {        /* große Werte benötigen 5 Bytes */
                    b = bytes[offset];
                    offset += 1;
    
    
                    if ((n == 1) && ((b & 0x40) > 0))
                    {   /* Vorzeichen prüfen */
                        b &= unchecked((byte)~0x40);
                        val = 0xffffffff;
                        val <<= 6;
                    }
                    else
                    {
                        val <<= 7;
                    }
                    if ((b & 0x80) > 0)
                    {                 /* es folgt noch ein Byte */
                        b &= unchecked((byte)~0x80);
                        val |= b;
                    }
                    else
                    {                        /* alle Bytes gelesen */
                        val |= b;
                        break;
                    }
                }
    
    
                return (int)val;
            }
    
    
            public static byte[] EncodeInt(int value)
            {
                var retVal = new List<byte>();
    
    
                var wr = value;
                if (value < 0)
                    wr *= -1;
    
    
                var anzBytes = 1;
    
    
                var anzBits = (int)Math.Ceiling(Math.Log(wr) / Math.Log(2));
                if (anzBits >= 6)
                {
                    anzBytes++;
                    anzBits -= 6;
                }
                while (anzBits > 7)
                {
                    anzBytes++;
                    anzBits -= 7;
                }
    
    
    
    
                for (int i = 1; i <= anzBytes; i++)
                {
                    byte wert = 0;
    
    
                    var fakt = (anzBytes - i) * 7;
                    var divisor = (int)Math.Pow(2, fakt);
                    wert = (byte)(wr / divisor);
                    wr = wr % divisor;
    
    
                    if (value < 0)
                    {
                        if (i == anzBytes || wr == 0)
                            wert -= 1;
    
    
                        wert = (byte)~(wert);
                        if (i == anzBytes)
                            wert &= 0x7F;
    
    
                        if (i == 1)
                            wert |= 0x40;
                    }
    
    
                    if (i != anzBytes)
                        wert |= 0x80;
    
    
    
    
                    retVal.Add(wert);
                }
    
    
                return retVal.ToArray();
            }
        }
    }
    ---------------------------------------------
    Jochen Kühner
    http://jfk-solutions.de/ - Softwareentwicklung, Programmierung, ...
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    IPhoneS7 - Inbetriebnahme Tool fürs IPhone (VarTab, Baustein-, PLC-Status)

  7. #177
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.645
    Danke
    208
    Erhielt 409 Danke für 328 Beiträge

    Standard

    Ich denke im TIA Projekt sind Bausteine Daten mit ZLib komprimiert gespeichert... Bin mir da aber nicht sicher, könnte aber ja auch sein das auf die PLC etwas komprimiert übertragen wird...
    ---------------------------------------------
    Jochen Kühner
    http://jfk-solutions.de/ - Softwareentwicklung, Programmierung, ...
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    IPhoneS7 - Inbetriebnahme Tool fürs IPhone (VarTab, Baustein-, PLC-Status)

  8. #178
    Avatar von Thomas_v2.1
    Thomas_v2.1 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2004
    Beiträge
    5.077
    Danke
    128
    Erhielt 1.477 Danke für 1.088 Beiträge

    Standard

    Ich habe nur Zugriff auf eine S7-1200, aber bei dem Aufbau der Kommunikation eines Panels zur SPS bin ich ein ganzes Stück weiter. Zumindest beim Aufbau der Variablenanfragen und der Werte in den Antworttelegrammen.

    Um einen Kommunikationstreiber zu schreiben der symbolisch auf eine 1200er zugreifen kann reicht es aber noch nicht ganz aus, wobei auf jeden Fall die LIDs aus dem TIA-Projekt ausgelesen werden müssen. Die CRC kann man sich aus dem Symbol ja selber berechnen.
    Vielleicht hat ja jemand Lust am rätseln wie der Aufbau der fehlenden Stücke wohl sein könnte. Vor allem beim Antworttelegramm zum ersten Verbindungsaufbau gibt es mittendrin eine seltsame Struktur, bei der ich nicht weiterkomme. Ich denke mal man wird irgendetwas von diesen Werten benötigen um die Session-Id für den weiteren Datenverkehr zu bestimmen.

    Das unpraktische an den varuint-Typen ist, dass man im Telegramm nicht sehen kann ob ein Feld ein Typ mit fester Größe oder eben der varuint ist, außer wenn man Werte größer 2^7 für das Feld provizieren kann.

    Ich hänge mal den aktuellen Stand der dll für 32 Bit, und zwei Logfiles an, bei denen ein Panel mit einer 1200er kommuniziert.
    Angehängte Dateien Angehängte Dateien

  9. #179
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.645
    Danke
    208
    Erhielt 409 Danke für 328 Beiträge

    Standard

    Die symbolische anfrage bei der 1200er geht doch auch ähnlich wie bei der s7 300/400, oder gehts bei dir um eine andere kommunikation?
    ---------------------------------------------
    Jochen Kühner
    http://jfk-solutions.de/ - Softwareentwicklung, Programmierung, ...
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    IPhoneS7 - Inbetriebnahme Tool fürs IPhone (VarTab, Baustein-, PLC-Status)

  10. #180
    Avatar von Thomas_v2.1
    Thomas_v2.1 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2004
    Beiträge
    5.077
    Danke
    128
    Erhielt 1.477 Danke für 1.088 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ja, das ist ein komplett anderes Protokoll als bei der 300/400 mit der 0x32 als Protokoll-Id, welche jetzt 0x72 lautet.
    Innendrin steckt zumindest für die 1200 aber immer noch der Zugriffsmechanismus über die Symbol-Prüfsumme und den LID-Nummern, nur die LID-Flags sind weggefallen. Seit V12 verwendet die HMI-Simulation nur noch diese Telegramme. Ich weiß nicht ob die vorige Variante von neuen CPUs überhaupt noch unterstützt wird.

    Von der 1500 habe ich selber nur ein paar Logfiles gesehen. Die verwendet was ich da gesehen habe vom Prinzip her den gleichen Telegramm-Aufbau wie die 1200 (also die 0x72er Telegramme), aber innendrin sieht es etwas anders aus.

Ähnliche Themen

  1. Wireshark Auszüge von Onlinebeobachtungen
    Von Jochen Kühner im Forum Simatic
    Antworten: 40
    Letzter Beitrag: 25.01.2011, 15:44
  2. Wireshark 1.2.0 ohne AMS.ADS?
    Von Neals im Forum CODESYS und IEC61131
    Antworten: 3
    Letzter Beitrag: 08.07.2009, 21:29
  3. Wireshark als Sender
    Von Tapio Bearking im Forum PC- und Netzwerktechnik
    Antworten: 2
    Letzter Beitrag: 08.07.2008, 11:47
  4. AK- Protokoll
    Von borromeus im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 27.02.2007, 17:30
  5. S7-Protokoll 2
    Von Zapot im Forum Feldbusse
    Antworten: 1
    Letzter Beitrag: 21.08.2006, 09:37

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •