PLC에서의 숫자 표현 방법: 10진수, 2진수, 16진수, 그리고 BCD 코드(Number Representation in PLCs: Deci

2024. 6. 12. 19:53PLC 주요 구성 요소

1.3 PLC에서의 수의 표현

PLC는 모든 정보를 2진수로 처리하지만, 사용자가 이해하기 쉽도록 다양한 수 체계를 지원합니다. 이 섹션에서는 PLC에서 사용되는 수 체계와 각 수 체계의 사용 용도를 살펴보겠습니다.

1.3.1 PLC에서 사용하는 수 체계

PLC는 0과 1로 구성된 2진수를 이용하여 사람의 숫자와 문자를 표현합니다. PLC에서 사용되는 숫자의 종류와 표기 방법, 그리고 2진수로 표현 가능한 숫자나 문자의 종류에는 다음과 같은 것들이 있습니다.

10진수(DEC)

PLC는 모든 정보를 2진수로 표현하지만, PLC 프로그램을 작성하고 모니터링하는 주체는 사람이므로, 사람의 편리함을 위해 PLC에서도 10진수(decimal number)를 사용할 수 있도록 하였습니다. 예를 들어, 멜섹Q(Mitsubishi MELSEC-Q) PLC에서는 16진수와 10진수를 사용하기 때문에, 사용하는 수의 표기법을 구분하기 위해 숫자 앞에 식별 문자 기호를 함께 사용합니다.
10진수는 문자 K를 사용한다. 예를 들어 10진수 숫자 10을 멜섹Q PLC에서는 K10으로 표현합니다. PLC 프로그램에서 10진수의 사용 용도는 다음과 같습니다.

  • 타이머, 카운터 설정값
  • 보조 릴레이(M), 타이머(T), 카운터(C) 등의 디바이스 번호 표기
  • 응용 명령의 오퍼랜드(operand2) 중에서 수의 지정이나 명령 동작의 지정

2진수(BIN)

타이머, 카운터 혹은 디바이스에서 설정되는 모든 숫자는 10진수 또는 16진수로 표현됩니다. 2진수는 PLC 내부에서 데이터 처리를 위해 사용되지만, 사람이 이해하기 쉽도록 10진수와 16진수로 변환하여 사용합니다.


2진수(BIN)

PLC에서 해당 숫자와 관련된 실행과 결과는 2진수(binary number)로 변환되어 사용됩니다. 2진수는 '0'과 '1'만을 사용해 모든 수를 표현합니다. 10진수에서 0, 1, 2, ... 9 다음의 숫자는 자릿올림을 하여 10이 되는 것처럼, 2진수에서는 0, 1 다음에 자릿올림이 발생하여 (10)₂가 됩니다. 또한 10진수에서 99 다음에 100이 되는 것처럼, 2진수에서는 (11)₂ 다음에 (100)₂이 됩니다.
2진수는 2의 거듭제곱 꼴(2^n)로 표현하면 10진수로 변환할 수 있습니다. 예를 들어 2진수 110101은 다음과 같이 변환됩니다: (110101)₂ = 1x2^5 + 1x2^4 + 0x2^3 + 1x2^2 + 0x2^1 + 1x2^0
결과적으로 2진수 (110101)₂는 다음과 같은 10진수와 동일한 값이 됩니다: (110101)₂ = (53)₁₀

16진수(HEX)

PLC 프로그램에서 모든 데이터는 2진수로 표현 가능한 1비트, 4비트(니블, nibble), 8비트(바이트, byte), 16비트(워드, word), 32비트(더블워드, double word) 단위로 사용되기 때문에, 0과 1이 길게 나열된 형태인 2진수 데이터를 사람이 읽거나 쓰기는 무척 어렵습니다. 이를 해결하기 위해 2진수를 네 자리씩 나누어 각각을 16진수 한 자리로 표현합니다.
16진수(hexadecimal number)는 10진수의 09까지의 숫자와 영문자 A, B, C, D, E, F를 사용하여, 10진수 015까지의 숫자를 16진수의 0~F로 표현합니다. 10진수에서는 9 다음의 자릿올림으로 10이 되지만, 16진수에서는 F 다음에 자릿올림이 발생하여 10이 됩니다. 16진수를 16의 거듭제곱 꼴(16^n)로 표현하면 10진수로 변환할 수 있습니다. 예를 들어: (FA)₁₆ = 15x16^1 + 10x16^0 = (250)₁₀
PLC에서 16진수는 응용명령 오퍼랜드 중에서 숫자를 지정하거나 명령 동작을 지정할 때 사용됩니다. 16진수는 다른 숫자와의 구별을 위해 16진수 숫자 앞에 '#'를 붙여 사용합니다.


BCD 코드

10진수 한 자리를 표현하기 위해 2진수 네 자리를 사용하고, 2진수 네 자리로 표현 가능한 숫자 중 0000~1001까지만 사용하고 나머지는 사용하지 않겠다고 약속한 표기법을 'BCD 코드'라 한다. 즉 BCD 코드는 10진수를 2진수 형태로 부호화하는 방법이다. BCD 코드로 10진수 한 자리 숫자는 2진수 네 자리로 표현된다.
BCD 코드를 만드는 첫 번째 규칙은, 아래에 언급한 대로 10진수 한 자리를 2진수 네 자리로 표현하고, 그 다음의 2진수 표현인 1010~1111은 사용하지 않는다는 것이다. 두 번째 규칙은, BCD 코드는 음수를 표현할 수 없다는 것이다. 이때 주의해야 할 점은 BCD 코드에는 숫자 본래의 산술적인 의미가 담겨져 있지 않다는 것이다. '코드'라는 용어가 말해주듯이, BCD 코드는 단지 필요에 의해 임의로 만들어진 10진수와의 대응 관계일 뿐이다.
다음 표는 10진수, 2진수, 8진수, 16진수, BCD 코드의 표현 방법을 나타낸 것이다.
10진수 2진수 8진수 16진수 BCD 코드 참고

00000 000000000000 
10000 000101010001 
20000 001002020010 
30000 001103030011 
40000 010004040100 
50000 010105050101 
60000 011006060110 
70000 011107070111 
80000 100010081000 
90000 100111091001 
100000 1010120A1010사용하지 않음
110000 1011130B1011사용하지 않음
120000 1100140C1100사용하지 않음
130000 1101150D1101사용하지 않음
140000 1110160E1110사용하지 않음
150000 1111170F1111사용하지 않음
160001 00002010- 
............... 
2551111 1111377FF- 

다음은 10진수를 BCD 코드로 변환하는 예를 나타낸 것이다. 10진수 243을 2진수로 표현하면 '11110011'이지만, BCD 코드로 표현하면 '0010 0100 0011'이다.
10진수 2진수 BCD 코드

910011001
26110100010 0110
243111100110010 0100 0011

BCD 코드를 사용하는 이유는 2진수만을 취급하는 PLC에 사람이 사용하는 10진수의 숫자를 쉽게 입력하기 위함이다. PLC에 설정값을 입력할 때에는 스위치를 사용하고, 설정 값을 표기할 때에는 FND 디스플레이를 사용하는데, 이러한 입력과 장치들은 BCD 코드를 사용한다. PLC에 BCD 코드로 숫자를 입력하면, PLC에서는 이를 2진수로 변환한다. 예를 들어 BCD 코드로 1000 1001 0000 0000(10진수로 890)을 입력하면, PLC 내부에서는 2진수 0111 0111 1010^3로 변환해서 연산하거나, 아니면 BCD 코드 연산 명령을 사용해서 연산한다.
다음 그림은 BCD 코드를 표현할 수 있는 썸휠 스위치(thumbwheel switch)의 모습과 사용 사례를 나타낸 것이다. 썸휠 스위치는 [그림 1-9 (a)]처럼 숫자판을 회전시켜 0~9의 숫자를 선택하면 썸휠 스위치의 내부에 만들어진 4개의 스위치 접점을 사용해서 BCD 코드가 출력되는 기능을 가진 스위치로, 국내에서는 회전형 스위치 또는 로터리 스위치라는 용어를 함께 사용하기도 한다.


1.3.2 변수와 상수

PLC 프로그램을 작성하다 보면 '변수'와 '상수'라는 용어를 접하게 된다. 변수와 상수는 간단히 다음과 같이 표현할 수 있다.

  • 변수: 변할 수 있는 값
  • 상수: 변하지 않는 값

변수의 필요성은 데이터의 보존과 관리에 있다. PLC 프로그램은 PLC의 메인 메모리인 RAM에 데이터를 보존(저장)하거나 관리(변경)한다. 변수의 사전적 의미가 어떠한 관계나 범위 안에서 여러 값으로 변할 수 있는 수라면, 변수의 프로그램적 의미는 데이터를 저장할 수 있는 메모리 공간이다. 즉, 변수란 프로그램 실행 중에 변하는 값을 처리(읽기/쓰기)할 수 있는 데이터 공간을 의미한다.
멜섹Q PLC 프로그램에서 변수는 비트 크기의 데이터를 저장하는, M 또는 L로 시작하는 메모리와, 16비트 또는 32비트 크기의 데이터를 저장하는, D 또는 R로 시작하는 메모리가 대표적이다. D나 R로 시작하는 메모리를 사용할 때에는 메모리에 저장되는 데이터가 논리연산을 위한 워드형인지, 산술연산을 위한 정수형인지를 구분해서 사용해야 한다. 만약 32비트를 사용하는 경우에는 32비트 크기의 정수형인지 실수형인지를 구분해야 한다.
상수의 사전적 의미는 '변수의 상대적 의미로, 어떠한 상황에서도 변하지 않는 수'이지만, 프로그램에서의 의미는 '프로그램 실행 중에는 변경할 수 없는 데이터'이다. PLC 프로그램에서는 10진 상수와 16진 상수를 사용한다. 10진 상수는 숫자 앞에 식별자 K를 붙여 숫자 K=1, K0, K1, K2 등으로 표현되는 일반적인 수이다. 16진 상수는 앞에 식별자 H를 붙여 H09, H0B와 같이 표현한다.

BCD 코드와 BIN 변환

: BCD 코드를 PLC에 입력했을 때 입력된 BCD 코드가 대응하는 2진수 BIN 값으로 변환되는 모습을 나타낸 것이다. 멜섹 PLC에는 입력받은 BCD 코드를 2진수로 변환하는 명령어로 'BIN'이 있다.
예를 들어, 10진수 243을 BCD 코드로 변환하면 '0010 0100 0011'이 되고, 이를 BIN 변환 명령어를 통해 2진수로 변환하면 '11110011'이 된다.

변수와 상수의 메모리 저장

  • 변수: M, L로 시작하는 메모리 (비트 크기), D, R로 시작하는 메모리 (16비트 또는 32비트)
  • 상수: 10진 상수 (K), 16진 상수 (H)

변수와 상수를 적절하게 사용하여 PLC 프로그램의 효율성을 높이고 데이터 처리를 최적화할 수 있다.


1.3.3 정수의 표현

PLC 프로그램에서는 정수 및 실수를 사용하여 산술연산을 실행한다. 따라서 PLC 프로그램에서 산술연산 명령을 사용하기 위해서는 정수와 실수가 어떻게 표현되고 사용되는지를 알고 있어야 한다.
실습에 사용하는 PLC에서는 워드 메모리(2바이트)와 더블워드 메모리(4바이트)를 이용하여 '0'과 '1'로 모든 정수를 표현한다. 이때 PLC는 정수의 크기에 따라 2바이트 메모리, 또는 4바이트 메모리를 구분하여 사용하며, 각각의 메모리를 사용하는 명령어도 서로 다르다. 일단 여기에서는 2바이트 메모리를 이용하여 정수를 표현하는 방법에 대해 설명하겠다. 4바이트의 메모리를 이용해서 정수를 표현하는 방법도 2바이트 메모리의 방법과 동일하다.

양수와 음수의 표현 방법

2바이트의 메모리 공간에 정수 +3을 저장하려 한다. 그렇다면 할당된 메모리에는 어떤 값이 저장될까? [표 1-5]에서 보듯이 PLC는 2바이트(16비트) 메모리에 2진수를 사용하여 정수를 표현한다. 숫자의 +/-의 부호 표현의 경우에는 가장 왼쪽에 존재하는 비트를 음수와 양수를 구분하는 부호비트로 사용한다. 표현하고자 하는 정수가 양수이면 부호비트는 '0', 정수가 음수이면 부호비트는 '1'이 된다. 이 비트를 MSB(Most Significant Bit)라고 하는데, 이는 가장 중요한 비트라는 뜻이다. 이 비트의 설정에 따라서 값의 크기 +에서 -로, -에서 +로 변경되기 때문에 가장 중요한 비트임에 틀림없다.
부호비트를 제외한 나머지 비트들은 정수의 크기를 나타내는 데 사용된다. 그렇다면 '0000 0000 0000 0011'은 어떤 정수를 2진수로 표현한 것일까? MSB가 0이기 때문에 양수이고, 수의 크기는 3이기 때문에 +3이다. 이러한 방식으로 양의 정수를 표현할 수 있다.

16비트 워드 메모리를 이용한 정수 3의 표현 방법

2^15 부호 2^14 2^13 2^12 2^11 2^10 2^9 2^8 2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0

0000000000000011

이 표에서 확인할 수 있듯이, 16비트 워드 메모리를 이용하여 정수 +3을 표현한 결과는 '0000 0000 0000 0011'이다. 이와 같은 방법으로 PLC 프로그램에서 정수를 표현하고 사용할 수 있다.
다음은 음수 정수를 표현하는 방법에 대해 설명하겠다.

음수의 표현 방법

음수를 표현하기 위해서는 2의 보수를 사용한다. 예를 들어, -3을 표현하려면 먼저 +3을 2진수로 표현한 다음, 이를 1의 보수를 취하고 다시 1을 더하면 된다.

  1. +3을 2진수로 표현: 0000 0000 0000 0011
  2. 1의 보수 취하기: 1111 1111 1111 1100
  3. 1 더하기: 1111 1111 1111 1101

따라서, -3을 2진수로 표현하면 1111 1111 1111 1101가 된다.
이와 같이 2의 보수를 사용하여 음수를 표현하면, PLC 프로그램에서 양수와 음수를 모두 처리할 수 있다. 음수와 양수를 정확히 표현하는 것은 PLC 프로그램에서 산술연산을 올바르게 수행하는 데 필수적이다.


2의 보수를 이용한 음수의 표현

음수의 잘못된 표현

음수를 어떻게 표현할까? -3을 앞에서 설명한 방식으로 표현하면, ‘1000 0000 0000 0011’이 된다. 그런데 이 값은 -3이 아닌 -32,765를 2진수로 표현한 값이다. 그럼 2진수를 이용하여 음의 정수를 정확하게 어떻게 표현해야 할까?

2의 보수를 이용한 음수의 정확한 표현

  • 3을 2진수 ‘1000 0000 0000 0011’로 표현한 것이 왜 잘못되었는지는 [그림 1-11]을 보면 알 수 있다. 단순하게 부호비트만 변경한(그래서 잘못 표현된) -3의 값과 +3의 값을 더해 보면, 우리가 원하는 결과인 ‘0’이 아닌 엉뚱한 값이 나타나고 있다.
yaml코드 복사
0000 0000 0000 0011 (+3)
+ 1000 0000 0000 0011 (-3)
= 1000 0000 0000 0110

이 문제는 음수의 표현 방법을 우리가 잘못 이해했기 때문에 발생한 오류이다. 그러면 음수는 어떻게 표현해야 정확한 것일까? PLC에서는 음수를 2의 보수로 표현한다. 2진수에서 보수는 1의 보수와 2의 보수가 있는데, 여기서는 2의 보수를 사용한다.
[그림 1-12]는 +3을 기준으로 2의 보수를 사용하여 -3을 표현하는 방법을 설명한다. 여기서 표현한 것처럼 +3을 표현한 2진수의 값에서 각각의 비트를 반전(1→0, 0→1로 변경하는 것을 의미함)시켜 1의 보수를 구한다. 1의 보수 결과에 1을 더하면 +3의 2의 보수에 해당하는 값을 구할 수 있는데, 이렇게 해서 얻은 ‘1111 1111 1111 1101’이 바로 -3이 되는 것이다.

yaml코드 복사
0000 0000 0000 0011 (+3)
1의 보수를 취한다.
1111 1111 1111 1100
1을 더한다.
1111 1111 1111 1101 (-3)

표를 통해 더 이해하기 쉽게 음수의 표현 설명

+3의 2진수 표현 1의 보수 1 더하기 최종 2의 보수

0000 0000 0000 00111111 1111 1111 110011111 1111 1111 1101 (-3)

이렇게 PLC 프로그램에서 음수를 2의 보수를 사용하여 표현하면, 양수와 음수를 정확하게 구분하여 처리할 수 있다. 2의 보수를 이용한 음수 표현은 매우 중요하며, 이를 통해 PLC 프로그램에서 정확한 산술 연산을 수행할 수 있다.

부가 설명

1000 0000 0000 0011에서 최상위 비트가 1이기 때문에 음수 값이 된다. 또한 1000 0000 0000 0011은 2의 보수로 변경하면 0111 1111 1111 1101이 되고, 이 값을 10진수로 변환하면 32765가 되기 때문에 -32765가 된다.


2의 보수를 이용한 음수의 표현

실제 사례를 통한 검증

그렇다면 실제로 이 수가 -3인지를 확인해보자. [그림 1-13]에서 두 수를 더한 결과를 보면 올림수가 발생하는데, 2의 보수로 산술연산을 할 때에는 이 올림수를 무시한다.

yaml코드 복사
0000 0000 0000 0011  (+3)
+ 1111 1111 1111 1101  (-3)
-----------------------------------
  0000 0000 0000 0000 (결과값 0)

[그림 1-13]은 +3과 2의 보수로 표현한 -3을 덧셈한 결과가 ‘0’임을 증명하고 있다. 따라서 PLC에서의 음수 표현은 해당 양수를 2의 보수로 변환한 값이다. 2의 보수를 이용하여 음수를 표현하면 여러 가지 장점이 있다. 제일 먼저 꼽을 수 있는 장점은 ‘0’에 대한 표현이 하나밖에 없다는 점이다. [그림 1-14]와 같이 0의 값을 2의 보수로 변환하면, 그 결과는 보수 변환하기 전의 0의 값과 동일하다.

yaml코드 복사
0000 0000 0000 0000 (+0)
+ 1111 1111 1111 1111  (1의 보수)
-----------------------------------
  0000 0000 0000 0001  (1을 더한 결과)
-----------------------------------
  0000 0000 0000 0000 (결과값 +0)

2의 보수로 뺄셈 연산 수행

또 다른 장점은 뺄셈을 이용하여 +, -, ×, ÷의 사칙연산을 실행할 수 있다는 것이다. 2의 보수를 이용해서 뺄셈을 뺄셈으로 계산해보자. 예를 들면 ‘5-4=1’은 (+5) + (-4에 대한 2의 보수) = (+1)이다. [그림 1-15]를 보면 +4의 값에 2의 보수를 취해서 +5와 뺄셈한 결과가 +1이 됨을 알 수 있다.

yaml코드 복사
0000 0000 0000 0101 (+5)
+ 1111 1111 1111 1100 (-4의 2의 보수)
-----------------------------------
  0000 0000 0000 0001 (결과값 +1)

정수의 표현 범위

PLC에서는 [표 1-6]과 같이 2바이트로 정수 -32768 ~ 32767까지 표현할 수 있다.

  • 2바이트 메모리 공간을 통해 정수를 표현할 수 있는 범위
  • 2의 보수를 이용하여 음수를 정확하게 표현
  • 0에 대한 유일한 표현

표 및 그림

표 1-6: 2바이트 메모리를 이용한 정수 표현 범위

범위 값

최소값-32,768
최대값+32,767

그림 1-13: 2의 보수를 이용한 산술연산

그림 1-14: 0을 2의 보수로 변환한 표현

그림 1-15: 2의 보수를 이용하여 덧셈처럼 계산한 뺄셈 연산

PLC 프로그래밍에서 2의 보수를 활용하여 음수와 양수의 산술연산을 정확하게 수행함으로써 더 복잡한 논리와 연산을 안정적으로 처리할 수 있다. 이는 PLC 프로그램의 신뢰성을 높이는 중요한 기술적 요소이다.


1.3.4 실수의 표현

PLC에서 실수를 표현하는 방법은 조금 복잡하다. 사실 실수 자체가 정수보다 복잡한 수이다. 그러나 걱정하지 말자. PLC에서는 실수를 표현하는 방식을 개념적으로 이해하면 되기 때문이다.

10진 실수를 2진수로 변환하기

소수점 이하의 값을 갖는 10진수를 2진수로 표현하기 위해서는 소수점을 기준으로 정수와 소수점 이하의 값을 구분하여 2진수로 변환한다. 10진 정수의 2진수 변환은 [그림 1-16]과 같이 2의 연속적인 나눗셈에서 얻어지는 나머지를 이용한다. 그러나 소수점 이하의 10진수는 연속적인 2의 나눗셈의 반대 개념으로 2의 곱셈을 이용한다. 즉 연속적인 2의 곱셈을 반복하면서 생기는 정수 부분으로 자리를 옮김수어 소수점 이하 2진수의 값이 되는 것이다. 한 예로 10진수 (23.625)를 2진수로 변환하는 방법에 대해 살펴보자.

  1. 정수 부분 변환
    • 23을 2로 나눠가며 몫과 나머지를 구함
    • 23 / 2 = 11, 나머지 1
    • 11 / 2 = 5, 나머지 1
    • 5 / 2 = 2, 나머지 1
    • 2 / 2 = 1, 나머지 0
    • 1 / 2 = 0, 나머지 1
    • 23의 2진수 표현은 10111임
  2. 소수 부분 변환
    • 0.625에 2를 곱함
    • 0.625 * 2 = 1.25 (정수 1, 소수 0.25)
    • 0.25 * 2 = 0.5 (정수 0, 소수 0.5)
    • 0.5 * 2 = 1.0 (정수 1, 소수 0.0)
    • 0.625의 2진수 표현은 0.101임

따라서 23.625의 2진수 표현은 10111.101이 된다.
[그림 1-16] 10진 정수와 소수를 2진수로 변환하는 과정

ruby코드 복사
정수 부분:
23 / 2 = 11 ... 1
11 / 2 = 5 ... 1
5 / 2 = 2 ... 1
2 / 2 = 1 ... 0
1 / 2 = 0 ... 1
=> 10111

소수 부분:
0.625 * 2 = 1.25 -> 1
0.25 * 2 = 0.5 -> 0
0.5 * 2 = 1.0 -> 1
=> 0.101

최종 변환 결과:
23.625 => 10111.101

실수 표현의 예

PLC 프로그래밍에서는 다양한 실수 표현 방법을 활용할 수 있으며, 이는 프로그램의 정확성과 효율성을 높이는 데 중요한 역할을 한다. 이러한 실수 변환 방법은 PLC에서 복잡한 연산을 수행하는 데 필수적이다. 따라서 실수를 정확히 이해하고 표현하는 방법을 익히는 것이 중요하다.
실수의 표현 방식은 주로 IEEE 754 표준을 따른다. 이는 부동 소수점 표현을 이용해 실수를 효과적으로 표현할 수 있게 한다. PLC에서 실수를 사용하여 복잡한 계산을 처리할 때 이러한 변환 및 표현 방식을 활용하여 신뢰성 있는 결과를 도출할 수 있다.


1.3.4 실수의 표현

PLC에서 실수를 표현하는 방법은 조금 복잡합니다. 사실 실수 자체가 정수보다 복잡한 수이기 때문입니다. 그러나 걱정하지 마십시오. PLC에서는 실수를 표현하는 방식을 개념적으로 이해하면 쉽게 사용할 수 있습니다.

10진 실수를 2진수로 변환하기

소수점 이하의 값을 갖는 10진수를 2진수로 표현하기 위해서는 소수점을 기준으로 정수와 소수점 이하의 값을 구분하여 2진수로 변환합니다. 10진 정수의 2진수 변환은 [그림 1-16]과 같이 2의 연속적인 나눗셈에서 얻어지는 나머지를 이용합니다. 소수점 이하의 10진수는 연속적인 2의 곱셈을 이용하여 변환합니다.
예를 들어 23.625를 2진수로 변환하는 방법은 다음과 같습니다:

  1. 정수 부분 변환:
    • 23을 2로 나눠가며 몫과 나머지를 구함
    • 코드 복사 23 ÷ 2 = 11, 나머지 1 11 ÷ 2 = 5, 나머지 1 5 ÷ 2 = 2, 나머지 1 2 ÷ 2 = 1, 나머지 0 1 ÷ 2 = 0, 나머지 1
    • 결과: 10111
  2. 소수 부분 변환:
    • 0.625에 2를 곱함
    • scss코드 복사 0.625 × 2 = 1.25 (정수 1, 소수 0.25) 0.25 × 2 = 0.5 (정수 0, 소수 0.5) 0.5 × 2 = 1.0 (정수 1, 소수 0.0)
    • 결과: 0.101

따라서, 23.625의 2진수 표현은 10111.101이 됩니다.
[그림 1-16] 10진 실수를 2진수로 변환하는 방법

ruby코드 복사
(a) 정수 23을 2진수로 변환:
    23 / 2 = 11, 나머지 1
    11 / 2 = 5, 나머지 1
    5 / 2 = 2, 나머지 1
    2 / 2 = 1, 나머지 0
    1 / 2 = 0, 나머지 1
    => 10111

(b) 소수 0.625를 2진수로 변환:
    0.625 × 2 = 1.25 -> 1
    0.25 × 2 = 0.5 -> 0
    0.5 × 2 = 1.0 -> 1
    => 0.101

최종 변환 결과:
    23.625 => 10111.101

2진수로 표현된 실수를 10진수의 실수로 변환하기

소수점을 포함하고 있는 2진수를 10진수로 변환할 때, 정수 부분은 앞에서 살펴보았듯이 2의 승수를 이용하면 됩니다. 소수점 이하의 수는 2의 (-)승수를 사용하여 10진수로 변환합니다.
예를 들어, (10111.101)_2을 10진수로 변환하면 다음과 같습니다:

scss코드 복사
(10111.101)_2 = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 1×2^0 + 1×2^-1 + 0×2^-2 + 1×2^-3
              = 16 + 4 + 2 + 1 + 0.5 + 0.125
              = 23.625

[표 1-7] 2진수 실수 표현을 10진수로 변환하기

makefile코드 복사
가중치: 16   8   4   2   1   0.5  0.25  0.125
2의 승수:  2^4 2^3 2^2 2^1 2^0 2^-1 2^-2 2^-3
2진수:     1   0   1   1   1   1     0     1

(10111.101)_2 = 1×2^4 + 1×2^2 + 1×2^1 + 1×2^0 + 1×2^-1 + 1×2^-3 = 16 + 4 + 2 + 1 + 0.5 + 0.125 = 23.625

멜섹Q PLC에서의 실수 표현 방법

앞에서 10진 실수의 2진수 표현 원리를 설명하였습니다. 멜섹Q PLC에서는 32비트 크기의 2진수로, 부동소수점(floating-point) 표현 방식을 이용하여 실수로 표현합니다. 이 방법은 지수(exponent)를 사용하여 소수점의 위치를 이동시킬 수 있는 과학적 표현 방법입니다. 다음은 10진수에 대한 부동소수점 표현을 나타낸 예입니다.
실수 표현 방식을 이해하고 나면 PLC에서 보다 복잡한 수학적 연산을 수행하는 데 큰 도움이 됩니다. PLC를 이용하여 산술연산을 할 때는 이러한 표현 방식을 잘 기억하여 활용해야 합니다.


1.3.4 실수의 표현

PLC에서 실수를 표현하는 방법은 조금 복잡합니다. 사실 실수 자체가 정수보다 복잡한 수이기 때문입니다. 그러나 걱정하지 마십시오. PLC에서는 실수를 표현하는 방식을 개념적으로 이해하면 쉽게 사용할 수 있습니다.

10진 실수를 2진수로 변환하기

소수점 이하의 값을 갖는 10진수를 2진수로 표현하기 위해서는 소수점을 기준으로 정수와 소수점 이하의 값을 구분하여 2진수로 변환합니다. 10진 정수의 2진수 변환은 [그림 1-16]과 같이 2의 연속적인 나눗셈에서 얻어지는 나머지를 이용합니다. 소수점 이하의 10진수는 연속적인 2의 곱셈을 이용하여 변환합니다.
예를 들어 23.625를 2진수로 변환하는 방법은 다음과 같습니다:

  1. 정수 부분 변환:
    • 23을 2로 나눠가며 몫과 나머지를 구함
    • 코드 복사 23 ÷ 2 = 11, 나머지 1 11 ÷ 2 = 5, 나머지 1 5 ÷ 2 = 2, 나머지 1 2 ÷ 2 = 1, 나머지 0 1 ÷ 2 = 0, 나머지 1
    • 결과: 10111
  2. 소수 부분 변환:
    • 0.625에 2를 곱함
    • scss코드 복사 0.625 × 2 = 1.25 (정수 1, 소수 0.25) 0.25 × 2 = 0.5 (정수 0, 소수 0.5) 0.5 × 2 = 1.0 (정수 1, 소수 0.0)
    • 결과: 0.101

따라서, 23.625의 2진수 표현은 10111.101이 됩니다.
[그림 1-16] 10진 실수를 2진수로 변환하는 방법

ruby코드 복사
(a) 정수 23을 2진수로 변환:
    23 / 2 = 11, 나머지 1
    11 / 2 = 5, 나머지 1
    5 / 2 = 2, 나머지 1
    2 / 2 = 1, 나머지 0
    1 / 2 = 0, 나머지 1
    => 10111

(b) 소수 0.625를 2진수로 변환:
    0.625 × 2 = 1.25 -> 1
    0.25 × 2 = 0.5 -> 0
    0.5 × 2 = 1.0 -> 1
    => 0.101

최종 변환 결과:
    23.625 => 10111.101

2진수로 표현된 실수를 10진수의 실수로 변환하기

소수점을 포함하고 있는 2진수를 10진수로 변환할 때, 정수 부분은 앞에서 살펴보았듯이 2의 승수를 이용하면 됩니다. 소수점 이하의 수는 2의 (-)승수를 사용하여 10진수로 변환합니다.
예를 들어, (10111.101)_2을 10진수로 변환하면 다음과 같습니다:

scss코드 복사
(10111.101)_2 = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 1×2^0 + 1×2^-1 + 0×2^-2 + 1×2^-3
              = 16 + 4 + 2 + 1 + 0.5 + 0.125
              = 23.625

[표 1-7] 2진수 실수 표현을 10진수로 변환하기

makefile코드 복사
가중치: 16   8   4   2   1   0.5  0.25  0.125
2의 승수:  2^4 2^3 2^2 2^1 2^0 2^-1 2^-2 2^-3
2진수:     1   0   1   1   1   1     0     1

(10111.101)_2 = 1×2^4 + 1×2^2 + 1×2^1 + 1×2^0 + 1×2^-1 + 1×2^-3 = 16 + 4 + 2 + 1 + 0.5 + 0.125 = 23.625

멜섹Q PLC에서의 실수 표현 방법

앞에서 10진 실수의 2진수 표현 원리를 설명하였습니다. 멜섹Q PLC에서는 32비트 크기의 2진수로, 부동소수점(floating-point) 표현 방식을 이용하여 실수로 표현합니다. 이 방법은 지수(exponent)를 사용하여 소수점의 위치를 이동시킬 수 있는 과학적 표현 방법입니다. 다음은 10진수에 대한 부동소수점 표현을 나타낸 예입니다.
실수 표현 방식을 이해하고 나면 PLC에서 보다 복잡한 수학적 연산을 수행하는 데 큰 도움이 됩니다. PLC를 이용하여 산술연산을 할 때는 이러한 표현 방식을 잘 기억하여 활용해야 합니다.


1.3.4 실수의 표현 (계속)

10진 실수를 2진수로 변환하기 (예시)

부동소수점 표현 방식은 수의 크기를 나타내는 가수 부분과, 소수점이 이동해야 하는 자릿수를 나타내는 지수 부분, 수의 부호를 나타내는 부호 부분으로 구성되어 있습니다. 멜섹Q PLC에서는 32비트 크기의 단정밀도(single precision) 부동소수점과 64비트 크기의 배정밀도 부동소수점 표현 방법을 이용하여 실수를 표현하는데, 이 책에서는 단정밀도 부동소수점 방식을 이용한 실수 표현 방법을 설명합니다.
단정밀도 부동소수점 표현에서 수의 형식은 [표 1-8]에 나타낸 것처럼 가장 왼쪽의 비트는 부호비트 1비트가 사용되고, 다음 8비트는 지수 표현을 위한 비트이며, 그리고 나머지 23비트는 가수를 나타내는 부분입니다. 가수 부분의 경우, 23비트 왼쪽의 2진 소수점이 있는 것으로 이해하면 됩니다. 지수 부분의 8비트는 실제 지수에 127을 더한 편중 지수(biased exponent)를 나타냅니다. 편중 지수를 사용하는 이유는 지수에 별도의 부호비트를 사용하지 않고도 매우 큰 수 혹은 작은 수를 표현하기 위한 것입니다. 편중 지수에 의해 -127에서 +128까지의 실제 지수를 나타낼 수 있습니다.
[표 1-8] 단정밀도 부동소수점 표현 방법
부호 지수(exponent) 가수(mantissa)

1비트8비트23비트

예를 들어 2진수 1011010010001을 멜섹Q PLC에서 사용하는 부동소수점을 이용하여 표현해보자. 우선 소수점 12자리를 왼쪽으로 이동시키고 2의 거듭제곱 꼴을 곱해줌으로써 다음과 같이 1011010010001을 지수와 가수를 구분한 소수의 표현으로 나타낼 수 있다.

코드 복사
1011010010001 = 1.011010010001 × 2^12

양수이므로 부호비트는 0이다. 지수 12는 127을 더한 편중지수 139의 2진수 10001011로 표현되며, 가수는 2진수 소수 부분인 .011010010001이 된다. 위와 같은 지수 표현에서 소수점의 왼쪽은 항상 1이므로 가수에는 포함되지 않는다. 따라서 2진수 1011010010001에 대한 부동소수점 표현은 다음과 같다.

makefile코드 복사
부호 비트: 0
지수: 10001011 (편중지수 139)
가수: 011010010001 (소수 부분)

결국, 최종 부동소수점 표현은 다음과 같습니다:

코드 복사
0 10001011 01101001000100000000000

이와 같이 멜섹Q PLC에서는 실수를 효율적으로 표현할 수 있는 다양한 방법이 제공됩니다. 이를 잘 이해하면 복잡한 수학적 계산도 문제없이 수행할 수 있습니다.

부록: 관련 PLC 명령어 및 설정

멜섹Q PLC에서 실수를 다루기 위한 명령어와 설정 방법을 추가로 설명합니다. 다양한 명령어를 통해 실수 연산을 보다 효율적으로 수행할 수 있으며, 이를 위해 아래와 같은 설정을 참조하십시오.

주요 명령어

  • DFLOAT(더블 정밀도 부동소수점): 64비트 실수를 표현하고 연산하는 데 사용됩니다.
  • FIX(고정 소수점 변환): 실수를 정수로 변환합니다.
  • FLOAT(부동 소수점 변환): 정수를 실수로 변환합니다.

설정 방법

  • 입력/출력 데이터 설정: PLC의 메모리 영역을 적절히 설정하여 실수 데이터를 저장하고 처리할 수 있도록 합니다.
  • 타이머 및 카운터 설정: 실수 값을 이용한 정밀한 시간 제어 및 카운터 기능을 구현할 수 있습니다.

이와 같은 명령어와 설정 방법을 잘 활용하면, 멜섹Q PLC에서 다양한 실수 연산을 효율적으로 수행할 수 있습니다. 부동소수점과 관련된 개념을 정확히 이해하고 적용함으로써 더욱 복잡한 제어 시스템을 구현할 수 있습니다.


단정밀도 부동소수점 표현 방법

단정밀도 부동소수점 표현 방식은 멜섹Q PLC에서 실수를 표현하는 데 사용되는 주요 방법 중 하나입니다. 이 방식에서는 실수를 부호, 지수, 가수로 나누어 표현합니다. 이를 통해 다양한 실수 범위를 효율적으로 나타낼 수 있습니다. 아래의 예제를 통해 단정밀도 부동소수점 표현 방법을 살펴보겠습니다.

예제 1: 십진수 10을 단정밀도 부동소수점으로 표현하기

  1. 십진수 10을 이진수로 변환:
  2. $$ (10)10=(1010)2=(1.010×23)2(10)10=(1010)2=(1.010×23)2 $$
  3. 부호비트:
    • 양수이므로 부호비트는 0.
  4. 지수 부분:
    • 지수 3 + 편중 지수 127 = 130127
    • 130
    • 3
    • (130)10=(10000010)2(130)10=(10000010)2
  5. 가수 부분:
    • 1.0101.010에서 소수점 오른쪽 부분인 010을 사용.
    • 010
    $$ (01000000000000000000000)2(01000000000000000000000)2 $$

따라서, 십진수 10을 단정밀도 부동소수점으로 표현하면 다음과 같습니다.
$$
0 10000010 01000000000000000000000 (0100 0000 0100 0000 0000 0000 0000 0000){2} = (41200000){16}
$$

예제 2: 십진수 0.75를 단정밀도 부동소수점으로 표현하기

  1. 십진수 0.75를 이진수로 변환:
  2. $$ (0.75)10=(0.11)2=(1.1×2−1)2(0.75)10=(0.11)2=(1.1×2−1)2 $$
  3. 부호비트:
    • 양수이므로 부호비트는 0.
  4. 지수 부분:
    • 지수 −1 + 편중 지수 127 = 126$$ 127 $$
    • $$ 126 $$
    • $$ −1 $$
    $$ (126)10=(01111110)2(126)10=(01111110)2 $$
  5. 가수 부분:
    • 1.11.1에서 소수점 오른쪽 부분인 1을 사용.
    • 1
    • (1.10000000000000000000000)2(10000000000000000000000)2

따라서, 십진수 0.75를 단정밀도 부동소수점으로 표현하면 다음과 같습니다.

yaml코드 복사
0 01111110 10000000000000000000000
(0011 1111 0100 0000 0000 0000 0000 0000)_{2} = (3F400000)_{16}

예제 3: 십진수 -10을 단정밀도 부동소수점으로 표현하기

  1. 십진수 -10을 이진수로 변환:
    • (10)10=(1010)2=(1.010×23)2(10)10=(1010)2=(1.010×23)2
  2. 부호비트:
    • 음수이므로 부호비트는 1.
  3. 지수 부분:
    • 지수 3 + 편중 지수 127 = 130127
    • 130
    • 3
    • (130)10=(10000010)2(130)10=(10000010)2
  4. 가수 부분:
    • 1.0101.010에서 소수점 오른쪽 부분인 010을 사용.
    • 010
    • (01000000000000000000000)2(01000000000000000000000)2

따라서, 십진수 -10을 단정밀도 부동소수점으로 표현하면 다음과 같습니다.

yaml코드 복사
1 10000010 01000000000000000000000
(1100 0000 0100 0000 0000 0000 0000 0000)_{2} = (C1200000)_{16}

예제 4: 단정밀도 부동소수점 형식으로 표현된 2진수 '1100 0010 1100 1000 0000 0000 0000 0000'를 10진수로 변환하기

  1. 부호비트:
    • 1 → 음수
  2. 지수 부분:
    • 10000101=13310000101=133
    • 실제 지수 = 133−127=6
    • 133−127=6
  3. 가수 부분:
    • 1.100100000000000000000001.10010000000000000000000

따라서, 이 부동소수점 표현은 다음과 같이 계산됩니다.

diff코드 복사
-1.10010000000000000000000 × 2^6
-1.1001 × 2^6 = -1100100 = -100 (10진수)

이를 통해 멜섹Q PLC에서 실수를 단정밀도 부동소수점으로 표현하고 변환하는 방법을 잘 이해할 수 있습니다. 이를 활용하면 복잡한 실수 연산도 문제없이 수행할 수 있습니다.


1.3.4 실수의 표현

PLC에서 실수를 표현하는 방법은 조금 복잡합니다. 사실 실수 자체가 정수보다 복잡한 수입니다. 그러나 걱정하지 말자. PLC에서는 실수를 표현하는 방식을 개념적으로 이해하면 되기 때문이다.

10진 실수를 2진수로 변환하기

소수점 이하의 값을 갖는 10진수를 2진수로 표현하기 위해서는 소수점을 기준으로 정수와 소수점 이하의 값을 구분하여 2진수로 변환한다. 10진 정수의 2진수 변환은 정수와 같이 2의 연속적인 나눗셈에서 얻어지는 나머지를 이용한다. 그러나 소수점 이하의 10진수는 연속적인 2의 나눗셈의 반대 개념으로 2의 곱셈을 이용한다. 즉 연속적인 2의 곱셈에서 생기는 정수 부분으로 자리를 올림수거 소수점 이하 2진수의 값이 되는 것이다. 한 예로 10진수 (23.625)를 2진수로 변환하는 방법에 대해 살펴보자.

정수 부분 (23)의 2진수 변환

  1. 23을 2로 나눠 몫과 나머지를 기록
    • 23 ÷ 2 = 11, 나머지 1
    • 11 ÷ 2 = 5, 나머지 1
    • 5 ÷ 2 = 2, 나머지 1
    • 2 ÷ 2 = 1, 나머지 0
    • 1 ÷ 2 = 0, 나머지 1
    따라서, 정수 23의 2진수 표현은 (10111)₂이다.

소수 부분 (0.625)의 2진수 변환

  1. 0.625에 2를 곱해 소수점 이하 값을 기록
    • 0.625 × 2 = 1.25 (정수 1, 소수 0.25)
    • 0.25 × 2 = 0.5 (정수 0, 소수 0.5)
    • 0.5 × 2 = 1.0 (정수 1, 소수 0)
    따라서, 소수 0.625의 2진수 표현은 (0.101)₂이다.

따라서, 10진수 23.625를 2진수로 표현하면 (10111.101)₂가 된다.

2진수로 표현된 실수를 10진수의 실수로 변환하기

소수점을 포함하고 있는 2진수를 10진수로 변환할 때, 정수 부분은 앞에서 살펴보았듯이 2의 승수를 이용하면 된다. 소수점 이하의 수는 2의 (-)승수를 사용하여 10진수로 변환한다.
예를 들어, 2진수 (10111.101)₂를 10진수로 변환하면 다음과 같다:

  • 정수 부분: 1×24+0×23+1×22+1×21+1×20=16+4+2+1=23
  • 1×24+0×23+1×22+1×21+1×20=16+4+2+1=23
  • 소수 부분: 1×2−1+0×2−2+1×2−3=0.5+0.125=0.625
  • 1×2−1+0×2−2+1×2−3=0.5+0.125=0.625

따라서, (10111.101)2=23.625(10111.101)2=23.625가 된다.

멜섹Q PLC에서의 실수 표현 방법

앞에서 10진 실수의 2진수 표현 원리를 설명하였다. 멜섹Q PLC에서는 32비트 크기의 2진수로, 부동소수점 표현 방식을 이용하여 실수로 표현한다. 이 방법은 지수(exponent)를 사용하여 소수점의 위치를 이동시킬 수 있는 과학적 표현 방법이다. 다음은 10진수에 대한 부동소수점 표현을 나타낸 예이다.

부동소수점 표현 방식

  • 부호, 지수부, 가수부로 나뉨
    • 부호: 수의 부호를 나타냄 (1 비트)
    • 지수부: 수의 크기를 나타냄 (8 비트)
    • 가수부: 소수점 이하 값을 나타냄 (23 비트)

예를 들어 2진수 1011010010001을 멜섹Q PLC에서 사용하는 부동소수점을 이용하여 표현해보자. 우선 소수점 12자리를 왼쪽으로 이동시키고 2의 거듭제곱 곱을 곱해줌으로써 다음과 같이 1011010010001을 지수와 가수를 구분한 소수의 표현으로 나타낼 수 있다.

  1. 1011010010001=1.011010010001×2121011010010001=1.011010010001×212
  2. 양수이므로 부호비트는 0이다.
  3. 지수 12는 127을 더한 편중지수 139의 2진수 10001011로 표현되며, 가수는 2진수 소수 부분인 .011010010001이다.

따라서, 2진수 표현 1011010010001에 대한 부동소수점 표현은 다음과 같다:

코드 복사
0 10001011 01101001000100000000000

예제

  1. 십진수 10을 멜섹Q PLC의 단정밀도 부동소수점 표현으로 나타내는 방법:
    • (10)₁₀ = (1010)₂ = (1.010 × 2³)₂
    • 부호비트: 0 (양수)
    • 지수 부분: 3 + 127 = 130 (10000010₂)
    • 가수 부분: 010 (01000000000000000000000₂)
    • 따라서, 십진수 10을 실수로 표현한 2진수 데이터는 다음과 같다:
    • yaml코드 복사 0100 0000 0100 0000 0000 0000 0000 0000 = (41200000)₁₆
  2. 십진수 0.75를 멜섹Q PLC의 단정밀도 부동소수점 표현으로 나타내는 방법:
    • (0.75)₁₀ = (0.11)₂ = (1.1 × 2⁻¹)₂
    • 부호비트: 0 (양수)
    • 지수 부분: -1 + 127 = 126 (01111110₂)
    • 가수 부분: 1 (10000000000000000000000₂)
    • 따라서, 십진수 0.75를 실수로 표현한 2진수 데이터는 다음과 같다:
    • yaml코드 복사 0011 1111 0100 0000 0000 0000 0000 0000 = (3F400000)₁₆
  3. 십진수 -10을 멜섹Q PLC의 단정밀도 부동소수점 표현으로 나타내는 방법:
    • (10)₁₀ = (1010)₂ = (1.010 × 2³)₂
    • 부호비트: 1 (음수)
    • 지수 부분: 3 + 127 = 130 (10000010₂)
    • 가수 부분: 010 (01000000000000000000000₂)
    • 따라서, 십진수 -10을 실수로 표현한 2진수 데이터는 다음과 같다:
    • yaml코드 복사 1100 0000 0100 0000 0000 0000 0000 0000 = (C1200000)₁₆

이와 같은 방식으로, PLC에서 실수를 표현할 때 단정밀도 부동소수점 표현을 사용하여 실수 값을 보다 정확하게 다룰 수 있다.