HSMS : SECS-Ⅰ 프로토콜을 대체하는 TCP/IP 기반의 표준 프로토콜
RS-232 통신을 위한 프로토콜인 SECS-Ⅰ의 사용이 점차 줄어들고 이더넷 기반의 TCP/IP를 통한 통신방식이 점차 증가하면서 반도체 통신도 더 빠른 통신을 위해 TCP/IP를 기반으로한 프로토콜이 개발되었습니다.
따라서 기존의 SECS-Ⅰ 방식보다 수십배(?) 혹은 수백배 빠른 HSMS 프로토콜이 현재 반도체 통신에서 주로 사용되고 있습니다.
따라서 기존 MESSAGE 포맷에서 DATA를 담당하는 C의 경우는 그대로 SECS-Ⅱ 프로토콜이 담당하고,
Header를 포함한 나머지 부분들은 이제 HSMS 프로토콜에서 담당하게 됩니다.
그렇기 때문에 HSMS 메세지 포맷과 SECS-Ⅰ 메세지 포맷은 다소 비슷함을 느끼실 수 있을것입니다.
1. HSMS Connection State Diagram + Procedure
1️⃣ HSMS Connection State Diagram
TCP/IP 통신을 통해 HSMS 프로토콜을 이용해서 SECS 메세지를 설비와 주고 받기 위해선 위의 그림과 같은 절차를 가지게 됩니다.
번호 | 상태 | 설명 |
1 | → Not Connected | TCP / IP 연결 준비 |
2 | Not Connected → Not Selected | TCP / IP 소켓 통신 연결 (Server / Client) |
3 | Not Selected → Not Connected | TCP / IP 소켓 통신 연결 해제 |
4 | Not Selected → Selected | HSMS Select.req / Select.rsp 메세지 송수신 |
5 | Selected → Not Selected | HSMS Deselect.req / Deselect.rsp 메세지 송수신 |
6 | Not Selected→ Not Connected | T7 타이머 경과 시 |
1, 2, 3 번의 경우 TCP/IP 통신 레벨의 절차이기때문에 사실 HSMS와 직접적인 관계는 없다고 볼 수 있습니다.
단지 HSMS 프로토콜을 통해 연결하기 위한 선행조건이라 보시면 될 것 같습니다.
✅ TCP Socket 통신 연결 부분 (일부 발췌)
public bool Open(){
if (config.ConnectMode.Equals(Enumeration.EnumConnectMode.ACTIVE))
{
ConnectClient();
return true;
}
if (config.ConnectMode.Equals(Enumeration.EnumConnectMode.PASSIVE))
{
OpenListener();
if (!socketServer.IsConnected)
{
return false;
}
hsmsStatus = Enumeration.EnumHSMSStatus.NotSelected;
return true;
}
}
ConnectMode가 Active인지 Passive인지에 따라서 Socket Client가 연결을 시도하거나, Socket Listener가 Client측의 연결을 대기를 하게 됩니다.
Client가 Connect하게 되면 System.Net.Socket의 TcpClient 클래스에서 연결메서드가 수행되고
Server(Listener)가 Start하게 되면 System.Net.Socket의 TcpListener클래스에서 Start 메서드를 통해 들어오는 연결 요청을 수신 대기하게 됩니다.
자세한건 System.Net.Socket 라이브러리를 참고하면 좋을것 같습니다.
(본문은 HSMS 프로토콜을 위한 글이기 때문에 소켓통신에 대한 설명은 여기까지...)
2️⃣ HSMS Procedure
※ 여기서 Active Entity는 연결을 시도하는 측! 즉, Client에 해당하고,
PassiveEntity는 연결을 기다리는 측! 즉, Server(Listener)에 해당한다.
✔ Connect 절차
(TCP/IP 연결 부분은 TCP/IP SOCKET 통신과 관련된 부분으로 설명 생략)
- Select.req : Connect된 HOST가 HSMS Server인지 확인하기 위한 Message
- Select.rsp : Select.req에 대한 Response
- T7 Timer : NotSelect가 일정시간동안 지속되면 자동적으로 NotConnected 상태로 변경된다.
✔ Disconnect 절차
- Separate.req : Connection을 Terminate 시키기 위한 Message
- 연결을 끊어주기 위한 Message로는 Deselect.req, Deselect.rsp도 있습니다.
둘다 연결을 끊어주는 것은 동일하나 Separate 메세지는 회신 메세지가 존재하지 않습니다.
(추가로 Separate로 연결을 끊으면 NotConnected 상태로 돌아가고, Deselect로 연결을 끊으면 NotSelected 상태로 돌아가는것 같습니다.) --> 지극히 개인적인 생각이니 맹신금지!!❌
▶ HSMS 통신을 간략화한 HSMS-SS에서는 연결해제할때 Deselect를 사용하지 않고 Separate 만 사용한다고 합니다!!😊
✔ Data 절차
- 위의 Connect 절차후에 바로 Data를 주고 받는 절차입니다.
일반적인 SECS-Ⅱ 메세지를 통해 주고받으며 회신 메세지가 일정시간동안 오지 않으면 T3 타이머가 오버됩니다.
- Selected 상태에서만 Data를 송수신할 수 있으며, 이외의 상태일때 데이터 메세지를 수신하면 Reject.req 메세지를 보내게 됩니다.
✔ LinkTest 절차
- Linktest.req : Connection을 확인하기 위한 Message
- Linktest.rsp : Linktest.req에 대한 Response
- 주기적으로 클라이언트는 서버와 Linktest 메세지를 주고받으면서 연결상태가 유지중인지를 확인합니다.(Connected 상태일때)
2. HSMS Message Format
1️⃣ HSMS Message Format
A) Length (4Byte) : Header(B) + Text(C)의 Byte 크기
B) Header (10Byte) : Session ID, Header Byte2, Header Byte3, PType, SType, System Byte로 구성
C) Text (1-n Byte) : Data Message일 경우에만 해당 Byte의 값이 존재하며, Header의 PType 값에 따라 Format 결정
2️⃣ HSMS Message Header Format
✅ Session ID : 16 Bit Unsigned int 형으로 Control Message와 Data Message간의 주소 연관관계를 제공
✅ Header Byte 2 : Control Message의 경우 0 또는 State Code 값을 가지며
Data Message일 경우 SType이 0일때 W-bit와 SECS-Stream 정보를 가진다.
✅ Header Byte 3 : Control Message의 경우 0 또는 State Code 값을 가지며
Data Message일 경우 SType이 0일때 SECS-Function 정보를 가진다.
(StateCode는 Stype의 값이 0이 아닌 특정한 값일 경우 StateCode 값을 가지게 됩니다.)
✅ PType : 8Bit Unsigned Int형, Message와 Text의 Encoding 방식 결정
Value | Description |
0 | SECS-II encoding |
1 – 127 | Reservation |
128 – 256 | Not used |
※ 거의 항상 Ptype은 0의 값을 가진다고 보시면 됩니다. :)
✅ SType : 8Bit Usngined Int형, 해당 Message와 Type을 알려주는 값
Value | Description |
0 | Data Message |
1 | Select.req |
2 | Select.rsp |
3 | Dselect.req |
4 | Deselect.rsp |
5 | Linktest.req |
6 | Linktest.rsp |
7 | Reject.req |
8 | - |
9 | Serperate.req |
10 | - |
11 – 127 | Reserved for subsidiary standards |
128 - 255 | Reserved, not used |
✅ System Byte : 열려있는 Transaction 중 특정 Transaction 을 구분 하는데 사용됨.
이 값은 Unique해야 하며 해당 Message의 Reply 메시지의 System bytes는 해당 Primary Message의 System bytes 와 같아야 함.
3️⃣ HSMS Message Header SType Format
✅ SType Value : 0 (Data Message)
SType의 값이 0일 경우, 해당 HSMS 메세지가 Control 메세지가 아닌 Data 메세지임을 의미하며,
Header Byte 2는 W-bit와 SECS Stream의 값을 표현하고, Header Byte 3는 SECS Function 값을 표현한다.
(W-bit는 Wait-bit를 의미하며 해당 메세지에 대한 회신(Reply)메세지가 존재할경우 True 값을 가진다.)
✅ SType Value : 2 (Select.rsq)
SType의 값이 2일 경우, Select.req 메세지의 응답인 Select.rsp 메세지로 Header Byte 2는 0, Header Byte 3에는 Select 상태 정보가 들어간다.
Value | Description |
0 | 통신이 성공적으로 성립 됨. |
1 | 통신이 이미 연결되어 있음. |
2 | 통신 연결이 준비 되지 않았음. |
3 | 연결은 되어 있지만 이미 다른 TCP/IP Service 를 하고 있음. |
4 – 127 | 예약 번호 |
128 - 255 | 예약 번호 |
✅ SType Value : 4 (Deselect.rsq)
SType의 값이 4일 경우, Deselect.req 메세지의 응답인 Deslect.rsp 메세지로 Header Byte 2는 0, Header Byte 3에는 Deselect 상태 정보가 들어간다.
Value | Description |
0 | 연결이 성공적으로 종료 됨. |
1 | 이미 종료 되었거나, Select 상태가 아님. |
2 | 연결상태가 Busy 로 정상 종료가 불가능한 상태. |
3 – 127 | 예약 번호 |
128 - 255 | 예약 번호 |
✅ SType Value : 7 (Reject.req)
SType의 값이 7일 경우, Reject.req로 유효하지 않은 메세지에 대한 응답.
Header Byte 2는 0, Header Byte 3에는 Reason Code가 들어간다.
Value | Description |
1 | 지원되지 않는 SType. |
2 | 지원되지 않는 PType. |
3 | Transaction이 열려 있지 않음. |
4 | 통신 상태가 Selected가 아닌 상태에서 Data receive됨. |
5 – 127 | 예약 번호 |
128 - 255 | 예약 번호 |
3. HSMS Timer
※ T3 Time은 SECS-Ⅰ프로토콜과 HSMS프로토콜 공통 Time Parameter이며, 나머지 T5,T6,T7,T8은 HSMS에서만 존재하는 Timeout 입니다.
1️⃣ T3 : Reply Timeout
메시지의 W-bit가 True일 경우에만 해당 시간동안 Reply Message를 대기한다.
설비에서 PrimaryMessage를 전송 후 T3 설정 시간 동안 Reply Message를 못 받을 경우 S9F9메세지를 전송한다.
T3의 시간은 1 ~ 120초 사이의 설정값을 가지며 기본적으로는 45sec의 값을 가진다.
2️⃣ T5 : Connect Separation Timeout
접속 대기시간
Active Entity(Client)가 Passive Entity(Server)에서 접속 종료 되면 T5 Connect Separation Time이 경과 되기 전에는 접속이 불가능 하다.
※ 다른 것은 해당 Time이 경과되면 불이익이 주어졌지만 T5의 경우는 반드시 해당 시간이 경과되고 나서야 연결이 진행되는 것이니 약간 다른 케이스의 Timeout으로 볼 수 있을것 같습니다! 😁
3️⃣ T6 : Control Transactions Timeout
Primary Conrtol Message가 Send 된 후 Secondary Control Message가 오지 않을 경우 발생한다.
즉, <xx>.req 메세지 송신 후, <xx>.rsp 수신하기 위해 대기할 수 있는 최대 시간
만약 T6을 초과하게 된다면 연결은 Disconnected 되며 HSMS Communication Failure로 간주 된다.
4️⃣ T7 : Not Selected Timeout
연결은 되어 있으나 상태가 NotSelected 인 경우 제한시간(T7) 동안 Selected 혹은 Not Connected 상태로 바뀌지 않는 다면 단 하나의 Connection만 Accept 할 수 있는 Entity의 경우 매우 치명적 일 수 있기 때문에 Disconnect 해야 한다.
즉, TCP/IP Connect에 대해 Accept를 하고 Select.req가 오지 않을 경우 발생한다.
5️⃣ T8 : NW Inter-Character Timeout
데이터 문자열 수신 후 다음 문자 데이터를 T8 시간 안에 받지 못할경우 발생
(이는 한 메세지가 분리된 블록(?)으로 전송되는 경우가 있기 때문에 발생하는 타임오버에 해당한다.)
T8 Timeout이 발생할 경우, Separate.Req Message를 전송하고 TCP/IP Connection를 Disconnect 한다.
본문에서는 생략하고 넘어갔지만 추후 HSMS-SS(Single Session)을 한번 공부해보도록 하겠습니다.
요즘에는 일반 HSMS 프로토콜보다 간략화(?) 버전인 HSMS-SS를 선호하고 많이 사용하는것 같습니다!!
댓글