16진수 -> 비트 상태로 디코딩
이 FP 명령은 트리거 EN이 TRUE이면 s1_Start에서 지정한 데이터 콘텐츠를 s2_Control의 콘텐츠에 따라 디코딩합니다. 디코딩 결과는 d_Start에서 시작하는 영역에 저장됩니다.
FP_DECODE는 FP_ENCODE의 역 명령입니다.
입력
디코딩할 소스 영역 또는 해당 정수
비트 위치 시작을 지정하는 제어 데이터 및 디코딩할 비트 수
출력
디코딩된 데이터를 저장하는 시작 어드레스(대상)
변수 s1_Start, s2_Control 및 d_Start의 데이터 형식은 같아야 합니다.
예 s2_Control=16#404
디코딩된 데이터 TRUE는 d_Start의 비트 위치 7에 저장됩니다.
비트 7을 제외한 모든 비트는 0으로 채워집니다.
s1_Start에서 지정한 영역의 nH 비트에서 2^nL 비트 세그먼트의 콘텐츠가 디코딩됩니다(여기서 nL은 디코딩할 비트 수).
디코딩된 결과는 d_Start에서 지정한 영역부터 시작하여 2^nL 비트 세그먼트에 저장됩니다(여기서 nH는 변환 시작 비트). 결과로 지정된 영역에서 유효하지 않은 비트는 0으로 채워집니다.
s2_Control에 대한 설명
s2_Control은 디코딩할 시작 비트 위치와 비트 수를 16진수 데이터를 사용하여 지정합니다.
"-"로 표시된 비트는 유효하지 않습니다. |
|||||
설정값 16#0–16#F |
(3) 디코딩할 시작 비트 위치 |
설정값 16#0–16#8 |
(4) 디코딩된 비트 수 |
||
16#0 |
0 |
16#0 |
0 |
||
16#1 |
1 |
16#1 |
1 |
||
16#2 |
2 |
16#2 |
2 |
||
16#3 |
3 |
16#3 |
3 |
||
16#4 |
4 |
16#4 |
4 |
||
16#5 |
5 |
16#5 |
5 |
||
16#6 |
6 |
16#6 |
6 |
||
16#7 |
7 |
16#7 |
7 |
||
16#8 |
8 |
16#8 |
8 |
||
16#9 |
9 |
||||
16#A |
10 |
||||
16#B |
11 |
||||
16#C |
12 |
||||
16#D |
13 |
||||
16#E |
14 |
||||
16#F |
15 |
비트 수와 디코딩 결과로 발생한 데이터 영역 간의 관계
디코딩할 바이트 수 |
결과에 필요한 데이터 영역 |
디코딩된 비트 수(결과) |
---|---|---|
1 |
1워드 |
2비트 1) |
2 |
1워드 |
4비트 1) |
3 |
1워드 |
8비트 1) |
4 |
1워드 |
16비트 |
5 |
2워드 |
32비트 |
6 |
4워드 |
64비트 |
7 |
8워드 |
128비트 |
8 |
16워드 |
256비트 |
1) 결과에 필요한 데이터 영역에서 유효하지 않은 비트는 0으로 채워집니다.
디코딩된 데이터의 예
4비트 데이터를 디코딩할 경우, 디코딩된 결과의 16비트 데이터는 아래와 같이 표시됩니다.
디코딩 조건: s2_Control
시작 비트 위치 0: 16#0
디코딩할 비트 수: 16#4(4비트)
디코딩할 데이터(4비트) |
디코딩된 결과 |
|
---|---|---|
16진수 |
10진수 |
|
16#0000 |
0 |
0000 0000 0000 0001 |
16#0001 |
1 |
0000 0000 0000 0010 |
16#0010 |
2 |
0000 0000 0000 0100 |
16#0011 |
3 |
0000 0000 0000 1000 |
16#0100 |
4 |
0000 0000 0001 0000 |
16#0101 |
5 |
0000 0000 0010 0000 |
16#0110 |
6 |
0000 0000 0100 0000 |
16#0111 |
7 |
0000 0000 1000 0000 |
16#1000 |
8 |
0000 0001 0000 0000 |
16#1001 |
9 |
0000 0010 0000 0000 |
16#1010 |
10 |
0000 0100 0000 0000 |
16#1011 |
11 |
0000 1000 0000 0000 |
16#1100 |
12 |
0001 0000 0000 0000 |
16#1101 |
13 |
0010 0000 0000 0000 |
16#1110 |
14 |
0100 0000 0000 0000 |
16#1111 |
15 |
1000 0000 0000 0000 |
인덱스 한정자를 사용하여 지정한 영역이 제한을 초과하는 경우.
1 £ nL £ 8인 경우. 여기서 nL은 인코딩/디코딩할 비트 수임.
1 £ nH + nL £ 16인 경우. 여기서 nH는 변환 시작 비트이고 nL은 인코딩/디코딩할 비트 수임.
디코딩된 결과에 사용되는 메모리 영역이 제한을 초과하는 경우.
인덱스 한정자를 사용하여 지정한 영역이 제한을 초과하는 경우.
1 £ nL £ 8인 경우. 여기서 nL은 인코딩/디코딩할 비트 수임.
1 £ nH + nL £ 16인 경우. 여기서 nH는 변환 시작 비트이고 nL은 인코딩/디코딩할 비트 수임.
디코딩된 결과에 사용되는 메모리 영역이 제한을 초과하는 경우.
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.
VAR
bStart: BOOL:=FALSE;
(*activates the function*)
wInput_value: WORD:=2#1100011000011110;
wControlCode: WORD:=16#0003;
(*specifies decoding*)
wConversionResult: WORD:=0;
(*result after a 0->1 leading
edge from start:
2#0000000001000000*)
END_VAR
변수 bStart가 TRUE로 설정되면 펑션이 실행됩니다.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_CONTACT,,bStart,8,1,10,3,);
B(B_VARIN,,wInput_value,11,2,13,4,);
B(B_VARIN,,wControlCode,11,3,13,5,);
B(B_VAROUT,,wConversionResult,21,2,23,4,);
B(B_F,FP_DECODE!,,13,0,21,5,,?DEN?Ds1_Start?Ds2_Control?AENO?Cd_Start);
L(10,2,13,2);
L(1,2,8,2);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF start then
FP_DECODE(s1_Start := wInput_value,
s2_Control := wControlCode,
d_Start => wConversionResult);
END_IF;