FUNCTION "threeInToTwentyOut" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
inByte : Byte; // input byte := IB0
END_VAR
VAR_IN_OUT
outDWord : DWord; // output double Word := DWQ0
END_VAR
VAR_TEMP
tempInByte : Int; // temp storage for masked input
tempOutDWord : DWord; // temp Storage for masked output
END_VAR
VAR CONSTANT
IN_MASK : Byte := 16#07; // just the first three from lsb needed
OUT_MASK : DWord := 16#FFF0_0000; // just 20 bits from lsb
CASE_0 : Int := 16#0000; // nothing to do...... --> output OFF
CASE_1 : Int := 16#0001;
CASE_2 : Int := 16#0002;
CASE_3 : Int := 16#0003;
CASE_4 : Int := 16#0004;
CASE_5 : Int := 16#0005;
CASE_6 : Int := 16#0006;
CASE_7 : Int := 16#0007;
OUT_DEFAULT : DWord := 16#0000_0000; // output OFF
OUT_0 : DWord := 16#0000_0000; // output OFF
OUT_1 : DWord := 16#0000_0001; // <-- Define your output pattern here.....
OUT_2 : DWord := 16#0000_0002;
OUT_3 : DWord := 16#0000_0003;
OUT_4 : DWord := 16#0000_0004;
OUT_5 : DWord := 16#0000_0005;
OUT_6 : DWord := 16#0000_0006;
OUT_7 : DWord := 16#0000_0007;
END_VAR
BEGIN
// mask the input byte
#tempInByte := #IN_MASK AND #inByte;
// select case of input pattern
CASE #tempInByte OF
#CASE_1: // Statement section case 1
#tempOutDWord := #OUT_1;
#CASE_2: // Statement section case 2
#tempOutDWord := #OUT_2;
#CASE_3: // Statement section case 3
#tempOutDWord := #OUT_3;
#CASE_4: // Statement section case 4
#tempOutDWord := #OUT_4;
#CASE_5: // Statement section case 5
#tempOutDWord := #OUT_5;
#CASE_6: // Statement section case 6
#tempOutDWord := #OUT_6;
#CASE_7: // Statement section case 7
#tempOutDWord := #OUT_7;
#CASE_0: // Statement section case 0
#tempOutDWord := #OUT_0;
ELSE // Statement section ELSE
#tempOutDWord := #OUT_DEFAULT;
END_CASE;
// mask IN/OUT to reset previous output, set current output with OR result of case
#outDWord := (#OUT_MASK AND #outDWord) OR #tempOutDWord;
END_FUNCTION