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

Ergebnis 1 bis 6 von 6

Thema: daveWriteBytes HILFE

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo!

    bräuchte mal wieder Hilfe, verstehe das mit dem buffer in WryteBytes nicht ganz!

    Ich habe z.B einen Wert der in einer integer Variablen drinn steht und möchte den in ein Word auf die SPS schreiben.

    Integer hat bei C nunmal 4 Bytes, das Word nur 2 Bytes.

    Wenn ich nun die Adresse der Variablen übergebe, werden dann nur die ersten beiden Bytes in die SPS übertragen? und die beiden höheren ignoriert?

    Gibt es in de library eine Funktion mit der ich das bigEndian und littleEndian problem lösen kann? oder muss ich mich diesmal quasi selbst darum kümmern?

    Danke
    Zitieren Zitieren daveWriteBytes HILFE  

  2. #2
    Registriert seit
    29.03.2004
    Beiträge
    5.792
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    Hi!

    Zeig doch mal ein Codeschnipsel wie du versuchst den Wert zu schreiben.

    Zitat Zitat von TheEngineer0815 Beitrag anzeigen
    Integer hat bei C nunmal 4 Bytes, das Word nur 2 Bytes.
    Das ist nicht richtig.
    Im C-Standard ist nur festgelegt dass ein Integer wenigstens 16 Bit haben muss. Meistens ist ein Integer aber die natürliche Größe des Prozessors. Auf einem aktuellen x86 dann z.B. 4 Bytes, auf einem 8-Bit AVR hat ein Integer auch nur 2 Bytes.
    Den Datentyp Word gibt es im C-Standard gar nicht.

    Um Datentypen mit fester Bit-Breite zu benutzen, müsstest du einen C-Compiler nach dem C99 Standard nehmen. Im Header "stdint.h" gibt es dann z.B. den Datentyp uint16_t der fest 16 Bit breit ist.
    Geändert von Thomas_v2.1 (18.03.2009 um 18:32 Uhr)

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

    Standard

    So Problem nach einigen Stunden des probierens gelöst!

    Integer hat auf meinem Rechner 32 Bit -> Merkeerdoppelworr

    Short Integer 16 Bit -> Merkerwort

    Hab in CVI eine Library gefunden die das Problem mit den Endians für mich erledigt.

    Sollte ich jetzt noch einzelne Bits übertragen wollen "ver-oder" ich die direkt in die Integer an die richtige Position und lass nur ein Byte abschicken.

    LG

  4. #4
    Registriert seit
    27.10.2005
    Ort
    Schwäbisch Gmünd
    Beiträge
    5.235
    Danke
    634
    Erhielt 955 Danke für 769 Beiträge

    Standard

    Ich rate zur Vorsicht. Das Schreiben von einzelnen Bits über ein Byte zu realisieren (wenn nicht alle 8 Bits geschrieben werden sollen) ist gefährlich da die nicht maskierten Bits auch auf einen Wert gesetzt werden. Beim Lesen spielt dies keine Rolle.
    Rainer Hönle
    DELTA LOGIC GmbH

    Ein Computer kann das menschliche Gehirn nicht ersetzen. Engstirnigkeit kann unmöglich simuliert werden. (Gerd W. Heyse)

  5. #5
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Du brauschst kein Extra-Bibliotheken:
    Wenn du z.B den Wert 4 schreiben willst, erzeugst du eine Variable vom typ int oder short, ganz wie du möchtest.
    int i =4;
    // in der Variablen steht jetzt: 0x04 0x00 0x00 0x00
    i=daveSwapIed_16(i);
    // in der Variablen i steht jetzt: 0x00 0x04 0x00 0x00
    Das kannst du writeBytes ohne weiteres übergeben:
    daveWriteBytes(dc, ....,2, &i); // die Länge muß 2 sein!
    Warum geht das?
    daveSwapIed_16() erwartet eine Parameter vom typ unsigned short und gibt den auch zurück.
    Der Compiler übergibt: 0x04 0x00
    daveSwapIed_16() dreht die Bytes 0 und 1 und gibt 0x00 0x04 zurück.
    Bei der Zuweisung an i (int) kopiert der Compiler diese beiden Bytes und füllt mit 0x0 auf.
    Die Benutzung von daveSwapIed_16() hat folgenden Vorteil:
    Ied steht für If endiannes differs.
    daveSwapIed_16() tut nur etwas, wenn die ausführende Maschine little endian ist.
    Du kannst das unveränderte Programm auch für Power PC oder so etwas kompilieren.

  6. #6
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Eine andere Gruppe von Funktionen kommt ins Spiel, wenn du mehrere Variablen, die in der SPS hintereinanderliegen, auf einmal schreiben willst.
    Stell dir vor, du hast in einem DB oder im Merkerbereich:
    INT MW0
    REAL MD2
    DINT MD6
    Code:
    //Du brauchst zunächst einen Puffer mit genügend Bytes
    char buf[100];
    //und einen Zeiger darauf:
    char * p=&buf[0];
    p=davePut16(p,4); legt die 4 als big endian 16_bit integer in b[0],b[1] ab.
    // p zeigt danach auf b[2]
    p=davePutFloat(p,4.444); legt die 4.444 als big endian single in b[2] bis b[5] ab.
    // p zeigt danach auf b[6]
    p=davePut32(p,4); legt die 4 als big endian 32_bit integer in b[6] bis b[9] ab.
    // p zeigt danach auf b[10]
    //den Pufferinhalt kann daveWriteBytes nun in einem Rutsch schreiben:
    daveWriteBytes(dc, ...,10,b);

Ähnliche Themen

  1. Hilfe Hilfe - HMI Fehler
    Von vietha11 im Forum HMI
    Antworten: 7
    Letzter Beitrag: 04.05.2011, 07:53
  2. Antworten: 90
    Letzter Beitrag: 21.03.2010, 12:35
  3. Moeller 719 Hilfe Hilfe
    Von kacperowski im Forum Sonstige Steuerungen
    Antworten: 0
    Letzter Beitrag: 11.05.2009, 19:57
  4. Hilfe Hilfe FM353
    Von Holle6 im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 06.10.2005, 19:03
  5. Antworten: 15
    Letzter Beitrag: 01.03.2005, 22:25

Lesezeichen

Berechtigungen

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