MC 프로토콜(SLMP)의 3E 프레임은 «서브헤더 + 국 정보 + 데이터 길이» 로 시작하고, 요청은 그 뒤에 감시 타이머·명령·서브명령·명령 데이터를, 응답은 종료 코드·응답 데이터를 싣습니다. 이진 코드는 2바이트 이상인 숫자를 작은 자리 바이트부터 보냅니다(리틀 엔디언). 아래는 D100 부터 3워드를 읽는 요청과 그 응답입니다.
요청: D100~D102 일괄 읽기
50 00 00 FF FF 03 00 0C 00 10 00 01 04 00 00 64 00 00 A8 03 00
| 바이트 | 칸 | 뜻 |
|---|---|---|
| 50 00 | 서브헤더 | 3E 요청 |
| 00 | 네트워크 번호 | 00 |
| FF | PC 번호 | FF |
| FF 03 | 요청 대상 모듈 I/O 번호 | 03FF(작은 자리 먼저) |
| 00 | 요청 대상 모듈 국번 | 00 — 위 넷이 00·FF·03FF·00 이면 연결된 국 자신 |
| 0C 00 | 요청 데이터 길이 | 12 바이트 — 감시 타이머부터 끝까지 |
| 10 00 | 감시 타이머 | 0x0010 = 16 × 0.25 s = 4 s |
| 01 04 | 명령 | 0401 일괄 읽기 |
| 00 00 | 서브명령 | 0000 워드 단위 |
| 64 00 00 | 시작 디바이스 번호 | 100(3바이트) |
| A8 | 디바이스 코드 | D 데이터 레지스터 |
| 03 00 | 디바이스 점 수 | 3 워드 |
길이 칸 12 는 감시 타이머 2 + 명령 2 + 서브명령 2 + 디바이스 4 + 점 수 2 바이트입니다. 이 값이 실제와 다르면 받는 쪽은 프레임을 제대로 끊지 못하고, PortDock PLC Simulator 는 C057 로 답합니다.
응답: 값 0x1995, 0x1202, 0x1130
D0 00 00 FF FF 03 00 08 00 00 00 95 19 02 12 30 11
| 바이트 | 칸 | 뜻 |
|---|---|---|
| D0 00 | 서브헤더 | 3E 응답 |
| 00 FF FF 03 00 | 국 정보 | 요청의 값을 그대로 돌려줌 |
| 08 00 | 응답 데이터 길이 | 8 바이트 — 종료 코드부터 끝까지 |
| 00 00 | 종료 코드 | 0000 완료 |
| 95 19 | D100 | 0x1995 = 6549 |
| 02 12 | D101 | 0x1202 = 4610 |
| 30 11 | D102 | 0x1130 = 4400 |
응답에는 디바이스 번호가 없습니다. 어느 디바이스의 값인지는 짝이 되는 요청을 보고 압니다.
오류 응답
D0 00 00 FF FF 03 00 0B 00 59 C0 00 FF FF 03 00 01 01 00 00
종료 코드 «59 C0» 는 C059 입니다. 그 뒤 9바이트는 오류 정보로, 요청의 네트워크·PC·I/O·국번(00 FF FF 03 00)과 명령 «01 01»(0101)·서브명령 «00 00» 입니다. 길이 0B 00 = 종료 코드 2 + 오류 정보 9. 여러 요청을 보내는 프로그램은 이 칸으로 어느 요청이 거절됐는지 압니다. 코드마다 볼 곳은 «MC 종료 코드 확인 순서» 에 있습니다.
비트 단위 읽기(서브명령 0001)
M100~M107 8점을 비트 단위로 읽는 명령 데이터는 «01 04 01 00 64 00 00 90 08 00», 응답 데이터는 «00 01 00 11» 입니다. 1점이 4비트이고 앞 점이 위 4비트라서 M100=0, M101=0, M102=0, M103=1, M104=0, M105=0, M106=1, M107=1 입니다. 점 수가 홀수면 마지막 바이트의 아래 4비트는 0 입니다.
비트 디바이스를 워드 단위로(서브명령 0000)
M100 을 워드 단위로 2워드 읽으면 M100~M131, 32점이 옵니다. 1워드가 16점이고 번호가 작은 점이 비트 0 입니다. 응답 «34 12 02 00» 은 M100~M115 = 0x1234, M116~M131 = 0x0002 — 0x1234 의 켜진 비트 2·4·5·9·12 는 M102·M104·M105·M109·M112 가 ON 이라는 뜻입니다.
4E 와 ASCII 는 어디가 다른가
- 4E: 서브헤더가 «54 00 + 일련번호 2바이트 + 00 00» 이고 응답은 «D4 00 + 같은 일련번호 + 00 00» 입니다. 예: «54 00 34 12 00 00 00 FF FF 03 00 0C 00 …» 의 일련번호는 1234. 요청과 응답의 짝을 맞출 때 씁니다. 나머지 칸은 3E 와 같습니다.
- ASCII: 같은 칸을 16진 글자로, 큰 자리부터 씁니다. 위 요청은 «500000FF03FF000018001004010000D*0001000003» — I/O 번호가 «03FF» 그대로이고, 길이 0018 은 24 글자, 디바이스는 코드 «D*» + 번호 6자리 «000100» 입니다.
- 서브명령 0002·0003 은 디바이스 번호 4바이트 + 코드 2바이트(ASCII 는 코드 4글자 + 번호 8자리)로 지정합니다. 예: «64 00 00 00 A8 00» = D100.
- TCP 에서는 요청 하나가 여러 조각으로 오거나 두 요청이 붙어 올 수 있습니다. 받는 쪽은 길이 칸으로 프레임을 끊습니다.
받은 바이트를 직접 풀어 보려면 웹 도구 «MC 프로토콜(SLMP) 프레임 해석기» 에 붙여 넣으세요. 응답과 짝 요청을 함께 넣으면 디바이스마다 값을 붙여 줍니다.
이 글은 미쓰비시 전기의 공개 매뉴얼(SLMP·MC 프로토콜)을 기준으로 썼으며, 제휴 관계가 아닙니다.
근거
- SLMP Reference Manual SH(NA)-080956ENG — 4장 메시지 형식(머리·길이·종료 코드·오류 정보), 5.2 디바이스 코드와 0401·1401·0403·1402, 5.9 루프백
- MELSEC Communication Protocol Reference Manual SH-080008 — 5장 이더넷 메시지(3E·4E 프레임)
- MELSEC iQ-R Ethernet User's Manual (Application) SH-081257ENG — 3.5 List of Error Codes — C050~C061 의 뜻
작성 2026-10-29