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

Ergebnis 1 bis 7 von 7

Thema: Warum haben die PUT/GET Instanzen nur noch 0 Bytes?

  1. #1
    Registriert seit
    22.11.2007
    Beiträge
    731
    Danke
    6
    Erhielt 89 Danke für 62 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    bei einer 300/400 belegen die PU/GET instanzen noch Platz im static Bereich und machen
    deswegen für mich auch Sinn im IDB

    aber bei einer 1500er (Optimierung ausgeschaltet) brauchen die kompletten PUT/GET Strukturen nur noch
    0 bytes und kommen auch ohne Platzverbrauch so in den IDB - was ist der Sinn dahinter, was bringt
    dieses leere Struktur in dem IDB?

    Kann mich jemand erleuchten

    put_get_null_bytes.png
    Zitieren Zitieren Warum haben die PUT/GET Instanzen nur noch 0 Bytes?  

  2. #2
    LowLevelMahn ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2007
    Beiträge
    731
    Danke
    6
    Erhielt 89 Danke für 62 Beiträge

    Standard

    könnte es sein das der interne GET-FB optimiert (also nicht absolut) ist und deswegen kein Speicher braucht?

  3. #3
    Registriert seit
    24.04.2013
    Beiträge
    309
    Danke
    23
    Erhielt 160 Danke für 88 Beiträge

    Standard

    Zitat Zitat von LowLevelMahn Beitrag anzeigen
    könnte es sein das der interne GET-FB optimiert (also nicht absolut) ist und deswegen kein Speicher braucht?
    Hi

    ja, wenn du dich nicht dagegen wehrst, dann wird optimiert. Und Optimiert, hießt, dass dir keine Offsets mehr bekannt gegeben werden.
    In den Bausteineigenschaften wird dir angezeigt, dass der Baustein sehr wohl einige Bytes belegt, S. sagt dir halt nicht wo.

    Der Zugriff auf den optimierten Speicher ist eigentlich immer schneller. Bei der 1200 fallen die Unterschiede nicht so groß aus. Bei der 1500 sind sie deutlich größer.

    Der optimierte Bedarf einer Struktur ist meist kleiner, gelegentlich aber auch größer. Wenn man in einem DB alles auf 0 setzt und nur einen auf 1, dann kann man im Wireshark schon finden, wo bei einer 1200 was im Speicher liegt.

    Die Daten sind so ausgerichtet, dass sie auf einer Adresse zu liegen kommen, die ihrer Breite entspricht. Ein LREAL liegt auf einem Offset der sich durch 8 teilen lässt. Ein INT liegt auf einer durch 2 teilbaren Adresse.
    Innerhalb einer Struktur werden zuerst die großen, dann die kleinen Typen abgelegt. Damit kann die Struktur wiederum als ganzes auf ihr erstes Element ausgerichtet werden. Eigentlich gar nicht so blöd, wären da nicht die Nebenwirkungen.
    Bei der 1500 benötigt ein BOOL ein ganzes Byte. Deshalb kann die 1500 6mal so schnell drauf schreiben und drei mal so schnell davon lesen.

    Weil die Daten nun nicht mehr in der Reihenfolge liegen, in der wir sie deklariert haben, hat uns Siemens vermutlich den ANY weggenommen. D.h. all die Tricks mittels selbst zusammengebautem ANY und wieder zerlegtem DB und Adressregister Zugriffe im DB zu adressieren klappen nicht mehr. Mit dem Variant, den S. intern dafür verwendet, dürfen wir noch nicht. Schauen wir mal, was die V13 bringt.

    'n schön' Tach auch
    HB

  4. #4
    LowLevelMahn ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2007
    Beiträge
    731
    Danke
    6
    Erhielt 89 Danke für 62 Beiträge

    Standard

    Code:
    Die Daten sind so ausgerichtet, dass sie auf einer Adresse zu liegen kommen, die ihrer Breite entspricht. Ein LREAL liegt auf einem Offset der sich durch 8 teilen lässt. Ein INT liegt auf einer durch 2 teilbaren Adresse.
    Innerhalb einer Struktur werden zuerst die großen, dann die kleinen Typen abgelegt. Damit kann die Struktur wiederum als ganzes auf ihr erstes Element ausgerichtet werden. Eigentlich gar nicht so blöd, wären da nicht die Nebenwirkungen.
    logisch klar - gibts eine Doku dazu oder woher hast du die Informationen?

  5. #5
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.181
    Danke
    923
    Erhielt 3.289 Danke für 2.658 Beiträge

    Standard

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. #6
    LowLevelMahn ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2007
    Beiträge
    731
    Danke
    6
    Erhielt 89 Danke für 62 Beiträge

    Standard

    Die Daten sind so ausgerichtet, dass sie auf einer Adresse zu liegen kommen, die ihrer Breite entspricht. Ein LREAL liegt auf einem Offset der sich durch 8 teilen lässt
    damit klärt sich auch dieser Satz von dir - LREALs werden nicht gezielt an 64Bit teilbaren Addressen aligned sondern das ergibt sich eben durch die sortierung nach der Größe automatisch
    ansonsten wird eher an 32Bit aligned weil die 1500er wohl ein 32Bit System ist

  7. #7
    Registriert seit
    24.04.2013
    Beiträge
    309
    Danke
    23
    Erhielt 160 Danke für 88 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von LowLevelMahn Beitrag anzeigen
    damit klärt sich auch dieser Satz von dir - LREALs werden nicht gezielt an 64Bit teilbaren Addressen aligned sondern das ergibt sich eben durch die sortierung nach der Größe automatisch
    ansonsten wird eher an 32Bit aligned weil die 1500er wohl ein 32Bit System ist
    Hi

    nachdem was ich mit dem Wireshark so aus der Kommunikation raus bekomme, ist vorrangig die Daten so in den Speicher zulegen, dass ein Prozessor schnell drauf zugreifen kann.
    Auf dem PC ist es so, dass wenn man #pragma pack 8 voreingestellt hat, so verschwenden C++ und C# für jeden Datentyp 8 Byte. Da freut sich Intel und die Hersteller von DRAM.
    Siemens scheint nicht ganz so großzügig zu sein (unser Glück). Im Programmierleitfaden (siehe oben) steht was von 32 Bit und bei der 1500 auch was von little endian, aber die Aussagen dort lassen viel Raum für Interpretation.
    Das Sortieren ist eine Möglichkeit sowohl wenig Platz zu brauchen als auch dem Prozessor schnellen Zugriff zu ermöglichen. Macht C# auch.

    Ich vermute, dass sowohl in der 1200 als auch in der 1500 ein 32 Bit Prozessor drin ist -- es gibt ja kaum noch kleinere zu kaufen, die annähernd die Leistung bringen -- aber weder hat S. die Datenbausteine noch das was im 1200er-MC7 drin ist auf 32 Bit ausgelegt. Der MC7strich der 1200 ist ein gar gruseliges Bitgeschubse. Da gab es doch einen Thread mit dem schönen Titel "der 1200 unter den Rock geschaut" ...

    Wenn sie ihr System auf 32 Bit ausgelegt hätten, dann würden sie zwischen die 8 und 16 Bit typen ja jeweils 24 bzw 16 Bit Platz lassen. Das macht S. aber nicht. Ich denk mal, wenn wir ein Byte lesen, dann lesen wir ein Byte und nicht vier. Sollte S. in der 1518 -- falls sie mal kommt -- einen fetten Intel drin haben, so ließt der dann 64 Byte um damit eine Cacheline zufüllen. Aber gerechnet wird dann trotzdem mit 16 Bit wenn wir ein ADD_INT machen.

    'n schön' Tach auch
    HB

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 03.12.2012, 10:35
  2. Warum kann S7 nur 6-dimensionales Feld (Array)?
    Von bischkul im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 26.10.2009, 21:14
  3. Hauptschalter in Schaltschranktüre: Warum nur in Off?
    Von maxi im Forum Schaltschrankbau
    Antworten: 16
    Letzter Beitrag: 19.10.2007, 12:53
  4. Antworten: 20
    Letzter Beitrag: 04.05.2006, 09:04
  5. Grafik einfügen...Nur als Paket, warum?
    Von Anonymous im Forum HMI
    Antworten: 3
    Letzter Beitrag: 04.02.2005, 20:05

Lesezeichen

Berechtigungen

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