비트 상태 인코딩 -> 16진수
이 FP 명령은 트리거 EN이 TRUE이면 s1_Start에서 지정한 데이터 콘텐츠를 s2_Control의 콘텐츠에 따라 인코딩합니다. 인코딩 결과는 지정된 비트 위치에서 시작하여 d_Start에서 지정한 16비트 대상 영역에 저장됩니다. 인코딩 결과에 대해 지정된 영역의 잘못된 비트는 0으로 채워집니다.
FP_ENCODE는 FP_DECODE의 역 명령입니다.
입력
인코딩할 시작 16비트 영역(소스)
비트 위치 시작을 지정하는 제어 데이터 및 인코딩할 비트 수
출력
인코딩 데이터 저장을 위한 16비트 영역(대상)
변수 s1_Start, s2_Control 및 d_Start의 데이터 형식은 같아야 합니다.
예: s2_Control=16#0005
16# |
0 |
0 |
0 |
5 |
|
↑ |
↑ |
인코딩할 비트 수: 25= 32비트 |
|||
인코딩할 데이터의 시작 비트 위치: 비트 위치 0 |
인코딩된 결과 8(10진수)은 트리거 EN이 TRUE이면 d_Start에 저장됩니다.
프로세스 설명
s1_Start에서 지정한 영역의 시작 부분에 있는 2^nL비트 세그먼트의 콘텐츠가 인코딩됩니다(여기서 nL은 인코딩할 비트 수임).
인코딩된 결과는 nH비트로 지정된 비트에서 시작하는 8개 비트로 10진수 데이터로 저장됩니다(여기서 nH는 변환 시작 비트). 결과로 지정된 영역에서 유효하지 않은 비트는 0으로 채워집니다.
s2_Control에 대한 설명
s2_Control은 대상 데이터의 시작 비트 위치와 인코딩할 비트 수를 16진수 데이터를 사용하여 지정합니다.
"-"로 표시된 비트는 유효하지 않습니다. |
|||||
설정값 16#0–16#F |
(3) 인코딩된 대상 데이터의 시작 비트 위치 |
설정값 16#0–16#8 |
(4) 인코딩된 비트 수 |
||
16#0 |
0 |
16#1 |
2 |
||
16#1 |
1 |
16#2 |
4 |
||
16#2 |
2 |
16#3 |
8(1바이트) |
||
16#3 |
3 |
16#4 |
16(1워드) |
||
16#4 |
4 |
16#5 |
32(2워드) |
||
16#5 |
5 |
16#6 |
64(4워드) |
||
16#6 |
6 |
16#7 |
128(8워드) |
||
16#7 |
7 |
16#8 |
256(16워드) |
||
16#8 |
8 |
||||
16#9 |
9 |
||||
16#A |
10 |
||||
16#B |
11 |
||||
16#C |
12 |
||||
16#D |
13 |
||||
16#E |
14 |
||||
16#F |
15 |
인코딩된 예
16비트 데이터(nL=4)를 인코딩할 경우, 인코딩 결과는 아래와 같이 표시됩니다.
인코딩할 데이터(4비트) |
인코딩된 결과 |
|
---|---|---|
16진수 |
10진수 |
|
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 |
인덱스 한정자를 사용하여 지정한 영역이 제한을 초과하는 경우.
1 £ nL £ 8인 경우. 여기서 nL은 인코딩/디코딩할 비트 수임.
1 £ nH + nL £ 16인 경우. 여기서 nH는 변환 시작 비트이고 nL은 인코딩/디코딩할 비트 수임.
인코딩할 데이터가 모두 0인 경우.
인덱스 한정자를 사용하여 지정한 영역이 제한을 초과하는 경우.
1 £ nL £ 8인 경우. 여기서 nL은 인코딩/디코딩할 비트 수임.
1 £ nH + nL £ 16인 경우. 여기서 nH는 변환 시작 비트이고 nL은 인코딩/디코딩할 비트 수임.
인코딩할 데이터가 모두 0인 경우.
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.
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
변수 bStart가 TRUE로 설정되면 펑션이 실행됩니다.
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;