StatusCode 오류 목록
PDComm OPC UA의 오류는 세 가지 형태로 나타납니다.
- C ABI 상태: SDK 함수의 반환값입니다. 호출 자체가 어떻게 끝났는지 알려 줍니다.
- OPC UA StatusCode: 응답 본문의 서비스 결과와 항목 결과입니다.
0x803B0000같은 32비트 값입니다. - 오류 문장: 사람이 읽는 영어 설명입니다. C에서는
pdcomm_opcua_last_error_copy, C++에서는pdcomm::opcua::error::what(), .NET에서는OpcUaException.Message, 시뮬레이터에서는 응답의error로 읽습니다. 문장은 바뀔 수 있으므로 프로그램의 분기에는 쓰지 않습니다.
C ABI 상태
섹션 제목: “C ABI 상태”| 값 | 이름 | 의미 | 조치 |
|---|---|---|---|
| 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.OPC UA StatusCode
섹션 제목: “OPC UA StatusCode”| 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 |
동작 이름이 틀렸습니다. |