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

StatusCode 오류 목록

PDComm OPC UA의 오류는 세 가지 형태로 나타납니다.

  1. C ABI 상태: SDK 함수의 반환값입니다. 호출 자체가 어떻게 끝났는지 알려 줍니다.
  2. OPC UA StatusCode: 응답 본문의 서비스 결과와 항목 결과입니다. 0x803B0000 같은 32비트 값입니다.
  3. 오류 문장: 사람이 읽는 영어 설명입니다. C에서는 pdcomm_opcua_last_error_copy, C++에서는 pdcomm::opcua::error::what(), .NET에서는 OpcUaException.Message, 시뮬레이터에서는 응답의 error로 읽습니다. 문장은 바뀔 수 있으므로 프로그램의 분기에는 쓰지 않습니다.
값 이름 의미 조치
0 PDCOMM_OPCUA_OK 성공. 응답에 Bad StatusCode가 있어도 OK입니다. 응답 본문의 결과를 확인합니다.
1 PDCOMM_OPCUA_INVALID_INPUT 인자, 크기, 구조체 버전, 인코딩, 요청 ID가 잘못되었습니다. 옵션 구조체의 struct_size와 version, 요청 인코딩을 확인합니다.
2 PDCOMM_OPCUA_INVALID_HANDLE 핸들이 0이거나 해제되었거나 종류가 다릅니다. 핸들을 해제한 뒤 쓰지 않았는지 확인합니다.
3 PDCOMM_OPCUA_INTERNAL_ERROR 내부 실패입니다. 오류 문장을 확인합니다.
4 PDCOMM_OPCUA_BUFFER_TOO_SMALL 출력 버퍼가 작습니다. 필요한 크기를 알려 줍니다. 알려 준 크기로 다시 호출합니다.
5 PDCOMM_OPCUA_RUNTIME_ERROR 네트워크, 보안, 프로토콜, 주소 공간 실패. 제한 시간 초과를 포함합니다. 오류 문장으로 원인을 찾습니다. 아래 표를 참고합니다.
6 PDCOMM_OPCUA_EMPTY 응답이 아직 오지 않았습니다. pdcomm_opcua_client_poll을 부르고 다시 확인합니다.
7 PDCOMM_OPCUA_BUSY 다른 스레드가 같은 핸들을 쓰는 중이거나, 대기 중인 요청이 있거나, 꺼내지 않은 응답이 있습니다. 한 핸들의 호출을 직렬화하고 응답을 모두 꺼냅니다.
8 PDCOMM_OPCUA_POISONED 앞선 호출이 내부에서 중단되어 핸들을 더 쓸 수 없습니다. 핸들을 해제하고 새로 만듭니다.
9 PDCOMM_OPCUA_LIMIT 자원 한도에 닿았습니다. 대기 요청 64개, 핸들 1024개, 버퍼 64 MiB 등입니다. 응답과 버퍼를 해제하고 다시 시도합니다.
10 PDCOMM_OPCUA_CLOSED 클라이언트나 서버가 닫혔거나 실패했습니다. 핸들을 해제하고 다시 연결합니다.
11 PDCOMM_OPCUA_LICENSE_REQUIRED 이 호출에 필요한 라이선스가 없습니다. pdcomm_opcua_discover와 pdcomm_opcua_client_connect는 opcua-client 모듈을, pdcomm_opcua_server_create는 opcua-server 모듈을 요구합니다. 네트워크 입출력 전에 거부하므로 연결하거나 포트를 열지 않았습니다. 오류 문장의 괄호 안 상태를 라이선스 문제 해결에서 찾습니다. pdcomm_opcua_license_status로 모듈 상태를 봅니다. 이미 연결된 클라이언트와 실행 중인 서버는 계속 동작합니다.

예제 프로그램은 상태를 (SDK status 5)처럼 함께 출력합니다.

상태 11의 오류 문장은 다음 형식입니다.

