# indezierter Bitzugriff



## tinosps (29 Juni 2008)

Hallo,
bin neu in der Runde und habe ein (kleines?) Problem mit Codsys. Ich verwende im Moment zwar MXPro, müsste aber das Gleiche wie bei TwinCat sein. Also, ich möchte bei einer Variablen einen indizierten Bitzugriff vornemen um die Variable Bit für Bit durch eine Schleife laufen zu lassen. Erlaubt sind leider nur Zugriffe mit Konstanten oder ganzen Zahlen (Variablenname.0) erlaubt zugriff auf das 1. Bit in der Variable. Ich wollte es jetzt in der Form Variablenname.a machen, wobei "a" die Position des Bits ist. Leider bekomme ich wie gesagt immer eine Fehlermeldung. Gibt es eine Möglichkeit per Variable eine Bitposition anzusprechen (ähnlich wie bei Siemens)?


----------



## J Schohaus (30 Juni 2008)

Hallo tinosps

Lade die Oscat.Lib dort findest du viele nützliche funktionen.
Z.B. für dein Problem Bit_Of_Word.

Oscat findest du http://www.oscat.de
Da du Codesys verwendet noch ein zweites intersantes Forum http://forum.3s-software.com/

mfG Jochen


----------



## Larry Laffer (30 Juni 2008)

Codesys ist zwar nicht meine Welt ...
aber die Lösung deines Problems müßte der Befehl AT sein. Auf diese Weise kannst du zu deinem WORD eine andere Sicht z.B. als ARRAY [1..16] of BOOL erzeugen. Hier ist dann die gewünschte Indizierung möglich.
	
	



```
Test_WORD : word ;
Test_Array AT Test_Word : ARRAY[1..16] of Bool ;
```
Gruß
LL


----------



## Werner29 (1 Juli 2008)

Lieber Larry,

das ist in mehrfacher Hinsicht nicht richtig.
Erstens kann man mit AT eine Variable nur auf eine direkte Adresse legen (%IX0.0)
Zweitens ist ein Array von BOOL kein Bitfeld (in CoDeSys). Jedes BOOL ist ein Byte gross. Das Array wäre also nicht 16 Bit sondern 16 Byte gross.
Es ist schon richtig, das Bit über einen Funktionsaufruf zu ermitteln.

Bernhard


----------



## Larry Laffer (1 Juli 2008)

Werner29 schrieb:


> ... das ist in mehrfacher Hinsicht nicht richtig.
> Erstens kann man mit AT eine Variable nur auf eine direkte Adresse legen (%IX0.0)
> Zweitens ist ein Array von BOOL kein Bitfeld (in CoDeSys). Jedes BOOL ist ein Byte gross. Das Array wäre also nicht 16 Bit sondern 16 Byte gross.
> Es ist schon richtig, das Bit über einen Funktionsaufruf zu ermitteln.


 
... wenn du da Recht hast (was ich nicht überprüfen kannst, da CoDeSys nicht meine Welt ist), dann könnte SCL an dieser Stelle mehr als CoDeSys. In SCL wäre das so überhaupt kein Problem ...

Vielleicht stellt mal einer diese Sache klar ... würde mich interessieren ...

Gruß
LL


----------



## Werner29 (1 Juli 2008)

Hallo Larry,

da ich wesentliche Teile von CoDeSys selber geschrieben habe, ist das hiermit klargestellt .
Es kann schon sein, dass man das in SCL so hinschreiben kann, das ist wiederum nicht meine Welt. Aber erstmal richten wir uns ja nach der IEC und nicht nach Siemens und die sieht überhaupt keine Bitzugriffe vor, der Bitzugriff mit Konstanten ist eine Erweiterung von uns und Bitzugriff mit Variablen müsste man einfach mal machen (wie so oft: es geht ja auch anders und ist daher nicht dringend und fällt daher immer hinten runter).
Der Grund warum bei CoDeSys (und allen gängigen Hochsprachen) BOOL nicht als Bit sondern als Byte (oder grösser) gehandhabt wird ist ganz einfach: Es gibt keinen Prozessor mit dem man direkt Bits im Speicher adressieren kann.
Ein Bitzugriff braucht daher um ein Vielfaches mehr Zeit als ein Bytezugriff.
(Trotzdem sollte man Bitfelder auch mal implementieren, aber: siehe oben).

