Si chiede di costruire una funzione in grado di contare quanti bit di una Word si trovano a 1 (l’output della funzione è un intero).
Possiamo procedere in due modi:
Nel primo viene utilizzato il costrutto AT (che consente di poter accedere ai singoli bit della variabile word con un array di bool), e quindi la funzione sarà:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | FUNCTION "Conta_Bit_SCL_func_1" : Void { S7_Optimized_Access := 'FALSE' } VERSION : 0.1 VAR_INPUT word_input : Word; END_VAR VAR_OUTPUT conteggio : Int; word_output : Word; END_VAR VAR_TEMP count_int : Int; word_in2 : Word; word_in_array AT word_in2 : Array[0..15] of Bool; word_tmp : Word; END_VAR BEGIN #word_in2 := #word_input; #conteggio := 0; #word_output := 0; FOR #count_int := 0 TO 15 DO IF #word_in_array[#count_int] = 1 THEN #conteggio := #conteggio + 1; #word_output := #word_output + 1; END_IF; END_FOR; END_FUNCTION |
Nel secondo caso invece si copia la word in ingresso in una word temporanea e si effettua uno SHR (shift right) per 15 volte con un ciclo for, andando ogni volta a verificare il primo bit (#word_tmp.%X0) e ad incrementare la variabile “#conteggio” qualora il bit fosse pari ad 1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | FUNCTION "Conta_Bit_SCL_func_2" : Void { S7_Optimized_Access := 'FALSE' } VERSION : 0.1 VAR_INPUT word_input : Word; END_VAR VAR_OUTPUT conteggio : Int; word_output : Word; END_VAR VAR_TEMP count_int : Int; word_tmp : Word; END_VAR BEGIN #conteggio := 0; #word_output := 0; #word_tmp:=#word_input; FOR #count_int:=0 TO 15 DO IF #word_tmp.%X0 = 1 THEN #conteggio := #conteggio + 1; #word_output := #word_output + 1; END_IF; #word_tmp:=SHR(IN:=#word_tmp, N:=1); END_FOR; END_FUNCTION |
Quindi per capire meglio si ha:
quando count=0 –> word_tmp.%X0=word_input.X0
quando count=1 –> word_tmp.%X0=word_input.X1
quando count=2 –> word_tmp.%X0=word_input.X2
….
quando count=15 –> word_tmp.%X0=word_input.X15