시뮬레이터 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
섹션 제목: “Connection”

| 항목 | 구성 필드 | 설명 |
|---|---|---|
| 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입니다.
클라이언트로 연결한 모습은 다음과 같습니다.


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


Request
섹션 제목: “Request”

- 위쪽 목록에서 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 ...)로 표시합니다.
클라이언트에서 서버로 보낸 결과입니다.


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


Data
섹션 제목: “Data”

- 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
섹션 제목: “Diagnostics”

Read diagnostics는 diagnostics입니다. 직렬 서버의 진단 카운터(counters), ASCII 종료 문자(delimiter, 10은 LF), 이벤트 로그, 청취 전용 여부(listen_only), 진단 레지스터(register)를 보여 줍니다. TCP 서버도 예외 수(exceptions)는 셉니다. 카운터의 의미는 진단 하위 기능을 참고합니다.
Trace / Fault
섹션 제목: “Trace / 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
섹션 제목: “Security”

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.가 표시됩니다.
Project 메뉴
섹션 제목: “Project 메뉴”| 메뉴 | 명령 | 설명 |
|---|---|---|
| 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에서도 씁니다. 헤드리스와 시나리오를 참고합니다.
다음 단계
섹션 제목: “다음 단계”- GUI로 서버를 열고 콘솔 클라이언트와 통신하는 흐름은 시뮬레이터로 시험 흐름 만들기에서 따라 합니다.
- 상태 줄 오류 메시지의 원인은 서비스 오류에서 찾습니다.