이전 글들에서 스마트 팩토리에서 CIM과 통신하기 위해 사용되는 SEMI 표준들 중 SECS 프로토콜, 그 중에서 SECS-I, SECS-II 프로토콜에 대해 알아보았다.
오늘은 SECS 메시지들을 TCP 로 통신할때 필요한 전송 표준인 HSMS 에 대해 알아보겠다.
HSMS(High Speed SECS Message Service) 란?
기존에 SECS 통신은 RS-232라는 직렬 시리얼 통신 위에서 SECS-I를 통해 SECS-II 메시지들을 주고받으며 통신이 이루어졌다.

하지만 점점 이더넷 기술 규격이 발달하고 널리 퍼짐에 따라 TCP/IP 프로토콜을 사용해서 통신을 하는 시대가 됐다.
그래서 이러한 TCP/IP 위에서도 안정적으로 SECS-II 메시지들을 사용해서 통신을 주고받을 수 있도록 규약을 만든 것이 HSMS 프로토콜이다.

→ HSMS란? TCP/IP 네트워크 상에서 SECS-II 메시지를 안정적으로 주고받기 위한 전송 프로토콜 이다.
이제 HSMS 프로토콜의 구조를 살펴보자.
HSMS 프로토콜의 구조
기본적으로 SECS-I 프로토콜에서 크게 구조가 변하지 않았다.

- A 영역(Length) : 
4 byte, B 영역과 C 영역의 길이를 나타낸다. 
- B 영역 (Header) : 
10 byte  (Session Id, Heder Byte 2, Header Byte 3, Ptype, Stype, System Byte) 
- C 영역 (Data) : 
가변적 , SECS-II 메시지가 존재. 
HSMS 메시지의 헤더는 크게 Session Id, Heder Byte 2, Header Byte 3, Ptype, Stype, System Byte 로 나뉘어져 있다.

- Session ID  Device ID, Host ID 각 통신 객체간의 관계를 규정하는 영역
 
- Header Byte 2  HSMS 메시지는 크게 Data Message와 Control Message로 나뉜다.  메시지 유형은 SType 값으로 구분함 (0: Data Message, 그 외: Control Message)
- 
Data Message (데이터 메시지)
실제 생산 장비와 호스트 간의 SECS-II 메시지를 전송할 때 사용
 
- 구성 요소
- W-Bit (MSB): 응답 필요 여부를 표시
 
- 1: 응답 필요
 
- 0: 응답 불필요
 
 
- Stream Number (하위 7비트): SECS-II 메시지의 Stream 번호
 
- 용도
 
 
- Control Message (제어 메시지)
 
- 특징
- 일반적으로 Header Byte 2는 0으로 설정
 
- 특수한 경우 상태 코드 포함 가능
 
 
- 용도
 
 
 
- Header Byte 3
- Data Message일 경우:
- Function Number (8비트 전체 사용)  → SECS-II 메시지에서 사용하는 
Function 코드 번호를 의미.  → 즉, 특정 Stream 안에서 어떤 기능(명령/응답)인지를 구체적으로 지시하는 값.
 
 
- Control Message일 경우:
- Control Type (8비트 전체 사용)  → 제어 메시지의 종류를 지정함. (예: 연결 요청, 연결 종료, 링크 테스트 등)
 
 
 
- PType (Protocol Type)
- 항상 0으로 설정 (Reserved)
 
- HSMS에서 통신 프로토콜 타입은 고정값을 가지며, 추가 정의 없이 0을 사용함.
 
 
- SType (Session Type)
- 이 메시지가 
어떤 종류의 통신 세션 메시지인지를 나타낸다. 
- 대표적인 SType 예시:
- 0: Data Message (SECS-II 데이터 전송용)
 
- 1: Select.req (연결 요청)
 
- 2: Select.rsp (연결 응답)
 
- 5: Linktest.req (링크 상태 테스트 요청)
 
- 6: Linktest.rsp (링크 상태 테스트 응답)
 
- 9: Separate.req (연결 종료 요청)
 
 
 
- System Bytes (4 Byte)
- 송신자가 임의로 설정하고, 응답 시 동일하게 복사되어 돌아오는 값.
 
- 요청-응답을 매칭하기 위한 용도로 사용됨.
- 예를 들어, 송신자가 메시지를 보낼 때 System Byte를 1234로 설정했다면, 그 응답 메시지에도 1234가 붙어 와야 한다.
 
- 이렇게 해서 요청과 응답 쌍을 구분하고 관리할 수 있다.
 
 
 
Control Message 와 Data Message
1. Data Message (데이터 메시지)
- 목적: 실제 생산장비와 호스트(서버) 간에 업무용 데이터를 주고받기 위한 메시지.
 
- 특징:
- SType = 0.
 
- SECS-II 메시지를 담고 있음. (장비 상태 보고, 명령 수행, 데이터 수집 등)
 
- Header Byte 2의 상위 1비트(W-Bit)가 응답 필요 여부를 표시:
- 1 → 이 메시지에 대해 응답이 필요함.
 
- 0 → 이 메시지에 대해 응답이 필요 없음.
 
 
- Header Byte 2의 하위 7비트는 Stream Number (SECS-II Stream 번호).
 
- Header Byte 3는 Function Number (SECS-II Function 번호).
 
 
- 구성 예시:
 
- Stream 2, Function 17 : 특정 명령 전송
- Stream 3, Function 1 : 상태 요청
2. Control Message (제어 메시지)
- 목적: 통신 상태를 관리하기 위한 메시지. (연결, 해제, 유지 등)
 
- 특징:
- SType ≠ 0 (0이 아닌 값들: 1, 2, 5, 6, 9 등)
 
- SECS-II 데이터는 포함되지 않음 (C 영역이 없음 또는 아주 짧음).
 
- 통신 자체를 유지하거나 제어하기 위한 간단한 명령을 보내는 것.
 
- Header Byte 2는 보통 0으로 설정.
 
- Header Byte 3는 Control Type을 나타냄. (어떤 제어 명령인지를 지정)
 
 
- 주요 Control Message 종류 (SType 기준):
 
| SType | 의미 | 설명 | 
|---|
| 1 | Select.req | 연결 요청 | 
| 2 | Select.rsp | 연결 요청 응답 | 
| 5 | Linktest.req | 링크 테스트 요청 | 
| 6 | Linktest.rsp | 링크 테스트 응답 | 
| 9 | Separate.req | 연결 해제 요청 | 
- Control Message 구성 예시:
- Select.req: 장비와 호스트가 새 연결을 만들 때 보냄.
 
- Linktest.req: 통신이 정상인지 확인하고 싶을 때 보냄.
 
- Separate.req: 정상적으로 연결을 끊고 싶을 때 보냄.
 
 
즉 정리하자면 Control Message냐 Data 메시지냐는 아래에 따라 알 수 있다.
| 구분 | Data Message | Control Message | 
|---|
| 목적 | 업무 데이터 전송 | 통신 제어 관리 | 
| SType | 0 | 1, 2, 5, 6, 9 등 | 
| Header Byte 2 | W-Bit + Stream Number | 보통 0 | 
| Header Byte 3 | Function Number | Control Type | 
| SECS-II 메시지 포함 여부 | 포함 (C영역 사용) | 거의 없음 (C영역 비워짐) |