SECS-II 메시지
SECS-II(SEMI E5)는 장비와 호스트가 주고받는 메시지의 구조와 의미를 정합니다. 메시지를 어떤 회선으로 보내는지는 정하지 않습니다. 같은 SECS-II 메시지가 HSMS(TCP/IP)로도, SECS-I(RS-232)로도 전달됩니다.
메시지 구조
섹션 제목: “메시지 구조”SECS-II 메시지는 헤더(header)와 본문(body)으로 이뤄집니다. 본문은 없을 수도 있습니다. 헤더 정보는 다음과 같습니다.
| 헤더 정보 | 의미 |
|---|---|
| 장치 ID(device ID) | 메시지가 오가는 장비를 구분합니다. HSMS에서는 세션 ID(session ID)라고 부릅니다. |
| 스트림(stream) | 메시지의 분류입니다. 1–127 범위입니다. |
| 펑션(function) | 분류 안의 개별 메시지입니다. 0–255 범위입니다. |
| W 비트(W-bit) | 송신자가 응답을 기다리는지 표시합니다. |
| 시스템 바이트(system bytes) | 요청과 응답을 짝짓는 4바이트 거래(transaction) 번호입니다. |
메시지는 S1F3처럼 스트림과 펑션 번호로 부릅니다. S는 스트림, F는 펑션입니다. 응답을 기다리는 메시지에는 S1F3 W처럼 W를 붙여 적습니다.
스트림과 펑션
섹션 제목: “스트림과 펑션”스트림은 기능 영역을 나눕니다. 이 SDK에서 자주 만나는 스트림은 다음과 같습니다.
| 스트림 | 영역 |
|---|---|
| S1 | 장비 상태(equipment status): 연결 확인, 상태 변수 읽기, 통신 수립, 온라인·오프라인 |
| S2 | 장비 제어와 진단(equipment control and diagnostics): 장비 상수, 보고서 정의, 원격 명령 |
| S5 | 예외 처리(exception handling): 알람 |
| S6 | 데이터 수집(data collection): 이벤트 보고서, 스풀 데이터 |
| S7 | 공정 프로그램 관리(process program management) |
| S9 | 시스템 오류(system errors): 알 수 없는 장치 ID, 스트림, 펑션 등의 통지 |
| S10 | 터미널 서비스(terminal services): 운영자 화면 메시지 |
펑션 번호에는 규칙이 있습니다.
- 홀수 펑션은 1차 메시지(primary message)입니다. 대화를 시작합니다.
- 짝수 펑션은 2차 메시지(secondary message), 즉 응답입니다. 응답의 펑션 번호는 요청의 펑션 번호에 1을 더한 값입니다.
S1F3의 응답은S1F4입니다. - 펑션 0(
F0)은 거래 중단(abort transaction)입니다. 받은 요청에 정상 응답을 할 수 없을 때 같은 스트림의F0로 응답합니다.
W 비트와 응답 규칙
섹션 제목: “W 비트와 응답 규칙”- 1차 메시지에 W 비트가 켜져 있으면 받은 쪽은 반드시 응답해야 합니다.
- W 비트가 꺼진 1차 메시지에는 응답하지 않습니다. 일부 메시지는 W 비트 없이 보내도 됩니다.
- 응답 메시지에는 W 비트를 켜지 않습니다.
- 응답은 요청과 같은 시스템 바이트를 씁니다. 송신자는 시스템 바이트로 응답을 원래 요청에 연결합니다.
- 응답이 정해진 시간 안에 오지 않으면 응답 타임아웃(reply timeout, T3)입니다. T3는 HSMS와 SECS-I에서 설명합니다.
송신자는 동시에 진행 중인 거래마다 서로 다른 시스템 바이트를 씁니다. PDComm HSMS 끝점(endpoint)은 initial_system_bytes 값부터 번호를 매기며, 응답을 기다리는 요청을 최대 32개까지 추적합니다(PDCOMM_TCP_MAX_TRANSACTIONS). 응답이 오면 이벤트의 토큰(token)이 원래 요청의 토큰과 같습니다.
데이터 아이템
섹션 제목: “데이터 아이템”본문은 하나의 아이템(item)입니다. 아이템은 리스트(list) 아니면 값을 담은 기본 아이템(primitive item)입니다. 리스트는 다른 아이템을 담으므로 트리(tree) 구조를 만들 수 있습니다.
인코딩
섹션 제목: “인코딩”모든 아이템은 다음 순서로 인코딩됩니다(SEMI E5, 데이터 구조와 아이템 형식).
+-------------+----------------------+------------------------+| format byte | length bytes (1..3) | data |+-------------+----------------------+------------------------+ bits 7..2: format code bits 1..0: number of length bytes (1, 2 or 3)- 형식 바이트(format byte)의 상위 6비트는 형식 코드(format code)이고, 하위 2비트는 길이 바이트 수입니다.
- 길이는 기본 아이템이면 데이터의 바이트 수, 리스트면 요소 개수입니다.
- 길이 바이트가 3개면 최대 16,777,215를 표현합니다.
- 숫자는 빅 엔디언(big-endian)입니다. 기본 아이템 하나에 같은 형식의 값을 여러 개(배열) 담을 수 있습니다.
형식 코드
섹션 제목: “형식 코드”표준은 형식 코드를 8진수로 적습니다. PDComm 상수의 값은 6비트 형식 코드를 10진수로 쓴 값입니다.
| 기호 | 형식 | 8진 코드 | 요소 크기 | C 상수 | .NET SecsFormat |
|---|---|---|---|---|---|
| L | 리스트 | 00 | 요소 개수 | PDCOMM_SECS_LIST (0) |
List |
| B | 바이너리(binary) | 10 | 1 | PDCOMM_SECS_BINARY (8) |
Binary |
| BOOLEAN | 불리언(boolean) | 11 | 1 | PDCOMM_SECS_BOOLEAN (9) |
Boolean |
| A | ASCII 문자열 | 20 | 1 | PDCOMM_SECS_ASCII (16) |
Ascii |
| J | JIS-8 문자열 | 21 | 1 | PDCOMM_SECS_JIS8 (17) |
Jis8 |
| I8 | 8바이트 부호 있는 정수 | 30 | 8 | PDCOMM_SECS_I8 (24) |
I8 |
| I1 | 1바이트 부호 있는 정수 | 31 | 1 | PDCOMM_SECS_I1 (25) |
I1 |
| I2 | 2바이트 부호 있는 정수 | 32 | 2 | PDCOMM_SECS_I2 (26) |
I2 |
| I4 | 4바이트 부호 있는 정수 | 34 | 4 | PDCOMM_SECS_I4 (28) |
I4 |
| F8 | 8바이트 부동소수점 | 40 | 8 | PDCOMM_SECS_F8 (32) |
F8 |
| F4 | 4바이트 부동소수점 | 44 | 4 | PDCOMM_SECS_F4 (36) |
F4 |
| U8 | 8바이트 부호 없는 정수 | 50 | 8 | PDCOMM_SECS_U8 (40) |
U8 |
| U1 | 1바이트 부호 없는 정수 | 51 | 1 | PDCOMM_SECS_U1 (41) |
U1 |
| U2 | 2바이트 부호 없는 정수 | 52 | 2 | PDCOMM_SECS_U2 (42) |
U2 |
| U4 | 4바이트 부호 없는 정수 | 54 | 4 | PDCOMM_SECS_U4 (44) |
U4 |
PDComm은 위 15개 형식을 지원합니다.
인코딩 예
섹션 제목: “인코딩 예”형식이 다르면 같은 숫자처럼 보여도 다른 값입니다. U4 0과 ASCII 문자열 "0"은 바이트가 다르고, 받는 쪽은 형식까지 비교합니다.
| 값 | 인코딩(16진) |
|---|---|
<A "IDLE"> |
41 04 49 44 4C 45 |
<U4 0> |
B1 04 00 00 00 00 |
<F4 21.5> |
91 04 41 AC 00 00 |
<L [2] ...> 리스트 헤더 |
01 02 뒤에 두 요소의 인코딩 |
41은 형식 코드 20(8진, ASCII)과 길이 바이트 1개를 합친 값입니다. B1은 U4, 91은 F4입니다.
SML로 메시지 읽기
섹션 제목: “SML로 메시지 읽기”로그와 문서에서는 SML(SECS Message Language)이라는 텍스트 표기를 흔히 씁니다. SML은 SEMI 표준이 아니지만 업계에서 널리 쓰는 관례입니다. 다음은 호스트가 상태 변수 1, 2의 값을 묻고 장비가 답하는 거래입니다.
S1F3 W<L [2] <U4 1> <U4 2>>.
S1F4<L [2] <F4 21.5> <A "LOT-001">>.S1F4 본문은 바이트로 01 02 91 04 41 AC 00 00 41 07 4C 4F 54 2D 30 30 31입니다. PDComm 튜토리얼 예제는 받은 본문을 이처럼 16진수로 출력합니다. 응답 리스트의 순서는 요청한 ID의 순서와 같습니다.
자주 쓰는 메시지
섹션 제목: “자주 쓰는 메시지”다음 표는 GEM에서 자주 쓰는 메시지와 PDComm이 처리하는 방식입니다. “내장”은 PDComm GEM API가 메시지를 만들고 해석한다는 뜻입니다. 방향의 H는 호스트, E는 장비입니다.
| 메시지 | 이름 | 방향 | PDComm |
|---|---|---|---|
| S1F1/F2 | Are You There / On Line Data | H↔E | 내장. 장비는 모델 이름과 소프트웨어 버전으로 답합니다. |
| S1F3/F4 | Selected Equipment Status | H→E | 내장 |
| S1F11/F12 | Status Variable Namelist | H→E | 내장 |
| S1F13/F14 | Establish Communications | H↔E | 내장 |
| S1F15/F16 | Request OFF-LINE | H→E | 내장 |
| S1F17/F18 | Request ON-LINE | H→E | 내장 |
| S1F21/F22 | Data Variable Namelist | H→E | 내장 |
| S1F23/F24 | Collection Event Namelist | H→E | 내장 |
| S2F13/F14 | Equipment Constant Request | H→E | 내장 |
| S2F15/F16 | New Equipment Constant Send | H→E | 내장. 수락 여부는 애플리케이션이 결정합니다. |
| S2F29/F30 | Equipment Constant Namelist | H→E | 내장 |
| S2F33/F34 | Define Report | H→E | 내장 |
| S2F35/F36 | Link Event Report | H→E | 내장 |
| S2F37/F38 | Enable/Disable Event Report | H→E | 내장 |
| S2F41/F42 | Host Command Send | H→E | 내장. 수락 여부는 애플리케이션이 결정합니다. |
| S2F43/F44 | Reset Spooling Streams and Functions | H→E | 내장 |
| S2F49/F50 | Enhanced Remote Command | H→E | 내장. 수락 여부는 애플리케이션이 결정합니다. |
| S5F1/F2 | Alarm Report Send | E→H | 내장 |
| S5F3/F4 | Enable/Disable Alarm Send | H→E | 내장 |
| S5F5/F6 | List Alarms Request | H→E | 내장 |
| S5F7/F8 | List Enabled Alarm Request | H→E | 내장 |
| S6F11/F12 | Event Report Send | E→H | 내장 |
| S6F15/F16, S6F19/F20, S6F21/F22 | 이벤트·보고서 조회(event and report request) | H→E | 내장 |
| S6F23/F24 | Request Spooled Data | H→E | 내장 |
| S7F1/F2, S7F3/F4, S7F5/F6 | Process Program Load Inquire, Send, Request | H↔E | 내장 |
| S7F17/F18 | Delete Process Program Send | H→E | 내장 |
| S7F19/F20 | Current Process Program Directory | H→E | 내장 |
| S7F21–S7F32 | 정형 공정 프로그램(formatted process program)과 검증 | H↔E | 내장 |
| S9F1–S9F13 | 오류 통지 | E→H | SDK는 자동으로 보내지 않습니다. 시뮬레이터는 처리하지 않은 메시지에 S9F3, S9F5, S9F7을 보냅니다. |
| S2F17/F18, S2F23, S6F1, S10 | 시각, 트레이스(trace), 터미널 서비스 | 다양 | 일반 송수신 함수로 주고받습니다. |
GEM API가 처리하지 않는 1차 메시지는 결과 종류가 Unhandled입니다. 이때 애플리케이션이 원래 이벤트로 직접 응답하거나 F0로 거래를 중단합니다. PDComm SDK는 S9 오류 메시지를 보내지 않으며, 받기 슬롯이 모두 찬 경우를 빼면 F0도 자동으로 보내지 않습니다. PDComm 시뮬레이터가 이런 메시지에 어떻게 답하는지는 상태 코드에서 설명합니다. 그 밖의 메시지는 HSMS 끝점의 일반 송수신 함수 pdcomm_tcp_request와 pdcomm_tcp_reply로 SECS-II 메시지를 직접 주고받아 구현할 수 있습니다. 본문이 아이템 한도를 넘거나 한 프레임에 들어가지 않으면 두 함수는 PDCOMM_LIMIT_EXCEEDED를 돌려줍니다. 각 기능의 의미는 GEM 기능에서 설명합니다.
PDComm에서 아이템 다루기
섹션 제목: “PDComm에서 아이템 다루기”PDComm은 아이템을 불변(immutable) 객체로 다룹니다. 아이템을 만들 때 크기 한도(limits)를 함께 넘깁니다. 한도(PdcommSecsLimits)는 메시지 바이트 수, 아이템 바이트 수, 아이템 개수, 중첩 깊이(nesting depth)를 제한하며 애플리케이션이 정합니다. 중첩 깊이는 한도와 상관없이 64를 넘을 수 없습니다.
| 작업 | C | C++ | .NET |
|---|---|---|---|
| 기본 아이템 만들기 | pdcomm_secs_primitive |
SecsItem::primitive |
SecsItem.FromAscii, FromF4, FromU4 |
| 리스트 만들기 | pdcomm_secs_list |
SecsItem::list |
SecsItem.CreateList |
| 바이트로 인코딩 | pdcomm_secs_encode |
SecsItem::bytes |
SecsItem.Encode |
| 바이트에서 디코딩 | pdcomm_secs_decode |
SecsItem::decode |
SecsItem.Decode |
예를 들어 튜토리얼 예제는 C#에서 SecsItem.FromF4([21.5f], ...)로 <F4 21.5>를, C++에서 pdcomm::SecsItem::primitive(PDCOMM_SECS_ASCII, ...)로 <A "LOT-001">을 만듭니다. 전체 타입은 SecsItem와 SecsItem을 참고합니다.