# SCL: Auf Bits eines Word zugreifen.



## Aksels (20 Oktober 2011)

Hallo Leute,

ich möchte in SCL auf die Bits eines Word zugreifen.
Die Variable "A" sagt mir, auf welches Bit.
Das Word heisst MyWord.
Gibt es da in SCL nicht irgendwie einen eleganten Trick, wie ich 
MyWord[A]:= true;
machen könnte?


----------



## Ralle (20 Oktober 2011)

schau mal z.Bsp. hier: http://www.sps-forum.de/showthread.php?t=42328&highlight=AT+SCL

oder du suchst nach "AT"


----------



## Aksels (20 Oktober 2011)

*Perfekt!*

Das wars. Hab nur um eine falsche Ecke gedacht. Oder gedanklich zu spät abgebogen.

Danke!


----------



## Aksels (27 Oktober 2011)

*Nochmal was ähnliches:*

Ich möchte als input 16 bools haben.
Also als Input fixeinen Array[0..15] of bool deklariert. Der bringt mir aber wenn ich eine Instanz erzeuge tatsächlich einen einzigen Input-Strick vom Typ Array [0..15] of Bool.
Ich will aber 16 einzelne bools.
Also habe ich an AT gedacht, die eingänge I_F_00 bis IF_15 als bool deklariert.
Mit AT bekommen ich aber nur den drüberliegenden eingestellt, also AT "I_F_15".
Ich brauche aber AT "I_F_00 länge 16Bit" Array [0..15] of Bool.
Sonst finktioniert in SCL doch meine for-Schleife nicht.
Wie mache ich das nur?


----------



## Zefix (28 Oktober 2011)

Hmm, unter Ralles Link hats doch Larry beschrieben.


```
myVar1 : WORD ;
myVar2 AT myVar1 : struct
                              Byte1 : byte ;
                              Byte2 : byte ;
                              end_struct ;
 [COLOR=Red]myVar3 AT myVar1 : array[0..15] of Bool ;[/COLOR]  usw.
```
Mit myVar3_hast du Zugriff auf die einzelnen Bools
Als INput mit deinen 16Bits dient myVar1 als Wort..._


----------



## Aksels (28 Oktober 2011)

*Das klappte ja schon, aber....*

dieses nicht:
Input:
I_F_00 :bool;
I_F_01 :bool;
I_F_02 :bool;
I_F_03 :bool;
I_F_04 :bool;
I_F_05 :bool;
I_F_06 :bool;
I_F_07 :bool;
I_F_08 :bool;
I_F_09 :bool;
I_F_10 :bool;
I_F_11 :bool;
I_F_12 :bool;
I_F_13 :bool;
I_F_14 :bool;
I_F_15 :bool;
I_F_Arr AT I_F_00 : Array [0..15] of Bool;

Letzteres brauche ich für meine For-schleife. Die 16 Inputs drüber für das externe Befüttern.
Aber er nimmt das so nicht an.
Aber wie verkaufe ich das dem Compiler, daß er ab I_F_00 16 Bits nehmen soll für das AT?


----------



## Tigerente1974 (28 Oktober 2011)

Dann ist Deine Eingangsvariable ja kein WORD sondern 16 einzelne Bits...

Entweder die Bits liegen (außerhalb) in einem Wortbereich und Du trägst ein WORD an die Eingangsvariable an, oder Du musst Dir die Eingänge umkopieren.


```
VAR_INPUT
I_F_00 :bool;
I_F_01 :bool;
I_F_02 :bool;
I_F_03 :bool;
I_F_04 :bool;
I_F_05 :bool;
I_F_06 :bool;
I_F_07 :bool;
I_F_08 :bool;
I_F_09 :bool;
I_F_10 :bool;
I_F_11 :bool;
I_F_12 :bool;
I_F_13 :bool;
I_F_14 :bool;
I_F_15 :bool;
END_VAR

VAR_TEMP
I_F : Array [0..15] of Bool;
END_VAR

BEGIN
I_F[0]:= I_F_00;
...
```


----------



## dalbi (28 Oktober 2011)

Hi,

oder über einen Any-Pointer und den SFC20 "BLKMOV".


