Codifica stato bit -> esadecimale
Questa funzione ritorna l'esponente in base 2 del bit con il peso maggiore della variabile in ingresso a s1_Start, secondo le impostazioni definite in s2_Control. Il risultato della codifica viene memorizzato nell'area di destinazione a 16 bit specificata da d_Start a partire dalla posizione bit specificata. I bit non validi nell'area specificata per il risultato della codifica vengono compilati con zeri.
FP_ENCODE è l'istruzione inversa diFP_DECODE.
Ingresso
Area a 16 bit iniziale da codificare (source)
Dati di controllo per specificare la posizione bit iniziale e il numero di bit da codificare
Uscita
area a 16 bit per memorizzare il dato codificato (destinazione)
Le variabili s1_Start, s2_Control e d_Start devono presentare lo stesso tipo di dato.
Esempio con s2_Control=16#0005
16# |
0 |
0 |
0 |
5 |
|
↑ |
↑ |
Numero di bit da codificare: 25=32 bit |
|||
Posizione bit iniziale dei dati da codificare: posizione bit 0 |
Il risultato della codifica 8 (decimale) viene memorizzato in d_Start quando il trigger EN è TRUE.
Descrizione del processo
Il contenuto del segmento bit 2^nL all'inizio dell'area specificata da s1_Start viene codificato (dove nL + il numero di bit da codificare).
Il risultato della codifica viene memorizzato come dati decimali negli otto bit che iniziano dal bit specificato come bit nH (laddove nH è il bit di conversione iniziale). I bit non validi nell'area specificata per il risultato vengono compilati con zeri.
Descrizione di s2_Control
s2_Control specifica la posizione iniziale dei bit dei dati di destinazione e il numero di bit da codificare utilizzando dati esadecimali.
I bit contrassegnati con "-" non sono validi. |
|||||
Impostazione 16#0–16#F |
(3) Posizione bit iniziale dei dati di destinazione codificati |
Impostazione 16#0–16#8 |
(4) Numero di bit codificati |
||
16#0 |
0 |
16#1 |
2 |
||
16#1 |
1 |
16#2 |
4 |
||
16#2 |
2 |
16#3 |
8 (1 byte) |
||
16#3 |
3 |
16#4 |
16 (1 word) |
||
16#4 |
4 |
16#5 |
32 (2 word) |
||
16#5 |
5 |
16#6 |
64 (4 word) |
||
16#6 |
6 |
16#7 |
128 (8 word) |
||
16#7 |
7 |
16#8 |
256 (16 word) |
||
16#8 |
8 |
||||
16#9 |
9 |
||||
16#A |
10 |
||||
16#B |
11 |
||||
16#C |
12 |
||||
16#D |
13 |
||||
16#E |
14 |
||||
16#F |
15 |
Esempio di codifica
Codificando i dati a 16 bit (nL=4), i risultato della codifica vengono mostrati nel seguente modo.
Dati da codificare (4 bit) |
Risultato della codifica |
|
---|---|---|
Equivalente |
Dec. |
|
0000 0000 0000 0001 |
16#0000 |
0 |
0000 0000 0000 0010 |
16#0001 |
1 |
0000 0000 0000 0100 |
16#0010 |
2 |
0000 0000 0000 1000 |
16#0011 |
3 |
0000 0000 0001 0000 |
16#0100 |
4 |
0000 0000 0010 0000 |
16#0101 |
5 |
0000 0000 0100 0000 |
16#0110 |
6 |
0000 0000 1000 0000 |
16#0111 |
7 |
0000 0001 0000 0000 |
16#1000 |
8 |
0000 0010 0000 0000 |
16#1001 |
9 |
0000 0100 0000 0000 |
16#1010 |
10 |
0000 1000 0000 0000 |
16#1011 |
11 |
0001 0000 0000 0000 |
16#1100 |
12 |
0010 0000 0000 0000 |
16#1101 |
13 |
0100 0000 0000 0000 |
16#1110 |
14 |
1000 0000 0000 0000 |
16#1111 |
15 |
se l'area specificata utilizzando il registro indice eccede il limite.
se 1 £ nL £ 8, in cui nL è il numero dei bit da codificare/decodificare.
se 1 £ nH + nL £ 16, in cui nH è il bit di avvio conversione e nL è il numero di bit da codificare/decodificare.
se il dato da codificare è tutto zero.
se l'area specificata utilizzando il registro indice eccede il limite.
se 1 £ nL £ 8, in cui nL è il numero dei bit da codificare/decodificare.
se 1 £ nH + nL £ 16, in cui nH è il bit di avvio conversione e nL è il numero di bit da codificare/decodificare.
se il dato da codificare è tutto zero.
Tutte le variabili di ingresso e uscita utilizzate per programmare questa funzione sono state dichiarate nell'intestazione del POU. La stessa intestazione del POU è utilizzata per tutti i linguaggi di programmazione.
VAR
bStart: BOOL:=FALSE;
(*activates the function*)
wInput_value: WORD:=2#0000000001000000;
wControlCode: WORD:=16#0003;
(*specifies the encodation*)
wOutput_value: WORD:=0;
(*result after a 0->1 leading
edge from start:
2#0000000000000110*)
END_VAR
Quando la variabile bStart è impostata su TRUE, la funzione viene eseguita.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_CONTACT,,bStart,6,1,8,3,);
B(B_VARIN,,wInput_value,10,2,12,4,);
B(B_VARIN,,wControlCode,10,3,12,5,);
B(B_VAROUT,,wOutput_value,20,2,22,4,);
B(B_F,FP_ENCODE!,,12,0,20,5,,?DEN?Ds1_Start?Ds2_Control?AENO?Cd_Start);
L(1,2,6,2);
L(8,2,12,2);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF bStart then
FP_ENCODE(s1_Start := wInput_value,
s2_Control := wControlCode,
d_Start => wOutput_value);
END_IF;