equal
deleted
inserted
replaced
|
1 FUNCTION_BLOCK STACK_INT |
|
2 VAR_INPUT PUSH, POP: BOOL R_EDGE; (* Basic stack operations *) |
|
3 R1 : BOOL ; (* Over-riding reset *) |
|
4 IN : INT ; (* Input to be pushed *) |
|
5 N : INT ; (* Maximum depth after reset *) |
|
6 END_VAR |
|
7 VAR_OUTPUT EMPTY : BOOL := 1 ; (* Stack empty *) |
|
8 OFLO : BOOL := 0 ; (* Stack overflow *) |
|
9 OUT : INT := 0 ; (* Top of stack data *) |
|
10 END_VAR |
|
11 VAR STK : ARRAY[0..127] OF INT; (* Internal stack *) |
|
12 NI : INT :=128 ; (* Storage for N upon reset *) |
|
13 PTR : INT := -1 ; (* Stack pointer *) |
|
14 END_VAR |
|
15 (* Function Block body *) |
|
16 IF R1 THEN |
|
17 OFLO := 0; EMPTY := 1; PTR := -1; |
|
18 NI := LIMIT (MN:=1,IN:=N,MX:=128); OUT := 0; |
|
19 ELSIF POP & NOT EMPTY THEN |
|
20 OFLO := 0; PTR := PTR-1; EMPTY := PTR < 0; |
|
21 IF EMPTY THEN OUT := 0; |
|
22 ELSE OUT := STK[PTR]; |
|
23 END_IF ; |
|
24 ELSIF PUSH & NOT OFLO THEN |
|
25 EMPTY := 0; PTR := PTR+1; OFLO := (PTR = NI); |
|
26 IF NOT OFLO THEN OUT := IN ; STK[PTR] := IN; |
|
27 ELSE OUT := 0; |
|
28 END_IF ; |
|
29 END_IF ; |
|
30 |
|
31 END_FUNCTION_BLOCK |