```
...
VAR_INPUT
  I_F_00 : BOOL;
  I_F_01 : BOOL;
  I_F_02 : BOOL;
  I_F_03 : BOOL;
  I_F_04 : BOOL;
  I_F_05 : BOOL;
  I_F_06 : BOOL;
  I_F_07 : BOOL;
  I_F_08 : BOOL;
  I_F_09 : BOOL;
  I_F_10 : BOOL;
  I_F_11 : BOOL;
  I_F_12 : BOOL;
  I_F_13 : BOOL;
  I_F_14 : BOOL;
  I_F_15 : BOOL;
END_VAR

VAR_TEMP
  I_F : ARRAY [0..15] OF BOOL;
  tRetVal : INT;
  tANY : ANY;
END_VAR

BEGIN

  tANY := I_F_00;

  tRetVal := BLKMOV(SRCBLK := tANY, DSTBLK := I_F);
...
```

Gruss Daniel


----------



## dalbi (28 Oktober 2011)

Hi,

natürlich muss die Länge noch angepasst werden. 


```
...
VAR_TEMP
  I_F : ARRAY [0..15] OF BOOL;
  tRetVal : INT;
  tANY : ANY;
  _ANY AT tANY : STRUCT
    id : BYTE;
    DataType : BYTE;
    Lenght : WORD;
    DBNo : WORD;
    BytePointer : DWORD;
  END_STRUCT;
END_VAR

BEGIN

  tANY := I_F_00;
  _ANY.Lenght := W#16#10; //16 Stück
  tRetVal := BLKMOV(SRCBLK := tANY, DSTBLK := I_F);
...
```

Gruss Daniel


----------



## Ralle (28 Oktober 2011)

dalbi schrieb:


> Hi,
> 
> natürlich muss die Länge noch angepasst werden.
> 
> ...



Bei einem FC in AWL funktionierte ein ähnliches Construct mit dem Any aus der Bool-Adresse nur korrekt, wenn man genau dieses Bool außen auch an der Wortgrenze legt, also z.Bsp. mit M0.0. Bei M0.4 an IN 1 geht die SPS in Stop. Wäre mal zu testen, ob das aus SCL heraus genauso wäre!!!!
Außerdem muß man die folgenden Bool auch richtig adressieren, weil durch den Any ja faktisch "um die IN herum" gegriffen wird.

Also 

M0.0
M1.6
M10.2
usw.

nacheinander an In1, In2 .. wird dann als Ergebnis 

M0.0
M0.1
M0.2
usw.

in den FC hineinbringen.

Bei einem FB ist das egal, weil der Any dann über die IDB-Schnittstelle läuft, da darf man auch mit M0.4 beginnen, ohne dass die SPS in Stop geht.


----------



## Tigerente1974 (28 Oktober 2011)

Bis grade dachte ich, ich hätte wieder was für die Zukunft gelernt.
Mit dieser Einschränkung würde ich das per ANY-Pointer nur noch dann lösen wollen, wenn es die 16 Bit "zu Fuß" deutlich überschreitet und ich zum Sklaven meines 2-Finger-Suchsystems an der Tastatur würde...
Der Code "zu Fuß" ist sofort lesbar und funktioniert immer. Da tippe ich doch lieber die paar Zeilen.
Wie schnell hat man so einen Codeschnipsel mal für eine andere Anwendung reinkopiert und macht dann ein langes Gesicht, wenn die Fehlersuche losgeht.


----------



## dalbi (28 Oktober 2011)

Hi,

ja das stimmt, war aber vom TE auch nicht gefordert.

In Stop geht dabei nichts der SFC20 kopiert den Adressbereich einfach nicht, wenn die Adresse nicht am Anfang beginnt.

Gruss Daniel


----------



## dalbi (28 Oktober 2011)

Vorteil von der Sache über den SFC20 ist eigentlich die Möglichkeit z.B. ein Array of FB zu basteln.

Gruss Daniel


----------



## Ralle (28 Oktober 2011)

dalbi schrieb:


> Hi,
> 
> ja das stimmt, war aber vom TE auch nicht gefordert.
> 
> ...



Ja, in Stop geht die Version mit indirekter Adressierung (erstes Bit in AR1), dann Zugriff auf das ganze Word über das AR1! Das macht SCL sicher ganz anders, wäre dann aber sicher auch länger, dafür aber nicht so "schmutzig", wie die indirekte Version, die ich ansprach. Mit dem richtigen OB hat man dann ein ähnliches Ergebnis, kein Stop und wohl auch kein Copy. Der SFC20 fängt da schon mal den Fehler und gibt ein RetVal aus.


----------

