Step 7 SCL Bits in UDTs?

K-SYSTEM-D

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

bin gerade dabei mich in SCL einzuarbeiten und bin an meine grenzen gestossen.

Ich habe eine UDT in diesem Falle UDT32 dort ist ein Variable (Command) vom Typ WORD hinterlegt.

Ich habe mir in SCL (FB) eine IN_OUT Array angelegt mit 1..300 Arrays auf die ich zugreifen muss.

Jeder FB hat dann seinen Array ( DB mit 300 Array vom TYP UDT32) dieser wird mit der Variable Objektitemnr zu gewissen.

Ich versuche bei Command ein Bit zu setzen leider stimmt meine Deklaration schon garnicht.

Hab schon mehr versuche unternommen die hier drunter war die letzte.

Vielleicht kann mir jemand helfen. Danke im voraus.

Code:
VAR_IN_OUT
     Para : ARRAY[1..300] OF UDT32;                          
     Commandtemp AT Para[Objektnr].Command : WORD;
     Commandarray AT Commandtemp: ARRAY[0..15] OF BOOL;    
END_VAR
 
Hallo,
wenn dein FB ein Array [1..300] of UDT32 vewaltet dann gehört das schon mal als VAR (also im Bereich STAT) deklariert.
Einen UDT kannst du natürlich im INOUT haben.

So ... und um dir jetzt weiter helfen zu können müßte ich etwas besser verstehen, was du vorhast - nach deiner Beschreibung habe ich nicht so ganz viel verstanden ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK ich versuchs

Ich habe einen DB (DB10) dort sind 300 UDTs hinterlegt.(also als Array of UDT 32)

jeder FB bekommt einen von diesem Array bzw.UDT zugeteilt


quasi erster FB dann DB10. Array1 von UDT32
zweiter FB dann DB10.Array2 von UDT32

usw.

In der UDT sind Befehle Status Parameter etc hinterlegt.

Jetzt will ich in SCL auf die Bits zugreifen und sie verändern. Parameter auswerten usw.

Sonst mach ich das immer in AWL mit Pointer und AR1.

Leider muss/darf muss ich mich in SCL einarbeiten.

Ich hoffe ich habs richtig rübergebracht.
 
OK ...
Dann machst du an deinen FB den (einen) UDT als IN_OUT und übergibst beim Aufruf des FB den entsprechenden Array-Eintrag (am Besten symbolisch) an den FB (meinEingang := "DB10".MeinUDTArray[7])
Das hat erstmal noch gar nichts mit SCL zu tun.

Gruß
Larry
 
Wenn das ganze Array zwingend als Parameter an den FB übergeben werden muss, kannst du es in einen neuen UDT einbetten.

Wenn der FB nur ein Element aus dem Array braucht, gilt Larry's Antwort. Dann muss auch der Aufruf in SCL sein, weil der Index (7) doch sicher variabel ist.

Wenn ein Array oder UDT via VAR_IN_OUT an den FB übergeben wird, steht es intern als Pointer im Instanz-DB. Ist das nicht gewünscht, kannst du es im VAR-Bereich anlegen und mit BLKMOV oder in SCL mit einfacher := Zuweisung übergeben.

Vielleicht ist auch zu erwägen, das Array gar nicht im DB10 abzulegen, sondern nur im Instanz-DB - ob das möglich/sinnvoll ist, wirst du besser beurteilen können.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK ...
Dann machst du an deinen FB den (einen) UDT als IN_OUT und übergibst beim Aufruf des FB den entsprechenden Array-Eintrag (am Besten symbolisch) an den FB (meinEingang := "DB10".MeinUDTArray[7])
Das hat erstmal noch gar nichts mit SCL zu tun.

Gruß
Larry

Soweit war ich doch schon oder nicht?

Code:
VAR_IN_OUT
     Para : ARRAY[1..300] OF UDT32;                          
     Commandtemp AT Para[Objektnr].Command : WORD;
END_VAR

Wie kann ich jetzt ein Bit in Para[1].Command : WORD; setzen?

Ich danke im voraus
 
Ich dachte das mehr so :
Code:
VAR_IN_OUT
     Parameter :  UDT32;                          
END_VAR

dann kannst du im Code dann so darauf zugreifen :
Code:
myWord := Parameter.Command ;

oder

