시뮬레이터 GUI
PDComm OPC UA Simulator는 OPC UA 서버와 클라이언트를 한 창에서 실행하는 Qt 응용 프로그램입니다. 코드를 쓰지 않고 연결, 보안, 주소 공간, 구독, 이벤트, 이력, PubSub을 시험합니다. GUI는 헤드리스 프로그램, MCP 서버와 같은 시뮬레이터 엔진을 씁니다. 화면의 버튼은 헤드리스 동작 하나를 실행합니다.
apps 패키지를 푼 폴더에서 실행합니다.
open "$OPCUA_APPS/PDComm OPC UA Simulator.app"Windows와 Linux에서는 패키지의 bin/pdcomm-opcua-simulator를 실행합니다. 설치를 확인하려면 화면 없이 자체 시험을 실행합니다. 서버를 시작하고, 접속하고, 끊고, 서버를 멈춘 뒤 끝납니다.
QT_QPA_PLATFORM=offscreen "$OPCUA_APPS/PDComm OPC UA Simulator.app/Contents/MacOS/pdcomm-opcua-simulator" --smoke-testsmoke server_start oksmoke connect oksmoke disconnect oksmoke server_stop ok모두 ok이면 종료 코드는 0입니다.
화면 구성
섹션 제목: “화면 구성”창 위쪽에는 작업 공간 탭 8개가 있고, 아래쪽 상태 줄에는 마지막 동작의 결과가 나옵니다. 성공하면 server_start completed처럼, 실패하면 connect failed: ...처럼 표시됩니다. 동작이 실패하면 빨간색, 동작은 성공했지만 항목 결과가 권한 거부이면 노란색으로 표시됩니다.
| 탭 | 하는 일 |
|---|---|
| Connection & Security | 시뮬레이터 서버를 시작하고, 클라이언트 세션을 연결합니다. |
| Address Space | 노드를 탐색하고 시뮬레이터 서버의 변수 목록을 봅니다. |
| Read / Write / Methods | 속성을 읽고 쓰고 메서드를 호출합니다. |
| Subscriptions | 데이터 변경을 구독하고 알림을 받습니다. |
| Events & Conditions | 이벤트를 구독하고 알람을 인지·확인합니다. |
| History | Raw 이력을 읽습니다. |
| PubSub | UADP 메시지를 UDP나 MQTT로 게시하고 받습니다. |
| Trace & Diagnostics | 실행한 동작의 기록과 진단 로그를 다룹니다. |
Project 메뉴의 **Open…**과 **Save…**는 구성과 서버 변수 값을 JSON 프로젝트 파일로 불러오고 저장합니다. 프로젝트 파일에는 암호와 개인 키 내용이 들어가지 않습니다. 인증서와 개인 키는 파일 경로만 저장합니다.
Connection & Security
섹션 제목: “Connection & Security”

왼쪽 Simulated server 그룹은 시뮬레이터 서버를 설정합니다.
| 항목 | 설명 |
|---|---|
| Listen address | 서버의 수신 주소. 포트 0이면 빈 포트를 고릅니다. |
| Endpoint path | endpoint URL의 경로(기본 pdcomm/simulator) |
| Offer SecurityPolicy None | None 엔드포인트를 광고합니다. |
| Offer signed and encrypted policies | 세 가지 보안 정책의 Sign, SignAndEncrypt 엔드포인트를 광고합니다. |
| Allow anonymous users | 익명 사용자를 받습니다. |
| User name, Password | 받을 사용자 계정. 암호를 비우면 사용자 이름 토큰을 광고하지 않습니다. |
| Simulation interval (ms) | Simulator.Counter를 늘리는 주기. 0이면 늘리지 않습니다. |
Start server를 누르면 서버가 시작되고 그룹 아래에 Running at opc.tcp://localhost:4840/pdcomm/simulator · sessions 1 · None + signed/encrypted policies처럼 주소, 세션 수, 보안 범위가 표시됩니다. 같은 버튼이 Stop server로 바뀝니다.
오른쪽 Client session 그룹은 시뮬레이터의 클라이언트를 설정합니다.
| 항목 | 설명 |
|---|---|
| Endpoint URL | 접속할 서버. 비우면 이 시뮬레이터의 서버에 접속합니다. |
| Security policy, Security mode | 요청할 정책과 모드. 서버가 광고하는 조합이어야 합니다. |
| User identity | Anonymous 또는 User name |
| User name, Password | User name을 고른 경우의 계정 |
| Timeout (ms) | 네트워크 교환과 요청마다의 제한 시간 |
Discover endpoints는 서버의 엔드포인트를 표에 보여 줍니다. Connect는 세션을 열고 활성화합니다. 연결되면 Connected Basic256Sha256 / SignAndEncrypt as username to opc.tcp://...처럼 표시되고 버튼이 Disconnect로 바뀝니다. Cancel request는 실행 중인 요청을 취소하고, Apply configuration은 화면의 설정을 적용합니다.
아래 화면은 서버에 암호를 설정하고 Basic256Sha256·SignAndEncrypt·User name으로 접속한 상태입니다. 암호를 설정했으므로 보안 엔드포인트에 username 토큰이 광고됩니다.


Address Space
섹션 제목: “Address Space”

