본문 바로가기
프로그래밍

BCD 코드 이용한 날짜 시간 표기

by minimax95 2021. 3. 25.

이번 포스팅에서는 미쯔비시 장비 프로토콜 맵에서 제공하는 Data Format을 이용하여 날짜와 시간을 표기하는 방법에 대해 정리해보겠습니다.

 

먼저 Address Map을 살펴보면 아래와 같습니다.(Melpro_D 시리즈)

Address 44001 ~ 44004번까지 상위 비트와 하위 비트의 값을 이용해서 아래와 같이 표기할 수 있습니다.

2021년 2월 10일 16시 37분 50초

=> 20 21 02 10 16 37 50 00

44001번지 상위 비트 20, 하위 비트 21

44002번지 상위 비트 02, 하위 비트 10

44003번지 상위 비트 16, 하위 비트 37

44004번지 상위 비트 50, 하위 비트 00

 

Modbus 패킷으로 분석해 보겠습니다.

패킷의 구조는 아래와 같습니다.

실제 마스터에서 시간설정을 위해 전송하는 Modbus 패킷을 캡처해 보면 아래와 같습니다.

01 10 0F A0 00 04 08 20 21 02 10 16 37 50 00 5B 09

01 => 1번 장비

10 => Function Code 16 Write Multiple Registers

0F A0 => 시작 주소 4000번지 (Register address 44001번지의 Protocol Address)

00 04 => 데이터 개수 4개

08 => 8Byte

20 21 => 2021년

02 10 => 2월 10일

16 37 => 16시 37분

50 00 => 50초

5B 09 => CRC

즉, 1번 장비의 시간설정 변경을 위해 4001번지부터 4003번지까지 8Byte의 날짜 시간 정보를 전송하는 것입니다.

 

여기서 주의해야 할 부분이 바로 BCD 코드를 처리하는 부분입니다.

소스코드 상에서 BCD 코드로 변환하기 위해서는 아래와 같은 코드가 필요합니다.

BCD 코드 상위 바이트와 하위 바이트에 각각 날짜와 시간 정보를 아래 코드 방식으로 넣어줍니다.

 

ushort [] values = { 20 21 02 10 16 37 50 00 }; 

 

여기서 Modbus 패킷으로 변환하기 위해 message 배열이 있다고 가정하고 각 Byte마다 for문을 이용해서 값을 변환시켜 줍니다.

byte [] message = new byte [9 + 2 * count]  // count는 8개

for(int i = 0; i < count + 4; i++)

{

    message[7 + i] = (byte)((values [i] / 10) << 4) + (values [i] % 10));

}

 

아래 이미지는 10대의 장비에서 시간 값을 읽어온 예시 사진입니다.

코드 그대로 읽어와서 표출할 수 있어서 편리하긴 하지만 Byte 변환시 10진수와 16진수 변환 등에 신경 써야 하는 부분이 있어서 주의를 해야 합니다.

날짜와 시간 표기를 위해 Address map에서 BCD 코드를 사용한 방법에 대한 포스팅을 마치도록 하겠습니다.

 

감사합니다.

댓글