Parameter.Command := myWord ;
... und der Aufruf des FB's dann, wie schon von mir beschreiben :
Code:
Parameter := "DB10".MeinUDTArray[7])

Gruß
Larry
 
Ich dachte das mehr so :
Code:
VAR_IN_OUT
     Parameter :  UDT32;                          
END_VAR

dann kannst du im Code dann so darauf zugreifen :
Code:
myWord := Parameter.Command ;

oder

Parameter.Command := myWord ;
... und der Aufruf des FB's dann, wie schon von mir beschreiben :
Code:
Parameter := "DB10".MeinUDTArray[7])

Gruß
Larry

OK das funktioniert schon mal, danke.

Aber wie kann ich ein bit setzen bzw auswerten? gibt es eine Alternative zu dem Code untendrunter?

Code:
(*Command auswerten und in Commandarray umkoppieren*)
IF (Para.Command AND 2#0000000000000001)=1        THEN    Command[0]:=TRUE;        ELSE    Command[0]:=FALSE;    END_IF;
IF (Para.Command AND 2#0000000000000010)=2        THEN    Command[1]:=TRUE;        ELSE    Command[1]:=FALSE;    END_IF;
IF (Para.Command AND 2#0000000000000100)=4        THEN    Command[2]:=TRUE;        ELSE    Command[2]:=FALSE;    END_IF;
IF (Para.Command AND 2#0000000000001000)=8        THEN    Command[3]:=TRUE;        ELSE    Command[3]:=FALSE;    END_IF;
IF (Para.Command AND 2#0000000000010000)=16       THEN    Command[4]:=TRUE;        ELSE    Command[4]:=FALSE;    END_IF;
IF (Para.Command AND 2#0000000000100000)=32       THEN    Command[5]:=TRUE;        ELSE    Command[5]:=FALSE;    END_IF;
IF (Para.Command AND 2#0000000001000000)=64       THEN    Command[6]:=TRUE;        ELSE    Command[6]:=FALSE;    END_IF;
IF (Para.Command AND 2#0000000010000000)=128      THEN    Command[7]:=TRUE;        ELSE    Command[7]:=FALSE;    END_IF;
IF (Para.Command AND 2#0000000100000000)=256      THEN    Command[8]:=TRUE;        ELSE    Command[8]:=FALSE;    END_IF;
IF (Para.Command AND 2#0000001000000000)=512      THEN    Command[9]:=TRUE;        ELSE    Command[9]:=FALSE;    END_IF;
IF (Para.Command AND 2#0000010000000000)=1024     THEN    Command[10]:=TRUE;       ELSE    Command[10]:=FALSE;   END_IF;
IF (Para.Command AND 2#0000100000000000)=2048     THEN    Command[11]:=TRUE;       ELSE    Command[11]:=FALSE;   END_IF;
IF (Para.Command AND 2#0001000000000000)=4096     THEN    Command[12]:=TRUE;       ELSE    Command[12]:=FALSE;   END_IF;
IF (Para.Command AND 2#0010000000000000)=8192     THEN    Command[13]:=TRUE;       ELSE    Command[13]:=FALSE;   END_IF;
IF (Para.Command AND 2#0100000000000000)=16384    THEN    Command[14]:=TRUE;       ELSE    Command[14]:=FALSE;   END_IF;
IF (Para.Command AND 2#1000000000000000)=32768    THEN    Command[15]:=TRUE;       ELSE    Command[15]:=FALSE;   END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber wie kann ich ein bit setzen bzw auswerten? gibt es eine Alternative zu dem Code untendrunter?

Ja ... gibt es ... mir fallen sogar 2 ein :

1.) du machst dir ein TEMP-Word auf das du eine AT-Sicht machst, die das WORD als Bits darstellt.
Du lädst dein Para.Word in das TEMP-Word, machst dann die gewünschte Zuweisung und schreibst dann das TEMP-Word in das Para.Word zurück.

2.) du machst eine AT-Sicht auf deinen ganzen UDT und in der wird das Para.Word dann als Bits dargestellt. Nun kannst du auf die Bits davon zugreifen und alles, was du machst wird im Grunde "nur" in der Original-Variablen ausgeführt - du mußt nicht hin- und herkopieren. Nachteil : wenn sich der UDT ändert mußt du die AT-Sicht nachbessern.

Gruß
Larry
 
Zurück
Oben