pdcomm::GemHost
클래스
HSMS 끝점(SEMI E37) 하나에서 동작하는 GEM 호스트 역할(SEMI E30)입니다.
class GemHost final : public GemEndpoint생성자는 중지된 TcpEndpoint에 호스트 역할을 구성합니다. start() 후에는 poll()과 handleEvent()로 끝점을 구동합니다. HSMS 세션이 선택(selected)되면 beginCommunication()으로 통신을 수립한 뒤 요청을 보냅니다. 모든 요청 메서드는 메시지가 큐에 들어가는 즉시 PdcommTcpToken을 반환합니다. 응답, 실패, 타임아웃(timeout)은 나중에 같은 토큰을 가진 GemResult로 도착합니다.
요청은 끝점의 네이티브 대기 슬롯 32개(모두 사용 중이면 PDCOMM_BACKPRESSURE)와 복사된 ID용 max_pending_ids 예산(PDCOMM_LIMIT_EXCEEDED)을 함께 사용합니다. 대부분의 요청에는 GemCommunication::Communicating 상태가 필요하며, 그렇지 않으면 PDCOMM_INVALID_STATE로 실패합니다. 입력은 호출이 반환되기 전에 복사됩니다.
들어오는 S6F11 이벤트 보고서(event report)와 S5F1 알람 보고서에는 자동으로 확인 응답하지 않습니다. 애플리케이션이 처리한 뒤 acknowledgeEvent() 또는 acknowledgeAlarm()을 호출해야 합니다.
const auto limits = pdcomm::secsLimits(4096, 4096, 128, 8);
pdcomm::TcpEndpoint transport(address, tcpOptions(PDCOMM_TCP_ACTIVE));
pdcomm::GemHost host(std::move(transport), pdcomm::gemHostOptions(limits, 64));
host.start();
// When host.tcp().state().state == PDCOMM_TCP_SELECTED:
host.beginCommunication();
// After a result with GemOutcome::CommunicationEstablished:
host.request(pdcomm::GemRequest::AreYouOnline);
host.request(pdcomm::GemRequest::StatusValues, {1, 2});참고
- 이동 전용(move-only)입니다. 한 끝점에 대한 모든 호출은 직렬화해야 합니다(GemEndpoint 참고).
멤버
GemHost
생성자
endpoint의 소유권을 가져와 GEM 호스트로 구성합니다.
GemHost(TcpEndpoint &&endpoint, const PdcommGemHostOptions &options)매개변수
| 이름 | 설명 |
|---|---|
endpoint | GEM 역할이 없는 중지된 HSMS 끝점입니다. 이 객체로 이동되며, 생성자가 예외를 던지면 파괴됩니다. |
options | gemHostOptions()로 만든 호스트 옵션입니다. |
참고
- 예외
pdcomm::Error: 끝점이 중지 상태가 아니거나 이미 GEM 역할이 있으면PDCOMM_INVALID_STATE,struct_size, 버전 또는 아이템 한도가 잘못되면PDCOMM_INVALID_ARGUMENT입니다.
acknowledgeAlarm
메서드
응답을 기대하는 받은 S5F1 알람 보고서에 대해 S5F2를 보냅니다.
void acknowledgeAlarm(GemResult &result, uint8_t acknowledgement)응답이 전송용으로 수락된 뒤에만 결과가 확인 응답됨으로 표시됩니다. PDCOMM_ALLOCATION_FAILED 또는 PDCOMM_BACKPRESSURE 후에는 다시 시도할 수 있습니다.
매개변수
| 이름 | 설명 |
|---|---|
result | 이 끝점에서 받은 GemOutcome::AlarmReceived 결과입니다. |
acknowledgement | ACKC5이며, 0부터 63까지입니다(0은 수락). |
참고
- 예외
pdcomm::Error: W 비트가 없는 보고서이면PDCOMM_INVALID_STATE, 중복 확인 응답, 다른 끝점, 이전 연결 또는 선택, 소비된 슬롯이면PDCOMM_STALE_TOKEN입니다. - 이 호출은
result를 변경합니다. 같은 결과의 getter와 동시에 실행하면 안 됩니다.
acknowledgeEvent
메서드
받은 S6F11 이벤트 보고서에 대해 S6F12를 보냅니다.
void acknowledgeEvent(GemResult &result, uint8_t acknowledgement)애플리케이션이 보고서를 수락하거나 거부한 뒤에만 확인 응답해야 합니다. 성공하면 결과가 확인 응답됨으로 표시됩니다. PDCOMM_ALLOCATION_FAILED 또는 PDCOMM_BACKPRESSURE 후에는 확인 응답만 다시 시도할 수 있습니다.
매개변수
| 이름 | 설명 |
|---|---|
result | 이 끝점에서 받은 GemOutcome::EventReceived 결과입니다. |
acknowledgement | ACKC6이며, 0부터 63까지입니다(0은 수락). |
참고
- 예외
pdcomm::Error: 중복 확인 응답, 다른 끝점, 이전 연결 또는 선택, 소비된 슬롯이면PDCOMM_STALE_TOKEN, 63보다 큰 코드이면PDCOMM_INVALID_ARGUMENT입니다. - 이 호출은
result를 변경합니다. 같은 결과의 getter와 동시에 실행하면 안 됩니다.
annotatedQuery
메서드
S6F21 Annotated Individual Report Request를 보냅니다.
PdcommTcpToken annotatedQuery(uint32_t reportId)매개변수
| 이름 | 설명 |
|---|---|
reportId | 보고할 RPTID입니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: reportQuery()와 같은 상태입니다.
beginCommunication
메서드
S1F13 Establish Communications Request를 보냅니다.
PdcommTcpToken beginCommunication()HSMS에서 선택된 세션이 GemCommunication::NotCommunicating 상태여야 합니다. 상태는 GemCommunication::WaitingAck가 되며, S1F14 응답은 GemOutcome::CommunicationEstablished 또는 GemOutcome::CommunicationRejected 결과로 도착합니다.
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 연결되지 않았거나 NotCommunicating 상태가 아니면PDCOMM_INVALID_STATE, 빈 대기 슬롯이 없으면PDCOMM_BACKPRESSURE입니다.
changeConstants
메서드
S2F15 New Equipment Constant Send를 보냅니다.
PdcommTcpToken changeConstants(const std::vector<GemConstantChange> &changes)S2F16 응답은 EAC를 담은 GemOutcome::ConstantChangeAck 결과로 도착합니다. EAC 0만으로는 실제 물리적 변경이 일어났는지 호스트가 알 수 없습니다.
매개변수
| 이름 | 설명 |
|---|---|
changes | (ECID, ECV) 쌍입니다. 아이템은 호출하는 동안 빌려 씁니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 통신 중이 아니면PDCOMM_INVALID_STATE,nullptr아이템이면PDCOMM_INVALID_ARGUMENT, 메시지가 아이템 한도를 넘으면PDCOMM_LIMIT_EXCEEDED입니다.
configureRemoteSpooling
메서드
S2F43 Reset Spooling Streams and Functions를 보냅니다.
PdcommTcpToken configureRemoteSpooling(const std::vector<GemSpoolSelection> &selections)요청이 대기 중인 동안 각 스트림과 그 펑션은 max_pending_items와 공유 max_pending_ids 한도에 포함됩니다. S2F44 응답은 GemOutcome::SpoolConfigurationAck 결과로 도착합니다.
매개변수
| 이름 | 설명 |
|---|---|
selections | 스풀링할 스트림입니다. 펑션 목록이 비어 있으면 해당 스트림의 모든 1차 메시지를 선택합니다. 빈 벡터이면 모든 스트림의 스풀링을 끕니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 스풀 한도가 구성되지 않았거나 호스트가 통신 중이 아니면PDCOMM_INVALID_STATE, 요청 한도를 넘으면PDCOMM_LIMIT_EXCEEDED입니다.
configureSpoolHost
메서드
주어진 한도로 호스트 스풀 요청(S2F43, S2F59, S6F23)을 활성화합니다.
void configureSpoolHost(const GemSpoolHostOptions &options)끝점이 중지된 동안 한 번 호출합니다. 호스트는 요청 한도만 저장합니다.
매개변수
| 이름 | 설명 |
|---|---|
options | gemSpoolHostOptions()로 만든 한도입니다. |
참고
- 예외
pdcomm::Error: 끝점이 중지 상태가 아니거나 한도가 이미 설정되었으면PDCOMM_INVALID_STATE, 옵션이 잘못되면PDCOMM_INVALID_ARGUMENT입니다.
constantMetadata
메서드
S2F29 Equipment Constant Namelist Request를 보냅니다.
PdcommTcpToken constantMetadata(const std::vector<const SecsItem *> &ids = {})매개변수
| 이름 | 설명 |
|---|---|
ids | ECID 아이템입니다. 비어 있으면 모든 상수를 요청합니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: constantRequest()와 같은 상태입니다.
constantRequest
메서드
장비 상수(equipment constant)에 대한 S2F13(값) 또는 S2F29(이름 목록) 요청을 보냅니다.
PdcommTcpToken constantRequest(GemConstantRequest kind, const std::vector<const SecsItem *> &ids = {})명시한 ID는 순서, 중복, 아이템 형식을 그대로 유지하며, 상태 요청과 max_pending_ids를 공유합니다. 범위와 형식은 호스트가 아니라 장비가 강제합니다.
매개변수
| 이름 | 설명 |
|---|---|
kind | GemConstantRequest::Values 또는 GemConstantRequest::Metadata입니다. |
ids | ECID 아이템이며, 보내기 전에 복사됩니다. 비어 있으면 모든 상수를 요청합니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 통신 중이 아니면PDCOMM_INVALID_STATE, ID가max_pending_ids또는 아이템 한도를 넘으면PDCOMM_LIMIT_EXCEEDED,nullptrID이면PDCOMM_INVALID_ARGUMENT입니다.
constantValues
메서드
S2F13 Equipment Constant Request를 보냅니다.
PdcommTcpToken constantValues(const std::vector<const SecsItem *> &ids = {})매개변수
| 이름 | 설명 |
|---|---|
ids | ECID 아이템입니다. 비어 있으면 모든 상수를 요청합니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: constantRequest()와 같은 상태입니다.
dataDirectory
메서드
S1F21 Data Variable Namelist Request를 보냅니다.
PdcommTcpToken dataDirectory(const std::vector<uint32_t> &ids = {})매개변수
| 이름 | 설명 |
|---|---|
ids | DVID입니다. 비어 있으면 전체를 요청합니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: directoryRequest()와 같은 상태입니다.
defineReports
메서드
S2F33 Define Report를 보냅니다.
PdcommTcpToken defineReports(uint32_t dataId, const std::vector<GemReportSpec> &specs)S2F34 응답은 GemResultInfo::acknowledgement에 DRACK을 담은 GemOutcome::DefineReportsAck 결과로 도착합니다.
매개변수
| 이름 | 설명 |
|---|---|
dataId | 메시지의 DATAID입니다. |
specs | 정의할 보고서(report)입니다. 빈 벡터이면 모든 보고서와 연결을 삭제합니다. VID가 없는 사양은 해당 보고서를 삭제합니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 통신 중이 아니면PDCOMM_INVALID_STATE, 메시지가 아이템 한도를 넘으면PDCOMM_LIMIT_EXCEEDED입니다.
directoryRequest
메서드
S1F21(데이터 변수) 또는 S1F23(수집 이벤트) 이름 목록(namelist) 요청을 보냅니다.
PdcommTcpToken directoryRequest(GemDirectoryKind kind, const std::vector<uint32_t> &ids = {})명시한 ID는 순서, 중복, 알 수 없음 표시를 그대로 유지합니다. 선택된 응답은 정확히 그 ID를 같은 순서로 반환해야 합니다.
매개변수
| 이름 | 설명 |
|---|---|
kind | GemDirectoryKind::Data 또는 GemDirectoryKind::Event입니다. |
ids | DVID 또는 CEID이며, 보내기 전에 복사됩니다. 비어 있으면 모든 행을 요청합니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 통신 중이 아니면PDCOMM_INVALID_STATE, ID가max_pending_ids또는 아이템 한도를 넘으면PDCOMM_LIMIT_EXCEEDED입니다.
enableAlarm
메서드
S5F3 Enable/Disable Alarm Send를 보냅니다.
PdcommTcpToken enableAlarm(uint32_t id, bool enabled, bool replyExpected = true)replyExpected를 설정하면 S5F4 응답이 GemOutcome::AlarmEnableAck 결과로 도착합니다.
매개변수
| 이름 | 설명 |
|---|---|
id | 변경할 ALID입니다. |
enabled | ALED입니다. true이면 보고를 활성화하고, false이면 비활성화합니다. |
replyExpected | W 비트를 설정합니다. 설정하지 않으면 응답을 기대하지 않습니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 통신 중이 아니면PDCOMM_INVALID_STATE, 빈 대기 슬롯이 없으면PDCOMM_BACKPRESSURE입니다.
enableEvents
메서드
S2F37 Enable/Disable Event Report를 보냅니다.
PdcommTcpToken enableEvents(bool enabled, const std::vector<uint32_t> &eventIds = {})S2F38 응답은 ERACK을 담은 GemOutcome::EnableEventsAck 결과로 도착합니다.
매개변수
| 이름 | 설명 |
|---|---|
enabled | CEED입니다. true이면 활성화하고, false이면 비활성화합니다. |
eventIds | 변경할 CEID입니다. 비어 있으면 연결 여부와 관계없이 모든 이벤트를 선택합니다. 없는 CEID만 거부됩니다(ERACK 1). |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 통신 중이 아니면PDCOMM_INVALID_STATE, 메시지가 아이템 한도를 넘으면PDCOMM_LIMIT_EXCEEDED입니다.
enhancedRemoteCommand
메서드
S2F49 Enhanced Remote Command를 보냅니다.
PdcommTcpToken enhancedRemoteCommand(uint32_t dataId, const SecsItem &object, const SecsItem &name, const std::vector<GemCommandParameter> ¶meters = {})S2F50 응답은 GemOutcome::EnhancedCommandAck 결과로 도착합니다.
매개변수
| 이름 | 설명 |
|---|---|
dataId | 메시지의 DATAID입니다. |
object | OBJSPEC입니다. ASCII 아이템이어야 합니다. |
name | RCMD 아이템입니다. |
parameters | (CPNAME, CEPVAL) 쌍입니다. 값은 JIS-8을 뺀 모든 형식의 리스트일 수 있습니다. 호출하는 동안 빌려 씁니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 통신 중이 아니면PDCOMM_INVALID_STATE, ASCII가 아닌 대상 객체이거나nullptr아이템이거나 JIS-8 값이면PDCOMM_INVALID_ARGUMENT, 메시지가 아이템 한도를 넘으면PDCOMM_LIMIT_EXCEEDED입니다.
eventDirectory
메서드
S1F23 Collection Event Namelist Request를 보냅니다.
PdcommTcpToken eventDirectory(const std::vector<uint32_t> &ids = {})매개변수
| 이름 | 설명 |
|---|---|
ids | CEID입니다. 비어 있으면 전체를 요청합니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: directoryRequest()와 같은 상태입니다.
eventQuery
메서드
S6F15 Event Report Request를 보냅니다.
PdcommTcpToken eventQuery(uint32_t eventId)매개변수
| 이름 | 설명 |
|---|---|
eventId | 보고할 CEID입니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: reportQuery()와 같은 상태입니다.
individualQuery
메서드
S6F19 Individual Report Request를 보냅니다.
PdcommTcpToken individualQuery(uint32_t reportId)매개변수
| 이름 | 설명 |
|---|---|
reportId | 보고할 RPTID입니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: reportQuery()와 같은 상태입니다.
linkReports
메서드
S2F35 Link Event Report를 보냅니다.
PdcommTcpToken linkReports(uint32_t dataId, const std::vector<GemLinkSpec> &specs)S2F36 응답은 LRACK을 담은 GemOutcome::LinkReportsAck 결과로 도착합니다.
매개변수
| 이름 | 설명 |
|---|---|
dataId | 메시지의 DATAID입니다. |
specs | 이벤트 연결입니다. 보고서 목록이 비어 있으면 해당 이벤트의 연결을 해제합니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 통신 중이 아니면PDCOMM_INVALID_STATE, 메시지가 아이템 한도를 넘으면PDCOMM_LIMIT_EXCEEDED입니다.
programDelete
메서드
S7F17 Delete Process Program Send를 보냅니다.
PdcommTcpToken programDelete(const std::vector<const SecsItem *> &ids = {})프로그램 저장소(GemEndpoint::configurePrograms())가 필요합니다. S7F18 응답은 GemOutcome::ProgramAckReceived 결과로 도착합니다.
매개변수
| 이름 | 설명 |
|---|---|
ids | 삭제할 프로그램 ID입니다. 빈 벡터이면 모든 프로그램의 삭제를 요청합니다. 아이템은 호출이 반환되기 전에 복사됩니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 통신 중이 아니거나 프로그램 저장소가 구성되지 않았으면PDCOMM_INVALID_STATE, ID 예산을 넘으면PDCOMM_LIMIT_EXCEEDED입니다.
programDirectory
메서드
S7F19 Current Process Program Directory Request(헤더만)를 보냅니다.
PdcommTcpToken programDirectory()S7F20 응답은 GemOutcome::ProgramDirectoryReceived 결과로 도착합니다. ID는 GemResult::programItem()으로 읽습니다.
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 통신 중이 아니거나 프로그램 저장소가 구성되지 않았으면PDCOMM_INVALID_STATE입니다.
queryRemoteSpooling
메서드
S2F59를 보내 장비의 현재 스풀링 선택을 조회합니다.
PdcommTcpToken queryRemoteSpooling()S2F60 응답은 GemOutcome::SpoolConfigurationData 결과로 도착합니다. GemResult::spoolSelection()으로 읽습니다.
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 스풀 한도가 구성되지 않았거나 호스트가 통신 중이 아니면PDCOMM_INVALID_STATE입니다.
remoteCommand
메서드
S2F41 Host Command Send를 보냅니다.
PdcommTcpToken remoteCommand(const SecsItem &name, const std::vector<GemCommandParameter> ¶meters = {})아이템은 호출이 반환되기 전에 크기가 제한된 메시지로 복사됩니다. 성공은 요청이 실행되었다는 뜻이 아니라 큐에 들어갔다는 뜻입니다. S2F42 응답은 GemOutcome::CommandAck 결과로 도착합니다.
매개변수
| 이름 | 설명 |
|---|---|
name | RCMD 아이템입니다(ASCII 또는 정수). |
parameters | (CPNAME, CPVAL) 쌍입니다. 가리키는 아이템은 호출하는 동안 빌려 씁니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 통신 중이 아니면PDCOMM_INVALID_STATE,nullptr아이템이면PDCOMM_INVALID_ARGUMENT, 메시지가 아이템 한도를 넘으면PDCOMM_LIMIT_EXCEEDED입니다.
reportQuery
메서드
보고서 조회 하나(S6F15, S6F19 또는 S6F21)를 보냅니다.
PdcommTcpToken reportQuery(GemRequest kind, uint32_t id)ID는 max_pending_ids 항목 하나를 사용합니다. S6F16 응답은 요청한 CEID를 그대로 돌려줘야 하며, S6F20과 S6F22 응답에는 RPTID가 없습니다.
매개변수
| 이름 | 설명 |
|---|---|
kind | GemRequest::EventQuery, GemRequest::IndividualQuery 또는 GemRequest::AnnotatedQuery입니다. |
id | 이벤트 조회이면 CEID, 그렇지 않으면 RPTID입니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 다른 종류이면PDCOMM_INVALID_ARGUMENT, 통신 중이 아니면PDCOMM_INVALID_STATE,max_pending_ids가 소진되면PDCOMM_LIMIT_EXCEEDED입니다.
request
메서드
기본 스트림 1 요청을 보냅니다.
PdcommTcpToken request(GemRequest requestKind, const std::vector<uint32_t> &ids = {})지원하는 종류는 GemRequest::AreYouOnline(S1F1), GemRequest::StatusValues(S1F3), GemRequest::StatusNames(S1F11), GemRequest::Offline(S1F15), GemRequest::Online(S1F17)입니다. 두 상태 요청만 ID를 받습니다.
매개변수
| 이름 | 설명 |
|---|---|
requestKind | 보낼 요청입니다. |
ids | 상태 요청에 쓰는 SVID이며, 보내기 전에 복사됩니다. 비어 있으면 전체를 요청합니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 다른 종류이거나 상태 요청이 아닌 요청에 ID를 주면PDCOMM_INVALID_ARGUMENT, 통신 중이 아니면PDCOMM_INVALID_STATE, 모든 대기 슬롯이 사용 중이면PDCOMM_BACKPRESSURE, ID가max_pending_ids를 넘으면PDCOMM_LIMIT_EXCEEDED입니다.
requestAlarmList
메서드
S5F5 List Alarms Request를 보냅니다.
PdcommTcpToken requestAlarmList(const std::vector<uint32_t> &ids = {})명시한 ID는 순서와 중복을 그대로 유지하며, 성공한 S5F6은 같은 순서로 반환해야 합니다. 응답은 GemOutcome::AlarmListReceived 결과로 도착합니다.
매개변수
| 이름 | 설명 |
|---|---|
ids | ALID이며, 보내기 전에 복사됩니다. 비어 있으면 모든 알람을 요청합니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 통신 중이 아니면PDCOMM_INVALID_STATE, ID가max_pending_ids또는 아이템 한도를 넘으면PDCOMM_LIMIT_EXCEEDED입니다.
requestEnabledAlarmList
메서드
S5F7 List Enabled Alarm Request를 보냅니다.
PdcommTcpToken requestEnabledAlarmList()S5F8 응답은 GemOutcome::EnabledAlarmListReceived 결과로 도착합니다.
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 통신 중이 아니면PDCOMM_INVALID_STATE입니다.
requestSpooledData
메서드
S6F23 Request Spooled Data를 보냅니다.
PdcommTcpToken requestSpooledData(GemSpoolCommand command)S6F24 응답은 GemResultInfo::acknowledgement에 RSDA를 담은 GemOutcome::SpoolControlAck 결과로 도착합니다. 이후 스풀된 메시지는 일반 1차 메시지로 도착합니다.
매개변수
| 이름 | 설명 |
|---|---|
command | 스풀된 메시지를 전송하거나 삭제(purge)합니다. |
반환값
제출한 요청의 토큰입니다.
참고
- 예외
pdcomm::Error: 스풀 한도가 구성되지 않았거나 호스트가 통신 중이 아니면PDCOMM_INVALID_STATE입니다.