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

시뮬레이터 GUI

PDComm Modbus Simulator는 Modbus 서버, 클라이언트, 게이트웨이를 화면에서 시험하는 Qt 애플리케이션입니다. SDK와 같은 서비스 명령을 쓰며, 버튼 하나가 JSON 명령 하나에 대응합니다. 화면의 모든 이름은 영어입니다.

OS 실행 방법
macOS SDK 최상위의 PDComm Modbus Simulator.app을 엽니다. 터미널에서는 open "$MODBUS_SDK/PDComm Modbus Simulator.app"
Windows SDK의 bin\pdcomm-modbus-simulator.exe
Linux "$MODBUS_SDK/bin/pdcomm-modbus-simulator". 데스크톱 환경이 필요합니다.

SDK 폴더 전체를 함께 둡니다. GUI는 같은 SDK의 lib/에 있는 라이브러리를 씁니다.

창 아래쪽의 상태 줄은 마지막 명령의 결과를 보여 줍니다.

상태 줄 뜻
Completed: <명령> 명령이 성공했습니다. 예: Completed: connect
<명령> failed: <메시지> 명령이 실패했습니다. 메시지는 SDK의 오류 문자열과 같습니다. 예: connect failed: Io(ConnectionRefused, ...)
Connecting... Connect를 누른 뒤 결과를 기다리는 중입니다.

GUI는 작업 스레드에서 5ms마다 poll을 보내므로, 서버와 게이트웨이는 창이 열려 있는 동안 계속 요청에 응답합니다. 클라이언트 요청도 작업 스레드에서 실행되어 화면이 멈추지 않습니다.

Connection 탭: TCP 서버 127.0.0.1:1502로 연결되어 Disconnect 버튼이 보임Connection 탭: TCP 서버 127.0.0.1:1502로 연결되어 Disconnect 버튼이 보임
항목 구성 필드 설명
Transport transport TCP, RTU, ASCII. SDK에 포함된 전송만 목록에 나옵니다.
Role role Server, Client, Gateway. Gateway는 TCP와 직렬 전송이 모두 있는 빌드에만 나옵니다.
TCP address address IP:포트. 서버는 받을 주소, 클라이언트는 상대 주소, 게이트웨이는 TCP 쪽 주소입니다.
Serial port port 직렬 장치 경로(/dev/cu.usbserial-..., COM3)
Unit unit 1~247
Baud, Parity, Stop bits baud, parity, stop_bits 직렬 설정. Parity가 none이면 Stop bits는 2여야 합니다.
Request timeout (ms) timeout_ms 클라이언트 요청과 연결, 게이트웨이의 직렬 대기 시간
ASCII character timeout (ms) ascii_timeout_ms ASCII 문자 사이 최대 간격
Broadcast turnaround (ms) turnaround_ms 브로드캐스트 뒤 기다리는 시간
Gateway routes (TCP unit to serial unit JSON) routes 게이트웨이 경로 표. 예: {"1":7,"2":9}
  • Connect는 입력값으로 configure를 보낸 뒤 connect를 보냅니다. 성공하면 버튼이 Disconnect로 바뀝니다. 포트 0으로 연 서버는 TCP address가 실제 주소로 바뀝니다.
  • Apply configuration은 configure만 보냅니다. 연결하지 않고 RTU 같은 구성으로 Request 탭의 Execute locally를 시험할 때 씁니다.
  • 연결 중에는 구성을 바꿀 수 없습니다. 바꾸려면 Disconnect를 먼저 누릅니다. 연결 중에 Apply configuration을 누르면 configure failed: Disconnect before changing configuration입니다.

클라이언트로 연결한 모습은 다음과 같습니다.

Connection 탭: Role이 Client이고 127.0.0.1:1502에 연결됨Connection 탭: Role이 Client이고 127.0.0.1:1502에 연결됨

연결에 실패하면 상태 줄에 원인이 나옵니다. 아래는 아무도 듣지 않는 포트에 연결한 경우입니다.

상태 줄에 connect failed: Io(ConnectionRefused, Connection refused) 메시지가 보이는 Connection 탭상태 줄에 connect failed: Io(ConnectionRefused, Connection refused) 메시지가 보이는 Connection 탭
Request 탭: FC 03과 PDU 030000000A를 로컬 실행한 응답이 16진수로 보임Request 탭: FC 03과 PDU 030000000A를 로컬 실행한 응답이 16진수로 보임
  • 위쪽 목록에서 FC 01~FC 43을 고르면 그 기능의 예제 PDU가 입력란에 채워집니다. 주소와 값을 고쳐 씁니다.
  • 입력란에는 기능 코드부터 시작하는 완전한 요청 PDU를 16진수로 씁니다. 유닛 주소, MBAP 헤더, CRC는 넣지 않습니다.
  • Execute locally는 execute입니다. 연결 없이 이 창의 데이터 모델에서 실행하고 source가 local입니다.
  • Send to peer는 request입니다. 클라이언트로 연결한 상태에서 상대에게 보내고 source가 wire입니다.
  • Unit은 Connection 탭의 값을 씁니다.
  • 응답 창은 결과 JSON을 보여 주며, PDU는 읽기 쉽게 16진수 바이트(03 08 04 B0 ...)로 표시합니다.

