오늘은 SECS-II에 대해서 알아보겠다.
Stream, Function 등에 대한 내용이 아닌 실제 전송되는 byte를 해석하는 방법에 대해서 설명하겠다.
현재 SECS를 공부하고 있거나 접해 본 사람들은 좌측의 메세지 형식을 많이 보았을 것이다. SEMI E Series 또는 Spec 문서에서 메세지를 메세지 형식을 표현하기 위해 사용한다.
우측의 그림은 해당 메세지를 실제 전송할 때 전송되는 byte를 16진수로 표현한 것이다.
SECS-II 메세지의 해석과 실제로 byte로 변환되는 과정까지 알아보도록 하겠다.
설명하기에 앞서 이해를 돕기 위해 데이터의 타입을 구분하는 영역을 data-type, 실제 데이터 값(내용)을 나타내는 영역을 data-value라고 지칭하도록 하겠다.
다음은 16진수로 표현한 메세지를 data-type 영역과 data-value 영역으로 구분 표현한 그림이다.
빨간 영역은 data-type, 파란 영역은 data-value이다.
data-type 영역을 볼때 어떤 데이터 타입인지 알기 위해선 다음을 이해하고 있어야 한다.
Data Type
데이터 타입은 List 타입, String 타입, Numberic 타입으로 구분할 수 있다.
- List 타입 : L(List)
- String 타입 : A(ASCII), B(Binary)
- Numberic 타입 : I1, I2, I4, I8, U1, U2, U4, U8, F4, F8, BOOLEAN
예시로 든 그림에서 A9는 LB가 1인 U2를 나타내고, 41은 LB가 1인 ASCII를 나타낸다.
Length-Byte
LB는 Length Byte의 약어이다.
SECS-II 에서는 Length-byte를 통해 data-type을 나타내는 byte 영역과 data-value를 나타내는 byte 영역을 구분하고 있다.
데이터 타입을 나타내는 byte 바로 뒤에 나오는 byte는 data-value를 나타내는 byte의 개수(길이)를 정의한 Length-byte이다. Length-byte가 한 개일 경우 data-type의 기본값 + 1bit, Length-byte가 두 개일 경우 data-type의 기본값 + 2bit 이런 식이다.
예제를 통해 더욱 자세히 설명하면 01은 List 타입이고 Length-byte가 한 개 있다고 알 수 있고, 01 바로 뒤에 나오는 한 개의 byte의 값이 data-value영역의 byte 개수를 의미한다.
data-type이 02 일 경우 List 타입이고 Length-byte가 2개 있으므로 02 바로 뒤부터 2개까지의 byte가 data-value 영역의 byte 개수를 나타내는 Length-byte이다.
※List 타입인 경우 Length-byte의 값은 포함하고 있는 Item의 개수를 나타내고 그 외의 타입인 경우에는 data-value를 나타내는 byte의 길이를 의미한다.
위 그림을 보면 Length-byte가 한 개이고 Length-byte의 값이 2인 경우 List안에 2개의 Item이 들어있는것과 Length-byte가 1개이고 Length-byte의 값이 3인 경우 3개의 Item이 들어있는 것을 알 수 있다.
List 타입이 아닌 경우에도 규칙은 동일하다. A9는 Length-byte가 1개인 U2를 나타내고 41은 Length-byte가 1개인 ASCII를 나타낸다. Length-byte의 각각의 값은 2와 6이므로 data-value영역의 byte 개수가 2개, 6개가 있을 것을 확인할 수 있고 해당 영역의 byte를 변환하면
01C8 -> 456 ,
31 32 33 31 32 33 -> 123123,
E0F3 -> 123123,
31 32 33 34 35 36 -> 123456
인 것을 알 수 있다.
Example
해당 예제의 data-type 영역만 나타내보면 다음과 같다.
Item이 4개인 List 안에
Length-byte가 1개인 U8,
Length-byte가 1개인 U2,
Length-byte가 1개인 ASCII,
Item이 2개인 List가 들어있고
두번째 List 안에는
Length-byte가 1개인 ASCII,
Length-byte가 1개인 ASCII가 있다.
U8는 data-value영역의 길이가 8이고
U2는 data-value영역의 길이가 2,
A는 data-value영역의 길이가 4,
두 번째 List 안에 있는
A는 data-value영역의 길이가 10,
A는 data-value영역의 길이가 12이다.
이를 바탕으로 data-value를 변환하면 다음과 같다.
- 0000125F5361D5AC → 20200630113708 (16진수→10진수)
- 1CB9 → 7353 (16진수→10진수)
- 54 45 53 54 → TEST (ASCII)
- 41 4C 41 52 4D 20 54 45 53 54 → ALARM TEST (ASCII)
- 54 48 49 53 20 49 53 20 54 45 53 54 → THIS IS TEST (ASCII)
SECS2
'logistics' 카테고리의 다른 글
최적 경로 찾기 #2 - 에이스타(A*) 알고리즘, 자바 코드 구현 포함 (0) | 2023.06.20 |
---|---|
자율 주행 로봇의 각종 센서들(카메라, 레이더, 라이다, 적외선 등) (0) | 2023.06.01 |
무인 운반 차량의 물류 최적화에 대한 고찰 (0) | 2023.05.26 |
[SEMI] HSMS란? 메세지 구조 자세히 설명 (0) | 2022.09.20 |
[SEMI] SEMI와 SECS란? SECS 기본 개념 (0) | 2022.07.18 |