Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Problem mit Datentyp

Anonymous
2005-05-13
2005-06-01
  • Anonymous - 2005-05-13

    Originally created by: Alexander Frisch

    Guten Tag zusammen...

    Ich Arbeite gerade mit TwinCAT PLC-Control, das ja auf CoDeSys aufsetzt. Hoffe ich bin hier damit richtig...

    Ich habe folgendes Problem:

    Ich will CAN-Botschaften zusammenstellen und für jede Botschaft (besser gesagt deren Dateninhalt) eine Struktur, bzw. eine Instanz davon erstellen. Die Verteilung der Signale in der Botschaft ist vorgegeben. Der Zugriff auf die Signale soll einfach über "Botschaft.Signal:=Wert;" erfolgen.

    Mein Problem ist nun, dass ich Signale habe die auch mal 2,3 oder 4 Bit lang sind.

    Der kleinste Datentyp den es gibt ist Bool, aber der belegt immer 1Byte im Speicher. Wenn ich nun Die Struktur-Instanz direkt der CAN-Botschaft übergebe hat jedes Bool-Signal (auch bei Arrays) ein ganzes Byte für sich. Ausserdem liegen die Signale in der falschen Reihenfolge im Speicher.

    Byte-Elemente anlegen und jedes Bit einzeln setzen ist zu viel Arbeit.

    Ich weiss langsam echt nicht mehr weiter... Ist schon blöd, wenn der arme Praktikant der einzige ist, der sich überhaupt mit SPSen auskennt...

    Also nochmal meine Fragen im Klartext.

    1. Gibt es einen Datentyp, der nur 1 Bit Speicher belegt?

    2. Gibt es die Möglichkeit eine Anzahl von Bits unter einer gemeinsamen Bezeichnung zusammenzufassen und dieser dann ein Bitmuster bzw. einen entsprechenden dezimal/hex-Wert zuzuweisen?

    3. Wie kann man die Reihenfolge, in der Elemente einer Struktur im Speicher abgelegt werden festlegen?

    Hoffe mir kann hier einer helfen!

    Gruss

    Alexander

    Ich

     
  • Anonymous - 2005-05-18

    Originally created by: Bernhard Werner

    1. Gibt es einen Datentyp, der nur 1 Bit Speicher belegt?

    Den gibt es im Moment nicht. Für die Version 3.0 ist er geplant.

    1. Gibt es die Möglichkeit eine Anzahl von Bits unter einer gemeinsamen >Bezeichnung zusammenzufassen und dieser dann ein Bitmuster bzw. einen >entsprechenden dezimal/hex-Wert zuzuweisen?

    Gibt es auch nicht. Ich würde Ihnen raten, Ihre Struktur mit einem Byte oder

    einem Array von Bytes zu deklarieren und die Bitfelder darin über eine/mehrere Funktionen zu manipulieren.

    1. Wie kann man die Reihenfolge, in der Elemente einer Struktur im >Speicher abgelegt werden festlegen?

    Die Reihenfolge ist immer dieselbe wie in der Deklaration. Abhängig vom Prozessor kann es sein, dass zwischen zwei Elementen eine Lücke gelassen wird. In Ihrem Fall (Twincat) ist das meines Wissens nicht so. Das heisst bei Twincat liegen die Elemente einer Struktur immer hintereinander im Speicher, so wie sie deklariert wurden.

    Bernhard Werner

     
  • Anonymous - 2005-05-18

    Originally created by: Alexander Frisch

    Zitat:
    1. Gibt es einen Datentyp, der nur 1 Bit Speicher belegt?
    Den gibt es im Moment nicht. Für die Version 3.0 ist er geplant.

    naja, so lange warten kann ich leider nicht...

    Zitat:
    2. Gibt es die Möglichkeit eine Anzahl von Bits unter einer gemeinsamen >Bezeichnung zusammenzufassen und dieser dann ein Bitmuster bzw. einen >entsprechenden dezimal/hex-Wert zuzuweisen?
    Gibt es auch nicht. Ich würde Ihnen raten, Ihre Struktur mit einem Byte oder
    einem Array von Bytes zu deklarieren und die Bitfelder darin über eine/mehrere Funktionen zu manipulieren.

    auf die idee bin ich dann auch gekommen, funktioniert auch soweit, aber ist bei dem umfang in dem es in dem projekt vorkommt wohl zu zeitaufwendig... sowohl bei der programmierung als auch während der laufzeit. also entweder in den sauren apfel beissen oder auf eine epic-sps und programmierung in C umsteigen, da müsste das gehn...

    Zitat:
    3. Wie kann man die Reihenfolge, in der Elemente einer Struktur im >Speicher abgelegt werden festlegen?
    Die Reihenfolge ist immer dieselbe wie in der Deklaration. Abhängig vom Prozessor kann es sein, dass zwischen zwei Elementen eine Lücke gelassen wird. In Ihrem Fall (Twincat) ist das meines Wissens nicht so. Das heisst bei Twincat liegen die Elemente einer Struktur immer hintereinander im Speicher, so wie sie deklariert wurden.

    nicht ganz richtig, ich habe letzte woche noch mit der fa. beckhoff telefoniert und die reihenfolge bei der deklaration entspricht nicht der reihenfolge im speicher. um das passend zu bekommen muss etwas getrickst werden. habe mir das aber nich nicht genauer angesehn.

    trotzdem danke für die antwort!

     
  • Anonymous - 2005-05-18

    Originally created by: Bernhard Werner

    Egal was die Firma Beckhoff sagt:bei Strukturen entspricht die Reihenfolge im Speicher der Reihenfolge in der Deklaration. Das sagt die Fa 3S.

    Bei Funktionsblöcken ist das etwas anders, bei Globalen Variablen gibt es keine verlässliche Ordnung im Speicher.

    Ob die Bitmanipulationen in C schneller programmiert sind bzw schneller ablaufen, das müssen Sie entscheiden. Ich fände es aber traurig, wenn es daran scheitern sollte.

     
  • RolandWagner

    RolandWagner - 2005-06-01

    Zitat:
    1. Gibt es einen Datentyp, der nur 1 Bit Speicher belegt?

    Es gibt zwar in der Tat keinen Datentyp, der nur 1 Bit belegt, man kann aber Variablen mit nur 1 Bit in dem Merkerbereich anlegen.

    Z.B:

    VAR

     OneBit AT %MX10.3:BOOL;
    

    END_VAR

    Die Variable OneBit belegt dann nur 1 Bit. Wenn man eine andere Variable im gleichen Adressbereich deklariert z.B.

    VAR

     OneWord AT %MW10:WORD;
    

    END_VAR

    dann kann man die einzelnen Bits auch über das komplette WORD ansteuern.

    Eine andere Lösung, um bitweise Zugriffe zu erstellen: Der Bitoperator.

    Z.B.

    VAR CONST

      Enable:INT :=0;
    
      Stop:INT := 1;
    

    END_VAR

    VAR

      Flags:WORD;
    

    END_VAR

    Flags.Enable := TRUE; (Entspricht Flags.0 := TRUE )

    Flags.Stop := FALSE; (Entspricht Flags.1 := FALSE )

    Um jetzt eine Bitkette in ein WORD an eine bestimmte Stelle zu schreiben, kann man sich natürlich auch mit dem SHL-Operator behelfen.

    z.B.

    Flags := SHL(7,4) OR Flags;

    um den Wert 7 an die 5. Bitposition in Flags zu schreiben. Natürlich muss man bei einem anderen Wert ausser 7 vorher sicherstellen, dass die n Bits, die man schreiben möchte, zunächst einmal auf 0 gesetzt werden. Generell könnte man das Ganze in CoDeSys aber recht bequem abstrahieren und als Funktion z.B. in einer Bibliothek allgemein verfügbar machen.

     

Log in to post a comment.