Start node에 NodeId를 넣고 방향(Forward 또는 Inverse)을 고른 뒤 Browse를 누릅니다. 표에는 Browse name, NodeId, Class(NodeClass 값), Reference(참조 타입), Forward가 나옵니다. 행을 두 번 누르면 그 노드가 Start node가 되므로 계층을 따라 내려갈 수 있습니다.
Refresh server model은 시뮬레이터 서버의 변수 목록을 Simulated server model 표에 보여 줍니다. 이 표는 OPC UA 서비스가 아니라 서버 내부 값을 직접 읽으므로, 클라이언트가 연결되지 않아도 동작합니다.
Read / Write / Methods
섹션 제목: “Read / Write / Methods”

| 항목 | 설명 |
|---|---|
| Node (comma separated for read) | 읽을 노드. 읽기는 쉼표로 여러 노드를 지정합니다. |
| Attribute id | 읽을 속성(기본 13, Value) |
| Value type, Value | 쓸 값의 타입과 값 |
| Method object, Method | 호출할 메서드의 객체와 메서드 NodeId |
| Arguments (typed JSON) | [{"type":"Double","value":1.5}] 형식의 입력 인자 |
Read와 Write는 클라이언트 세션으로 서비스를 보냅니다. Set on server는 클라이언트를 거치지 않고 서버의 값을 직접 바꿉니다. 장비 쪽에서 값이 바뀐 상황을 흉내 낼 때 씁니다. Call method는 메서드를 호출합니다. 결과는 아래 칸에 JSON으로 나옵니다.
익명 세션으로 Simulator.Protected를 읽으면 항목 결과가 BadUserAccessDenied이고, 상태 줄에 read: permission denied for this session identity가 노란색으로 나옵니다.


Subscriptions
섹션 제목: “Subscriptions”

노드 칸에 쉼표로 노드를 나열하고 **Interval (ms)**을 정한 뒤 Subscribe를 누릅니다. Publish를 누를 때마다 Publish 요청을 두 번 보내고, 받은 알림을 표에 추가합니다. 표에는 Sequence(알림 메시지의 시퀀스 번호), Node, Value, Type, Status, Source time이 나옵니다. Delete subscription은 구독을 지우고, Clear는 표와 보관한 알림을 비웁니다.
Events & Conditions
섹션 제목: “Events & Conditions”

- Subscribe to Server events로 Server 객체의 이벤트를 구독합니다.
- Activate alarm으로
Simulator.AlarmSource를 참으로 바꿉니다. Clear alarm은 거짓으로 바꿉니다. - Publish로 이벤트를 받습니다. 표에는 Time, Event type, Condition, Severity, Message, Active, Acked, Confirmed, EventId가 나옵니다.
- Comment에 설명을 넣고 Acknowledge last 또는 Confirm last를 누릅니다. 마지막 조건 이벤트의 EventId를 자동으로 씁니다. 다시 Publish를 누르면 바뀐 상태가 나옵니다.
- Condition refresh는 현재 조건 상태를 다시 받습니다.
History
섹션 제목: “History”

노드와 Max values를 정하고 **Read raw history (last hour)**를 누르면 지난 1시간의 Raw 이력을 읽습니다. 이력을 저장하는 노드는 Simulator.Double과 Simulator.Counter입니다. 값이 더 남아 있으면 상태 줄에 more available이 붙습니다. 연속 지점을 이어 받으려면 헤드리스의 history_read를 씁니다.
PubSub
섹션 제목: “PubSub”

| 항목 | 설명 |
|---|---|
| Transport | UADP over UDP 또는 UADP over MQTT |
| Role | Publisher and subscriber, Publisher, Subscriber |
| UDP listen | 구독자의 UDP 수신 주소 |
| UDP destination | 게시자가 보낼 주소. 비우면 같은 시뮬레이터의 구독자로 보냅니다. |
| MQTT broker, MQTT topic | MQTT 전송의 브로커 주소와 토픽 |
| DataSet fields | 게시할 필드(타입이 있는 JSON 배열) |
Start PubSub로 시작하고 Publish DataSet으로 게시합니다. Show received는 받은 메시지를 표에 추가하고 상태를 새로 고칩니다. 표에는 Publisher, Writer group, Sequence, Fields, Source가 나옵니다.
Trace & Diagnostics
섹션 제목: “Trace & Diagnostics”

Refresh trace는 시뮬레이터가 실행한 동작의 기록을 보여 줍니다. 표에는 #, Workspace, Action, Result, Elapsed (us), Target, Error가 있습니다. 최근 1000개까지 보관합니다. Clear trace로 비웁니다.
**Diagnostic log (off by default)**를 선택하고 로그 파일 경로를 넣은 뒤 Apply logging을 누르면 진단 로그를 파일에 씁니다. 경로의 폴더는 미리 있어야 합니다. 로그 형식과 활용은 시간 초과와 진단에서 설명합니다.
연결 오류 화면
섹션 제목: “연결 오류 화면”접속할 수 없는 주소를 Endpoint URL에 넣고 Connect를 누르면 상태 줄에 오류가 빨간색으로 나옵니다.


오류 문장별 조치는 문제 해결에서 찾습니다.
다음 단계
섹션 제목: “다음 단계”- 헤드리스 시뮬레이터: 같은 동작을 스크립트로 실행합니다.
- 보안과 사용자 구성