흔히들 숫자, 16진수, 10진수, 2진수, 바이너리, 헥사, 아스키, 문자, .... 뭐 이런 다양한 용어를 사용합니다. 이들간의 관계를 혼란스러워 하는 경우가 많은 것 같습니다.
만약 D300이라는 디바이스에 65라는 숫자가 들어 있다고 하겠습니다.
D300의 값은 16진수 41이다. 맞는 말입니다.
D300의 값은 10진수 65이다. 역시 맞는 말입니다.
D300의 값은 2진수 01000001이다. 역시 맞습니다.
D300의 값은 문자 'A' 혹은 문자열 "A"이다 라고 해도 역시 맞습니다.
즉, 멜섹에서 라면
MOV K65 D300
MOV H41 D300
$MOV "A" D300
이 모두 같은 결과를 만들어 냅니다.
실제로 위에서 D300에 들어 있는 숫자를 표현하기 위해서 K65라든지 H41이라든지 하는 표현을 사용했습니다. 하지만 이건 어디까지나 표현입니다. K65라든가 H41이라든가 하는 것은 우리가 편의상 그렇게 표현을 한 것에 불과한 것이고, 실제로 D300에 들어 가는 값은 변하지를 않습니다. 똑 같습니다.
그러므로 D300이 16진수인지 2진수인지를 묻는 것은 대략난감한 질문입니다.
다음으로 숫자를 문자로 바꾸는 과정에서 많은 오해가 발생하는 것 같습니다.
위의 예를 계속 살펴보면 D300의 값은 K65라고 표현할 수 있습니다. 이때 65라는 것을 사람의 눈은 숫자로 인식합니다. 하지만 컴퓨터의 입장에서 이것은 숫자가 아니라 '6'이라는 문자와 '5'라는 문자입니다. 좀 더 구체적으로 얘기하면 '6'에 해당하는 아스키값 54와 '5'에 해당하는 아스키값 53의 두 개의 숫자입니다. 물론 이것은 10진수로 표현한 것이고, 만약에 16진수로 표현한다면 H41이 될 것이고, '4'에 해당하는 아스키값 52와 '1'에 해당하는 아스키값 49의 두 개의 숫자입니다.
ASC라는 명령은 D300에 들어 있는 10진수로는 65, 16진수로는 41인 숫자를 16진수로 표현했을 때의 형태로 바꾸는 명령입니다. 즉, D600에는 D300의 16진 표현인 '4'와 '1'에 해당하는 아스키값 52와 49가 한 바이트씩을 채우면서 13361이 들어 가게 됩니다. 이것은 실제로 값이 전혀 다른 것으로 바뀌는 것입니다. 위에서 단순히 표현만을 달리하는 경우에는 실제의 값은 바뀌지 않지만 이것은 실제로 값이 다른 모습으로 바뀌어 버리는 변환입니다. 단순한 표현이 아니라 변환이 발생하는 겁니다.
문자, 아스키를 다루는 것이니까 $MOV를 사용해도 되지 않느냐고 하셨지만 $MOV는 단순히 값을 복사하는 것이지 변환하는 것이 아닙니다. 즉, $MOV D300, D600이라고 하시면 D300의 65라는 숫자가 D600으로 그대로 복사될 뿐 아무런 변환도 일어나지 않습니다.
'그럼 $MOV는 MOV와 똑 같지 않느냐?' 예 맞습니다. MOV혹은 BMOV와 거의 같습니다. 차이가 있다면 $MOV는 따로 얼마 만큼을 복사할지에 해당하는 길이를 따로 지정하지 않고, D300부터 그 이후에 있는 숫자들 중에서 0을 만날 때까지만을 옮긴다는 것이고, MOV는 내용과는 상관없이 무조건 한 워드를, BMOV는 항상 길이가 주어졌어 그 주어진 수량 만큼만을 옮긴다는 차이가 있을 뿐 근본적인 것은 똑 같습니다. '4'라는 문자가 52라는 숫자인 것처럼, 'A'라는 문자가 65라는 숫자인 것처럼 $MOV가 옮기는 것도 결과적으로는 숫자 입니다. 단지 그것은 문자로 볼 수도 있다는 것이지, 여전히 근본은 숫자입니다.
결론적으로 $MOV는 아스키로 변환하는 명령이 아닙니다. 그러므로 ASC를 대신할 수는 없습니다.
에바님을 위한 추가 설명
13361은 10진수로 표현했을 때이고, 16진수로 표현하면 3431입니다. 52의 16진 표현이 34이고, 49의 16진수 표현이 31입니다. 즉, 각각의 아스키값이 한 바이트씩 입니다. 일반적으로 PC는 바이트를 기본으로 하기 때문에 PC 환경에서라면 '52와 49의 두바이트라가 됩니다.'라고 했을 겁니다. 하지만 PLC는 워드를 기본단위로 하는 경우가 많습니다. 멜섹도 마찬가지여서 'D' 는 워드 디바이스입니다. 워드라는 단위는 두 바이트가 모인 것으로 두 바이트 52와 49는 모여서 하나의 워드가 되는 것입니다. 계산기로 16진수 3431을 10진수로 바꿔보세요. 그러면 13361(52 * 256 + 49)임을 알 수 있습니다.