ASCII -> BCD 변환
이 FP 명령은 트리거 EN이 TRUE이면 s1_Start의 16진수 ASCII 코드를 BCD 문자로 변환합니다. s2_Control에서 변환할 바이트 수와 변환 방향을 지정합니다.
결과는 d에 저장됩니다.
입력
시작 어드레스
바이트 수와 변환 방향
출력
변환된 바이트
제어 코드 s2_Control 지정
16비트: 1–2바이트 변환 예정
32비트: 1-4바이트 변환 예정
0: 정방향
1: 역방향
저장되면 1바이트로 구성된 두 문자가 교환됩니다. 2바이트는 데이터의 1세그먼트로 변환됩니다.
정방향:
역방향:
BCD 문자를 표시하는 ASCII HEX 코드:
BCD 문자 |
ASCII HEX 코드 |
|||||||||
---|---|---|---|---|---|---|---|---|---|---|
0123456789 | 16#30 | 16#31 | 16#32 | 16#33 | 16#34 | 16#35 | 16#36 | 16#37 | 16#38 | 16#39 |
예부호 있는/부호 없는 16비트 데이터, 정방향, 4문자
오프셋 |
ASCII 코드 |
BCD와 동일 |
오프셋 |
변환된 BCD 문자 |
|||
s1_Start |
0 |
16#3231 |
21 |
Þ |
d |
0 |
16#3412 |
1 |
16#3433 |
3 |
1 |
||||
s2_Control |
16#0004 |
예16비트 데이터, 역방향, 4개 문자
오프셋 |
ASCII 코드 |
BCD와 동일 |
오프셋 |
변환된 BCD 문자 |
|||
s1_Start |
0 |
16#3231 |
21 |
Þ |
d |
0 |
16#1234 |
1 |
16#3433 |
43 |
1 |
||||
s2_Control |
16#1004 |
예32비트 데이터, 정방향, 8문자
오프셋 |
ASCII 코드 |
BCD와 동일 |
오프셋 |
변환된 BCD 문자 |
|||
s1_Start |
0 |
16#3231 |
21 |
Þ |
d |
0 |
16#3412 |
1 |
16#3433 |
3 |
1 |
16#7856 |
|||
2 |
16#3635 |
65 |
2 |
||||
3 |
16#3837 |
87 |
3 |
||||
s2_Control |
16#0008 |
예32비트 데이터, 역방향, 8개 문자
오프셋 |
ASCII 코드 |
BCD와 동일 |
오프셋 |
변환된 BCD 문자 |
|||
s1_Start |
0 |
16#3231 |
21 |
Þ |
d |
0 |
16#5678 |
1 |
16#3433 |
43 |
1 |
16#1234 |
|||
2 |
16#3635 |
65 |
2 |
||||
3 |
16#3837 |
87 |
3 |
||||
s2_Control |
16#1008 |
예32비트 데이터, 역방향, 7개 문자
홀수 문자를 변환하는 경우, 변환 방향이 "정방향"이면 마지막 변환된 바이트의 비트 위치 0-3에 0을 입력합니다. 변환 방향이 "역방향"인 경우, 비트 위치 4-7에 0을 입력합니다.
오프셋 |
ASCII 코드 |
BCD와 동일 |
오프셋 |
변환된 BCD 문자 |
|||
s1_Start |
0 |
16#3231 |
21 |
Þ |
d |
0 |
16#4567 |
1 |
16#3433 |
43 |
1 |
16#0123 |
|||
2 |
16#3635 |
65 |
2 |
||||
3 |
16#3837 |
87 |
3 |
||||
s2_Control |
16#1007 |
인덱스 한정자를 사용하여 지정한 영역이 제한을 초과하는 경우.
16#30-16#39 이외의 ASCII 문자가 지정된 경우
s2_Control에서 지정한 바이트 수가 s1_Start에서 지정한 영역보다 큰 경우
변환 결과가 d에서 지정한 데이터 영역 보다 큰 경우
s2_Control = 0인 경우
변환 방향이 범위를 벗어난 경우
s2_Control에서 지정한 바이트 수가 8 보다 큰 경우
인덱스 한정자를 사용하여 지정한 영역이 제한을 초과하는 경우.
16#30-16#39 이외의 ASCII 문자가 지정된 경우
s2_Control에서 지정한 바이트 수가 s1_Start에서 지정한 영역보다 큰 경우
변환 결과가 d에서 지정한 데이터 영역 보다 큰 경우
s2_Control = 0인 경우
변환 방향이 범위를 벗어난 경우
s2_Control에서 지정한 바이트 수가 8 보다 큰 경우
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.
VAR
bStart: BOOL:=FALSE;
(*activates the function*)
wASCIIInput: WORD:=16#3031;
wControlCode: WORD:=16#2;
(*specifies the operation:
digit 0: the number of bytes
to convert
digit 1,2: has to be zero
digit 3: nomal or reverse direction*)
wConversionResult: WORD:=0;
(*result after a 0->1 leading
edge from start:
[16#2033,0]*)
END_VAR
변수 bStart가 TRUE로 설정되면 펑션이 실행됩니다. ASCII 입력 값의 2문자는 정방향으로 변환됩니다.
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,5,2,7,4,);
B(B_VARIN,,wASCIIInput,11,3,13,5,);
B(B_VARIN,,wControlCode,11,4,13,6,);
B(B_VAROUT,,wConversionResult,23,3,25,5,);
B(B_F,FP_ASCII_TO_BCD!,,13,1,23,6,,?DEN?Ds1_Start?Ds2_Control?AENO?Cd);
L(1,3,5,3);
L(7,3,13,3);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
if bStart then
FP_ASCII_TO_BCD(s1_Start := wASCIIInput,
s2_Control := wControlCode,
d => wConversionResult);
END_IF;