GEM 기능
SEMI E30은 GEM 장비가 제공하는 기능(capability)을 정합니다. 이 페이지는 각 기능의 개념, 쓰는 메시지, PDComm에서 다루는 방법을 설명합니다. 기능별 실습은 링크한 튜토리얼에서 진행합니다.
한눈에 보기
섹션 제목: “한눈에 보기”| 기능 | 주요 메시지 | PDComm | 튜토리얼 |
|---|---|---|---|
| 상태 변수, 데이터 변수 | S1F3, S1F11, S1F21, S1F23 | 내장 API | 데이터 수집 |
| 이벤트 보고서 | S2F33, S2F35, S2F37, S6F11, S6F15–S6F22 | 내장 API | 보고서와 이벤트 |
| 알람 | S5F1–S5F8 | 내장 API | 알람 |
| 원격 명령 | S2F41, S2F49 | 내장 API | 원격 명령 |
| 장비 상수 | S2F13, S2F15, S2F29 | 내장 API | 데이터 수집 |
| 공정 프로그램 | S7F1–S7F6, S7F17–S7F32 | 내장 API | 공정 프로그램 |
| 스풀링 | S2F43, S6F23 | 내장 API | 스풀링 |
| 트레이스 데이터 수집 | S2F23, S6F1 | 일반 송수신 함수 | |
| 시각 동기화 | S2F17, S2F31 | 일반 송수신 함수 | |
| 터미널 서비스 | S10 | 일반 송수신 함수 |
변수와 식별자
섹션 제목: “변수와 식별자”GEM 장비는 값을 변수(variable)로 공개하고, 호스트는 숫자 ID로 변수를 가리킵니다.
| 식별자 | 이름 | 의미 |
|---|---|---|
| SVID | 상태 변수(status variable) ID | 언제든 읽을 수 있는 장비의 현재 값. 예: 장비 상태, 처리한 웨이퍼 수 |
| DVID | 데이터 변수(data variable) ID | 특정 이벤트가 일어날 때만 의미가 있는 값. 예: 방금 끝난 로트 ID |
| ECID | 장비 상수(equipment constant) ID | 호스트가 읽고 바꿀 수 있는 설정 값 |
| CEID | 수집 이벤트(collection event) ID | 장비에서 일어나는 사건. 예: 공정 시작, 공정 끝 |
| RPTID | 보고서(report) ID | 이벤트에 붙여 보낼 변수 묶음 |
| VID | 변수 ID | 보고서에 넣는 변수. SVID, DVID, ECID를 함께 부르는 말 |
호스트는 S1F3으로 상태 변수 값을, S1F11로 상태 변수의 이름과 단위를 읽습니다. S1F21과 S1F23은 데이터 변수와 수집 이벤트의 이름 목록(namelist)을 돌려줍니다.
PDComm 장비는 상태 변수를 RegisterStatus로, 데이터 변수를 ConfigureDataVariables로 등록합니다. 등록은 끝점을 시작하기 전에 합니다. 값은 실행 중에 바꿀 수 있지만 처음 등록한 형식(format)을 유지해야 합니다. 요청에 없는 ID가 있으면 그 자리에 빈 리스트가 들어갑니다. 빈 리스트만으로 변수가 없다고 단정하지는 않습니다.
이벤트 보고서
섹션 제목: “이벤트 보고서”이벤트 보고서(event report)는 GEM 데이터 수집의 중심입니다. 호스트는 “어떤 이벤트가 일어나면 어떤 값을 보내라”고 장비에 미리 설정해 둡니다.
Host Equipment | S2F33 Define Report RPTID 100 = [VID 1, 2] -> | | <- S2F34 DRACK 0 | | S2F35 Link Event CEID 10 -> [RPTID 100] -> | | <- S2F36 LRACK 0 | | S2F37 Enable Event CEID 10 -> | | <- S2F38 ERACK 0 | | | event 10 happens | <- S6F11 Event Report DATAID, CEID 10, | | RPTID 100 = [value 1, value 2] | | S6F12 ACKC6 0 -> |- 보고서 정의(S2F33): 보고서 ID와 그 안에 넣을 변수 ID 목록을 정합니다.
- 이벤트 연결(S2F35): 수집 이벤트 ID에 보고서 ID들을 연결합니다.
- 이벤트 활성화(S2F37): 보고서를 보낼 이벤트를 켭니다.
- 이벤트 보고(S6F11): 이벤트가 일어나면 장비가 연결된 보고서의 현재 값을 담아 보냅니다. 호스트는
S6F12로 확인합니다.
이벤트의 활성화 상태와 보고서 연결은 서로 독립적입니다. 이벤트가 꺼져 있으면 이벤트가 일어나도 S6F11이 오지 않습니다. 켜져 있지만 연결된 보고서가 없으면 장비는 보고서 목록이 빈 S6F11을 보냅니다. S2F37은 장비에 없는 CEID가 있을 때만 ERACK 1로 거부되며, 보고서를 다시 정의하거나 연결을 바꿔도 활성화 상태는 그대로입니다. 호스트는 S6F15(이벤트별), S6F19(보고서별), S6F21(이름이 붙은 보고서)으로 보고서 값을 직접 조회할 수도 있습니다.
PDComm에서 호스트는 DefineReports, LinkReports, EnableEvents를 씁니다. 장비는 PublishEvent나 데이터 변수 값을 함께 넣는 PublishEventWithData로 S6F11을 보냅니다. 장비가 원격 설정을 받지 않고 고정된 보고서 구성으로 동작해야 한다면 ConfigureFixedCatalog으로 시작 전에 설치합니다. 보고서의 각 VID는 상태 변수, 데이터 변수, 장비 상수 중 하나에 연결됩니다.
알람(alarm)은 장비의 이상 상태를 호스트에 알립니다(SEMI E30, 알람 관리).
| 항목 | 의미 |
|---|---|
| ALID | 알람 ID |
| ALCD | 알람 코드. 최상위 비트는 발생(set)과 해제(clear), 나머지 7비트는 분류(category)입니다. |
| ALTX | 알람 설명 문자열 |
| 메시지 | 용도 |
|---|---|
| S5F1/F2 | 장비가 알람 발생·해제를 보고합니다. |
| S5F3/F4 | 호스트가 알람 보고를 켜거나 끕니다. |
| S5F5/F6 | 호스트가 알람 목록을 요청합니다. |
| S5F7/F8 | 호스트가 켜진 알람 목록을 요청합니다. |
PDComm 장비는 알람 정의를 ConfigureAlarms로 설치합니다. ObserveAlarm은 알람의 활성 상태만 바꾸며 메시지를 보내지 않습니다. 호스트에 알리려면 PublishAlarm으로 S5F1을 보냅니다. 응답을 기다릴지(W 비트)는 호출할 때 정합니다. 호스트는 EnableAlarm과 RequestAlarmList를 씁니다.
원격 명령
섹션 제목: “원격 명령”원격 명령(remote command)은 호스트가 장비에 동작을 지시하는 방법입니다. 예를 들어 START, STOP, PP-SELECT 같은 명령을 보냅니다.
- S2F41 Host Command Send: 명령 이름(RCMD)과 매개변수 이름·값 쌍(CPNAME/CPVAL) 목록을 보냅니다.
- S2F49 Enhanced Remote Command: 대상 객체(OBJSPEC)와 중첩·반복 구조의 매개변수를 보낼 수 있는 확장 형식입니다.
- 장비는 HCACK와 매개변수별 오류(CPACK)로 응답합니다.
| HCACK | 의미 |
|---|---|
| 0 | 수락, 명령 실행됨 |
| 1 | 명령이 없음 |
| 2 | 지금은 실행할 수 없음 |
| 3 | 매개변수 오류가 하나 이상 있음 |
| 4 | 수락, 완료는 나중에 이벤트로 알림 |
| 5 | 이미 원하는 상태여서 거부 |
| 6 | 대상 객체가 없음 |
HCACK 0이나 4는 명령을 받았다는 뜻일 뿐, 장비가 실제 작업을 끝냈다는 뜻이 아닙니다. 완료는 보통 별도의 수집 이벤트로 보고합니다.
PDComm 장비는 명령 카탈로그를 ConfigureCommands로 설치합니다. 정의에는 매개변수의 형식, 개수, 범위, 필수 여부, ON-LINE REMOTE 필요 여부, 완료 이벤트를 넣을 수 있습니다. PDComm이 카탈로그로 요청을 검증하고, 최종 응답은 애플리케이션이 RespondCommand로 결정합니다. 호스트는 RemoteCommand와 EnhancedRemoteCommand를 씁니다.
장비 상수
섹션 제목: “장비 상수”장비 상수(equipment constant)는 호스트가 바꿀 수 있는 장비 설정입니다. 예를 들어 통신 재시도 간격이나 공정 한계값이 있습니다.
| 메시지 | 용도 |
|---|---|
| S2F13/F14 | 상수 값을 읽습니다. |
| S2F15/F16 | 상수 값을 바꿉니다. 응답의 EAC가 0이면 수락입니다. |
| S2F29/F30 | 상수의 이름, 단위, 최솟값, 최댓값, 기본값을 읽습니다. |
PDComm 장비는 상수 저장소를 ConfigureConstants로 설치합니다. 값 변경 요청(S2F15)은 애플리케이션이 RespondConstants로 적용(0), 실행 불가(2), 범위 밖(3) 중 하나로 응답합니다. 응답이 수락이어도 값이 실제로 적용됐는지는 다시 읽어 확인합니다.
공정 프로그램
섹션 제목: “공정 프로그램”공정 프로그램(process program)은 장비가 제품을 처리하는 방법을 담은 레시피(recipe)입니다. 프로그램은 PPID라는 이름으로 구분하고, 내용은 PPBODY입니다.
비정형 프로그램(unformatted): 내용을 장비만 해석하는 바이트나 문자열로 주고받습니다.
| 메시지 | 용도 |
|---|---|
| S7F1/F2 | 큰 프로그램을 보내기 전에 받을 수 있는지 묻습니다(load inquire/grant). |
| S7F3/F4 | 프로그램을 보냅니다. |
| S7F5/F6 | 프로그램을 요청합니다. |
| S7F17/F18 | 프로그램을 지웁니다. |
| S7F19/F20 | 장비의 프로그램 목록을 요청합니다. |
정형 프로그램(formatted): 내용을 명령과 매개변수 구조로 주고받아 양쪽이 검증할 수 있습니다. S7F21–S7F32는 장비의 공정 능력(capability) 조회, 정형 프로그램 전송과 요청, 검증 보고와 검증 협상, 검증 요청을 다룹니다.
PDComm은 두 방식을 모두 제공합니다. S7F1–S7F6은 호스트와 장비 어느 쪽에서나 보낼 수 있고, 삭제와 목록 요청은 호스트가 보냅니다. 정형 프로그램은 GemEndpoint.FormattedPrograms 서비스로 다룹니다. PDComm은 여기에 로컬 저장소, 프로그램 선택, 시험 실행(dry run), 실행 단계 추적 같은 애플리케이션용 도구를 더합니다. 실제 장비 동작은 애플리케이션이 구현합니다.
스풀링
섹션 제목: “스풀링”스풀링(spooling)은 통신이 끊긴 동안 보내지 못한 메시지를 장비가 저장해 두었다가 나중에 보내는 기능입니다.
- 호스트가
S2F43으로 어떤 스트림과 펑션의 메시지를 스풀할지 정합니다. - 통신이 끊긴 동안 장비는 해당 메시지를 스풀에 쌓습니다.
- 통신이 다시 수립되면 호스트가
S6F23으로 스풀 데이터를 보내라(transmit, 0) 또는 버려라(purge, 1)고 요청합니다. - 장비가 쌓인 메시지를 차례로 보냅니다.
PDComm 장비는 ConfigureSpooling으로 스풀을 설정합니다. 파일 경로를 주면 스풀을 파일에 보존합니다. 메시지는 CaptureSpool, CaptureSpoolEvent, CaptureSpoolAlarm으로 쌓고 SendNextSpool로 보냅니다. 호스트는 RequestSpoolConfiguration과 RequestSpooledData를 씁니다. PDComm은 현재 스풀 선택을 조회하는 요청(S2F59/S2F60)도 제공합니다. 송신을 접수한 것과 상대가 받은 것, 저장소에서 지운 것은 서로 다른 단계이므로 각 결과를 따로 확인합니다.
일반 송수신 함수로 다루는 기능
섹션 제목: “일반 송수신 함수로 다루는 기능”다음 GEM 기능은 HSMS 끝점의 일반 송수신 함수(pdcomm_tcp_request, pdcomm_tcp_reply)로 SECS-II 메시지를 주고받아 애플리케이션에서 구현합니다.
- 트레이스 데이터 수집(trace data collection):
S2F23으로 주기적인 샘플링을 설정하고S6F1로 값을 받는 기능입니다. - 시각 동기화(clock):
S2F17/S2F18로 시각을 묻고S2F31/S2F32로 맞추는 기능입니다. - 터미널 서비스(terminal services):
S10으로 운영자 화면에 메시지를 표시하는 기능입니다.
본문이 item_limits를 넘거나 한 프레임(max_frame_bytes)에 들어가지 않으면 두 함수는 PDCOMM_LIMIT_EXCEEDED를 돌려줍니다. 메시지 구조는 SECS-II 메시지를 참고합니다.