이 프로그램은
PortDock PLC Simulator 는 PC 가 PLC 의 이더넷 포트처럼 MC 프로토콜(SLMP) 요청에 답하게 하는 시험 도구입니다. PLC 없이 HMI·데이터 수집 프로그램·상위 프로그램의 통신을 만들고 시험할 때 씁니다.
3E·4E 프레임, 이진·ASCII 코드, TCP 서버·UDP 를 고릅니다. 디바이스(D·W·R·ZR·M·X·Y·B·L 등) 표의 값으로 일괄 읽기·쓰기, 랜덤 읽기·쓰기, 루프백에 답합니다.
블록 읽기·쓰기, 모니터 등록·실행, 원격 RUN·STOP·PAUSE·래치 클리어·리셋, 형명 읽기에도 답하고, «조건 규칙» 으로 «요청 비트가 켜지면 잠시 뒤 완료 비트 켜기» 같은 핸드셰이크를 흉내 냅니다.
미쓰비시 공개 매뉴얼(SLMP/MC) 기준 구현 — 제휴 아님, 실제 PLC 와 동작이 다를 수 있음. 래더 프로그램은 돌리지 않습니다(값은 표에 넣은 그대로, 또는 «값 자동 변화» 로만 바뀝니다).
응답 지연·무응답·종료 코드 오류를 일부러 만들어 클라이언트의 오류 처리도 시험할 수 있습니다.
처음 쓰는 순서
- 1. 왼쪽 «연결 방식»(TCP 서버·UDP), «프레임»(3E·4E), «데이터 코드»(이진·ASCII), «포트» 를 클라이언트 설정과 똑같이 맞춥니다. 포트 기본값 5000 은 이 프로그램의 기본값입니다 — 매뉴얼은 포트 번호를 정해 두지 않고 PLC 쪽 설정에서 정합니다.
- 2. «묶을 주소» 는 기본 127.0.0.1 — 이 PC 안의 프로그램만 붙습니다. 다른 PC 의 HMI 를 붙이려면 «다른 PC 에서 연결 허용 (0.0.0.0)» 을 켭니다(방화벽 안내가 나옵니다).
- 3. 가운데 위에서 디바이스(예: D)를 고르고 칸에 값을 넣어 둡니다. 시작 전에 넣어 둬도 됩니다. 32비트·실수·이름은 칸의 ⋯(또는 오른쪽 버튼)으로 «칸 설정» 을 엽니다.
- 4. «시작»(F4)을 누르면 요청이 오는 대로 답합니다. 주고받은 내용과 풀이(«0401 일괄 읽기 (워드) D100 ×3», «종료 0000 완료 · 6바이트»)는 아래 «통신 기록» 에 찍힙니다.
- 처음 켜면 비어 있는 «통신 기록» 자리에 이 순서가 카드로 보입니다. «예제 채우기» 는 D0~D7 에 1~8(D0 «상태»·D1 «설정값»), D8~D9 에 F32 23.5(CDAB, «온도»), M0~M7 에 1·0 을 넣습니다(그 자리에 값이 있으면 먼저 묻습니다). «다시 보지 않기» 로 숨깁니다.
화면 구성
- 왼쪽: 연결 방식·프레임·데이터 코드·묶을 주소·포트, «자기 국 요청만 받기», «시작»·«멈춤», 상태와 붙은 클라이언트 목록(TCP 는 ✕ 로 하나씩 끊기). 그 아래 «장애 주입 (시험용)»·«통계» 는 접혀 있고 제목을 누르면 펼칩니다(펼친 상태는 기억).
- 가운데 위: 디바이스 버튼(비트 X·Y·M·L·F·B·SM · 워드 D·W·R·ZR·SD · 타이머·카운터 TS·TC·TN·CS·CC·CN), «규칙»·«채우기…»·«저장»·«불러오기». 그 아래 «시작 번호»·«개수»·«크기(점)», 비트 디바이스면 «비트»·«워드(16점)» 보기, 워드면 «표시»(U16·S16·HEX·BIN·ASCII·바이트), 회색 «응답 범위: D0–D12287».
- 왼쪽 «흉내 PLC 상태»(접힘): RUN·STOP·PAUSE 단추, 형명 읽기 흉내 값. RUN 이 아니면 아래에 노란 줄이 남습니다.
- 가운데: 디바이스 칸(번호 · 이름 · 값 · 형식 · ◷ · ⋯). 클라이언트가 바꾼 칸은 잠깐 강조됩니다.
- 아래: «통신 기록»(RX ◀ 요청, TX ▶ 응답, EV 사건)과 찾기·거르기 줄, «파일로 계속 저장»·«지우기», 맨 아래 한 줄 안내(공개 매뉴얼 기준 구현 — 제휴 아님).
- 표와 통신 기록 사이의 막대를 끌면 통신 기록 높이가 바뀌고 기억됩니다.
- 머리줄 📌: 항상 위 — 이 창을 다른 창 위에 늘 보이게 합니다(설정의 «항상 위» 와 같음).
- 창 제목에 지금 상태가 나옵니다(예: «COM3 115200 8N1 · 연결됨 ● REC — PortDock Serial»). 작업 표시줄에서 어느 창이 어느 포트인지 알 수 있습니다.
- 창 너비가 900px 이하(화면 반쪽 맞춤 등)면 왼쪽 칸이 접히고, 위에 요약 줄과 «⚙ 연결 설정»(Port Inspector 는 «⚙ 포트 목록», Net Scan 은 «⚙ 찾기 설정», Hardware Tester 는 «⚙ 점검 항목»)·연결 버튼이 나옵니다. 언어·📌·!·AI·?·⚙ 단추는 그 줄 오른쪽으로 옮겨 갑니다. «⚙ …» 으로 펼치고 ✕ 나 바깥을 눌러 닫습니다.
- 머리줄 AI: AI 에게 물어보기용 복사— 프로그램·버전·연결 설정·이번 실행의 오류·최근 통신 기록(HEX·글자·풀이 줄. Port Inspector·Hardware Tester 는 점검 결과, Net Scan 은 찾은 장비)을 «원인 후보와 확인 순서를 알려 주세요» 질문 틀과 함께 AI 채팅에 붙여 넣기 좋은 글로 만듭니다. 질문 틀은 앱 성격에 맞춥니다 — 통신 앱은 장비·배선, Hardware Tester 는 PC·무선 환경, Net Scan 은 네트워크 장비 찾기, Port Inspector 는 포트·드라이버. 미리보기를 확인하고 «복사» 하면 클립보드에만 들어갑니다. 8,000자를 넘으면 오래된 기록 줄부터 빼고 뺀 수를 적습니다. 사용자 폴더·윈도우 기본 PC 이름(DESKTOP-… 등)·MAC 뒤 3바이트·공인 IP 는 가리고, 사설 IP 는 원인(서브넷 다름 등)을 보는 데 필요해 기본으로 남깁니다(«사설 IP 도 가리기» 로 가림).
- 붙여 넣는 AI 서비스로 내용이 갑니다. 장비·회사 정보는 확인 후 붙여 넣으세요.
- 글자 크기: Ctrl+마우스 휠 또는 Ctrl+= / Ctrl+- 로 키우고 줄이고, Ctrl+0 으로 처음 크기(13px)로 돌아갑니다. 설정의 «글자 크기» 와 같은 값이라 다음에 켜도 그대로입니다.
서버 설정
- «연결 방식»: TCP 서버 — 클라이언트 여러 개가 동시에 붙어도 각각 답합니다(최대 64). 요청 하나가 TCP 조각 여럿으로 나뉘어 오거나 둘이 붙어 와도 머리의 «요청 데이터 길이» 로 끊어 하나씩 답합니다. UDP — 데이터그램 하나가 요청 하나이고, 보낸 곳으로 답합니다.
- «프레임»: 3E 는 부머리 5000(이진 50 00), 4E 는 5400 + 일련번호 + 0000 — 4E 응답에는 요청의 일련번호를 그대로 넣습니다. 고른 것과 다른 프레임이 오면 답하지 않고 «IGNORED» 줄을 남깁니다.
- «데이터 코드»: 이진은 숫자를 작은 자리 바이트부터, ASCII 는 16진 글자로 큰 자리부터 보냅니다(SLMP 4장). 클라이언트와 같아야 합니다.
- «묶을 주소»: 기본 127.0.0.1(이 PC 안에서만). «다른 PC 에서 연결 허용 (0.0.0.0)» 을 켜면 모든 랜카드에서 받습니다 — 처음 시작할 때 윈도우 방화벽 허용 창이 뜰 수 있습니다(관리자 권한 필요). 공장망에서 실제 PLC 와 같은 IP·포트로 띄우지 마세요. 실제 PLC 대신 답하게 됩니다.
- «포트»: 기본 5000. 0 이면 운영체제가 빈 포트를 고르고 상태 칸에 실제 주소가 나옵니다. 이미 쓰는 포트면 «포트가 이미 사용 중» 으로 시작하지 못합니다. 시작에 성공한 «주소:포트» 는 «▾» 최근 목록에 남습니다.
- «자기 국 요청만 받기»: 켜면 요청 머리의 네트워크 00·국 FF·I/O 03FF·멀티드롭 00(연결된 국 자신)만 처리하고, 다른 국 요청에는 종료 코드 C05F 로 답합니다. 끄면(기본) 어느 국 요청이든 이 표로 답하고, 응답 머리에는 요청의 국 정보를 그대로 돌려줍니다. 시작한 동안에도 바뀝니다.
- 감시 타이머 값은 읽기만 하고 쓰지 않습니다(이 흉내는 바로 답합니다).
구현한 명령
- 0401 일괄 읽기 · 1401 일괄 쓰기: 서브 명령 0001(비트 1점 단위)·0000(워드 단위 — 비트 디바이스는 16점이 1워드), 0003·0002 는 같은 일을 디바이스 번호 4바이트·코드 2바이트(ASCII 는 코드 4글자·번호 8글자)로. 점 수: 워드 1~960, 비트 이진 1~7168·ASCII 1~3584.
- 0403 랜덤 읽기: 서브 0000·0002. 워드 점과 더블워드 점(번호가 작은 워드가 아래 자리)을 섞어 읽습니다. 점 수 합 1~192(0002 는 1~96).
- 1402 랜덤 쓰기: 비트(서브 0001 은 1~188점, 0003 은 1~94점 — ON/OFF 는 01·00, 0003 이진은 01 00·00 00), 워드·더블워드(서브 0000 은 워드×12 + 더블워드×14 ≤ 1920, 0002 는 ≤ 960).
- 0619 루프백: 받은 데이터(1~960바이트)를 그대로 돌려줍니다.
- 0406 블록 읽기 · 1406 블록 쓰기: 서브 0000·0002. 워드 블록(워드 디바이스)과 비트 블록(비트 디바이스, 1점 = 16비트 한 워드)을 여러 개 — 블록 수 1~120(0002 는 1~60), 점 수 합 ≤ 960, 쓰기는 «블록 수 × 4(0002 는 × 9) + 점 수 합 ≤ 960». 워드 블록에 비트 디바이스(또는 반대)는 C05B, 넘치면 C051.
- 0801 모니터 등록 · 0802 모니터 실행: 0801 은 0403 과 같은 모양(워드·더블워드 점)으로 읽을 디바이스를 등록만 하고(타이머·카운터 접점·코일 TS·TC·CS·CC 는 C05B), 0802 는 등록한 값을 0403 응답 모양으로 돌려줍니다. 등록 전 0802 는 C05D. 등록은 연결마다가 아니라 서버 하나에 하나이고, «시작» 을 다시 누르거나 원격 리셋을 받으면 지워집니다(이 흉내의 단순화).
- 1001 원격 RUN(모드 0001·0003, 클리어 모드 00·01·02) · 1002 원격 STOP · 1003 원격 PAUSE(모드 0001·0003) · 1005 원격 래치 클리어 · 1006 원격 리셋(서브 0000): «흉내 PLC 상태» 를 바꾸고 사건 줄 «REMOTE STOP · RUN → STOP» 을 남깁니다. 래더가 없으므로 STOP·PAUSE 여도 읽기·쓰기에는 평소대로 답하고 조건 규칙만 쉽니다. 클리어 모드는 읽기만 하고 값을 지우지 않으며, 래치 클리어는 L(래치 릴레이)만 0 으로 합니다. 리셋은 매뉴얼대로 응답을 보내지 않고 RUN 으로 돌아갑니다(TCP 연결은 끊지 않음). «강제 실행 허용» 모드·여러 클라이언트 사이의 원격 조작 순서, STOP 이 아닐 때의 래치 클리어·리셋 거절은 흉내 내지 않습니다 — 실제 PLC 와 다를 수 있습니다.
- 0101 형명 읽기: «흉내 PLC 상태» 의 형명(16글자, 모자라면 공백)과 형명 코드로 답합니다. 기본값 «PORTDOCK-SIM»·0000 은 실제 기종 이름이 아닙니다 — 클라이언트가 형명 코드로 기종을 가르면 그 값을 넣습니다.
- 쓰기는 범위를 다 본 뒤에 반영합니다 — 범위를 넘으면 하나도 쓰지 않고 C056.
- 그 밖의 명령(버퍼 메모리, 라벨, 파일, 원격 암호 등)과 확장 지정 서브 명령(0080 등)은 없습니다 — C059 로 답합니다.
- 메시지 형식은 SLMP Reference Manual SH(NA)-080956ENG 4장·5.2·5.6·5.9(https://dl.mitsubishielectric.com/dl/fa/document/manual/plc/sh080956eng/sh080956engl.pdf)와 MELSEC Communication Protocol Reference Manual SH-080008 5장(https://dl.mitsubishielectric.com/dl/fa/document/manual/plc/sh080008/sh080008ab.pdf)을 따랐습니다.
디바이스
- 비트: X 입력(9C) · Y 출력(9D) · M 내부 릴레이(90) · L 래치 릴레이(92) · F 어넌시에이터(93) · B 링크 릴레이(A0) · SM 특수 릴레이(91) · TS·TC 타이머 접점·코일(C1·C0) · CS·CC 카운터 접점·코일(C4·C3). 괄호는 이진 디바이스 코드입니다.
- 워드: D 데이터 레지스터(A8) · W 링크 레지스터(B4) · R 파일 레지스터(AF) · ZR 파일 레지스터 연번(B0) · SD 특수 레지스터(A9) · TN 타이머 현재값(C2) · CN 카운터 현재값(C5).
- X·Y·B·W·ZR 는 번호를 16진으로 씁니다(X1F, W100 = 256번째). 화면의 «시작 번호» 칸도 16진으로 읽습니다(X1F·1F·0x1F 모두 됨). 나머지는 10진입니다.
- «크기(점)»: 디바이스마다 1~65536. 기본값(D 12288, M 8192, X·Y 8192(0~1FFF), R 32768, ZR 65536 …)은 시험용 작은 값이고 어느 기종의 상한과도 같다고 내세우지 않습니다. 이 크기를 넘는 번호를 요청하면 C056 으로 답합니다.
- 비트 디바이스는 «비트» 보기(체크칸)와 «워드(16점)» 보기(16점을 한 워드로 — 번호가 작은 점이 비트 0, 클라이언트가 워드 단위로 읽는 값과 같음)를 고릅니다.
- 32비트 값: 번호가 작은 워드가 아래 자리입니다(예: D200 = 아래 16비트, D201 = 위 16비트). «칸 설정» 의 순서 기본값이 그래서 CDAB 입니다. 실수(F32)도 같습니다.
- 롱 타이머·롱 카운터·인덱스 레지스터·링크 다이렉트 같은 다른 디바이스는 없습니다 — 그 코드는 C05B 로 답합니다.
종료 코드
- 응답의 «종료 코드» 가 0000 이면 완료, 아니면 오류이고 그 뒤에 오류 정보(요청의 네트워크·국·I/O·멀티드롭과 명령·서브 명령)가 붙습니다(SLMP 4.2).
- 이 흉내가 쓰는 값 — 뜻은 MELSEC iQ-R Ethernet User's Manual (Application) SH-081257ENG 3.5 «List of Error Codes» 의 설명을 줄인 것이고, 어느 조건에 어느 코드를 쓸지는 이 프로그램이 고른 것입니다(실제 PLC·모듈과 다를 수 있음):
- C050 ASCII 로 바꿀 수 없는 글자(16진이 아닌 글자, 10진 디바이스 번호에 A~F) · C051 워드 점 수 범위 밖 · C052 비트 점 수 범위 밖 · C053 랜덤 비트 점 수 범위 밖 · C054 랜덤 워드·더블워드 점 수 범위 밖 · C056 디바이스 크기를 넘는 번호
- C057 머리의 요청 데이터 길이가 실제와 다름 · C059 모르는 명령·서브 명령 · C05B 모르는 디바이스 코드, 워드 디바이스를 비트 단위로 · C05C 루프백 데이터 수 범위 밖, 원격 조작의 모드 값이 틀림 · C05D 모니터 등록(0801) 전에 모니터 실행(0802) · C05F 다른 국 요청(«자기 국 요청만 받기» 켬) · C060 비트 값이 0·1 이 아님 · C061 명령 데이터가 점 수보다 짧거나 김
- 출처: https://dl.mitsubishielectric.com/dl/fa/document/manual/plc/sh081257eng/sh081257engaf.pdf (3.5). 이 매뉴얼들은 저장소에 넣지 않았습니다.
통신 기록
- RX ◀ 는 받은 요청, TX ▶ 는 보낸 응답, EV 는 사건(듣기 시작·클라이언트 연결·끊김·IGNORED·END·DELAY)입니다. 줄마다 클라이언트 주소가 붙습니다.
- «풀이 보기» 를 켜면 요청 줄에 «명령 이름 · 첫 디바이스 · 점 수»(랜덤은 «W 워드 수 D 더블워드 수»), 다른 국이면 «NW·ST·IO·MD», 4E 면 «#일련번호», 응답 줄에 «종료 코드 · 뜻 · 데이터 길이» 가 붙습니다. 오류 응답 줄은 빨갛습니다.
- 오류로 답한 요청은 EV 줄 «END C056 주소 범위 밖 — 0401» 처럼 남고 통계의 «종료 코드별» 에 셉니다.
- 원격 조작은 «REMOTE STOP · RUN → STOP», 실행된 조건 규칙은 «RULE #1 요청 → 완료: M101=ON» 줄로 남습니다. 클라이언트 쓰기 직후 바로 실행된 규칙은 그 요청의 사건 줄에 붙어 파일 기록에도 들어가고, 지연 뒤·주기로 실행된 규칙 줄은 화면에만 보입니다.
- 따라가기: 맨 아래에 있을 때만 새 줄을 따라 내려갑니다. 위로 굴리면 멈추고(새 줄이 와도 읽던 자리 그대로) 오른쪽 아래에 «↓ 맨 아래로 (새 줄 n)» 이 나옵니다. 누르거나 End, 또는 맨 아래까지 굴리면 다시 따라갑니다. 도구줄 «자동 스크롤» 체크가 지금 따라가는지를 보여 줍니다.
- 줄 고르기: 누르면 그 줄, Shift+누르기는 범위, Ctrl+누르기는 하나씩 더하기·빼기. 줄을 눌러도 따라가기는 꺼지지 않습니다.
- 오른쪽 버튼 메뉴: 줄 복사 · HEX 복사 · ASCII 복사 · HEX + ASCII 복사 · C 배열로 복사({0x01, 0x03}) · 이 내용 찾기. 내용 복사(HEX·ASCII·C 배열)는 사건 줄(EV)을 빼고 한 줄에 한 프레임씩 씁니다.
장애 주입 (시험용)
- «응답 지연(ms)»: 응답을 이만큼 늦게 보냅니다. TCP 는 연결마다 따로 기다리므로 지연 중에도 다른 연결의 요청에 답합니다.
- «응답 안 함»: 요청은 평소대로 처리하고(쓰기는 반영) 응답만 보내지 않습니다 — 클라이언트의 시간 초과·재시도 시험.
- «종료 코드로 답함»: 고른 종료 코드(목록 또는 «직접 입력…» 16진)로 답합니다. 이때 쓰기는 반영하지 않습니다.
- «대상 고르기»: «지연 최대»(지연을 응답 지연 ~ 최대 사이에서 요청마다 아무렇게나 — 고른 값은 DELAY 줄), «명령»(0401, 1401 …), «디바이스»(D, M …), «N번째마다», «확률(%)». 비워 두면 모든 요청에 겁니다.
- 장애 주입은 켤 때마다 꺼진 채로 시작합니다. 하나라도 켜지면 제목이 «⚠ 장애 주입 켜짐» 이 되고 아래에 경고 줄이 남습니다.
칸 설정·값 자동 변화
- 칸의 ⋯ 또는 오른쪽 버튼: 이름, 형식(U16·S16·U32·S32·F32·F64·문자열), 워드·바이트 순서, 값 자동 변화(증가·감소·랜덤·사인·램프·토글)를 정합니다. 비트 디바이스는 이름과 토글·랜덤만.
- 자동 변화는 백엔드가 돌리므로 창을 내려 두어도 바뀝니다. «클라이언트가 읽을 때마다 바꾸기» 를 켜면 시간이 아니라 그 칸을 읽는 요청(0401·0403)마다 바뀝니다.
- 클라이언트가 쓴 값은 다음 변화 때까지 남고, 증가·감소는 그 값부터 이어 갑니다.
- 값 칸: Enter·↓ 다음 칸, ↑·Shift+Enter 앞 칸, Esc 고치기 취소. 엑셀 등에서 여러 값을 붙여 넣으면 이어진 칸에 한꺼번에 넣습니다.
- 비트 보기에서는 칸 아무 데나 눌러도 ON·OFF 가 뒤집힙니다(체크칸도 그대로).
- «표시» 의 ASCII(2글자)는 한 워드를 두 글자로 — 아래 바이트 글자가 먼저(PLC 문자열 순서), 보이지 않는 바이트는 «\x0D», 0 은 «\0». «바이트(위 아래)» 는 위 바이트·아래 바이트를 10진으로(«18 52» = 1234h). 입력도 같은 모양으로 합니다.
- «채우기…»: «숫자로 채우기»(시작 번호·개수·값·증가량 — 워드는 0~65535 를 돌고 «줄여 가기» 로 빼 나감, 비트는 0·1 하나로), «문자열 써 넣기»(시작 번호부터 한 워드에 두 글자, 글자 순서·끝 0 고름, \xNN 됨 — 워드 디바이스만), «숫자 목록 써 넣기»(«100, 200 0x10 -1», 비트는 0·1). 미리보기 줄에 «D100~D104 에 5칸» 처럼 나오고, 디바이스 크기를 넘으면 쓰지 않습니다. 쓸 칸에 이미 값(0 이 아닌)이 있으면 몇 칸인지 보이고 «덮어쓰기» 를 한 번 더 눌러야 씁니다 — 되돌리기는 없습니다.
조건 규칙
가운데 위 «규칙» 단추로 엽니다. 규칙 하나 = 조건 → 지연 → 동작. 래더 프로그램이 아니라, PC 쪽 프로그램이 기다리는 PLC 쪽 응답(완료 비트·결과 값)을 흉내 내는 짧은 흐름입니다. 이 동작은 프로토콜이 아니라 이 프로그램이 정한 것입니다.
- 조건: «비트가 ON 이 되면»·«OFF 가 되면»(맞지 않다가 맞게 된 순간 한 번 예약, 지연이 끝나기 전에 풀리면 취소), «올라갈 때»·«내려갈 때»(바뀌는 순간만), «워드 값 비교»(=·≠·>·<, 0~65535 — 맞게 된 순간 한 번), «조건 없음(주기)»(지연마다 되풀이, 50 ms 이상).
- 주소: M100·X1F(X·Y·B·W·ZR 는 16진)·D100, 워드 안 비트는 «D100.3»(0~F). ON·OFF·올라감·내려감은 비트(또는 워드 안 비트)에, 값 비교는 워드에.
- 지연: 고정 ms, 또는 «최대» 를 지연보다 크게 넣으면 그 사이 아무 값(예약할 때 고름). 0 이면 클라이언트 쓰기를 처리하는 그 자리에서 바로 — 다음 읽기에 이미 바뀌어 있습니다.
- 동작(최대 16개, 차례로): 비트 ON·OFF·반전, 워드 «값 쓰기»·«더하기»(음수면 빼기, 0~65535 를 돎).
- 평가 시점: 클라이언트가 쓴 직후, 화면에서 값을 바꾼 직후, 그리고 백엔드가 20 ms 마다. 켜는 순간 이미 맞는 ON·OFF·값 비교 조건은 한 번 실행됩니다. 지연 0 인 규칙이 서로 꼬리를 물면 한 번에 8바퀴까지만 돕니다.
- «흉내 PLC 상태» 가 RUN 일 때만 돕니다. STOP·PAUSE 로 바꾸면 예약은 버려지고, RUN 으로 돌아오면 조건을 처음부터 봅니다.
- «예제 넣기 (핸드셰이크)»: «요청 → 완료»(M100 이 ON 이 되면 300 ms 뒤 M101 ON)와 «요청 OFF → 완료 OFF»(M100 이 OFF 가 되면 M101 OFF) 두 규칙. 클라이언트에서 M100 을 켜고 M101 을 읽어 봅니다.
- «여러 개 만들기»: 개수·번호 간격을 넣고 저장하면 조건·동작 번호를 그만큼씩 옮긴 규칙을 한꺼번에 만듭니다(예: 개수 3·간격 2 → M100→M101, M102→M103, M104→M105).
- 목록: 체크칸으로 켜고 끄기, ✎ 고치기, ⧉ 복제, ✕ 지우기. 오른쪽에 실행 횟수·마지막 실행 시각(⏳ = 지연을 기다리는 중), «횟수 지우기».
- 규칙은 다음에 켤 때 그대로 돌아오고 «저장» 파일에도 들어갑니다(«불러오기» 하면 바뀜). 범위 밖 번호를 바꾸려는 동작은 건너뜁니다.
저장·불러오기
- «저장»: 모든 디바이스의 크기(바꾼 것)·0 이 아닌 값·칸 설정·자동 변화를 JSON 파일 하나로 저장합니다(시험 준비 상태를 다른 PC·다음 시험으로 옮기기). 조건 규칙도 함께 넣습니다 — 규칙이 없는 옛 파일도 그대로 읽습니다.
- «불러오기»: 그 파일을 읽어 크기·값·칸 설정을 바꿉니다(파일에 없는 값은 0). 다른 프로그램의 파일은 거절하고, 틀린 칸은 건너뛰고 몇 개인지 알려 줍니다. 시작한 채 불러오면 먼저 묻습니다.
- 따로 저장하지 않아도 값·칸 설정·크기는 다음에 켤 때 그대로 돌아옵니다(장애 주입은 빼고).
설정 (⚙)
- «언어»·«테마»(Windows 따라가기·밝게·어둡게)·«글자 크기»·«로그 시각» 형식·«화면에 남길 줄 수»·«새 줄 자동 스크롤».
- «연결하면 자동으로 파일 로그 시작»: «자동 로그 폴더» 를 고르면 «시작» 할 때마다 «portdock-plc-simulator-날짜-시각.log» 로 남깁니다.
- «글자·파일 로그»: 파일 로그 형식(HEX·ASCII·HEX + ASCII·CSV), 크기·시간으로 나누기(«이름-002.log»), «날짜가 바뀌면 새 파일»(«이름-20261031.log»), «옛 로그 지우기(일)» — 기록을 시작할 때·다음 파일로 넘어갈 때 같은 폴더의 같은 이름 갈래(같은 확장자, 이름 뒤에 «-숫자» 만 붙은 파일) 중 고친 지 그 날 수가 지난 것을 지우고 «LOG CLEAN» 사건 줄을 남깁니다(0 = 안 지움). 다음에 시작하는 파일 기록부터 적용됩니다.
- «연결·기록 중에 창을 닫으려 하면 묻기»(시작한 동안도), «설정 내보내기·가져오기», «기본값으로».
- «항상 위»: 이 창을 다른 창 위에 늘 보이게 합니다(머리줄 📌 과 같은 값).
- «모두 펼치기(전문가 화면)»: 평소 접어 두는 칸(고급 연결·받기 설정·장애 주입·통계·찾는 방법·트리거·자동응답 등)을 펼친 채 보입니다. 켜 둔 채 하나를 접으면 이번 실행 동안만 접힙니다. 끄면 칸마다 기억해 둔 열림 상태로 돌아갑니다.
- «사용 통계 보내기»(기본 꺼짐): 켜면 창을 닫을 때 한 번, 기능별 사용 횟수(연결·보내기·읽기 등 — 횟수만)·켜 둔 시간(분)·프로그램/윈도우 버전·화면 언어·설치판/휴대판 구분을 Aptabase(EU)로 익명으로 보냅니다. 통신 내용·IP·포트·COM 이름·파일 경로·PC/사용자/장비 이름은 보내지 않습니다. 처음 실행할 때 한 번 묻고(고르지 않고 닫으면 보내지 않음), 여기서 언제든 끌 수 있습니다. 인터넷이 없거나 보내지 못하면 버립니다. 이 칸이 없는 판은 통계를 보내지 않습니다.
- 사용 통계를 한 PortDock 앱에서 고르면(묻는 창 또는 이 칸), 아직 묻지 않은 이 PC 의 다른 PortDock 앱은 다시 묻지 않고 그 답을 처음 값으로 씁니다(휴대판은 같은 폴더에 둔 것끼리). 앱마다 이 칸에서 따로 바꿀 수 있고, 가져온 설정 파일로는 켜지지 않습니다. 남기는 것은 «물어봤음» 과 고른 값뿐입니다(설치판 %LOCALAPPDATA%\dev.portdock\shared-consent.json, 휴대판 portdock-data\shared-consent.json).
- «새 버전 확인(하루 한 번)»(기본 꺼짐): 켜면 하루 한 번 GitHub(api.github.com)에 PortDock 최신 릴리스만 묻습니다. 새 버전이면 창 아래에 알림줄과 «릴리스 페이지» 버튼이 나옵니다. 보내는 데이터는 없고 내려받기·설치는 하지 않습니다. «이 버전은 그만 알리기» 로 그 버전 알림을 끕니다. 아래 «정보» 칸의 «새 버전 확인» 버튼은 지금처럼 릴리스 페이지를 엽니다.
- «연결·기록 중 절전 막기»(기본 꺼짐): 연결(시작)해 있거나 파일로 기록하는 동안 PC 가 대기(절전) 모드로 들어가지 않게 합니다 — 밤샘 기록 중 USB 변환기가 사라지지 않게. 화면은 꺼져도 됩니다. 끊거나 창을 닫으면 풀리고, 전원 설정은 바꾸지 않습니다.
- «켤 때 마지막 연결 다시 열기»(기본 꺼짐): 켤 때 마지막으로 연결에 성공했던 설정으로 저절로 연결(시작)합니다. 그 포트·장치가 없으면 조용히 그만둡니다. 포트를 열면 리셋되는 장비(Arduino 등)에는 끄세요. 명령줄 «--auto» 도 같은 일을 합니다.
- 명령줄 «--auto»: 마지막으로 시작에 성공한 설정으로 바로 시작합니다(예: «PortDock PLC-Simulator.exe --auto»). 다른 인자는 «무시한 명령줄 인자» 로 알립니다.
단축키·팁
- F4: 시작·멈춤(왼쪽 버튼과 같음).
- Ctrl+L: 화면 기록 지우기(파일 로그는 그대로).
- Ctrl+S: 화면 내용 저장.
- Ctrl+Shift+L: 파일로 계속 저장 켜기·끄기.
- End: 로그 맨 아래로 가서 다시 따라가기.
- 로그를 한 번 누른 뒤(로그 칸에 포커스) ↑/↓: 줄 옮겨 고르기 · Shift+↑/↓: 범위 늘리기 · PageUp/PageDown: 한 화면씩 · Home: 첫 줄 · End: 마지막 줄(다시 따라가기). 옮기면 따라가기는 멈춥니다.
- Ctrl+C: 고른 로그 줄을 «시각 방향 내용» 으로 복사(지금 보기대로). 입력칸 안에서는 보통 복사.
- Ctrl+F: 로그 찾기 칸으로. 찾기 칸에서 Enter 다음 · Shift+Enter 이전 · Esc 지우기.
- F1 또는 화면의 ? 버튼: 이 도움말. Esc 로 닫습니다.
- 숫자 칸: ↑/↓ 1씩, Shift+↑/↓ 10씩, PageUp/PageDown 100씩, 칸을 누른 뒤 마우스 휠. 속도 칸은 ↑/↓ 로 목록의 다음·앞 속도.
- 대화상자·우클릭 메뉴가 열려 있거나 한글을 조합하는 중에는 단축키가 동작하지 않습니다.
- 값은 시작 전에도 넣을 수 있고, 시작한 동안 바꾸면 다음 요청부터 그 값으로 답합니다.
문제 해결
- 클라이언트가 붙지 않음: «연결된 클라이언트 0» 이면 주소·포트를 확인합니다. 다른 PC 에서 붙으면 «다른 PC 에서 연결 허용» 을 켜고, 윈도우 방화벽에서 이 프로그램을 허용합니다. 127.0.0.1 이면 이 PC 안에서만 붙습니다.
- RX 줄은 오는데 응답이 없음: EV 줄 «IGNORED» 면 프레임(3E/4E)·데이터 코드(이진/ASCII)가 클라이언트와 다릅니다. 장애 주입 «응답 안 함» 도 확인합니다.
- 클라이언트가 오류를 받음: 통신 기록의 «종료» 코드를 보고 위 «종료 코드» 절에서 찾습니다. C056 이면 «크기(점)» 를 늘리고, C059 면 이 프로그램에 없는 명령, C05D 면 모니터 등록(0801)을 먼저 보내야 합니다.
- 조건 규칙이 돌지 않음: 왼쪽 «흉내 PLC 상태» 가 RUN 인지(원격 STOP 을 받았을 수 있음), 규칙 체크칸이 켜져 있는지, 조건이 «맞게 된 순간» 이 있었는지(이미 ON 인 채로는 다시 실행하지 않음) 봅니다. 목록의 실행 횟수·⏳ 로 확인합니다.
- 32비트·실수 값이 이상함: «칸 설정» 의 형식과 순서(CDAB 가 기본)를 클라이언트와 맞춥니다.
- «포트가 이미 사용 중»: 다른 프로그램(또는 다른 PortDock 창)이 그 포트를 씁니다.
- 실제 PLC 와 다르게 동작함: 이 프로그램은 공개 매뉴얼의 메시지 형식으로만 만들었고 실기와 견주지 않았습니다. 오류 코드·응답 시간·연결 수 제한·기종별 디바이스 범위는 실제와 다를 수 있습니다.
- 프로그램이 열리지 않음: Microsoft Edge WebView2 가 필요합니다(Windows 11 에는 들어 있음). Windows 7 은 지원하지 않습니다.
용어
- MC 프로토콜(SLMP) · 3E: 미쓰비시 PLC 와 이더넷으로 값을 읽고 쓰는 방식. 3E 는 그 메시지 모양 중 하나이고, 이진·ASCII 두 가지 데이터 코드가 있습니다.
- 디바이스(X·Y·M·D …): PLC 메모리 이름 — X 입력, Y 출력, M 내부 릴레이, D 데이터 레지스터 등. 버튼에 대면 비트/워드·몇 진수인지 나옵니다.
- C05F: MC 프로토콜 종료 코드(오류). «자기 국 요청만 받기» 를 켜면 다른 국 앞으로 온 요청에 이 코드로 답합니다.