PDComm license required for module 'opcua-client' (missing): no valid license for this module was found. Existing connections keep running. Install a license with the license API, PDCOMM_LICENSE_FILE or a pdcomm.license file.
StatusCode 값 어디서 원인과 조치
Good 0x00000000 모든 결과 성공
GoodNoData 0x00A50000 이력 읽기 기간 안에 값이 없습니다. 기간을 확인합니다.
BadUserAccessDenied 0x801F0000 읽기·쓰기 항목 결과, 세션 활성화 익명 세션이 인증 사용자 전용 노드에 접근했거나, 사용자 이름이나 암호가 틀렸거나, 인증 실패가 5번 이어져 잠겼습니다. 사용자로 접속하고 암호를 확인합니다. 잠금은 10분 뒤 또는 서버를 다시 시작하면 풀립니다.
BadIdentityTokenInvalid 0x80200000 세션 활성화 서버가 사용자 토큰을 해석하거나 복호화하지 못했습니다. 서버가 지원하지 않는 토큰 종류, 맞지 않는 policyId, 채널 정책과 다른 암호화 알고리즘이 원인입니다. Qt·MFC 작업자는 기본으로 PDCOMM_OPCUA_USER_SECRET_HEADER_POLICY_ONLY를 켜므로, 64바이트를 넘는 암호를 쓰고 서버가 알고리즘 URI를 요구하면 이 오류가 납니다. 그 서버에는 flags를 0으로 설정합니다.
BadIdentityTokenRejected 0x80210000 세션 활성화 토큰 형식은 맞지만 서버 정책이 거부했습니다. 예를 들어 PDComm 서버는 보안 정책 None 채널의 사용자 이름 토큰을 거부합니다. 보안 채널로 접속합니다.
BadSecurityChecksFailed 0x80130000 연결 서버가 클라이언트 인증서를 신뢰하지 않거나 보안 검사가 실패했습니다. 서버는 이유를 자세히 알리지 않습니다. 서버의 신뢰 목록에 클라이언트 인증서가 있는지 먼저 확인합니다.
BadCertificateUntrusted 0x801A0000 연결 인증서를 신뢰하지 않습니다. PDComm 클라이언트는 이 경우를 OPC UA security CertificateUntrusted로 보고합니다. 인증서 문제를 봅니다.
BadCertificateTimeInvalid 0x80140000 연결 인증서의 유효 기간이 지났거나 아직 시작되지 않았습니다. 인증서를 새로 만들고 컴퓨터 시각을 확인합니다.
BadCertificateHostNameInvalid 0x80160000 연결 서버 인증서에 접속한 호스트 이름이 없습니다.
BadCertificateUriInvalid 0x80170000 연결 인증서의 URI와 ApplicationUri가 다릅니다.
BadCertificateUseNotAllowed 0x80180000 연결 인증서의 keyUsage나 extendedKeyUsage가 OPC UA 요건에 맞지 않습니다. 템플릿으로 다시 만듭니다.
BadTcpEndpointUrlInvalid 0x80830000 탐색, 연결 endpoint URL의 경로가 서버와 다릅니다. 예를 들어 시뮬레이터 경로는 /pdcomm/simulator입니다.
BadNodeIdUnknown 0x80340000 읽기·쓰기, 이력 노드가 없습니다. 네임스페이스 인덱스와 식별자를 확인합니다.
BadHistoryOperationUnsupported 0x80720000 이력 노드는 있지만 이력을 저장하지 않거나, 서버가 요청한 이력 작업을 지원하지 않습니다. 시뮬레이터에서는 Simulator.Double과 Simulator.Counter만 이력을 저장합니다.
BadNotWritable 0x803B0000 쓰기 읽기 전용 변수입니다.
BadTypeMismatch 0x80740000 쓰기, 메서드 인자 값의 타입이 변수의 타입과 다릅니다. 예를 들어 Double 변수에 Int32를 썼습니다.
BadArgumentsMissing 0x80760000 메서드 호출 입력 인자가 모자랍니다.
BadTooManyArguments 0x80E50000 메서드 호출 입력 인자가 많습니다.
BadInvalidArgument 0x80AB0000 메서드 호출 인자 값이 맞지 않습니다. 인자별 결과(input_results)에서 어느 인자인지 확인합니다.
BadOutOfRange 0x803C0000 메서드 호출 인자가 허용 범위를 벗어났습니다. Simulator.Delay는 10000 ms까지입니다.
BadContinuationPointInvalid 0x804A0000 이력 읽기 연속 지점을 모르거나 이미 썼거나 해제했거나, 세부 정보가 처음 요청과 다릅니다.
BadEventIdUnknown 0x809A0000 조건 메서드 EventId가 없습니다. 받은 이벤트의 EventId를 그대로 씁니다.
BadConditionBranchAlreadyAcked 0x80CF0000 Acknowledge 이미 인지한 상태입니다.
BadConditionBranchAlreadyConfirmed 0x80D00000 Confirm 이미 확인한 상태입니다.

