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

Ergebnis 1 bis 4 von 4

Thema: PackMode bzw. Padding Bytes bei Siemens / Wago / Beckhoff

  1. #1
    Registriert seit
    22.11.2013
    Beiträge
    9
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    wir empfangen auf einem serverseitigen System TCP-IP-Nachrichten von SPS-Steuerungen.
    Im Rahmen einer Weiterentwicklung haben wir beschlossen, künftig auch Wago bzw. Beckhoff Steuerungen an unserem Konnektor zu betreiben.
    Problematisch ist an dieser Stelle, dass sich die Telegramme trotz dem identischen Inhalt von Nutzdaten, je nach Steuerungstyp unterscheiden.
    Siemens verwendet ein PackMode 2, Beckhoff lässt sich einstellen und Wago kann nur PackMode 4.

    Bei der Analyse des empfangen Bytestreams ist es somit unterschiedlich, an welchem Byteoffset die nächste Variable beginnt, da je nach PackMode sogenannte Padding-Bytes vom PLC-Controller eingefügt werden. --> http://infosys.beckhoff.de/index.php...gnment.htm&id=

    Behoben wäre das Problem innerhalb unserer Applikation (C#) durch die Abbildung eines Telegramms in Form von Strukturen. Diesen Strukturen könnte je nach Steuerung ein spezifisches LayoutAttribute vorangestellt werden. --> [StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, Pack=4)]
    https://msdn.microsoft.com/de-de/lib...v=vs.100).aspx

    Hierbei könnte über die Marshalklasse sowohl die Länge einer Variable als auch ihr Offset erfragt werden und anschließend mit dem PLC-spezifischen Converter in den entsprechenden .Net Datentyp gewandelt werden.
    Da wir zum Start unserer Applikation die Vielzahl von Nachrichten nicht kennen, müssten wir zur Laufzeit mit CodeDom die Strukturen erstellen und laden. Da dies zu einem nur schwer lesbaren Quellcode führt, würde ich bei der Implementierung gerne darauf verzichten.

    Jetzt zur eigentlichen Frage:
    Ziel sollte es sein, dass unsere Converter-Klasse die Berechnung des nächsten Offsets selbständig übernehmen kann und somit den Algorithmus des LayoutAttributes "Pack" übernimmt.
    Leider habe ich hier bei meiner bisherigen Suche im Netz noch nichts brauchbares gefunden.
    Grundlage des Pack-Algorithmus ist meiner Meinung nach eine Modulo Berechnung. Allerdings bilden auch weitere Faktoren die Grundlage. Beispielsweise: Was ist mein nächster Datentyp im Stream... Je nachdem kann die Anzahl von Padding Bytes variieren.

    Hatte von Euch evtl. jemand bereits vor einem ähnlichen Problem gestanden?

    Vielen Dank für die Mithilfe!

    Grüße,
    spsTec
    Zitieren Zitieren PackMode bzw. Padding Bytes bei Siemens / Wago / Beckhoff  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.192
    Danke
    925
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Statt Strukturen könnte man einfach alles ganz unwissenschaftlich selber in ein Array Of Byte packen und hätte dann keine Probleme mit Padding Bytes. Nebenbei würde man da auch gleich die Endianness eindeutig festlegen.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #3
    spsTec ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    22.11.2013
    Beiträge
    9
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Harald,

    der grobe Aufbau unseres Telegramms ist folgendermaßen:

    L5 Header
    L6 Header
    L7 Nutzdaten

    Empfangen auf Serverseite wird ein Byte[]. Über eine Konfigurationsdatenbank wissen wir, welche Datentypfolge innerhalb der Nutzdaten kommt.
    Um auf den .net Zieldatentyp zu parsen, fehlt uns zur Laufzeit, auf Grund der unterschiedlichen Pack_modi, leider der Offset innerhalb des Byte[] wo der aktuelle Nutzdatenwert steht.
    Auf der SPS alles in ein Byte[] zu verpacken wird schwierig, da wir hierbei an Dynamik verlieren würden.

    Viele Grüße,
    spsTec

  4. #4
    spsTec ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    22.11.2013
    Beiträge
    9
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich habe einen Weg zum Umgehen des Problems gefunden. Wie bereits vermutet ist die Lösung eine Modulo-Regel.
    Ist diese nicht erfüllt, so wird mit Padding-Bytes aufgefüllt, bis der neue Offset im Byte[] die festgelegte Regel erfüllt.

    Hier die Lösung, falls sie auch für andere Kollegen hilfreich sein könnte:

    Code:
    private int calculatePackOffset(int actOffset, int typeSize)
    {            
        // this function calculate the right offset in dependence of pack mode
        while (actOffset % Math.Min(packMode, typeSize) != 0)
        {
            ++actOffset;
        }
    
        return actOffset;
    }
    

    Viele Grüße,
    spsTec

Ähnliche Themen

  1. Padding Bytes
    Von xXDragonflyXx im Forum PHOENIX CONTACT
    Antworten: 8
    Letzter Beitrag: 04.05.2015, 22:11
  2. Step 7 Einzelne Bytes eines Arrays auslesen bzw. berechnen
    Von knollsimi im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 15.11.2014, 19:06
  3. Hilfe Bei Beckhoff oder Wago 750-xxx SPS
    Von leonhandball im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 23.07.2012, 11:00
  4. Wago 841: Download hängt bei 65408 Bytes
    Von cmdr im Forum CODESYS und IEC61131
    Antworten: 4
    Letzter Beitrag: 30.01.2012, 16:19
  5. Antworten: 0
    Letzter Beitrag: 06.12.2011, 22:39

Lesezeichen

Berechtigungen

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