1. Introduction and objectives
8.1 E THER CAT M ASTER (ST SOURCE C ODE )
1) GVLs: GVL_MASTER
1 // Contains all the global variables and constants 2
3 {attribute 'qualified_only'}
4 VAR_GLOBAL
5 (* OUTPUT GLOBALS VARIABLES *) 6
7 // sawtooth real out value 8 fSawtoothRealOut AT %Q*: REAL;
9 // sawtooth 8 bits signed integer out value 10 iSawtooth8BitsIntOut AT %Q*: SINT;
11 // sawtooth 16 bits signed integer out value 12 iSawtooth16BitsIntOut AT %Q*: INT;
13 // sawtooth 32 bits signed integer out value 14 iSawtooth32BitsIntOut AT %Q*: DINT;
15 // sawtooth 8 bits unsigned integer out value 16 uiSawtooth8BitsIntOut AT %Q*: USINT;
17 // sawtooth 16 bits unsigned integer out value 18 uiSawtooth16BitsIntOut AT %Q*: UINT;
19 // sawtooth 32 bits unsigned integer out value 20 uiSawtooth32BitsIntOut AT %Q*: UDINT;
21 // sawtooth bool out value
22 bSawtoothBoolOut AT %Q*: BOOL := TRUE;
23
24 // sawtooth real out scaled values array
25 fSawToothRealOutArray AT %Q*: SignalRealValuesArray;
26 // sawtooth out 8 bits signed integer out scaled values array 27 iSawtooth8BitIntOutArray AT %Q*: Signal8BitsIntValuesArray;
28 // sawtooth out 16 bits signed integer out scaled values array 29 iSawtooth16BitIntOutArray AT %Q*: Signal16BitsIntValuesArray;
30 // sawtooth out 32 bits signed integer out scaled values array 31 iSawtooth32BitIntOutArray AT %Q*: Signal32BitsIntValuesArray;
32 // sawtooth out 8 bits unsigned integer out scaled values array 33 uiSawtooth8BitUIntOutArray AT %Q*: Signal8BitsUIntValuesArray;
34 // sawtooth out 16 bits unsigned integer out scaled values array 35 uiSawtooth16BitUIntOutArray AT %Q*: Signal16BitsUIntValuesArray;
36 // sawtooth out 32 bits unsigned integer out scaled values array 37 uiSawtooth32BitUIntOutArray AT %Q*: Signal32BitsUIntValuesArray;
38
39 (* INPUT GLOBALS VARIABLES *) 40
41 // real in value
42 fRealValueIn AT %I*: REAL;
43 // 8 bits integer in value 44 i8BitsIntValueIn AT %I*: SINT;
45 // 16 bits integer in value 46 i16BitsIntValueIn AT %I*: INT;
47 // 32 bits integer in value 48 i32BitsIntValueIn AT %I*: DINT;
49 // 8 bits unsigned integer in value 50 ui8BitsIntValueIn AT %I*: USINT;
51 // 16 bits unsigned integer in value 52 ui16BitsIntValueIn AT %I*: UINT;
53 // 32 bits unsigned integer in value 54 ui32BitsIntValueIn AT %I*: UDINT;
55 // bool in value
56 bBoolValueIn AT %I*: BOOL;
57
58 // real in values array
59 fRealValuesInArray AT %I*: SignalRealValuesArray;
60 // 8 bits signed integer in values array
61 i8BitIntValuesInArray AT %I*: Signal8BitsIntValuesArray;
62 // 16 bits signed integer in values array
63 i16BitIntValuesInArray AT %I*: Signal16BitsIntValuesArray;
64 // 32 bits signed integer in values array
65 i32BitIntInValuesArray AT %I*: Signal32BitsIntValuesArray;
66 // 8 bits unsigned integer in values array
67 ui8BitIntValuesInArray AT %I*: Signal8BitsUIntValuesArray;
68 // 16 bits unsigned integer in values array
69 ui16BitIntValuesInArray AT %I*: Signal16BitsUIntValuesArray;
70 // 32 bits unsigned integer in values array
71 ui32BitIntInValuesArray AT %I*: Signal32BitsUIntValuesArray;
72 END_VAR 73
74 VAR_GLOBAL CONSTANT
75 // Minimum signal array subscript
115
76 MIN_ARRAY_IDX: INT := 1;
77 // Maximum signal array subscript 78 MAX_ARRAY_IDX: INT := 10;
79 // Max number of time tick before resetting signal values 80 MAX_TICK_COUNT: INT := 999;
81 END_VAR
2) DUTs: Signal16BitsIntValuesArray
1 // Definition of an array of 16 bits integers data type 2
3 TYPE Signal16BitsIntValuesArray :
4 ARRAY[GVL_MASTER.MIN_ARRAY_IDX ..GVL_MASTER.MAX_ARRAY_IDX] OF INT;
5 END_TYPE
3) DUTs: Signal16BitsUIntValuesArray
1 // Definition of an array of 16 bits unsigned integers data type 2
3 TYPE Signal16BitsUIntValuesArray :
4 ARRAY[GVL_MASTER.MIN_ARRAY_IDX ..GVL_MASTER.MAX_ARRAY_IDX] OF UINT;
5 END_TYPE
4) DUTs: Signal32BitsIntValuesArray
1 // Definition of an array of 32 bits integers data type 2
3 TYPE Signal32BitsIntValuesArray :
4 ARRAY[GVL_MASTER.MIN_ARRAY_IDX ..GVL_MASTER.MAX_ARRAY_IDX] OF DINT;
5 END_TYPE
5) DUTs: Signal32BitsUIntValuesArray
1 // Definition of an array of 32 bits unsigned integers data type 2
3 TYPE Signal32BitsUIntValuesArray :
4 ARRAY[GVL_MASTER.MIN_ARRAY_IDX ..GVL_MASTER.MAX_ARRAY_IDX] OF UDINT;
5 END_TYPE
6) DUTs: Signal8BitsIntValuesArray
1 // Definition of an array of 8 bits integers data type 2
3 TYPE Signal8BitsIntValuesArray :
4 ARRAY[GVL_MASTER.MIN_ARRAY_IDX..GVL_MASTER.MAX_ARRAY_IDX] OF SINT;
5 END_TYPE
7) DUTs: Signal8BitsUIntValuesArray
1 // Definition of an array of 8 bits unsigned integers data type 2
3 TYPE Signal8BitsUIntValuesArray :
4 ARRAY[GVL_MASTER.MIN_ARRAY_IDX..GVL_MASTER.MAX_ARRAY_IDX] OF USINT;
5 END_TYPE
8) DUTs: SignalRealValuesArray
1 // Definition of an array of reals data type 2
3 TYPE SignalRealValuesArray :
4 ARRAY[GVL_MASTER.MIN_ARRAY_IDX ..GVL_MASTER.MAX_ARRAY_IDX] OF REAL;
5 END_TYPE
9) POUs: fcGenerate16BitsIntSawtoothSignal (FUN)
1 // Generates a 16 bits integer sample multiplying the current time tick 2 // by a 16 bits integer scale factor
3
4 FUNCTION fcGenerate16BitsIntSawtoothSignal : INT 5 VAR_INPUT
6 // The signal scale factor 7 iScaleFactor: INT;
8 // The current time tick 9 iTimeTick: INT;
10 END_VAR 11
12 fcGenerate16BitsIntSawtoothSignal := iTimeTick * iScaleFactor;
116
10) POUs: fcGenerate16BitsIntSawtoothSignals (FUN)
1 // Generates an array of 16 bits integer samples multiplying the current time tick 2 // by 16 bits integer scale factors each corresponding to current array subscript 3
4 FUNCTION fcGenerate16BitsIntSawtoothSignals 5 VAR_IN_OUT
6 // the generated signals array
7 iSawTooth16BitsIntArray: Signal16BitsIntValuesArray;
8 END_VAR 9 VAR_INPUT
10 // the current time tick 11 iTimeTick: INT;
12 END_VAR 13 VAR
14 iIndex: INT;
15 END_VAR 16
17 FOR iIndex := GVL_MASTER.MIN_ARRAY_IDX TO GVL_MASTER.MAX_ARRAY_IDX DO
18 iSawTooth16BitsIntArray[iIndex]:=fcGenerate16BitsIntSawtoothSignal(iIndex, 19 iTimeTick);
20 END_FOR
11) POUs: fcGenerate16BitsUIntSawtoothSignal (FUN)
1 // Generates a 16 bits unsigned integer sample multiplying the current time tick 2 // by a 16 bits unsigned integer scale factor
3
4 FUNCTION fcGenerate16BitsUIntSawtoothSignal : UINT 5 VAR_INPUT
6 // The signal scale factor 7 iScaleFactor: INT;
8 // The current time tick 9 iTimeTick: INT;
10 END_VAR 11
12 fcGenerate16BitsUIntSawtoothSignal := INT_TO_UINT(iTimeTick * iScaleFactor);
12) POUs: fcGenerate16BitsUIntSawtoothSignals (FUN)
1 // Generates an array of 16 bits unsigned integer samples multiplying the current time tick 2 // by 16 bits unsigned integer scale factors each corresponding to current array subscript 3
4 FUNCTION fcGenerate16BitsUIntSawtoothSignals 5 VAR_IN_OUT
6 // the generated signals array
7 uiSawTooth16BitsIntArray: Signal16BitsUIntValuesArray;
8 END_VAR 9 VAR_INPUT
10 // the current time tick 11 iTimeTick: INT;
12 END_VAR 13 VAR
14 iIndex: INT;
15 END_VAR 16
17 FOR iIndex := GVL_MASTER.MIN_ARRAY_IDX TO GVL_MASTER.MAX_ARRAY_IDX DO
18 uiSawTooth16BitsIntArray[iIndex] := fcGenerate16BitsUIntSawtoothSignal(iIndex, 19 iTimeTick);
20 END_FOR
13) POUs: fcGenerate32BitsIntSawtoothSignal (FUN)
1 FUNCTION fcGenerate32BitsIntSawtoothSignal : DINT 2 VAR_INPUT
3 // The signal scale factor 4 iScaleFactor: INT;
5 // The current time tick 6 iTimeTick: INT;
7 END_VAR 8
9 fcGenerate32BitsIntSawtoothSignal := INT_TO_DINT(iTimeTick * iScaleFactor);
14) POUs: fcGenerate32BitsIntSawtoothSignals (FUN)
1 // Generates an array of 32 bits integer samples multiplying the current time tick 2 // by 32 bits integer scale factors each corresponding to current array subscript 3 4 FUNCTION fcGenerate32BitsIntSawtoothSignals
5 VAR_IN_OUT
6 // the generated signals array
7 iSawTooth32BitsIntArray: Signal32BitsIntValuesArray;
8 END_VAR
117
9 VAR_INPUT
10 // the current time tick 11 iTimeTick: INT;
12 END_VAR 13 VAR
14 iIndex: INT;
15 END_VAR 16
17 FOR iIndex := GVL_MASTER.MIN_ARRAY_IDX TO GVL_MASTER.MAX_ARRAY_IDX DO 18 iSawTooth32BitsIntArray[iIndex] := fcGenerate32BitsIntSawtoothSignal(iIndex, 19 iTimeTick);
20 END_FOR
15) POUs: fcGenerate32BitsUIntSawtoothSignal (FUN)
1 // Generates a 32 bits unsigned integer sample multiplying the current time tick 2 // by a 32 bits unsigned integer scale factor
3 4 FUNCTION fcGenerate32BitsUIntSawtoothSignal : UDINT 5 VAR_INPUT
6 // The signal scale factor 7 iScaleFactor: INT;
8 // The current time tick 9 iTimeTick: INT;
10 END_VAR 11
12 fcGenerate32BitsUIntSawtoothSignal := INT_TO_UDINT(iTimeTick * iScaleFactor);
16) POUs: fcGenerate32BitsUIntSawtoothSignals (FUN)
1 // Generates an array of 32 bits unsigned integer samples multiplying the current time tick 2 // by 32 bits unsigned integer scale factors each corresponding to current array subscript 3
4 FUNCTION fcGenerate32BitsUIntSawtoothSignals 5 VAR_IN_OUT
6 // the generated signals array
7 uiSawTooth32BitsIntArray: Signal32BitsUIntValuesArray;
8 END_VAR 9 VAR_INPUT
10 // the current time tick 11 iTimeTick: INT;
12 END_VAR 13 VAR
14 iIndex: INT;
15 END_VAR 16
17 FOR iIndex := GVL_MASTER.MIN_ARRAY_IDX TO GVL_MASTER.MAX_ARRAY_IDX DO
18 uiSawTooth32BitsIntArray[iIndex] := fcGenerate32BitsUIntSawtoothSignal(iIndex, 19 iTimeTick);
20 END_FOR
17) POUs: fcGenerate8BitsIntSawtoothSignal (FUN)
1 // Generates a 8 bits integer sample multiplying the current time tick 2 // by a 8 bits integer scale factor
3
4 FUNCTION fcGenerate8BitsIntSawtoothSignal : SINT 5 VAR_INPUT
6 // The signal scale factor 7 iScaleFactor: INT;
8 // The current time tick 9 iTimeTick: INT;
10 END_VAR 11
12 fcGenerate8BitsIntSawtoothSignal := INT_TO_SINT(iTimeTick * iScaleFactor);
18) POUs: fcGenerate8BitsIntSawtoothSignals (FUN)
1 // Generates an array of 8 bits integer samples multiplying the current time tick 2 // by 8 bits integer scale factors each corresponding to current array subscript 3
4 FUNCTION fcGenerate8BitsIntSawtoothSignals 5 VAR_IN_OUT
6 // the generated signals array
7 iSawTooth8BitsIntArray: Signal8BitsIntValuesArray;
8 END_VAR 9 VAR_INPUT
10 // the current time tick 11 iTimeTick: INT;
12 END_VAR 13 VAR
14 iIndex: INT;
15 END_VAR
118
16
17 FOR iIndex := GVL_MASTER.MIN_ARRAY_IDX TO GVL_MASTER.MAX_ARRAY_IDX DO
18 iSawTooth8BitsIntArray[iIndex] := fcGenerate8BitsIntSawtoothSignal(iIndex, 19 iTimeTick);
20 END_FOR
19) POUs: fcGenerate8BitsUIntSawtoothSignal (FUN)
1 // Generates a 8 bits unsigned integer sample multiplying the current time tick 2 // by a 8 bits unsigned integer scale factor
3
4 FUNCTION fcGenerate8BitsUIntSawtoothSignal : USINT 5 VAR_INPUT
6 // The signal scale factor 7 iScaleFactor: INT;
8 // The current time tick 9 iTimeTick: INT;
10 END_VAR 11
12 fcGenerate8BitsUIntSawtoothSignal := INT_TO_USINT(iTimeTick * iScaleFactor);
20) POUs: fcGenerate8BitsUIntSawtoothSignals (FUN)
1 // Generates an array of 8 bits unsigned integer samples multiplying the current time tick 2 // by 8 bits unsigned integer scale factors each corresponding to current array subscript 3
4 FUNCTION fcGenerate8BitsUIntSawtoothSignals 5 VAR_IN_OUT
6 // the generated signals array
7 uiSawTooth8BitsIntArray: Signal8BitsUIntValuesArray;
8 END_VAR 9 VAR_INPUT
10 // the current time tick 11 iTimeTick: INT;
12 END_VAR 13 VAR
14 iIndex: INT;
15 END_VAR 16
17 FOR iIndex := GVL_MASTER.MIN_ARRAY_IDX TO GVL_MASTER.MAX_ARRAY_IDX DO
18 uiSawTooth8BitsIntArray[iIndex] := fcGenerate8BitsUIntSawtoothSignal(iIndex, 19 iTimeTick);
20 END_FOR
21) POUs: fcGenerateRealSawtoothSignal (FUN)
1 // Generates a real sample multiplying the current time tick 2 // by a real scale factor
3
4 FUNCTION fcGenerateRealSawtoothSignal : REAL 5 VAR_INPUT
6 // The signal scale factor 7 fScaleFactor: REAL;
8 // The current time tick 9 iTimeTick: INT;
10 END_VAR 11
12 fcGenerateRealSawtoothSignal := INT_TO_REAL(iTimeTick) * fScaleFactor;
22) POUs: fcGenerateRealSawtoohSignals (FUN)
1 // Generates an array of real samples multiplying the current time tick 2 // by scale factors each corresponding to current array subscript 3 4 FUNCTION fcGenerateRealSawtoohSignals
5 VAR_IN_OUT
6 // the generated signals array
7 fSawtoothRealValuesArray: SignalRealValuesArray;
8 END_VAR 9 VAR_INPUT
10 // The current time tick 11 iTimeTick: INT;
12 END_VAR 13 VAR
14 iIndex : INT;
15 END_VAR 16
17 FOR iIndex := GVL_MASTER.MIN_ARRAY_IDX TO GVL_MASTER.MAX_ARRAY_IDX DO
18 fSawtoothRealValuesArray[iIndex]:=fcGenerateRealSawtoothSignal(INT_TO_REAL(iIndex, 19 iTimeTick);
20 END_FOR
119
23) POUs: MASTER_MAIN (PRG)
1 // This is the main program executed in task with cycle time of one millisecond.
2 // It generates all the ramps and the rectangular boolean signals, 3 // the signals are periodic with the periodo equal to one second 4
5 PROGRAM MASTER_MAIN 6 VAR
7 iTimeTick : INT := 0;
8 END_VAR 9
10 IF iTimeTick = GVL_MASTER.MAX_TICK_COUNT THEN 11 // reset the time tick when the max is reached 12 iTimeTick := 0;
13 END_IF 14
15 IF (iTimeTick MOD ((GVL_MASTER.MAX_TICK_COUNT + 1) / 2) = 0) THEN 16 GVL_MASTER.bSawtoothBoolOut := NOT(GVL_MASTER.bSawtoothBoolOut);
17 END_IF 18
19 // Generate the periodic signals 20
21 // Real sawtooths
22 GVL_MASTER.fSawtoothRealOut := fcGenerateRealSawtoothSignal(1.0, iTimeTick);
23 fcGenerateRealSawtoohSignals(GVL_MASTER.fSawToothRealOutArray, iTimeTick);
24
25 // signed integer sawtooths
26 GVL_MASTER.iSawtooth8BitsIntOut := fcGenerate8BitsIntSawtoothSignal(1, iTimeTick);
27 fcGenerate8BitsIntSawtoothSignals(GVL_MASTER.iSawtooth8BitIntOutArray, iTimeTick);
28
29 GVL_MASTER.iSawtooth16BitsIntOut := fcGenerate16BitsIntSawtoothSignal(1, iTimeTick);
30 fcGenerate16BitsIntSawtoothSignals(GVL_MASTER.iSawtooth16BitIntOutArray, iTimeTick);
31
32 GVL_MASTER.iSawtooth32BitsIntOut := fcGenerate32BitsIntSawtoothSignal(1, iTimeTick);
33 fcGenerate32BitsIntSawtoothSignals(GVL_MASTER.iSawtooth32BitIntOutArray, iTimeTick);
34
35 // unsigned integer sawtooths
36 GVL_MASTER.uiSawtooth8BitsIntOut := fcGenerate8BitsUIntSawtoothSignal(1, iTimeTick);
37 fcGenerate8BitsUIntSawtoothSignals(GVL_MASTER.uiSawtooth8BitUIntOutArray, iTimeTick);
38
39 GVL_MASTER.uiSawtooth16BitsIntOut := fcGenerate16BitsUIntSawtoothSignal(1, iTimeTick);
40 fcGenerate16BitsUIntSawtoothSignals(GVL_MASTER.uiSawtooth16BitUIntOutArray, iTimeTick);
41
42 GVL_MASTER.uiSawtooth32BitsIntOut := fcGenerate32BitsUIntSawtoothSignal(1, iTimeTick);
43 fcGenerate32BitsUIntSawtoothSignals(GVL_MASTER.uiSawtooth32BitUIntOutArray, iTimeTick);
44
45 // update the time tick 46 iTimeTick := iTimeTick + 1;