Feedback me if you need more
intermediate level
intermediate level
Code:
DATA_BLOCK "a"
TITLE =
VERSION : 0.1
STRUCT
a : ARRAY [0 .. 3 ] OF INT := 23;
END_STRUCT ;
BEGIN
a[0] := 23;
a[1] := 0;
a[2] := 0;
a[3] := 0;
END_DATA_BLOCK
DATA_BLOCK "b"
TITLE =
VERSION : 0.1
STRUCT
b : INT := 45;
END_STRUCT ;
BEGIN
b := 45;
END_DATA_BLOCK
FUNCTION "ANY" : VOID
TITLE =
//ERSATZ "P##..." für Pointer auf Elemente in Strukturen , UDT , Arrays , Multiinstanzen...etc
VERSION : 0.1
VAR_INPUT
LAR1 : ANY ; //ALLE mögliche Daten
END_VAR
VAR_TEMP
PNTR : DWORD ; //POINTER
DBNO : DWORD ; //DBNO
END_VAR
BEGIN
NETWORK
TITLE =SIOAN
//Hier wird der Speicherbereich für die Benutzung des Pointers ausserhalb der "ANY" Funktion korrigiert und (Pointer) gleich im AR1 geladen
T #PNTR; //Lade Pointerdaten aus AKKU1
TAK ;
T #DBNO; // Lade DB Nr aus AKKU2
L P##PNTR; //Lade Pointer auf #PNTR Anfang
LAR1 ;
L B [AR1,P#0.0];
L B#16#87;
==D ; //Speicherbereich abfragen
SPBN VL; //IF THEN
L B#16#86;
T B [AR1,P#0.0];
VL: U( ;
L #DBNO;
L L#0;
<>D ; // #DBNO auf NULL abfragen
) ;
U( ;
L #DBNO;
L DINO;
==D ; // #DBNO = DINO abfragen
) ;
U( ;
L B [AR1,P#0.0];
L B#16#84;
==D ; //Speicherbereich abfragen
) ;
SPBN DI; //IF THEN
L B#16#85;
T B [AR1,P#0.0];
DI: L #PNTR;
LAR1 ;
END_FUNCTION
FUNCTION_BLOCK FB 1
TITLE =
VERSION : 0.1
VAR_INPUT
z : ARRAY [0 .. 3 ] OF INT ;
END_VAR
VAR
x : INT ;
END_VAR
VAR_TEMP
v : INT ;
y : WORD ;
END_VAR
BEGIN
NETWORK
TITLE =
CALL "ANY" (
LAR1 := #x);
AUF "a";
L 3;
T W [AR1,P#0.0];
L #x;
T MD 0;
NETWORK
TITLE =
CALL "ANY" (
LAR1 := "a".a[0]);
AUF "a";
L 7;
T W [AR1,P#0.0];
L "a".a[0];
T MD 4;
NETWORK
TITLE =
CALL "ANY" (
LAR1 := "b".b);
AUF "b";
L 15;
T W [AR1,P#0.0];
L "b".b;
T MD 8;
BE ;
NETWORK
TITLE =
CALL "ANY" (
LAR1 := #z[0]);
L 0;
u: U( ; //WHILE
T #v;
L 4;
<I ;
) ;
SPBN o; //IF THEN
L 31;
T W [AR1,P#0.0];
+AR1 P#2.0;
L #v;
+ 1;
SPA u; //LOOP
o: NOP 0;
L #z[3];
T MD 12;
BE ;
END_FUNCTION_BLOCK
DATA_BLOCK DB 1
TITLE =
VERSION : 0.0
FB 1
BEGIN
z[0] := 0;
z[1] := 0;
z[2] := 0;
z[3] := 0;
x := 0;
END_DATA_BLOCK
FUNCTION FC 2 : VOID
TITLE =
VERSION : 0.1
VAR_TEMP
z : ARRAY [0 .. 3 ] OF INT ;
v : INT ;
END_VAR
BEGIN
NETWORK
TITLE =
CALL "ANY" (
LAR1 := #z[0]);
L 0;
u: U( ; //WHILE
T #v;
L 4;
<I ;
) ;
SPBN o; //IF THEN
L 255;
T W [AR1,P#0.0];
+AR1 P#2.0;
L #v;
+ 1;
SPA u; //LOOP
o: NOP 0;
L #z[3];
T MD 12;
BE ;
END_FUNCTION
ORGANIZATION_BLOCK OB 1
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1
VAR_TEMP
OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
OB1_PRIORITY : BYTE ; //Priority of OB Execution
OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
OB1_RESERVED_1 : BYTE ; //Reserved for system
OB1_RESERVED_2 : BYTE ; //Reserved for system
OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =
CALL FB 1 , DB 1 ;
NETWORK
TITLE =
CALL FC 2 ;
END_ORGANIZATION_BLOCK
...........................................................................................................................................................................................................................................................................................................................................................................
DATA_BLOCK "b1"
TITLE =Sioan
VERSION : 0.0
FB 1
BEGIN
x := FALSE;
a[0] := 0;
a[1] := 0;
a[2] := 0;
a[3] := 0;
END_DATA_BLOCK
DATA_BLOCK "b2"
TITLE =Sioan
VERSION : 0.1
STRUCT
a : BOOL ;
b : ARRAY [0 .. 3 ] OF INT := 0;
END_STRUCT ;
BEGIN
a := FALSE;
b[0] := 2;
b[1] := 22;
b[2] := 222;
b[3] := 2222;
END_DATA_BLOCK
DATA_BLOCK "b3"
TITLE =Sioan
VERSION : 0.1
STRUCT
x : BOOL ;
y : ARRAY [0 .. 3 ] OF INT := 6, 66, 666, 6666;
END_STRUCT ;
BEGIN
x := FALSE;
y[0] := 6;
y[1] := 66;
y[2] := 666;
y[3] := 6666;
END_DATA_BLOCK
FUNCTION_BLOCK FB 1
TITLE =Sioan
VERSION : 0.1
VAR_INPUT
x : BOOL ;
a : ARRAY [0 .. 3 ] OF INT ;
END_VAR
VAR_TEMP
e : INT ;
END_VAR
BEGIN
NETWORK
TITLE = Sioan
U #x;
SPBN o;
L MW 0;
T "b2".b[0];
CALL "BLKMOV" (
SRCBLK := "b2".b,
RET_VAL := #e,
DSTBLK := #a);
o: NOP 0;
END_FUNCTION_BLOCK
ORGANIZATION_BLOCK OB 1
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1
VAR_TEMP
OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
OB1_PRIORITY : BYTE ; //Priority of OB Execution
OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
OB1_RESERVED_1 : BYTE ; //Reserved for system
OB1_RESERVED_2 : BYTE ; //Reserved for system
OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =Sioan
CALL FB 1 , "b1" (
x := E 0.0,
a := "b3".y);
END_ORGANIZATION_BLOCK
...........................................................................................................................................................................................................................................................................................................................................................................
.