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

시뮬레이터 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-test
smoke server_start ok
smoke connect ok
smoke disconnect ok
smoke 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 토큰이 광고됩니다.

Basic256Sha256 SignAndEncrypt 엔드포인트에 사용자 이름으로 접속한 Connection & Security 탭Basic256Sha256 SignAndEncrypt 엔드포인트에 사용자 이름으로 접속한 Connection & Security 탭
Simulator 객체에서 탐색한 참조와 시뮬레이터 서버 모델을 보여 주는 Address Space 탭Simulator 객체에서 탐색한 참조와 시뮬레이터 서버 모델을 보여 주는 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가 노란색으로 나옵니다.

익명 세션의 BadUserAccessDenied 결과와 노란색 권한 거부 상태 줄익명 세션의 BadUserAccessDenied 결과와 노란색 권한 거부 상태 줄
두 노드의 데이터 변경 알림이 표에 쌓인 Subscriptions 탭두 노드의 데이터 변경 알림이 표에 쌓인 Subscriptions 탭

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

알람 활성화와 인지 뒤의 조건 이벤트를 보여 주는 Events & Conditions 탭알람 활성화와 인지 뒤의 조건 이벤트를 보여 주는 Events & Conditions 탭
  1. Subscribe to Server events로 Server 객체의 이벤트를 구독합니다.
  2. Activate alarm으로 Simulator.AlarmSource를 참으로 바꿉니다. Clear alarm은 거짓으로 바꿉니다.
  3. Publish로 이벤트를 받습니다. 표에는 Time, Event type, Condition, Severity, Message, Active, Acked, Confirmed, EventId가 나옵니다.
  4. Comment에 설명을 넣고 Acknowledge last 또는 Confirm last를 누릅니다. 마지막 조건 이벤트의 EventId를 자동으로 씁니다. 다시 Publish를 누르면 바뀐 상태가 나옵니다.
  5. Condition refresh는 현재 조건 상태를 다시 받습니다.
Simulator.Double의 Raw 이력 값을 보여 주는 History 탭Simulator.Double의 Raw 이력 값을 보여 주는 History 탭

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

UDP로 게시한 UADP DataSet을 받은 PubSub 탭UDP로 게시한 UADP DataSet을 받은 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를 누르면 상태 줄에 오류가 빨간색으로 나옵니다.

연결 거부 오류가 상태 줄에 빨간색으로 표시된 Connection & Security 탭연결 거부 오류가 상태 줄에 빨간색으로 표시된 Connection & Security 탭

오류 문장별 조치는 문제 해결에서 찾습니다.