SCL: Auf Bits eines Word zugreifen.

Aksels

Level-2
Beiträge
257
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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?
 
Zuletzt bearbeitet:
Hmm, unter Ralles Link hats doch Larry beschrieben.

Code:
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 myVar3hast du Zugriff auf die einzelnen Bools
Als INput mit deinen 16Bits dient myVar1 als Wort...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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.

Code:
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;
...
 
Hi,

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

Code:
...
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

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

Code:
...
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
 
Hi,

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

Code:
...
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

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.
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Vorteil von der Sache über den SFC20 ist eigentlich die Möglichkeit z.B. ein Array of FB zu basteln.

Gruss Daniel
 
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

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.
 
Zurück
Oben