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

pdcomm_opcua_client_begin

함수

UA Binary 서비스 요청 하나를 응답을 기다리지 않고 큐에 넣습니다.

int32_t pdcomm_opcua_client_begin(pdcomm_opcua_handle client, const uint8_t *request, size_t size, uint32_t *out_request)

선언 위치: #include <pdcomm/opcua/pdcomm_opcua.h>

request는 네임스페이스 0 인코딩 NodeId로 시작하는 완전한 UA Binary 서비스 요청입니다(예: ReadRequest(631)). 라이브러리는 무엇이든 큐에 넣기 전에 메시지 전체를 디코딩한 뒤, RequestHeader의 authenticationToken, timestamp, requestHandle을 교체합니다. timeoutHint가 0이면 timeout_ms로 바뀌며, returnDiagnostics, auditEntryId, 0이 아닌 timeoutHint, additionalHeader는 그대로 유지합니다.

지원하는 서비스는 FindServers, GetEndpoints, Cancel, Browse, BrowseNext, TranslateBrowsePathsToNodeIds, RegisterNodes, UnregisterNodes, Read, Write, Call, HistoryRead, HistoryUpdate, Subscription 서비스(Create, Modify, SetPublishingMode, Publish, Republish, Transfer, Delete), MonitoredItem 서비스(Create, Modify, SetMonitoringMode, SetTriggering, Delete), 그리고 AddNodes, AddReferences, DeleteNodes, DeleteReferences입니다. 보안 채널과 세션 요청은 전용 함수가 있으므로 거부합니다.

바이트는 pdcomm_opcua_client_poll()이 보냅니다. 각 요청은 timeout_ms 안에 응답을 받아야 합니다.

요청을 보내고 응답이 올 때까지 폴링하는 예입니다(examples/opcua/opcua_client.c).

int32_t status = pdcomm_opcua_client_begin(client, request, size, &id);
*body = NULL;
*body_size = 0;
if (status != PDCOMM_OPCUA_OK) return status;
for (;;) {
  status = pdcomm_opcua_client_poll(client);
  if (status != PDCOMM_OPCUA_OK) return status;
  status = pdcomm_opcua_client_take_response(client, id, &response);
  if (status == PDCOMM_OPCUA_OK) break;
  if (status != PDCOMM_OPCUA_EMPTY) return status;
  if (waited++ >= timeout_ms) return PDCOMM_OPCUA_RUNTIME_ERROR;
  example_sleep_ms(1);
}
status = pdcomm_opcua_buffer_copy(response, NULL, 0, &required);
if (status == PDCOMM_OPCUA_BUFFER_TOO_SMALL && required > 0) {
  *body = (uint8_t *)malloc(required);
  status = *body ? pdcomm_opcua_buffer_copy(response, *body, required, body_size)
                 : PDCOMM_OPCUA_INTERNAL_ERROR;
}
pdcomm_opcua_release(response);
return status;

매개변수

이름설명
client클라이언트 핸들입니다.
request인코딩된 요청이며 최대 4 MiB입니다. 호출 중에 복사됩니다.
sizerequest의 크기(바이트)입니다.
out_request요청 ID(requestHandle)를 받습니다. 이 클라이언트 안에서 고유하며, 실패하면 0입니다.

반환값

성공하면 #PDCOMM_OPCUA_OK를 반환합니다. 지원하지 않는 서비스이거나 인코딩이 유효하지 않으면 #PDCOMM_OPCUA_INVALID_INPUT을 반환합니다. 처리 중인 요청이 64개이거나 큐에 넣은 바이트가 너무 많으면 #PDCOMM_OPCUA_LIMIT를 반환하며 아무것도 보내지 않습니다. 응답이 보류되어 있으면 #PDCOMM_OPCUA_BUSY를 반환합니다. 그 밖에 #PDCOMM_OPCUA_CLOSED, #PDCOMM_OPCUA_RUNTIME_ERROR, #PDCOMM_OPCUA_INVALID_HANDLE, #PDCOMM_OPCUA_POISONED를 반환할 수 있습니다.