콘텐츠로 이동
무료 평가 시작

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로 응답합니다.
  • 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(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은 아이템을 불변(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을 참고합니다.