Fix datatype checking of enumerated datatype declarations. We now follow the fill->narrow algorithm correctly.
(* This file includes normal standard ST and IL code.
* This code is then included into other tests, once
* possibly strange things have been defined.
*
* Including this normal code will test whether the strange
* things somehow breack the correct parsing and compiling
* of normal code.
*
* Code in this file must not use the XXXX identfier!
*)
(***************************************************************************)
(* Test if generic IL code is not affected by any previous declarations... *)
(***************************************************************************)
(* Test each IL operator *)
(* Since our compiler needs to distinguish
* between IL and ST code, we place each IL
* operator in a distinct function, to test whether
* the use of that IL operator as the first IL
* instruction does not confuse the logic
* use to determine whether ST or IL is being parsed.
*)
function bar0005 : int
var
e_1, f_1 : int;
end_var
& 10
end_function
function bar0006 : int
var
e_1, f_1 : int;
end_var
&N 10
end_function
function bar0007 : int
var
e_1, f_1 : int;
end_var
ADD 10
end_function
function bar0008 : int
var
e_1, f_1 : int;
end_var
AND TRUE
end_function
function bar0009 : int
var
e_1, f_1 : int;
end_var
ANDN TRUE
end_function
function_block bar0010
var
e_1, f_1 : int;
tt : TP;
end_var
CAL tt
end_function_block
function_block bar0011
var
e_1, f_1 : int;
tt : TP;
end_var
CALC tt
end_function_block
function_block bar0012
var
e_1, f_1 : int;
tt : TP;
end_var
CALCN tt
end_function_block
function_block bar0013
var
e_1, f_1 : int;
tt : CTUD;
end_var
CU tt
end_function_block
function_block bar0014
var
e_1, f_1 : int;
tt : CTUD;
end_var
CD tt
end_function_block
function_block bar0015
var
e_1, f_1 : int;
tt : R_TRIG;
end_var
CLK tt
end_function_block
function bar0016 : int
var
e_1, f_1 : int;
end_var
DIV e_1
end_function
function bar0017 : int
var
e_1, f_1 : int;
end_var
EQ e_1
end_function
function bar0018 : int
var
e_1, f_1 : int;
end_var
GE e_1
end_function
function bar0019 : int
var
e_1, f_1 : int;
end_var
GT e_1
end_function
function_block bar0020
var
e_1, f_1 : int;
tt : TP;
end_var
IN tt
end_function_block
function bar0021 : int
var
e_1, f_1 : int;
end_var
JMP ll
ll: LD FALSE
end_function
function bar0022 : int
var
e_1, f_1 : int;
end_var
JMPC ll
ll: LD FALSE
end_function
function bar0023 : int
var
e_1, f_1 : int;
end_var
JMPCN ll
ll: LD FALSE
end_function
function bar0024 : int
var
e_1, f_1 : int;
end_var
LD TRUE
end_function
function bar0025 : int
var
e_1, f_1 : int;
end_var
LDN TRUE
end_function
function bar0026 : int
var
e_1, f_1 : int;
end_var
LE e_1
end_function
function bar0027 : int
var
e_1, f_1 : int;
end_var
LT e_1
end_function
function bar0028 : int
var
e_1, f_1 : int;
end_var
MOD e_1
end_function
function bar0029 : int
var
e_1, f_1 : int;
end_var
MUL e_1
end_function
function bar0030 : int
var
e_1, f_1 : int;
end_var
NE e_1
end_function
function bar0031 : int
var
e_1, f_1 : int;
end_var
NOT TRUE
end_function
function bar0032 : int
var
e_1, f_1 : int;
end_var
OR TRUE
end_function
function bar0033 : int
var
e_1, f_1 : int;
end_var
ORN TRUE
end_function
function_block bar0034
var
e_1, f_1 : int;
tt : TP;
end_var
PT tt
end_function_block
function_block bar0035
var
e_1, f_1 : int;
tt : CTUD;
end_var
PV tt
end_function_block
function bar0036 : int
var
e_1, f_1 : bool;
end_var
R e_1 (* IL operand *)
end_function
function_block bar0037
var
e_1, f_1 : int;
tt : SR;
end_var
R tt (* FB call *)
end_function_block
function_block bar0038
var
e_1, f_1 : int;
tt : SR;
end_var
R1 tt (* FB call *)
end_function_block
function bar0039 : int
var
e_1, f_1 : bool;
end_var
RET
end_function
function bar0040 : int
var
e_1, f_1 : bool;
end_var
RETC
end_function
function bar0041 : int
var
e_1, f_1 : bool;
end_var
RETCN
end_function
function bar0042 : int
var
e_1, f_1 : bool;
end_var
S e_1
end_function
function_block bar0043
var
e_1, f_1 : int;
tt : SR;
end_var
S1 tt (* FB call *)
end_function_block
function bar0044 : int
var
e_1, f_1 : bool;
end_var
ST e_1
end_function
function bar0045 : int
var
e_1, f_1 : bool;
end_var
STN e_1
end_function
function bar0046 : int
var
e_1, f_1 : int;
end_var
SUB e_1
end_function
function bar0047 : int
var
e_1, f_1 : bool;
end_var
XOR e_1
end_function
function bar0048 : int
var
e_1, f_1 : bool;
end_var
XORN e_1
end_function
(***************************************************************************)
(* Test if generic ST code is not affected by any previous declarations... *)
(***************************************************************************)
(* A helper FUNCTION BLOCK declaration *)
function_block bar1000
var_input
a_1, b_1: int;
end_var
var_output
c_1, d_1: int;
end_var
c_1 := 10 + b_1;
end_function_block
(* A FUNCTION declaration *)
function bar1001 : int
var_input
a_1, b_1: int;
end_var
var_output
c_1, d_1: int;
end_var
c_1 := 10 + b_1;
end_function
(* Generic ST code *)
function_block bar1002
var
e_1, f_1 : int;
g_1 : int;
fb : bar1000;
end_var
fb(g_1, 20);
fb (10, g_1, e_1, f_1);
fb (a_1 := g_1, b_1:=g_1, c_1=>g_1, d_1=>f_1);
fb(a_1 := 10, b_1:=20, c_1=>e_1, d_1=>g_1);
fb (c_1=>g_1, a_1:=20, d_1=>f_1);
g_1 := fb.c_1;
fb.a_1 := g_1 + g_1 * 2 * (g_1) / bar1001(g_1, 10, g_1, e_1) MOD g_1 MOD g_1 ** g_1;
IF (g_1 >= 10) THEN g_1 := 10; END_IF;
CASE (g_1 + 10) OF
10: g_1 := 10;
10..20:g_1 := 20;
ELSE g_1 := 20;
END_CASE;
FOR g_1 := 10 TO 20 BY 2 DO
g_1 := g_1 + 1;
END_FOR;
FOR e_1 := g_1 TO 20 DO
g_1 := g_1 + 1;
END_FOR;
FOR e_1 := 10 TO g_1 BY 2 DO
g_1 := g_1 + 1;
END_FOR;
FOR e_1 := 10 TO g_1 DO
g_1 := g_1 + 1;
END_FOR;
FOR e_1 := 10 TO 20 BY g_1 DO
g_1 := g_1 + 1;
END_FOR;
WHILE (g_1 >= 10) DO
g_1 := 10;
END_WHILE;
REPEAT g_1 := 10; UNTIL (g_1 >= 10) END_REPEAT;
end_function_block
(****************************************************************************)
(* Test if generic SFC code is not affected by any previous declarations... *)
(****************************************************************************)
PROGRAM bar2001
VAR
QX1 AT %QX1 : BOOL := 1;
QX2 AT %QX2 : BOOL := 0;
QX3 AT %QX3 : BOOL;
IX1 AT %IX1 : BOOL;
IX2 AT %IX2 : BOOL;
IX3 AT %IX3 : BOOL;
END_VAR
VAR
delta_1 : TIME := T#1s;
END_VAR
INITIAL_STEP GO:
END_STEP
TRANSITION FROM GO TO STEP1
:= IX1 = FALSE;
END_TRANSITION
STEP STEP1:
ONSTEP1();
END_STEP
ACTION ONSTEP1:
QX1 := TRUE;
QX2 := TRUE;
END_ACTION
TRANSITION (PRIORITY := 4) FROM STEP1 TO STEP2
:= IX2 = TRUE;
END_TRANSITION
STEP STEP2:
INLINE1(D, T#1s);
END_STEP
ACTION INLINE1:
QX1 := QX2 XOR QX1; QX2 := NOT QX2;
END_ACTION
TRANSITION transition_id1 FROM STEP2 TO A1
:= QX1 = FALSE AND QX2 = FALSE;
END_TRANSITION
STEP A1:
INLINE2(DS, T#1s);
END_STEP
ACTION INLINE2:
IX1 := TRUE;
END_ACTION
TRANSITION transition_id2 (PRIORITY := 3) FROM A1 TO STEP2
:= IX1 = TRUE;
END_TRANSITION
TRANSITION FROM STEP2 TO (D1, D2, D3)
:= QX1 = TRUE AND QX2 = TRUE;
END_TRANSITION
STEP D1:
INLINE5(L, T#1s);
END_STEP
ACTION INLINE5:
QX1 := FALSE;
END_ACTION
TRANSITION FROM D1 TO E1
:= NOT ( QX1 OR QX2 OR QX3 );
END_TRANSITION
STEP E1:
INLINE8(N);
END_STEP
ACTION INLINE8:
QX1 := TRUE;
END_ACTION
TRANSITION FROM (E1, E2, E3) TO GO
:= QX1 AND QX2 AND QX3;
END_TRANSITION
STEP D2:
INLINE6(P);
END_STEP
ACTION INLINE6:
QX2 := FALSE;
END_ACTION
TRANSITION FROM D2 TO E2
:= NOT ( QX1 OR QX2 OR QX3 );
END_TRANSITION
STEP E2:
INLINE9(R);
END_STEP
ACTION INLINE9:
QX2 := TRUE;
END_ACTION
STEP D3:
INLINE7(S);
END_STEP
ACTION INLINE7:
QX2 := FALSE;
END_ACTION
TRANSITION FROM D3 TO E3
:= NOT ( QX1 OR QX2 OR QX3 );
END_TRANSITION
STEP E3:
INLINE10(SD, T#1s);
END_STEP
ACTION INLINE10:
QX3 := TRUE;
END_ACTION
TRANSITION FROM STEP2 TO A3
:= QX1 = TRUE AND QX2 = FALSE;
END_TRANSITION
STEP A3:
INLINE4(SL, T#1s);
END_STEP
ACTION INLINE4:
IX1 := TRUE;
END_ACTION
TRANSITION FROM A3 TO STEP2
:= IX1 = TRUE;
END_TRANSITION
TRANSITION FROM STEP2 TO A2
:= QX1 = FALSE AND QX2 = TRUE;
END_TRANSITION
STEP A2:
INLINE3(L, delta_1);
END_STEP
ACTION INLINE3:
IX1 := FALSE;
END_ACTION
TRANSITION FROM A2 TO STEP2
:= IX1 = FALSE;
END_TRANSITION
STEP A01:
INLINE01(L, delta_1, IX1, QX1);
END_STEP
ACTION INLINE01:
IX1 := FALSE;
END_ACTION
TRANSITION FROM STEP2 TO A01
:= IX1 = FALSE;
END_TRANSITION
STEP A02:
INLINE01(L, delta_1, IX1, QX1);
INLINE1 (L, delta_1, IX1, QX1);
INLINE2 (S);
INLINE3 ();
END_STEP
TRANSITION FROM STEP2 TO A02
:= IX1 = FALSE;
END_TRANSITION
END_PROGRAM
(*********************************************************************************)
(* Test if generic CONFIGURATION is not affected by any previous declarations... *)
(*********************************************************************************)
CONFIGURATION CONF0001
RESOURCE STD_RESSOURCE ON BEREMIZ
TASK STD_TASK(INTERVAL := t#100ms,PRIORITY := 0);
PROGRAM MAIN_INSTANCE : bar2001;
END_RESOURCE
END_CONFIGURATION