클라이언트에서 서버로 보낸 결과입니다.

Request 탭: Send to peer로 FC 03을 보내 source가 wire인 응답Request 탭: Send to peer로 FC 03을 보내 source가 wire인 응답

예외 응답은 status가 exception입니다. 다음은 수량 0으로 읽어 예외 03을 받은 경우입니다.

Request 탭: PDU 0300000000을 실행해 응답 83 03과 status exception이 보임Request 탭: PDU 0300000000을 실행해 응답 83 03과 status exception이 보임
Data 탭: 코일, 이산 입력, 레지스터, 파일, FIFO, 장치 식별 객체가 JSON으로 보이는 편집기Data 탭: 코일, 이산 입력, 레지스터, 파일, FIFO, 장치 식별 객체가 JSON으로 보이는 편집기
  • Read model은 data_get입니다. 네 테이블, 파일 레코드, FIFO, 장치 식별 객체, 서버 ID, 예외 상태를 JSON으로 보여 줍니다.
  • 편집기에서 값을 고친 뒤 Apply model을 누르면 model_set으로 모델 전체를 바꿉니다. 모든 필드가 있어야 합니다.
  • JSON 문법이 틀리면 명령을 보내지 않고 상태 줄에 Invalid model JSON을 표시합니다.
  • 형식은 맞지만 값이 틀리면(비트 테이블에 2 등) model_set failed: Bit table values must be zero or one처럼 실패하고, 기존 모델은 그대로입니다.
  • 서버로 연결 중이면 연결 중인 서버의 모델을 읽고 바꿉니다.

모델 형식은 JSON 명령 레퍼런스에 있습니다.

Diagnostics 탭: counters, delimiter, event_log, listen_only, register가 보이는 진단 결과Diagnostics 탭: counters, delimiter, event_log, listen_only, register가 보이는 진단 결과

Read diagnostics는 diagnostics입니다. 직렬 서버의 진단 카운터(counters), ASCII 종료 문자(delimiter, 10은 LF), 이벤트 로그, 청취 전용 여부(listen_only), 진단 레지스터(register)를 보여 줍니다. TCP 서버도 예외 수(exceptions)는 셉니다. 카운터의 의미는 진단 하위 기능을 참고합니다.

Trace / Fault 탭: request와 response가 16진수인 wire 기록 목록과 Decode raw fault 버튼Trace / Fault 탭: request와 response가 16진수인 wire 기록 목록과 Decode raw fault 버튼
  • Read trace는 trace입니다. 최근 1000개의 요청·응답과 직렬 원시 바이트를 보여 줍니다. source는 local(Execute locally), wire(실제 통신)입니다.
  • Decode raw fault는 fault입니다. Request 탭 입력란의 내용을 이번에만 원시 바이트로 보고, Connection 탭의 Transport 디코더로 해석합니다. 결과의 source는 synthetic입니다. 실제 회선에 오류를 주입하는 기능이 아닙니다.
  • 해석을 마치면 Request 탭 입력란을 정상 PDU로 되돌립니다.

예를 들어 Transport를 RTU로 두고 입력란에 01030000000AC5CC를 넣은 뒤 Decode raw fault를 누르면 errors에 Checksum이 나옵니다. 주소와 프레임 관찰에 더 많은 예가 있습니다.

Security 탭: mode, chain, private_key, trust, roles, null_role이 들어간 Security JSON 편집기Security 탭: mode, chain, private_key, trust, roles, null_role이 들어간 Security JSON 편집기

Security 탭은 구성의 security 객체를 JSON으로 입력합니다.

  • 비워 두면 일반 Modbus TCP입니다.
  • 내용이 있으면 Connect나 Apply configuration 때 security로 함께 보냅니다. 형식은 Modbus/TCP Security를 따릅니다.
  • JSON 문법이 틀리면 configure failed: invalid type: string "Invalid JSON", expected struct Security입니다.
  • 서버는 roles와 null_role을, 클라이언트는 hostname을 함께 씁니다.
  • 경로는 GUI를 실행한 작업 폴더 기준의 상대 경로도 받지만, 다른 곳에서 열 프로젝트라면 절대 경로를 씁니다.
  • Security가 없는 SDK에서는 편집기가 꺼지고 Security is excluded from this build.가 표시됩니다.
메뉴 명령 설명
Save… (Ctrl+S, macOS는 Cmd+S) project_export 구성과 모델을 *.modbus.json 파일로 저장합니다. 실패하면 Cannot save project입니다.
Open… (Ctrl+O, macOS는 Cmd+O) project_import 파일을 불러와 Connection, Security, Data를 갱신합니다.
  • 불러오기는 연결을 끊은 상태에서만 됩니다. 연결 중이면 project_import failed: Disconnect before loading a project입니다.
  • 16MiB보다 큰 파일이나 읽을 수 없는 파일은 Cannot read project, JSON이 아니면 Invalid project JSON입니다.
  • kind가 pdcomm.modbus.project, version이 1이 아니면 Unsupported Modbus project kind or version이고 현재 상태를 그대로 둡니다.
  • 저장한 파일은 헤드리스와 MCP의 project_import에서도 씁니다. 헤드리스와 시나리오를 참고합니다.