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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: C-Script Datenformat INT/Word???

  1. #11
    Avatar von sailor
    sailor ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.02.2008
    Ort
    Bayern
    Beiträge
    611
    Danke
    64
    Erhielt 27 Danke für 23 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Also: Stat1 Stat 2 werden schon geschrieben, aber mit den falschen werten!!! Aber die werden wie 32 Bit behandelt. Irgendwas ist mit Rohdatenvariablen faul, glaub ich. Aber was? Ich hab eine SoftSPS (RTX) auf den gleichen PC laufen. Vieleicht liegts daran ??

  2. #12
    Registriert seit
    23.08.2004
    Beiträge
    565
    Danke
    73
    Erhielt 19 Danke für 18 Beiträge

    Standard

    bin überfragt. Sorry. Hast keine S7 da?

  3. #13
    Avatar von sailor
    sailor ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.02.2008
    Ort
    Bayern
    Beiträge
    611
    Danke
    64
    Erhielt 27 Danke für 23 Beiträge

    Standard

    Doch. Probier ich mal . Bin aber die nächsten 3 Tage unterwegs.
    Hab mit dem Sch... auch Kollege S supportrequestet.
    trotzdem Danke
    Melde mich hier wieder
    Gruß
    Sailor

  4. #14
    Registriert seit
    29.03.2004
    Beiträge
    5.793
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    Hallo,
    bei C ist es so dass ein Integer mindestens 16 Bits breit sein muss, aber er durchaus größer sein kann. Auf gängigen PC-Prozessoren ist ein int zur Zeit üblicherweise 32 Bit breit.
    Überprüfen kannst du das in deinem C-Code indem du dir mal die Ausgabe von sizeof(int) ansiehst. Ich schätze mal dass dort 4 Bytes zurückgegeben werden.

    Das passt dann eben mit deinem GetTagRaw() und deiner Struktur nicht mehr zusammen. Es gibt aber Datentypen bei denen die Anzahl der Bits fest vorgegeben ist. Da wären z.B. der Typ BYTE (1 Byte) und der Typ WORD (2 Byte) (dies ist kein C-Standard, sondern WinCC bzw. Windows spezial, im C99-Standard gibt es dafür die Typen uint8_t, uint16_t etc.).

    Du könntest deine Struktur dann so ändern:
    Code:
    struct{
      WORD Stat1;
      WORD Stat2;
      WORD Stat3;
      WORD Stat4;
    } RStat;
    Nun ist aber immer noch nicht gesagt dass die Stat1-4 Variablen direkt im Speicher hintereinander liegen, denn der Compiler kann zu Optimierungszwecken sogenannte Padding-Bytes einfügen. Das macht er, weil je nach Architektur ein Zugriff auf 4 Bytes schneller ist als auf 2 Bytes die im Speicher ungünstig angeordnet sind.
    Also es kann sein, dass sizeof(WORD) den Wert 2 zurückgibt, aber im obigen Beispiel ein sizeof(RStat) einen Wert von 16 zurückgibt. Ich habs eben mal mit WinCC in einer VM getestet, dort ist die Struktur wirklich genau 8 Bytes groß (also keine Padding-Bytes).
    Aber verlassen kann man sich darauf nicht!

    Bei einigen Compilern lässt sich mit entsprechenden Compiler-Pragmas angeben, dass keine Padding-Bytes eingefügt werden sollen (beim GCC z.B. mit #pragma pack(1) ).
    Wenn du wirklich sicher sein willst dass dein Programm auf verschiedensten Prozessorarchitekturen einwandfrei läuft, ist die Lösung mit der Struktur aber unbrauchbar. Dann nimmt man ein char Array und muss wohl oder übel die einzelnen Werte selber korrekt zusammensetzen.

  5. Folgende 2 Benutzer sagen Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Bender25 (28.06.2010),sailor (30.06.2010)

  6. #15
    Registriert seit
    23.08.2004
    Beiträge
    565
    Danke
    73
    Erhielt 19 Danke für 18 Beiträge

    Standard

    hm genau das könnte das problem sein. Da hab ich gar nicht dran gedacht. Danke für die ausführliche Info

  7. #16
    Avatar von sailor
    sailor ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.02.2008
    Ort
    Bayern
    Beiträge
    611
    Danke
    64
    Erhielt 27 Danke für 23 Beiträge

    Standard

    Dann liegt die Ursache wahrscheinlich daran, daß ich keine S7-CPU benutze mit einer Verbindung über den Treiber S7-Protocol-Suite sondern eine WINLC RTX von Siemens über den gleichen Treiber. In dem Fall ja den virtuellen S7-Bus.
    Da muss man ja erst mal drauf kommen.
    Siemens Supportrequest hat natürlich auch keine Ahnung warum.
    Aber ich habs jetzt so gelöst: da ich die Bytes ja sowieso in der CPU drehen muß (TAW) lade ich die Integrerwerte mach TAD und transfrerier die in Doppelwörter. Funktioniert einwandfrei. Aber die GRenze von 204 bytes der Raw-Var ist natürlich auf 32 bit Werte begrenzt.

    Herzlichen Dank noch mal an Euch und Grüezi aus der Schwyz.
    Sailor

  8. #17
    Registriert seit
    23.08.2004
    Beiträge
    565
    Danke
    73
    Erhielt 19 Danke für 18 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hast es mal mit dem vorschlag von Thomas versucht?

    Deine Struc von INT in WORD zu ändern? Dann sollte es gehen!!

Ähnliche Themen

  1. Datenformat
    Von römi im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 07.07.2009, 07:04
  2. Datenformat Char
    Von CanYouHelpMe im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 15.09.2008, 09:23
  3. S7 REAL Datenformat
    Von cidex im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 09.08.2007, 19:37
  4. Datenformat eeprom
    Von mariob im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 24.03.2006, 22:31
  5. SM338 Pos-Input Datenformat?
    Von Krumnix im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 16.01.2006, 19:54

Lesezeichen

Berechtigungen

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