Ab Version 3 gibt es übrigens den Datentyp BIT allerdings nur in Strukturen und es gibt auch UNION. Damit kann man ähnlich wie in deinem Beispiel Variablen auf dieselbe Adresse legen.

Grüße, Bernhard


----------



## Larry Laffer (1 Juli 2008)

... dann sage ich mal Dankeschön für den Hinweis.

Wie schon gesagt, hatte ich auf die Frage geantwortet in der bisherigen Erkenntnis, das Codesys alles das was Siemens kann auch kann ... Jetzt bin ich ein bißchen enttäuscht ...

Es war für mich allerdings auch nicht unlogisch, dass das gehen könnte, da ich auf der AWL-Seite das ja auch machen kann.

Wie auch immer - wieder etwas gelernt ...

Gruß
LL


----------



## Werner29 (1 Juli 2008)

nicht enttäuscht sein, Siemens kann dafür auch nicht alles, was CoDeSys kann.
In mancher Hinsicht tut sich Siemens leichter, weil sie die Hardware auch völlig in der Hand haben. Dafür tun sie sich schwerer wenn sie die Hardware wechseln wollen. Zum Beispiel auf einen PC.


----------



## Ralle (1 Juli 2008)

Ich finds auch etwas schade, daß eine SPS, die sich zu großen Teilen ja mit Bitverarbeitung befaßt, gerade auf diesem Gebiet zu Umwegen zwingt. Wie Werner29 ja sagte, betrifft das auch die IEC, was zu der Frage führt, ob man das vergessen hat oder einfach aus der falschen Branche kam?


----------



## Werner29 (2 Juli 2008)

Damals war ich noch nicht auf der Automatisierungswelt. Ich tippe mal ein eine Mischung aus beidem. Es ist ja so viel vergessen worden. 
Ausserdem war der Ansatz ja, dass man von der Hardware-Ebene abstrahieren wollte. An sich nicht unvernünftig, wo es geht sollte man das tun. Aber wo es nicht geht, sollte man es trotzdem können.

Ich finde im Übrigen, falls es jemand interessiert, auch unseren Bitzugriff nicht sonderlich glücklich, weil er syntaktisch mit dem Komponentenzugriff kollidiert:

a.b : soll das jetzt eine Komponente einer struktur sein, oder ein Bit in einer Variablen? Hätte man sich eine eigene Syntax überlegt: a:b oder b@a oder was auch immer, dann hätte man dieses Problem nicht.


----------



## repök (2 Juli 2008)

*Util.lib*

in dieser lib von codesys gibts die funktionenen für den bitzugriff.


----------



## tinosps (4 Juli 2008)

noch einmal hallo an alle und danke für die beiträge,
die oscat - bibliothek ist mir bekannt
der grund meiner anfrage war folgender: bei von uns verwendeteten DP-ASI-gates bekommt man die daten in bytes zur verfügung gestellt, das können bis zu 36 sein, die auswertung erfolgt aber bitweise, solange ich in codesys bleibe ist das kein problem, wenn ich aber daten an unsere visu schicken möchte muss ich zwischen zwei übeln wählen 1: ich trösel die bytes auf und schicke nur die relevanten bits an die visu (das ergibt sehr lange bool-listen) oder 2. ich schicke die bytes, ABER unsere visu (galileo) erlaubt garkeinen bitzugriff auf variablen (ausser auf bools) also habe ich mir die relevanten bits verausgepickt und sie wieder in bytes packen wollen. deswegen hatte ich mir einen FB gemacht, mit einer äusseren und einer inneren schleife, habe die adresse des 1. bytes auf einen pointer gelegt einem fb-eingang gesagt ich möchte x variablen lesen (äussere schleife), dem 2. eingang (innere schleife) die variable hat eine länge von x bits, als ausgang habe ich dann ein passendes 2-dimensionales array of bool angehängt, ich habe gedacht, damit könnte ich einen universellen baustein erstellen mit dem ich x-beliebig viele variabeln beliebiger grösse in ein passendes array schreiben kann, da das problem mit den langen bool-listen immer wieder auftritt und auch die kommunikation zwischen visu und sps sehr ausbremst wird. aber zum einen hängt es nun an dem bitzugriff, zum anderen muss ich dem pointer das variablenformat in der deklaration mitteilen (POINTER OF BYTE)
ich persönlich finde es "schade" das man bei bit-verarbeitung in codesys und galileo solche klimzüge machen muss, ich dachte immer das währe in einer sps das a und o
noch einmal danke und gruss an alle


----------

