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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: TwinCat ADS Kommunikation: Bytes verschoben?

  1. #1
    Registriert seit
    03.12.2014
    Beiträge
    57
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    ich habe eine Frage, bei der wir aktuell nicht weiter kommen.
    Wir haben zwar eine Idee, wissen aber nicht ob das richtig ist und wie wir das lösen können.

    Wir möchten mit TwinCAT 2 eine ADS Kommunikation zwischen einer CX5020 (Intel Celeron X86) und einem CP66 (ARM) aufbauen.
    Prinzipiell funktioniert das auch: Ein Struct mit verschiedenen Variablen und fester Adresse im Speicher auf der einen CPU, ein ADSRead Befehl auf der anderen CPU.

    Das Problem ist, dass das gleiche Struct auf der Ziel CPU anders beschrieben wird. Die Werte stimmen nicht!
    Wir haben uns die übertragenen Daten Byte für Byte in Hex angesehen und festgestellt, dass die Bytes korrekt übertragen werden.
    Das Problem ist aber, dass es von der einen CPU zur anderen eine Verschiebung der Variablen gibt.

    Beispiel: Erstes Teil im Struct ist ein String der Länge 32. Die ersten 32Bytes sind Chars, Byte 33 ist der Abschluss vom String.
    Die nächste Variable ist eine Real. Die eine CPU fängt mit der Real in Byte 34 an, die andere in Byte 37.

    Unsere Theorie:
    Die CX5020 nutzt jedes Byte ohne Lücke, das CP66 lässt teilweise Lücken und nutzt "eine Art Viererpack".....
    Ich hoffe, das war jetzt verständlich....

    Nun zu den Fragen:
    Warum ist das so?
    Gibt es hierfür unterschiedliche Arten für eine Speicherbelegung? Wenn ja, wo steht das?
    Wie setze ich eine ADS Kommunikation dann vernünftig um? Passende Reihenfolge der Variablen?

    Danke!
    Zitieren Zitieren TwinCat ADS Kommunikation: Bytes verschoben?  

  2. #2
    Registriert seit
    04.01.2015
    Beiträge
    64
    Danke
    0
    Erhielt 18 Danke für 17 Beiträge

    Standard

    Hallo beschreibung.
    Die Frage ist ob du per Compiler das Alingment ausschalten kannst.
    Wenn nicht , müsstest du die Structur so aufbauen, dass kein Alingment benötigt wird. (Ausfüllen mit ReserveBytes)

    http://de.wikipedia.org/wiki/Speicherausrichtung

    Sind die Operanden im Speicher nicht ausgerichtet, so ist eine lückenlose Nutzung des Speichers auch bei beliebiger Mischung der Datenformate möglich. Allerdings müssen abhängig von der zufälligen Anordnung ggf. mehr Speicherzugriffe erfolgen, als eigentlich für ein solches Datenelement minimal nötig wären. Durch zusätzliche Shiftoperationen müssen die Operandenteile danach erst wieder zusammengesetzt werden. (Genau genommen sind bei n größer m auch Shift-Operationen nötig, die aber bei vorgegebener Datenbusbreite unvermeidlich sind und somit kein "data misalignment" sind.)
    Je nach benutzter Prozessorarchitektur wird ein Zugriff auf nicht ausgerichtete Daten hardwareseitig gar nicht unterstützt. In diesem Falle müsste eine spezielle Programmroutine, welche die Daten softwareseitig zusammensetzt, implementiert und für jeden Zugriff ausgeführt werden. Der Mehraufwand geht weit über bloße zusätzliche Speicherzugriffe hinaus.

  3. #3
    Registriert seit
    04.01.2015
    Beiträge
    64
    Danke
    0
    Erhielt 18 Danke für 17 Beiträge

    Standard

    Schaue unter Alignment
    Manche Compiler fügen bei der Structur ReserveBytes ein damit ein DatenWord wieder auf eine gerade Adresse kommt.
    Ob du dies bei deinem Compiler ausschalten kanst , weiss ich nicht.


    http://de.wikipedia.org/wiki/Speicherausrichtung

  4. #4
    Registriert seit
    29.03.2004
    Beiträge
    5.797
    Danke
    144
    Erhielt 1.707 Danke für 1.239 Beiträge

    Standard

    Wahrscheinlich hat der ARM Prozessor eine andere Bytereihenfolge (Endianess). Zumindest bei den PLC-Bausteinen für ADS-Funktionen ist angemerkt, dass bei der Übertragung von Gleitkommavariablen die Endianess beachtet werden muss.
    http://infosys.beckhoff.com/index.ph...nDelta.htm&id=

    Wie du das Problem lösen kannst weiß ich allerdings auch nicht. Spricht nicht gerade für das ADS-Protokoll, dass die Daten nicht in einer festgelegten einheitlichen Bytereihenfolge übertragen werden.

  5. #5
    Registriert seit
    04.01.2015
    Beiträge
    64
    Danke
    0
    Erhielt 18 Danke für 17 Beiträge

    Standard

    Schaue unter Alignment
    Manche Compiler fügen bei der Structur ReserveBytes ein damit ein DatenWord wieder auf eine gerade Adresse kommt.
    Ob du dies bei deinem Compiler ausschalten kanst , weiss ich nicht.

    http://de.wikipedia.org/wiki/Speicherausrichtung

  6. #6
    Registriert seit
    03.12.2014
    Beiträge
    57
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hi.
    Danke für die Antwort. Die Übertragung ist 1 zu 1. Das passt.
    Es ist definitiv so, dass die Variablen der Steuerungen unterschiedlich auf den Speicher zugreifen.
    Wenn die Real Variable am Anfang vom Struct steht, wird sie übertragen. Es ist kein Endianess Problem.
    Das Problem tritt dann auf, wenn ich eine Variable mit weniger als 4 Byte Länge vor z.B. einem Real habe.
    Weil dann die Real an unterschiedlichen Stellen in beiden Steuerungen beginnt.

  7. #7
    Registriert seit
    29.03.2004
    Beiträge
    5.797
    Danke
    144
    Erhielt 1.707 Danke für 1.239 Beiträge

    Standard

    Das hört sich dann nach Padding bzw. Alignement an. D.h. die Variablen werden so im Speicher abgelegt, dass der Prozessor optimal darauf zugreifen kann. Wenn es für ein Prozessortyp effektiver ist alle Werte an 4 Byte Grenzen auszurichten, und davor kommt nur eine 2 Byte-Variable, dann werden dazwischen 2 Null-Bytes eingefügt die nicht verwendet werden.

    Der direkte Zugriff auf Speicher ist nie eine gute Idee. Es kann auch sein dass eine andere Compiler-(Linker)-version die Variablen anders im Speicher ablegt, da kannst du dir nie sicher sein.

  8. #8
    Registriert seit
    03.12.2014
    Beiträge
    57
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hi.
    Ok, aber wie mache ich dann eine ADS Kommunikation ohne direkten Zugriff auf den Speicher?
    Das ist ja genau so beschrieben. Die Daten liest er ja auch entsprechend.
    Problem ist halt nur die unterschiedliche Aufteilung.
    Wir haben uns nun überlegt, einfach beim Erstellen vom Struct auf diese "Eigenschaft" zu achten und die Variablen entsprechend zu sortieren. Dann sollte es gehen....

  9. #9
    Registriert seit
    04.11.2014
    Beiträge
    139
    Danke
    1
    Erhielt 25 Danke für 23 Beiträge

    Standard

    Hallo,

    du musst die Struktur nur richtig anordnen, auf beiden Seiten. Siehe:
    http://infosys.beckhoff.com/index.ph...t.htm&id=20943

    Grüße

  10. #10
    Registriert seit
    04.11.2014
    Beiträge
    139
    Danke
    1
    Erhielt 25 Danke für 23 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Vielleicht noch kurz:
    Du solltest die größte von oben nach unten anordnen. Spricht 4Byte, 2Byte, 1Byte.
    Dann sollte es gehen.

    Grüße

Ähnliche Themen

  1. Antworten: 9
    Letzter Beitrag: 28.11.2014, 10:59
  2. Twincat 3 Ads Kommunikation Array of Strings
    Von Neuling2014 im Forum CODESYS und IEC61131
    Antworten: 13
    Letzter Beitrag: 02.09.2014, 13:05
  3. TwinCat ADS
    Von Bigchaqy im Forum CODESYS und IEC61131
    Antworten: 9
    Letzter Beitrag: 08.10.2011, 23:46
  4. Bei Ethernet Kommunikation fehlen Bytes
    Von Power_Pete im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 15.01.2010, 17:20
  5. Twincat ads
    Von Simo im Forum CODESYS und IEC61131
    Antworten: 6
    Letzter Beitrag: 23.03.2009, 17:49

Lesezeichen

Berechtigungen

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