byte/word zu bool konvertieren ?

thomas59

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus zusammen,

ich komme von der Mikrocontrollerprogrammierung (Assembler + C). Habe angefangen mit einer Wago 750-880 erste Schritte zu üben. ST kommt mir dabei am ehesten bekannt vor. Dazu folgende Frage:
Ich möchte in einem 8 fach DO-Ausgangsmodul die einzelnen Bits (z.B. als xO02..xO09 deklariert) als byte ansprechen, um z.B. einen Zählerwert dort auszugeben. Ich mach das im Moment so:

Deklaration
cnt : CTUD;

PLC_PRG
xO02 := cnt.CV.0;
xO03 := cnt.CV.1;
xO04 := cnt.CV.2;
...
xO09 := cnt.CV.7;

Gibt es da eine elegantere Möglichkeit ?

Besten Dank.
Thomas
 
Hi
Einfach den Ausgang als Byte definieren ...
Dann kannst du deinen Wunsch umsetzen.
BAusgang1-8 at QBadresse: Byte
Nun geht's :
Bausgang1-8 := dezimalwert;
Viel Erfolg
Shrimps
 
Memcopy und Pointer auf Ein/Ausgänge können ziemlich seltsames verahalten der Ein/Ausgänge verursachen. Ein und Ausgänge müssen immer per direkter Zuweisung angesprochen werden. Dabei ist es Egal ob die irgendwo mit AT %xx deklariert oder innerhalb der Konfiguration angelegt werden. Nur so kann der Compiler die Eingänge und Ausgänge synchron zur Task aktualisieren
 
Außerdem kommt da auch noch das Problem, wie 8 aufeinanderfolgende Ausgangsadressen intern adressiert werden. Es ist nicht gesagt, daß die wirklich zusammen in einem Byte liegen und ob MEMCPY dieses Byte "trifft".

xO02 := cnt.CV.0;
xO03 := cnt.CV.1;
xO04 := cnt.CV.2;
...
xO09 := cnt.CV.7;

Gibt es da eine elegantere Möglichkeit ?
Das ist bereits die elegante und saubere Lösung. (meine Meinung)

Harald
 
Deklariere:
pointer_to_Ausgangskarte: Pointer to Byte;
bAussgang : Byte;

Quelltext:
pointer_to_Ausgangskarte :=BITADR(xDO_Freigabe_Rosenberg);
bAussgang := pointer_to_Ausgangskarte^;

Sollte so funktionieren. Die Bits der Ausgangskarte liegen übrigens definitiv alle direkt hintereinander im Speicher. Mit %QX usw. kannst du direkt auf jedes Bit zugreifen.
 
Danke vielmals für den Tip. Funktioniert das auch, wenn die Bits nicht auf einer Byteadresse beginnen ?
Ansonsten kommt mir das immer mehr wie "Pascal" vor...

Danke
Thomas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja das sollte immer Funktionieren. Da du ja über den Pointer die Adresse des ERSTEN Bits angibst an dem deine Ausgangsvariablen beginnen. Da die Variablen immer hintereinander im Speicher liegen sollte das genauso Funktionieren. Das Byte das du selbst erzeugst bildet dann die letzten 4 Bit des einen und die ersten 4 Bit des anderen Bytes ab.
 
Wenn es noch Probleme gibt poste mal den Teil des Quelltextes mit dem du auf die DOs zugreifst.

Gruss
 
Zurück
Oben