PDComm 클라이언트가 직접 인증서를 검사하다 실패하면 StatusCode 대신 오류 이름을 OPC UA security <이름> 형식으로 보고합니다.

오류 이름 대응 StatusCode 원인
CertificateUntrusted BadCertificateUntrusted 상대 인증서가 신뢰 목록에 없습니다.
CertificateHostInvalid BadCertificateHostNameInvalid URL의 호스트가 서버 인증서의 DNS·IP 항목에 없습니다.
CertificateUriInvalid BadCertificateUriInvalid URI가 하나가 아니거나 ApplicationUri와 다릅니다. 클라이언트 자신의 인증서도 검사합니다.
CertificateTimeInvalid BadCertificateTimeInvalid 유효 기간 밖입니다. 자신의 인증서와 상대 인증서 모두 검사합니다.
CertificateUseNotAllowed BadCertificateUseNotAllowed 키 용도나 확장 키 용도, CN·O 같은 필수 필드가 맞지 않습니다.
CertificatePolicyInvalid BadSecurityChecksFailed RSA 키 길이(2048~4096비트)나 서명 알고리즘(SHA-2)이 정책에 맞지 않습니다.
CertificateChainIncomplete BadSecurityChecksFailed 인증서 경로를 구성할 수 없습니다.
InvalidKey 해당 없음 개인 키가 인증서와 짝이 아니거나 RSA 키가 아닙니다.

시뮬레이터는 실패한 동작의 error에 문장을 담습니다. 서비스는 처리되었지만 항목 결과가 Bad이면 ok는 true이고 good이 false입니다.

오류 문장 원인과 조치
The client is not connected connect 전에 클라이언트 동작을 보냈습니다.
The server is not running 서버가 없는데 서버 동작을 보냈거나, URL 없이 접속했습니다.
The server does not offer the selected security policy and mode 서버가 그 정책과 모드를 광고하지 않습니다. discover로 확인합니다.
OPC UA protocol: identity token not advertised 서버가 사용자 이름 토큰을 광고하지 않습니다. 서버에 암호를 주고 시작했는지 확인합니다.
OPC UA protocol: anonymous identity not supported 서버가 익명 토큰을 광고하지 않습니다.
OPC UA protocol: credentials require authenticated server 보안 정책 None 채널로 암호를 보내려 했습니다. 보안 정책을 바꿉니다.
A password is required for the user name identity identity가 username인데 connect에 password가 없습니다.
OPC UA status BadUserAccessDenied (0x801F0000) 사용자 인증에 실패했습니다.
Timeout (client connection closed) 요청이 제한 시간 안에 끝나지 않아 연결을 닫았습니다. 시간 초과와 진단을 봅니다.
Stop the endpoint before changing its configuration 실행 중인 서버·클라이언트·PubSub의 구성을 바꾸려 했습니다.
Unknown service action 동작 이름이 틀렸습니다.