Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
41
Добавлен:
11.10.2020
Размер:
3.04 Mб
Скачать

Bit-Shift Operatoren...

Beispiel in AWL:

Var1 BYTE

LD

2#1001_0011

NOT

 

 

ST

Var1

(* Ergebnis ist 2#0110_1100 *)

Beispiel in ST:

Var1 := NOT 2#1001_0011

Beispiel in FUP:

10.3 Bit-Shift Operatoren...

Hinweis für Versionen bis einschließlich Service Pack 5 der Version 2.2: Der Codegenerator für Infineon C16x Zielsysteme führt die Bit-Shift Rechenoperationen mit Modulo 16 durch.

SHL

Bitweises Links-Shift eines Operanden: erg:= SHL (in, n)

in wird um n Bits nach links geschoben. und von rechts mit Nullen aufgefüllt.

Hinweis: Beachten Sie, dass die Anzahl der Bits, die für die Rechenoperation berücksichtigt wird, durch den Datentyp der Eingangsvariable in vorgegeben wird. Handelt es sich hierbei um eine Konstante, wird der kleinstmögliche Datentyp berücksichtigt. Der Datentyp der Ausgangsvariable bleibt ohne Auswirkung auf die Rechenoperation.

Sehen Sie im nachfolgenden Beispiel in hexadezimaler Darstellung, wie sich bei gleichem Wert der Eingangsvariablen in_byte und in_word die Ergebnisse erg_byte und erg_word der Operation unterscheiden, je nachdem, ob in vom Typ BYTE oder WORD ist.

Beispiel in ST:

PROGRAM shl_st VAR

in_byte : BYTE:=16#45;

in_word : WORD:=16#45; erg_byte : BYTE; erg_word : WORD;

n: BYTE :=2;

END_VAR

erg_byte:=SHL(in_byte,n); (* Ergebnis ist 16#14 *) erg_word:=SHL(in_word;n); (* Ergebnis ist 16#0114 *)

Beispiel in FUP:

Beispiel in AWL:

LD 16#45

SHL 2

ST erg_byte

10-6

CoDeSys V2.3

10 - ANHANG

SHR

Bitweises Rechts-Shift eines Operanden: erg:= SHR (in, n)

in wird um n Bits nach rechts geschoben. Wenn ein vorzeichenloser Datentyp verwendet wird (BYTE, WORD, DWORD), wird von links mit Nullen aufgefüllt. Bei Vorzeichen-Datentypen wie z.B. INT wird dagegen ein arithmetischer Shift durchgeführt, d.h. es wird mit dem Wert des obersten Bits aufgefüllt.

Hinweis: Beachten Sie, dass die Anzahl der Bits, die für die Rechenoperation berücksichtigt wird, durch den Datentyp der Eingangsvariable in vorgegeben wird. Handelt es sich hierbei um eine Konstante, wird der kleinstmögliche Datentyp berücksichtigt. Der Datentyp der Ausgangsvariable bleibt ohne Auswirkung auf die Rechenoperation.

Sehen Sie im nachfolgenden Beispiel in hexadezimaler Darstellung die Ergebnisse der Operation, wobei einmal erg_byte vom Typ BYTE und einmal erg_word vom Typ WORD als Eingangsvariablen dienen.

Beispiel in ST:

PROGRAM shr_st VAR

in_byte : BYTE:=16#45;

in_word : WORD:=16#45; erg_byte : BYTE; erg_word : WORD;

n: BYTE :=2; END_VAR

erg_byte:=SHR(in_byte,n); (* Ergebnis ist 11 *) erg_word:=SHR(in_word;n); (* Ergebnis ist 0011 *)

Beispiel in FUP:

Beispiel in AWL:

LD 16#45

SHR 2

ST erg_byte

ROL

Bitweise Linksrotation eines Operanden: erg:= ROL (in, n)

erg, in und n sollten vom Typ BYTE, WORD oder DWORD sein. in wird n mal um eine Bitstelle nach links geschoben, wobei das linkeste Bit von rechts wieder eingeschoben wird.

Hinweis: Beachten Sie, dass die Anzahl der Bits, die für die Rechenoperation berücksichtigt wird, durch den Datentyp der Eingangsvariable in vorgegeben wird. Handelt es sich hierbei um eine Konstante, wird der kleinstmögliche Datentyp berücksichtigt. Der Datentyp der Ausgangsvariable bleibt ohne Auswirkung auf die Rechenoperation.

Sehen Sie im nachfolgenden Beispiel in hexadezimaler Darstellung, wie sich bei gleichem Wert der Eingangsvariablen in_byte und in_word die Ergebnisse erg_byte und erg_word der Operation unterscheiden, je nachdem, ob in vom Typ BYTE oder WORD ist.

Beispiel in ST:

PROGRAM rol_st VAR

in_byte : BYTE:=16#45; in_word : WORD:=16#45; erg_byte : BYTE; erg_word : WORD;

n: BYTE :=2;

CoDeSys V2.3

10-7

Bit-Shift Operatoren...

END_VAR

erg_byte:=ROL(in_byte,n); (* Ergebnis ist 16#15 *) erg_word:=ROL(in_word;n); (* Ergebnis ist 16#0114 *)

Beispiel in FUP:

Beispiel in AWL:

LD 16#45

ROL 2

ST erg_byte

ROR

Bitweise Rechtsrotation eines Operanden: erg:= ROR (IN, N)

erg, in und n sollten vom Typ BYTE, WORD oder DWORD sein. in wird n mal um eine Bitstelle nach rechts geschoben, wobei das rechteste Bit von links wieder eingeschoben wird.

Hinweis: Beachten Sie, dass die Anzahl der Bits, die für die Rechenoperation berücksichtigt wird, durch den Datentyp der Eingangsvariable in vorgegeben wird. Handelt es sich hierbei um eine Konstante, wird der kleinstmögliche Datentyp berücksichtigt. Der Datentyp der Ausgangsvariable bleibt ohne Auswirkung auf die Rechenoperation.

Sehen Sie im nachfolgenden Beispiel in hexadezimaler Darstellung, wie sich bei gleichem Wert der Eingangsvariablen in_byte und in_word die Ergebnisse erg_byte und erg_word der Operation unterscheiden, je nachdem, ob in vom Typ BYTE oder WORD ist.

Beispiel in ST:

PROGRAM ror_st

VAR

in_byte : BYTE:=16#45;

in_word : WORD:=16#45; erg_byte : BYTE; erg_word : WORD;

n: BYTE :=2; END_VAR

erg_byte:=ROR(in_byte,n); (* Ergebnis ist 16#51 *) erg_word:=ROR(in_word;n); (* Ergebnis ist 16#4011 *)

Beispiel in FUP:

Beispiel in AWL:

LD 16#45

ROR 2

ST erg_byte

10-8

CoDeSys V2.3

10 - ANHANG

10.4 Auswahloperatoren...

Sämtliche Auswahloperationen lassen sich auch auf Variablen durchführen. Wegen der besseren Anschaulichkeit beschränken wir uns in den folgenden Beispielen auf Konstanten als Operatoren.

SEL

Binäre Selektion.

OUT := SEL(G, IN0, IN1) bedeutet:

OUT := IN0 if G=FALSE;

OUT := IN1 if G=TRUE.

IN0, IN1 und OUT können jeden Typ haben, G muss vom Typ BOOL sein. Das Ergebnis der Selektion ist IN0, wenn G FALSE ist, bzw. IN1, wenn G TRUE ist.

Beispiel in AWL:

 

LD

TRUE

 

 

SEL

3,4

(* IN0 = 3, IN1 =4 *)

ST

Var1

(* Ergebnis ist 4

*)

LD

FALSE

 

 

SEL

3,4

 

 

ST

Var1

(* Ergebnis ist 3

*)

Beispiel in ST:

Var1:=SEL(TRUE,3,4); (* Ergebnis für Var1 ist 4 *)

Beispiel in FUP:

Hinweis: Zum Zweck der Laufzeitoptimierung wird folgendermaßen abgearbeitet: Ein Ausdruck, der IN0 vorgeschaltet ist, wird nur dann berechnet, wenn G FALSE ist. Ein Ausdruck der IN1 vorgeschaltet ist, wird nur dann berechnet, wenn G TRUE ist !

In der Simulation dagegen werden alle Zweige berechnet.

MAX

Maximumsfunktion. Liefert von zwei Werten den größten.

OUT := MAX(IN0, IN1)

IN0, IN1 und OUT können von beliebigem Typ sein.

Beispiel in AWL:

LD 90

MAX 30

MAY 40

MAX 77

ST Var1 (* Ergebnis ist 90 *)

Beispiel in ST:

Var1:=MAX(30,40); (* Ergebnis ist 40 *)

Var1:=MAX(40,MAX(90,30)); (* Ergebnis ist 90 *)

CoDeSys V2.3

10-9

Auswahloperatoren...

Beispiel in FUP:

MIN

Minimumsfunktion. Liefert von zwei Werten den kleinsten.

OUT := MIN(IN0, IN1)

IN0, IN1 und OUT können von beliebigem Typ sein.

Beispiel in AWL:

LD 90

MIN 30

MIN 40

MIN 77

ST Var1 (* Ergebnis ist 30 *)

Beispiel in ST:

Var1:=MIN(90,30); (* Ergebnis ist 30 *);

Var1:=MIN(MIN(90,30),40); (* Ergebnis ist 30 *);

Beispiel in FUP:

LIMIT

Limitierung

OUT := LIMIT(Min, IN, Max) bedeutet:

OUT := MIN (MAX (IN, Min), Max)

Max ist die obere, Min die untere Schranke für das Ergebnis. Wenn der Wert IN die obere Grenze Max überschreitet, dann liefert LIMIT Max. Wenn IN Min unterschreitet, dann ist das Ergebnis Min.

IN und OUT können von beliebigem Typ sein.

Beispiel in AWL:

LD 90

LIMIT 30,80

ST Var1 (* Ergebnis ist 80 *)

Beispiel in ST:

Var1:=LIMIT(30,90,80); (* Ergebnis ist 80 *);

MUX

Multiplexer

OUT := MUX(K, IN0,...,INn) bedeutet:

OUT := INK.

IN0, ...,INn und OUT können von beliebigem Typ sein. K muss von den Typen BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT oder UDINT sein. MUX wählt aus einer Menge von Werten den K-ten aus. Der erste Wert entspricht K=0. Ist K größer als die Anzahl der weiteren Eingänge (n) , so wird der letzte Wert weiter gegeben (INn).

Beispiel in AWL:

LD 0

10-10

CoDeSys V2.3

Соседние файлы в папке 759-333