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.
Gibt es einen Datentyp, der nur 1 Bit Speicher belegt?
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?
Wie kann man die Reihenfolge, in der Elemente einer Struktur im Speicher abgelegt werden festlegen?
Hoffe mir kann hier einer helfen!
Gruss
Alexander
Ich
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2005-05-18
Originally created by: Bernhard Werner
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.
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.
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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!
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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.
Gibt es einen Datentyp, der nur 1 Bit Speicher belegt?
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?
Wie kann man die Reihenfolge, in der Elemente einer Struktur im Speicher abgelegt werden festlegen?
Hoffe mir kann hier einer helfen!
Gruss
Alexander
Ich
Originally created by: Bernhard Werner
Den gibt es im Moment nicht. Für die Version 3.0 ist er geplant.
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.
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
Originally created by: Alexander Frisch
naja, so lange warten kann ich leider nicht...
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...
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!
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.
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
END_VAR
Die Variable OneBit belegt dann nur 1 Bit. Wenn man eine andere Variable im gleichen Adressbereich deklariert z.B.
VAR
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
END_VAR
VAR
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.