데이터 변환

프로그래밍에서 데이터 유형을 혼합하면 데이터 변환이 발생합니다.
프로그래밍 대상:
변환이 발생하는 경우:
래더 다이어그램
구조화된 텍스트
하나의 명령어 내에서 파라미터의 데이터 유형을
혼합합니다.
펑션 블록
데이터 유형이 다른 파라미터 2개를 연결하는 경우
명령어의 모든 피연산자에서 다음과 같은 데이터 유형을 사용하는 경우 명령어 실행 속도가 빨라지고 필요한 메모리가 줄어듭니다.
  • 동일한 데이터 유형.
  • 중간 데이터 유형:
    • 모든 함수 블록 명령어는 하나의 데이터 유형 피연산자만 지원합니다.
    • 데이터 유형을 혼합하거나 최적의 데이터 유형이 아닌 태그를 사용하면 컨트롤러에서는 다음 규칙에 따라 데이터를 변환합니다.
      • 피연산자는 SINT, USINT, INT, UINT, DINT, UDINT, LINT, ULINT, REAL, LREAL의 데이터 유형 순위에 따라 변환되며 데이터 유형의 순위는 1(가장 낮음)부터 10(가장 높음)까지 있습니다.
        팁: 데이터 변환에 필요한 시간과 메모리를 줄이려면 명령어의 모든 피연산자에 대해 동일한 데이터 유형을 사용하십시오.
SINT 또는 INT를 DINT로 변환하거나 DINT를 LINT로 변환
SINT 또는 INT 입력 Source 태그는 Source 태그에 대한 부호 확장을 통해 DINT 값으로 승격됩니다. SINT 또는 INT 값을 DINT 값으로 변환하는 명령어는 다음 변환 방법 중 하나를 사용합니다.
변환 방법
데이터 변환을 위한 배치 방법
부호 확장
32비트 또는 64비트가 될 때까지 기존 비트 왼쪽에 있는 각 비트 위치로 맨 왼쪽 비트(값의 기호)의 값 배치.
0 채우기
32비트 또는 64비트가 될 때까지 기존 비트 왼쪽에 0 배치.
로직 명령어는 0 채우기를 사용합니다. 기타 모든 명령어는 부호 확장을 사용합니다.
다음은 부호 확장 및 0 채우기를 사용하여 값을 변환한 결과를 보여주는 예입니다.
값
2#1111_1111_1111_1111
(-1)
부호 확장을 통해 이 값으로 변환
2#1111_1111_1111_1111_1111_1111_1111_1111
(-1)
영 채우기를 통해 이 값으로 변환
2#0000_0000_0000_0000_1111_1111_1111_1111
(65535)
부호 확장을 통해 데이터를 변환하는 명령어에서 SINT 또는 INT 태그와 즉시 값을 사용하는 경우 다음 방법 중 하나를 사용하여 즉시 값을 처리합니다.
즉시 값을 10진 기수로 지정합니다.
값을 10진수가 아닌 기수로 입력하는 경우 즉시 값의 32비트를 모두 지정합니다. 이렇게 하려면 32비트가 될 때까지 값의 왼쪽에 있는 각 비트 위치에 맨 왼쪽 비트의 값을 입력합니다.
각 연산자에 대한 태그를 생성하고 명령어 전체에서 동일한 데이터 유형을 사용합니다. 상수 값을 할당하려면 다음 중 하나를 수행합니다.
태그 중 하나에 상수 값을 입력합니다.
태그 중 하나로 값을 이동하는 MOV 명령어를 추가합니다.
MEQ 명령어를 사용하여 필요한 비트만 확인합니다.
다음은 즉시 값을 INT 태그와 혼합하는 두 가지 방법을 보여주는 예입니다. 두 가지 예에서는 1771 I/O 모듈의 비트를 검사하여 모든 비트가 제자리에 있는지 확인합니다. 1771 입/출력(I/O) 모듈의 입력 데이터 워드가 INT 태그이기 때문에 16비트 상수 값을 사용하는 것이 가장 쉽습니다.
중요: 즉시 값과 INT 태그 혼합
remote_rack_1:I.Data[0]가 INT 태그이므로 이를 검사하는 값도 INT 태그로 입력됩니다.
DC_Other_Pg547_v31
중요: 즉시 값과 INT 태그 혼합
remote_rack_1:I.Data[0]가 INT 태그이므로 이를 검사하는 값이 먼저 int_0으로 이동하고 이는 역시 INT 태그입니다. 그런 다음 EQU 명령어가 두 태그를 비교합니다.
DC_Other_Pg548_v31
정수를 REAL로 변환
컨트롤러에서는 REAL 값을 IEEE 단정도 부동 소수점 수 형식으로 저장합니다. 값의 부호에 1비트를, 밑수 값에 23비트를, 지수에 8비트를 사용합니다(총 32비트). 동일한 명령어에 정수 태그(SINT, INT 또는 DINT)와 REAL 태그를 혼합하여 입력하면 컨트롤러에서는 명령어를 실행하기 전에 정수 값을 REAL 값으로 변환합니다.
  • SINT 또는 INT 값은 항상 동일한 REAL 값으로 변환됩니다.
  • DINT 값은 동일한 REAL 값으로 변환되지 않을 수 있습니다.
  • REAL 값은 기준 값에 최대 24비트를 사용합니다(저장된 23비트 + "숨겨진" 1비트).
  • DINT 값은 값에 최대 32비트를 사용합니다(부호에 1비트, 값에 31비트).
DINT 값에 25개 이상의 유효 비트가 필요한 경우 이 값은 동일한 REAL 값으로 변환되지 않을 수 있습니다. 그렇지 않으면 컨트롤러에서는 가장 가까운 짝수 값으로 반올림된 가장 높은 24비트를 저장합니다.
DINT를 SINT 또는 INT로 변환
DINT 값을 SINT 또는 INT 값으로 변환하기 위해 컨트롤러에서는 DINT의 위쪽 부분을 잘라내고 데이터 유형에 맞는 낮은 비트를 저장합니다. 값이 너무 크면 변환 시 오버플로가 발생합니다.
DINT를 INT 및 SINT로 변환
DINT 값
다음 더 작은 값으로 변환
16#0001_0081 (65,665)
INT:
16#0081 (129)
SINT:
16#81 (-127)
REAL을 SINT, INT 또는 DINT로 변환
REAL 값을 정수 값으로 변환하기 위해 컨트롤러에서는 소수 부분을 반올림하여 결과 데이터 유형에 맞는 비트를 저장합니다. 값이 너무 크면 변환 시 오버플로가 발생합니다.
숫자는 다음 예처럼 반올림됩니다.
0.5보다 작은 소수는 가장 가까운 정수로 내립니다.
0.5보다 큰 소수는 가장 가까운 정수로 반올림합니다.
0.5는 가장 가까운 짝수 값으로 반올림하거나 내립니다.
중요: REAL 값을 DINT 값으로 변환
REAL 값
다음 DINT 값으로 변환
-2.5
-3.5
-2
-4
-1.6
-2
-1.5
-2
-1.4
-1
1.4
1
1.5
2
1.6
2
2.5
3.5
2
4
의견을 작성 부탁드립니다.
이 자료에 대한 문의사항이나 요청사항이 있습니까? 여기에 요청사항을 작성 부탁드립니다.
Normal