이 프로그램은
PortDock Modbus Slave 는 PC 가 Modbus 슬레이브(서버) 장비인 척 답하게 하는 시험 도구입니다. 시리얼(Modbus RTU), TCP 서버(Modbus TCP), TCP 서버(RTU over TCP) 세 가지로 연결합니다.
PLC·HMI·컨트롤러 같은 마스터가 보내는 읽기·쓰기 요청에, 화면의 레지스터 표 값으로 답합니다. 32비트·실수·문자열 같은 형식과 바이트 순서, 칸 이름, 값 자동 변화(증가·랜덤·사인…)도 흉내 냅니다.
응답 지연·무응답·예외·CRC(MBAP) 오류를 일부러 만들어 마스터의 오류 처리도 시험할 수 있습니다. 국번·함수·주소·N번째·확률로 장애를 걸 요청을 고를 수 있습니다.
처음 쓰는 순서
- 1. 왼쪽 «연결 방식» 을 고릅니다. 시리얼이면 «포트» 와 «속도(bps)»·«데이터 비트»·«패리티»·«정지 비트» 를 마스터와 똑같이, TCP 면 «묶을 주소»(보통 0.0.0.0)와 «포트»(보통 502)를 정합니다.
- 2. «국번(슬레이브 ID)» 에 마스터가 부를 국번(기본 1)이 있는지 확인합니다. 없으면 1~247 을 넣고 «추가» 를 누릅니다. 이 도움말에서는 줄여 «국번» 이라고 부릅니다.
- 3. 가운데 위에서 표(예: «보유 레지스터»)를 고르고, 칸에 값을 넣어 둡니다. 연결 전에 넣어 둬도 됩니다. 32비트 값·실수·이름이 필요하면 칸의 ⋯(또는 오른쪽 버튼)으로 «칸 설정» 을 엽니다. 위 «표시» 목록의 «형식 지정…» 도 고른 칸의 «칸 설정» 을 엽니다.
- 4. «연결»(TCP 는 «시작»)을 누르면 마스터 요청이 오는 대로 바로 답합니다. 주고받은 내용과 풀이(«id1 FC03 HR 0..9 (10)»)는 아래 «통신 기록» 에 찍힙니다.
- 처음 켜면 비어 있는 «통신 기록» 자리에 이 순서가 카드로 보입니다. 카드에서 주소 부르는 법(0 기준·1 기준·40001)을 바로 고르고(가운데 위 «주소 표기» 와 같은 값), «예제 채우기» 를 누르면 지금 국번의 보유 레지스터 0~7 에 1~8, 8~9 에 F32 CDAB 23.5 가 들어가고 이름(상태·설정값·온도)과 형식도 붙습니다(그 자리에 값이 있으면 먼저 묻습니다) — 마스터로 읽으면 주소가 밀렸는지·워드 순서가 맞는지 바로 보입니다. «CSV 가져오기…» 는 엑셀로 만든 레지스터 맵(«표 내보내기·가져오기» 절)을 바로 읽습니다. «다시 보지 않기» 를 누르면 숨고, 그 뒤로는 «마스터가 읽으면 여기 «통신 기록» 에 보입니다» 한 줄만 남습니다.
화면 구성
- 왼쪽: «연결 방식», 포트(또는 주소·포트) 설정과 «연결»·«끊기», 연결 상태, «국번(슬레이브 ID)». 그 아래 «장애 주입 (시험용)»·«장치 식별 (FC 2B/0E)»·«통계» 는 접혀 있고 제목을 누르면 펼칩니다(펼친 상태는 기억). 접힌 «장애 주입» 제목 옆에는 «꺼짐», «통계» 제목 옆에는 «요청 n · 예외 m» 이 보입니다.
- 가운데 위: 표 4종 버튼, 지금 보는 국번(«국번 1»), «채우기»·«표 내보내기»·«표 가져오기». 그 아래 «시작 주소»·«개수»·«표시»·«주소 표기», «칸»·«목록» 보기 버튼과 회색 «응답 범위: HR 0–99» 한 줄.
- 가운데: 레지스터 표. «칸» 보기는 바둑판(주소 · 이름 · 값 · 형식 · ◷ · ⋯), «목록» 보기는 한 줄에 주소·이름·형식·값·자동 변화.
- 아래: «통신 기록»(RX ◀ 요청, TX ▶ 응답, EV 사건)과 찾기·거르기 줄, «파일로 계속 저장»·«지우기».
- 표와 통신 기록 사이의 막대를 위아래로 끌면 통신 기록 높이가 바뀌고 기억됩니다(두 번 누르면 처음대로, 막대에 포커스를 두고 ↑·↓ 도 됨). 처음 높이는 작은 창(1000×640)에서 표가 넉넉히 보이게 잡혀 있습니다.
- 머리줄 📌: 항상 위 — 이 창을 다른 창 위에 늘 보이게 합니다(설정의 «항상 위» 와 같음).
- 창 제목에 지금 상태가 나옵니다(예: «COM3 115200 8N1 · 연결됨 ● REC — PortDock Serial»). 작업 표시줄에서 어느 창이 어느 포트인지 알 수 있습니다.
- 창 너비가 900px 이하(화면 반쪽 맞춤 등)면 왼쪽 연결 설정 칸이 접히고, 위에 요약 줄과 «⚙ 연결 설정»·연결 버튼이 나옵니다. «⚙ 연결 설정» 으로 펼치고 ✕ 나 바깥을 눌러 닫습니다.
연결 설정 — 시리얼(RTU)
- «포트»: 마스터와 이어진 COM 포트. 연결 중에는 포트만 바꿀 수 없고, 나머지 설정은 바로 적용됩니다.
- 저장해 둔 포트가 목록에 없으면 같은 장치(일련번호, 없으면 VID:PID)를 찾아 고르고, 없으면 첫 포트로 바꾼 뒤 «저장된 COM3 이(가) 없어 COM7 로 바꿨습니다» 처럼 알려 줍니다.
- 연결에 실패하면 상태 칸에 빨갛게 «연결 실패 · 이유» 가 나옵니다. 포트가 사용 중이면 다른 프로그램이 쓰고 있는지 확인하세요.
- «속도(bps)»: 목록(1200~115200)에서 고르거나 숫자를 넣습니다.
- «데이터 비트»: 8 또는 7. Modbus RTU 는 보통 8 입니다.
- «패리티»: «없음»·«짝수»·«홀수». Modbus 규격 기본은 짝수지만 장비마다 다르니 마스터와 맞추세요.
- «정지 비트»: 1 또는 2. 보통 패리티가 «없음» 이면 2, 있으면 1 입니다.
- 연결 중에도 속도·데이터 비트·패리티·정지 비트를 바꿀 수 있고, 끊지 않고 바로 적용됩니다(로그에 SET 줄).
- 흐름 제어는 쓰지 않습니다. USB 변환기를 뽑았다 꽂으면 «다시 꽂기를 기다리는 중» 이 되고, 같은 장치가 돌아오면 저절로 다시 연결합니다.
- 프레임 구분은 Modbus RTU 로, 수신 검사는 CRC16 Modbus 로 자동 설정됩니다. USB 변환기가 요청을 쪼개 보내도(16ms 지연) 요청 길이를 보고 이어 붙입니다(16·17·08·2B 포함).
연결 설정 — TCP 서버(Modbus TCP · RTU over TCP)
- «TCP 서버 (Modbus TCP)»: 이 PC 가 Modbus TCP 장비가 됩니다. 요청 앞의 MBAP 머리(트랜잭션 ID · 프로토콜 ID 0 · 길이 · Unit ID)를 읽고, 응답에 트랜잭션 ID·Unit ID 를 그대로 돌려줍니다. MBAP 의 Unit ID 칸이 곧 국번입니다. CRC 는 없습니다.
- «TCP 서버 (RTU over TCP)»: 시리얼과 똑같은 RTU 프레임(국번 + PDU + CRC)을 TCP 로 주고받습니다. 시리얼 서버(게이트웨이)를 거치는 장비를 흉내 낼 때 씁니다.
- «묶을 주소»: 들을 랜카드 주소. 0.0.0.0 이면 모든 랜카드에서 받습니다. 마스터에는 이 PC 의 IP(예: 192.168.0.10)와 포트를 넣습니다.
- «포트»: 기본 502. 0 이면 운영체제가 빈 포트를 고르고, 상태 칸에 실제 주소가 나옵니다. 포트가 이미 쓰이면 «포트가 이미 사용 중» 으로 시작하지 못합니다.
- «시작» 하면 «듣는 중 — 마스터의 접속을 기다리는 중» 이 되고, 상태 칸 아래에 «연결된 클라이언트 n» 이 보입니다(마우스를 올리면 주소). 여러 마스터가 동시에 붙어도 각각 답합니다(최대 64).
- «국번 무시 (0·255 포함 모두 답함)»: 켜면 어떤 국번으로 와도 답합니다 — 목록에 있는 국번이면 그 표, 아니면 첫 국번의 표로 답하고, 받은 국번을 그대로 돌려줍니다. 끄면 목록에 없는 국번은 무시(«IGNORED unit 5»)하고 0 은 브로드캐스트(쓰기만 하고 답 없음)입니다. 연결 중에도 바로 바뀝니다.
- MBAP 머리가 틀린 요청(프로토콜 ID 가 0 이 아님, 길이 칸이 실제 길이와 다름)에는 답하지 않고 «IGNORED MBAP 머리가 틀림» 으로 남기며 «MBAP 오류» 로 셉니다.
- 한 TCP 조각에 요청 둘이 붙어 와도, 하나가 둘로 쪼개져 와도 MBAP 길이 칸으로 나눠·이어 붙입니다.
- TCP 에서는 지연 응답을 기다리는 동안에도 다음 요청을 받습니다(BUSY 무시는 시리얼만).
국번(슬레이브 ID)
- 국번(슬레이브 ID)은 마스터가 요청 맨 앞에 넣어 부르는 장비 번호입니다(Modbus TCP 에서는 MBAP 의 Unit ID 칸). 이 프로그램은 국번 여러 개를 한꺼번에 흉내 낼 수 있고, 국번마다 표 4종과 칸 설정을 따로 가집니다.
- 칸에 1~247 을 넣고 «추가»(또는 Enter)를 누르면 국번이 늘어납니다. 0(브로드캐스트), 248 이상, 이미 있는 국번은 칸이 빨개지고 이유가 나옵니다.
- 국번 버튼을 누르면 그 국번의 표를 봅니다. × 로 지웁니다(하나는 남아야 합니다). 지우면 5초 동안 아래 알림의 «되돌리기» 로 표 값·칸 설정까지 되살릴 수 있습니다.
- 목록에 없는 국번으로 온 요청에는 답하지 않고 «다른 국번» 으로 셉니다(TCP 의 «국번 무시» 를 켜면 예외).
표 4종과 지원 함수 코드
- «코일» 0x: 읽기 01, 한 칸 쓰기 05, 여러 칸 쓰기 0F. 값은 켜짐/꺼짐(체크칸).
- «입력 접점» 1x: 읽기 02. 값은 켜짐/꺼짐(체크칸). 마스터는 쓸 수 없습니다.
- «보유 레지스터» 4x: 읽기 03, 한 칸 쓰기 06, 여러 칸 쓰기 10, 마스크 쓰기 16, 읽기/쓰기 한 번에 17. 값은 0~65535.
- «입력 레지스터» 3x: 읽기 04. 값은 0~65535. 마스터는 쓸 수 없습니다.
- 16 마스크 쓰기: 새 값 = (지금 값 AND and 마스크) OR (or 마스크 AND NOT and 마스크). 응답은 요청 그대로입니다.
- 17 읽기/쓰기: 규격대로 먼저 쓰고 그다음 읽습니다(겹치는 주소면 새 값이 읽힙니다). 읽기 1~125, 쓰기 1~121 개. 두 범위 중 하나라도 응답 범위 밖이면 예외 02 이고 아무것도 쓰지 않습니다.
- 08 진단: 하위 함수 00(Return Query Data — 받은 데이터를 그대로 되돌려 보내기)만 지원합니다. 다른 하위 함수는 예외 01.
- 2B/0E 장치 식별(Read Device Identification): 기본 등급 — 객체 0 제조사, 1 제품 코드, 2 버전. 읽기 코드 1(묶음)·2·3(이 장비 등급인 기본으로 답함)·4(하나씩). 없는 객체를 하나씩 읽으면 예외 02, 코드 0·5 이상은 예외 03, MEI 가 0E 가 아니면 예외 01. 값은 왼쪽 «장치 식별 (FC 2B/0E)» 에서 고칩니다.
- 그 밖의 함수 코드는 예외 01(Illegal Function)로 답합니다.
- 한 번에 읽고 쓸 수 있는 개수: 01·02 는 1~2000, 03·04 는 1~125, 0F 는 1~1968, 10 은 1~123. 넘거나 형식이 틀리면 예외 03(Illegal Data Value).
- 05 쓰기 값은 «FF 00»(켜짐) 또는 «00 00»(꺼짐)만 받습니다. 그 밖은 예외 03.
시작 주소·개수·표시·주소 표기
- «시작 주소»·«개수»: 이 슬레이브가 이 표에서 답할 주소 범위입니다. 기본은 0부터 100칸. 보는 범위만 바뀌는 것이 아니라 마스터가 읽고 쓸 수 있는 범위도 함께 바뀝니다.
- 이 범위 밖을 읽거나 쓰면 예외 02(Illegal Data Address)로 답합니다. 마스터의 «주소 범위 오류» 처리를 시험할 때 씁니다.
- 평소에는 도구줄 끝에 회색으로 «응답 범위: HR 0–99» 처럼 지금 답하는 범위가 보입니다(«주소 표기» 를 따름). 기본(0부터 100칸)에서 바꾸면 노란 안내 «⚠ 바꾸면 마스터가 읽을 수 있는 주소 범위도 바뀝니다 …» 가 나오고, «알겠습니다» 를 누르면 그 범위에서는 다시 회색 한 줄로 돌아갑니다.
- «주소 표기»: «0 기준» 은 통신에 실제로 들어가는 주소(프로토콜 주소), «1 기준» 은 설명서처럼 1부터, «PLC (40001)» 는 40001·30001·10001·00001 식(9999 를 넘으면 6자리, 예: 410000)입니다. 칸의 주소, «시작 주소» 칸, 장애 주입의 주소 범위, 통신 기록 풀이에 모두 같이 적용됩니다.
- «1 기준»·«PLC» 일 때 «시작 주소» 칸에는 1부터 센 값을 넣습니다(예: 40001 = 1). CSV 파일의 address 는 언제나 0 기준입니다.
- 화면에는 최대 2000칸까지 보입니다. 범위가 더 커도 응답은 범위 전체로 합니다.
- «표시»(레지스터의 U16 칸): U16(0~65535), S16(-32768~32767), HEX(4자리), BIN(16자리). 형식을 정한 칸(S16·F32 등)은 그 형식으로 보입니다. «표시» 는 표 전체의 보기이고, 실수·32비트·문자열은 칸마다 정합니다 — 목록 끝의 «형식 지정…(32비트·float·문자열)» 을 고르면 마지막으로 고른 칸(없으면 첫 칸)의 «칸 설정» 이 열립니다.
- 값 칸에 숫자를 넣고 Enter 를 누르거나 다른 곳을 누르면 반영됩니다. 형식에 맞지 않으면 빨갛게 보이고 원래 값으로 돌아갑니다. 정수 칸은 «0x» 를 붙이면 HEX 로 읽습니다.
- 마스터가 값을 바꾸면 그 칸이 잠깐 강조되고, 마우스를 올리면 «마스터가 바꾼 값» 이 보입니다(자동 변화 칸은 강조하지 않음).
- «채우기»: 보이는 범위를 0, 1, 2… 로 채웁니다(코일·입력 접점은 0, 1, 0, 1…). 형식과 상관없이 레지스터 하나씩 채웁니다.
- «칸»·«목록» 보기 버튼: «칸» 은 바둑판, «목록» 은 주소·이름·형식·값·자동 변화를 한 줄씩 보입니다. 값은 두 보기 모두에서 고칠 수 있습니다.
- 표 값·칸 설정은 모든 슬레이브·모든 표에 대해(보이는 칸만이 아니라) 프로그램을 껐다 켜도 남아 있습니다. 직접 고친 값과 마스터가 쓴 값 모두, 바뀌고 약 1초 뒤 저장됩니다.
칸 설정 — 이름·형식·워드/바이트 순서
- 칸마다 오른쪽에 옅은 ⋯ 가 있습니다(마우스를 올리거나 값 칸에 들어가면 진해짐). ⋯ 를 누르거나, 칸에서 오른쪽 버튼을 누르거나, «표시» 의 «형식 지정…» 을 고르면 «칸 설정» 창이 열립니다. Esc·✕·바깥을 누르면 닫힙니다.
- «이름»: 칸에 붙일 이름(예: 온도). 칸 보기에는 주소 옆에, 목록 보기에는 «이름» 열에 보이고 CSV 로 내보냅니다.
- «형식»: U16, S16, U32(2칸), S32(2칸), F32 실수(2칸), F64 실수(4칸), 문자열(길이 1~250바이트, 2바이트에 1칸). 여러 칸을 쓰는 형식은 칸 하나로 묶여 넓게 보이고, 한 번에 고칩니다. 칸 아래에 «F32 CDAB» 처럼 형식·순서가 작게 붙습니다.
- «워드·바이트 순서»: ABCD = 큰 쪽 먼저(Modbus 기본), CDAB = 워드 바꿈(낮은 워드 먼저), BADC = 바이트 바꿈, DCBA = 둘 다(리틀 엔디언). 예: F32 123.456 → ABCD 42F6 E979, CDAB E979 42F6, BADC F642 79E9, DCBA 79E9 F642. 마스터 설정과 같아야 같은 값이 읽힙니다. 문자열은 바이트 바꿈(BADC·DCBA)만 봅니다.
- 다른 형식 칸과 겹치게 정하면 «주소 … 의 칸과 겹칩니다» 가 나옵니다. 그 칸을 먼저 «기본으로» 되돌리세요.
- «기본으로»: 이름·형식·자동 변화를 지우고 보통 U16 칸으로 되돌립니다. 레지스터 값은 그대로입니다.
- 보는 범위의 끝에 걸쳐 잘리는 형식 칸은 레지스터 하나씩 보입니다(범위를 넓히면 묶여 보입니다).
- 여러 칸 한 번에: 칸 하나를 누른 뒤 다른 칸을 Shift+클릭하면 그 사이가 골라지고(파랗게), 표 위에 «n칸 고름 — 형식·순서·[한 번에 정하기]» 줄이 나옵니다. 32비트(U32·S32·F32)는 두 칸씩, F64 는 네 칸씩 앞에서부터 묶고, 끝에 묶음이 모자라는 칸은 그대로 둡니다. 범위에 걸친 옛 형식은 지워지고 묶음 첫 칸의 이름은 남습니다. 값은 바뀌지 않습니다(같은 레지스터를 새 형식으로 읽음). 보통 클릭이나 «고르기 풀기» 로 풉니다.
값 자동 변화(시뮬레이션)
- «칸 설정» 의 «자동 변화» 로 고릅니다. 걸린 칸에는 ◷ 가 붙고, 마우스를 올리면 설정이 보입니다(목록 보기는 «자동 변화» 열).
- 증가·감소: 지금 값에 «폭» 만큼 더하거나 뺍니다. «최대»(감소는 «최소»)에 닿으면 «끝에 닿으면 처음으로» 가 켜져 있으면 반대 끝으로, 꺼져 있으면 그 자리에서 멈춥니다.
- 랜덤: «최소»~«최대» 사이 아무 값(정수형은 정수). 사인: 중심값 ± 진폭으로 «한 주기(ms)» 동안 한 번 오르내립니다. 램프: 한 주기 동안 최소에서 최대로 오르고 다시 최소부터. 토글: 0 ↔ 1(코일·입력 접점은 토글·랜덤만).
- «바꾸는 간격(ms)»(50~3,600,000)마다 바꾸거나, «마스터가 읽을 때마다 바꾸기» 를 켜면 마스터가 그 칸을 읽을 때(01~04·17) 바꿉니다.
- 프로그램 안쪽(백엔드)에서 돌기 때문에 창을 내려 두어도 값이 바뀝니다. 형식(F32·CDAB 등)을 정한 칸은 그 형식으로 바꿔 넣습니다. 문자열 칸에는 쓸 수 없습니다.
- 마스터가 쓴 값은 다음 변화 때까지 남고, 증가·감소는 그 값부터 이어 갑니다. 범위 밖 값을 쓰면 증가는 최소부터(감소는 최대부터) 다시 시작합니다.
- 자동 변화 설정도 표 값과 함께 저장되고, JSON 으로 내보내면 같이 들어갑니다(CSV 에는 값·형식·이름만).
표 내보내기·가져오기(CSV·JSON)
- «표 내보내기»: 지금 국번·표의 범위 전체를 저장합니다. 파일 이름이 .csv 면 CSV(엑셀용), .json 이면 JSON 입니다.
- CSV 모양: 머리줄 «table,address,type,order,name,value», UTF-8(BOM 포함 — 엑셀에서 한글이 깨지지 않음). address 는 0 기준, type 은 u16·s16·u32·s32·f32·f64·string(길이)·bit, order 는 ABCD·CDAB·BADC·DCBA. 형식 칸은 한 줄로(예: «holding-registers,10,f32,CDAB,온도,23.5»).
- «표 가져오기»: CSV 또는 JSON 을 고릅니다. CSV 는 줄마다 표가 적혀 있어 지금 국번의 다른 표에도 들어갑니다. 표 이름은 CO·DI·HR·IR·4x 같은 줄임도, 형식은 float·int32·double 같은 이름도 받습니다. 세미콜론(;)·탭으로 나눈 파일도 읽습니다.
- «장비 흉내…»: 내장 장비 10종(LS ELECTRIC 인버터 S100·G100과 전력 계측장치 GIMAC1000, 오토닉스 온도 조절기 TK·TX와 패널 미터 MT4W, 한영넉스 온도 조절기 VX와 카운터/타이머 LC, 루텍 전력 미터 Accura 3300E·2300) 중에서 고르면 그 장비의 레지스터 이름(단위·배율 포함)·형식과 예시 값을 지금 국번의 표마다 넣고, 응답 범위가 모자라면 넓힙니다. «통신 설정도 맞추기» 를 켜 두면 시리얼 설정을 매뉴얼의 출하 속도·데이터 비트·패리티·정지 비트로 바꿉니다(국번은 바꾸지 않으니 창에 나오는 기본 국번을 확인하세요). 값은 예시(대개 0, 0 이 범위 밖이면 범위 끝값, 상태 목록이 있으면 첫 상태, 문자열은 모델 이름)라 실제 장비 값이 아닙니다 — 마스터·HMI 프로그램을 장비 없이 시험할 때 씁니다.
- CSV 의 value 가 비어 있으면 값은 그대로 두고 형식·이름만 바꿉니다. 형식·이름이 없는 줄은 그 주소의 칸 설정을 보통 칸으로 되돌립니다.
- 한 줄이라도 틀리면(모르는 표·형식·순서, 0~65535 밖 주소, 형식에 맞지 않는 값, 겹치거나 같은 주소) 아무것도 바꾸지 않고 «3행: 형식 «f33» 을 모릅니다…» 처럼 행 번호(엑셀과 같음)와 함께 알려 줍니다(처음 6개까지).
- 가져온 줄이 응답 범위(«시작 주소»·«개수») 밖이면 값은 들어가지만 마스터가 읽으려면 범위를 넓히라고 알려 줍니다.
- JSON 은 예전 판 파일도 그대로 읽습니다. 파일의 국번·표가 지금 보는 것과 다르면 «파일의 대상(…)이 지금 보는 것(…)과 다릅니다. 지금 표에 넣을까요?» 라고 묻습니다. 형식이 틀리면 «표 파일 형식이 틀립니다(start·values 0~65535 확인).» 가 나옵니다.
브로드캐스트(주소 0)
- 마스터가 주소 0 으로 보낸 요청은 브로드캐스트입니다. 쓰기(05·06·0F·10·16·17)는 이 프로그램이 흉내 내는 모든 슬레이브에 적용합니다.
- Modbus 규격대로 브로드캐스트에는 답하지 않습니다. 로그에 «BROADCAST fc 06 (no reply)» 처럼 남습니다.
- 장애 주입은 브로드캐스트에는 쓰이지 않습니다. TCP 에서 «국번 무시» 를 켜면 0 도 보통 요청처럼 답합니다.
장애 주입 (시험용)
마스터가 이상한 응답을 받았을 때 제대로 대처하는지(재시도, 알람, 통신 오류 표시 등) 시험하는 기능입니다. 평소엔 접혀 있고 제목 옆에 «꺼짐» 이 보입니다. 하나라도 켜지면 제목이 빨간 «⚠ 장애 주입 켜짐» 으로 바뀌며 펼쳐지고(접어도 제목 옆에 켜진 장애가 보임), 아래에 «⚠ 장애 주입 (시험용)» 표시가 나오며, 대상을 골랐으면 «— 대상: 국번 1 · FC 03 …» 이 붙습니다.
- «응답 지연(ms)»: 응답을 정한 시간만큼 늦게 보냅니다. 마스터의 타임아웃 설정이 맞는지 시험합니다.
- 시리얼은 지연 중(응답을 보내기 전)에 다음 요청이 오면, 한 번에 하나만 처리하는 실제 장비처럼 무시합니다. 로그에 «BUSY …» 가 남고 «무시(BUSY)» 로 셉니다.
- «응답 안 함 (타임아웃 시험)»: 요청은 처리하지만(쓰기는 표에 반영) 아무것도 보내지 않습니다. 로그에 «NO-RESPONSE (fault)».
- «예외로 답함»: 고른 예외 코드(01·02·03·04·05·06·0A·0B)로 답합니다(쓰기는 하지 않음).
- «CRC 틀리게»(시리얼·RTU over TCP): 응답(예외 응답 포함)의 CRC 를 일부러 틀리게 보냅니다.
- «MBAP 길이 틀리게»(Modbus TCP): 응답 MBAP 머리의 길이 칸을 1 크게 보냅니다. 마스터가 길이를 믿고 1바이트를 더 기다리다 타임아웃이 나는지, 길이 검사로 버리는지 시험합니다.
- «고급 — 대상·N번째·확률·지연 범위» 를 펼치면:
- «지연 최대(ms, 0 = 고정)»: 0 보다 크면 «응답 지연» ~ 이 값 사이에서 요청마다 아무렇게나 고릅니다(흔들림). 고른 값은 «DELAY 350 ms (fault)» 로 남습니다.
- «이 국번만»·«이 함수 코드만(HEX)»: 쉼표로 여러 개. 비우면 모두. «이 주소 범위만»: 요청 주소 범위가 겹칠 때만(지금 «주소 표기» 기준, 비운 쪽은 처음·끝까지). 주소가 없는 08·2B 요청은 주소 조건이 있으면 빠집니다.
- «N번째마다 (1 = 매번)»: 조건에 맞는 요청 N번째마다 한 번(예: 3 이면 3·6·9번째). «확률(%)»: 조건에 맞는 요청에 이 확률로. 둘 다 쓰면 N번째 요청 중에서 확률로 고릅니다.
- 칸이 틀리면 빨갛게 되고 이유가 나오며, 앞의 맞는 값이 그대로 쓰입니다.
- 장애 주입은 저장되지 않습니다. 프로그램을 켤 때마다 모두 꺼진 상태로 시작합니다.
장치 식별 (FC 2B/0E)
- 마스터가 2B/0E(Read Device Identification)로 물으면 «제조사 (객체 0)»·«제품 코드 (객체 1)»·«버전 (객체 2)» 칸의 글로 답합니다. 모든 슬레이브가 같은 값을 씁니다.
- 각 칸은 80바이트까지입니다(한글은 한 글자에 3바이트). 넘으면 칸이 빨개지고 저장하지 않습니다. 값은 저장되어 다음에 켜도 남습니다.
통계
- 평소엔 접혀 있고 제목 옆에 «요청 n · 예외 m» 이 보입니다(예외·CRC 오류가 있으면 빨강). 제목을 누르면 아래 표가 펼쳐집니다.
- «내 국번 요청»: 흉내 내는 국번(브로드캐스트 포함)으로 온 요청 수.
- «정상 응답»·«예외»: 정상으로 답한 수와 예외 응답을 보낸 수.
- «다른 국번»: 목록에 없는 국번으로 와서 답하지 않은 수.
- «CRC 오류»(TCP 는 «MBAP 오류»): 프레임이 틀려 무시한 수. 늘어나면 속도·패리티·배선(TCP 는 마스터 설정)을 확인하세요.
- «쓰기»: 마스터가 표를 바꾼 수. «무시(BUSY)»·«응답 안 함(장애)»·«브로드캐스트» 는 생겼을 때만 보입니다.
- «함수별»: 내 국번 요청을 함수 코드별로 «FC03×12 · FC10×3» 처럼 셉니다.
- «초기화»: 숫자를 0으로 되돌립니다.
통신 기록과 사건 줄(EV)
통신 기록은 설정의 «화면에 남길 줄 수»(기본 100,000줄)까지 남고, 아무리 많아도 보이는 줄만 그려 느려지지 않습니다. 받은 요청의 CRC 가 틀리면 줄 끝에 빨간 «CRC» 가 붙고, 도구줄에 «CHECK FAIL n» 이 나옵니다(누르면 틀린 줄만).
- «풀이»: 요청·응답 줄에 Modbus 풀이를 붙입니다. 요청은 «id1 FC03 HR 0..9 (10)», 쓰기는 «id1 FC10 HR 100..101 ← 1, 2», 응답은 «id1 FC03 HR 0..9 → 정상: 1, 2, 3 …», 예외는 «→ 예외 02 없는 주소 (Illegal Data Address)»(빨간 글자). TCP 는 앞에 트랜잭션 번호(«#12»)가 붙습니다. 주소는 «주소 표기» 를 따릅니다. 줄에 마우스를 올려도 보입니다.
- TCP 에서는 줄마다 상대 주소(예: 192.168.0.20:51234)가 붙습니다.
- 찾기·거르기 줄: HEX(«01 03») 또는 글자로 찾고, «찾은 줄만»·«틀림만»·방향(RX·TX·EV)으로 거릅니다. 거르기는 보기만 바꿉니다.
- OPEN: 포트를 열었습니다(포트·속도·8N1 같은 설정이 함께 적힙니다). LISTEN·ACCEPT·CLOSE: TCP 서버가 듣기 시작·마스터가 접속·접속이 끊김(이유와 함께).
- FRAMING modbus-rtu-request @속도, RXCHECK crc16-modbus: 자동 설정된 프레임 구분과 수신 검사.
- SET: 연결 중 설정이 바뀌었습니다. 예: «SET baud 9600→19200».
- LOST: 장치가 빠지거나 읽기 오류로 끊겼습니다. RECONNECT: 같은 장치를 다시 열었습니다. CLOSE: 닫았습니다.
- LOG START: 파일 저장을 시작했습니다.
- EXCEPTION 02 → id 1 fc 03: 국번 1 이 함수 03 요청에 예외 02 로 답했습니다.
- BROADCAST fc 10 (no reply): 브로드캐스트 쓰기를 적용하고 답하지 않았습니다.
- NO-RESPONSE (fault) id 1 fc 03: «응답 안 함» 때문에 답하지 않았습니다. DELAY 350 ms (fault): 지연 범위에서 고른 지연.
- IGNORED bad CRC: 받은 요청의 CRC 가 틀려 무시했습니다. IGNORED MBAP 머리가 틀림: TCP 요청의 프로토콜 ID·길이가 틀렸습니다.
- IGNORED id 5 (not simulated) / IGNORED unit 5: 목록에 없는 국번이라 무시했습니다.
- BUSY: 지연 응답을 보내기 전에 온 요청을 무시했습니다(시리얼).
- 자기가 보낸 응답이 그대로 되돌아오면(RS-485 에코 등) 다시 답하지 않습니다.
- «파일로 계속 저장»: 고른 파일에 모든 줄을 계속 덧붙입니다(이미 있는 파일이면 뒤에 이어 씁니다). 한 줄 모양: «2026-10-17 21:05:03.123 RX 01 03 00 00 00 0A C5 CD [OK]». 풀이는 화면에만 붙습니다.
- «지우기»: 화면의 통신 기록만 비웁니다.
- 따라가기: 맨 아래에 있을 때만 새 줄을 따라 내려갑니다. 위로 굴리면 멈추고(새 줄이 와도 읽던 자리 그대로) 오른쪽 아래에 «↓ 맨 아래로 (새 줄 n)» 이 나옵니다. 누르거나 End, 또는 맨 아래까지 굴리면 다시 따라갑니다. 도구줄 «자동 스크롤» 체크가 지금 따라가는지를 보여 줍니다.
- 줄 고르기: 누르면 그 줄, Shift+누르기는 범위, Ctrl+누르기는 하나씩 더하기·빼기. 줄을 눌러도 따라가기는 꺼지지 않습니다.
- 오른쪽 버튼 메뉴: 줄 복사 · HEX 복사 · ASCII 복사 · HEX + ASCII 복사 · C 배열로 복사({0x01, 0x03}) · 이 내용 찾기. 내용 복사(HEX·ASCII·C 배열)는 사건 줄(EV)을 빼고 한 줄에 한 프레임씩 씁니다.
경고 문구의 뜻
- «1초 이상 지연은 대부분의 마스터 타임아웃(보통 1초)보다 길어 «응답 없음» 으로 보입니다.»: 지연 시험이 아니라 무응답 시험이 되어 버릴 수 있습니다. 지연 최대가 1초 이상일 때도 나옵니다.
- «지연 최대가 지연보다 작아 고정 지연(…ms)으로 씁니다.»: 범위를 쓰려면 «지연 최대» 를 «응답 지연» 보다 크게 하세요.
- ««응답 안 함» 이 켜져 있어 예외 응답도 보내지 않습니다.»: 두 장애를 함께 켜면 무응답이 이깁니다. 예외를 시험하려면 «응답 안 함» 을 끄세요.
- «⚠ 장애 주입 (시험용)»: 장애가 하나라도 켜져 있다는 표시입니다. 정상 통신 시험 전에 꺼 두세요.
- «⚠ 바꾸면 마스터가 읽을 수 있는 주소 범위도 바뀝니다 — 응답 범위: … 이 범위 밖을 읽으면 예외 02 로 답합니다.»(노랑): «시작 주소»·«개수» 를 기본에서 바꿨을 때만 나옵니다. 둘은 화면 범위이자 응답 범위입니다. 마스터가 예외 02 를 받으면 넓히세요. «알겠습니다» 로 닫습니다.
- «묶을 주소를 넣으세요»: TCP 서버의 «묶을 주소» 가 비어 있어 시작할 수 없습니다. 모든 랜카드면 0.0.0.0.
- 설정 창 «폴더를 고르지 않으면 자동 로그가 시작되지 않습니다.»: «연결하면 자동으로 파일 로그 시작» 을 켰다면 «고르기» 로 폴더를 정하세요.
- 설정 창 «연결·기록 중에는 가져올 수 없습니다. 먼저 멈추세요.»: 먼저 «끊기»·«저장 멈춤» 을 하세요.
설정(⚙)
- «언어»: 한국어·English.
- «테마»: «윈도우 설정 따름»·«밝게»·«어둡게».
- «글자 크기(px)»: 11~18.
- «로그 시각 표시»: «시:분:초.밀리초», «날짜 + 시각», «UTC», «시작부터 지난 시간 (지우면 다시)». 화면 통신 기록에 적용됩니다(파일 로그는 늘 날짜 + 시각).
- «화면에 남길 줄 수»: 1,000~1,000,000(기본 100,000). 넘치면 화면에서만 오래된 줄을 지웁니다.
- «새 줄이 오면 자동 스크롤»: 통신 기록을 맨 아래로 따라갑니다(위로 올려 보는 중에는 따라가지 않습니다).
- «연결하면 자동으로 파일 로그 시작»: «자동 로그 폴더» 를 고르면 연결할 때마다 «portdock-modbus-slave-날짜-시각.log» 에 저장합니다.
- «연결·기록 중에 창을 닫으려 하면 묻기»: 실수로 창을 닫아 시험이 끊기는 것을 막습니다.
- «설정 내보내기»·«설정 가져오기»: 화면 설정과 연결 방식·국번·범위·표 값·칸 설정(이름·형식·자동 변화)·장치 식별을 JSON 파일로 옮깁니다(장애 주입은 빼고). 다른 PortDock 프로그램의 파일은 받지 않습니다.
- «기본값으로»: 화면 설정만 되돌립니다.
- «항상 위»: 이 창을 다른 창 위에 늘 보이게 합니다(머리줄 📌 과 같은 값).
- «모두 펼치기(전문가 화면)»: 평소 접어 두는 칸(고급 연결·받기 설정·장애 주입·통계·찾는 방법·트리거·자동응답 등)을 펼친 채 보입니다. 켜 둔 채 하나를 접으면 이번 실행 동안만 접힙니다. 끄면 칸마다 기억해 둔 열림 상태로 돌아갑니다.
단축키·팁
- F4: 연결·끊기(왼쪽 버튼과 같음).
- Ctrl+L: 화면 기록 지우기(파일 로그는 그대로).
- Ctrl+Shift+L: 파일로 계속 저장 켜기·끄기.
- End: 로그 맨 아래로 가서 다시 따라가기.
- Ctrl+C: 고른 로그 줄을 «시각 방향 내용» 으로 복사(지금 보기대로). 입력칸 안에서는 보통 복사.
- Ctrl+F: 로그 찾기 칸으로. 찾기 칸에서 Enter 다음 · Shift+Enter 이전 · Esc 지우기.
- F1 또는 화면의 ? 버튼: 이 도움말. Esc 로 닫습니다.
- 숫자 칸: ↑/↓ 1씩, Shift+↑/↓ 10씩, PageUp/PageDown 100씩, 칸을 누른 뒤 마우스 휠. 속도 칸은 ↑/↓ 로 목록의 다음·앞 속도.
- 대화상자·우클릭 메뉴가 열려 있거나 한글을 조합하는 중에는 단축키가 동작하지 않습니다.
- 국번 칸에서 Enter: «추가».
- 값 칸: Enter·↓ 다음 칸, ↑·Shift+Enter 앞 칸(옮기면서 반영), Esc 고치기 취소. 칸에서 오른쪽 버튼: «칸 설정».
- 엑셀 등에서 여러 칸을 복사해 값 칸에 붙여 넣으면(탭·줄바꿈·쉼표로 나뉜 값) 그 칸부터 이어진 칸에 한꺼번에 들어갑니다. 칸마다 그 칸의 형식(U16 칸은 지금 «표시»)으로 읽고, 하나라도 못 읽으면 넣지 않고 알립니다. 범위를 넘는 값은 버립니다.
- 값은 연결 전에 넣어 둘 수 있고, 연결 중에 바꿔도 다음 요청부터 바로 반영됩니다.
- 마스터 쪽 화면과 이 표를 나란히 두고, 값을 바꿔 가며 마스터가 제대로 읽는지 확인하면 편합니다. 32비트 값이 이상하게 읽히면 «칸 설정» 의 순서(CDAB 등)를 바꿔 보세요.
문제 해결
- 포트가 안 보임: 장치 관리자에서 COM 포트와 변환기 드라이버(CH340·FTDI·CP210x 등)를 확인하세요. 목록은 1.5초마다 새로 고쳐집니다.
- «이미 연결돼 있거나 여는 중입니다»: 이 프로그램에서 이미 연결했거나 여는 중입니다. «끊기» 후 다시 하세요.
- «Access is denied»(액세스 거부): 다른 프로그램이 그 포트를 쓰고 있습니다. 그 프로그램을 닫으세요.
- 요청이 오는데 답하지 않음: 통신 기록의 EV 줄을 보세요. «IGNORED bad CRC» 면 속도·패리티·정지 비트가 마스터와 다릅니다. «IGNORED id …»·«IGNORED unit …» 면 그 국번을 «국번(슬레이브 ID)» 에 추가하거나(TCP) «국번 무시» 를 켜세요.
- RX 줄이 아예 없음: 배선(RS-485 A/B 바뀜 등)과 포트를 확인하세요. TCP 면 상태 칸의 «연결된 클라이언트» 가 0 인지 보세요 — 0 이면 마스터의 IP·포트, 윈도우 방화벽(이 프로그램 허용)을 확인하세요.
- TCP «포트가 이미 사용 중»: 다른 Modbus 프로그램(또는 다른 PortDock 창)이 같은 포트를 쓰고 있습니다. 그 프로그램을 닫거나 다른 포트를 쓰세요.
- 마스터가 예외 02 를 받음: 읽는 주소가 «시작 주소»·«개수» 범위 밖입니다. 장비 설명서가 1부터 세는지(40001)도 확인하세요 — «주소 표기» 를 «1 기준»·«PLC» 로 바꾸면 설명서와 같은 번호로 보입니다.
- 32비트·실수 값이 엉뚱하게 읽힘: «칸 설정» 의 형식과 «워드·바이트 순서» 가 마스터와 같은지 확인하세요(가장 흔한 것은 ABCD 와 CDAB).
- 마스터가 타임아웃: 장애 주입이 켜져 있는지 확인하세요(«⚠ 장애 주입» 표시).
- 윈도우 7 은 지원하지 않습니다. 윈도우 10·11 을 쓰세요.
- 프로그램이 열리지 않음: Microsoft Edge WebView2 가 필요합니다. 윈도우 11 에는 들어 있고, 설치 프로그램이 없으면 받아 설치합니다(인터넷 필요). 인터넷이 없는 PC 는 WebView2 런타임 설치 파일을 따로 설치하세요.