# Mitsubishi MC

> MC 프로토콜(3E 프레임)로 Mitsubishi MELSEC PLC에 접속합니다. 디바이스 코드, 십진과 십육진 번호 매김, 그리고 읽기 길이.

**Mitsubishi MC** 드라이버는 MC 프로토콜로 Mitsubishi MELSEC PLC와 이야기하며, TCP 위의 이진 3E 프레임을 씁니다. Q, L, iQ 계열이 말하는 그 프레임입니다. 값의 주소는 익숙한 MELSEC 디바이스 표기로 적습니다. `D100`이나 `M50`처럼 디바이스 코드에 번호를 붙인 것입니다. [Connector](connector)에서 Mitsubishi MC 드라이버 아래에 장치를 추가하십시오. 패널은 이 프로토콜이 쓰는 칸만 보여 줍니다.

## 연결 {#connection}

| 칸 | 뜻 | 기본값 |
| --- | --- | --- |
| **호스트** | PLC 이더넷 인터페이스의 IP 주소나 호스트 이름. | 비어 있음 |
| **포트** | MC 프로토콜 연결의 TCP 포트이며 1에서 65535까지입니다. 칸이 비어 있으면 5007이 회색으로 보이고 장치는 그 포트로 호출됩니다. 0으로 저장된 장치도 똑같이 보입니다. | 5007 |

장치 머리글은 조립된 endpoint를 보여 줍니다. 예를 들어 `mcp://192.168.0.20:5007`입니다. 이 드라이버에는 읽기 주기 칸이 없습니다. 그 태그는 1초에 한 번 읽힙니다. PLC 쪽에는 고른 포트에 TCP와 이진 코드의 MC 프로토콜(SLMP) 연결이 있어야 합니다. 어디서 만드는지는 [PLC 준비](#prepare-the-plc)에 있습니다.

## PLC 준비 {#prepare-the-plc}

MELSEC CPU는 프로젝트가 만든 연결에서만 MC 프로토콜을 제공하며, Ethernet 포트가 허용하지 않으면 RUN 중의 쓰기를 거부합니다. 설정은 엔지니어링 도구에서 하고 파라미터와 함께 CPU에 씁니다(**Online > Write to PLC**). CPU는 시작할 때 이것을 읽으므로, 쓴 다음에는 CPU를 리셋하거나 전원을 껐다 켜십시오.

| 설정 | GX Works3(iQ-R, iQ-F) | GX Works2(Q, L) | 설정이 없으면 |
| --- | --- | --- | --- |
| 장치의 **포트**에서 TCP로 받는 MC 연결 | **Module Parameter > Ethernet Port > Basic Settings > External Device Configuration**: **SLMP Connection Module**을 표로 끌어다 놓고 Protocol은 TCP, **Port No.**는 장치의 포트로 설정합니다. | **PLC Parameter > Built-in Ethernet Port Setting > Open Setting**: Protocol TCP, **Open System** MC Protocol, **Host Station Port No.**에 장치의 포트를 넣은 줄을 만듭니다. | CPU가 그 포트의 연결을 거부하고 장치는 오프라인으로 남습니다. |
| **Communication Data Code**를 이진으로 | **Module Parameter > Ethernet Port > Basic Settings**: **Binary**. | **PLC Parameter > Built-in Ethernet Port Setting**: **Binary Code**. | CPU가 ASCII 문자로 답하거나 아예 답하지 않으며, 어떤 태그도 읽히지 않습니다. |
| RUN 중 쓰기 허용 | iQ-R: **Module Parameter > Ethernet Port > Basic Settings**의 **Enable/Disable Online Change**를 **Enable All (SLMP)**로. | **PLC Parameter > Built-in Ethernet Port Setting**의 **Enable online change (FTP, MC Protocol)** 체크. | CPU는 읽기에는 정상적으로 응답하지만, RUN 중에는 모든 쓰기를 종료 코드 0x0055로 거부합니다. |

Q나 L CPU는 포트 5000부터 5009까지를 스스로 쓰므로, 그 MC 연결에는 장치의 기본값인 5007을 줄 수 없습니다. 5010 같은 다른 포트를 주고 장치의 **포트**에도 그 번호를 입력하십시오. GX Works2는 **Host Station Port No.**를 16진수로 보여 줄 수 있으며, 그때 5010은 1392입니다. 데이터 코드는 Ethernet 포트 전체에 하나이므로, 그 포트에서 CPU와 ASCII로 통신하는 다른 프로그램도 이진으로 바꿔야 합니다.

CPU가 포트를 거부하거나, ASCII로 답하거나, RUN 중의 쓰기를 거부하면, 장치 페이지가 어떤 설정인지를 이 단계와 장치가 접속하는 포트와 함께 알림으로 알려 줍니다. 알림은 CPU가 받아들이면 저절로 사라집니다. RUN 중에 거부된 쓰기는 쓰기가 거부된 태그를 밝힙니다. 진단 로그와 에이전트도 같은 단계를 읽습니다.

## 주소 지정 {#addressing}

Mitsubishi 태그의 주소는 태그 신호원 카드의 두 칸으로 적습니다.

| 칸 | 뜻 | 받는 값 | 기본값 |
| --- | --- | --- | --- |
| **디바이스 주소** | MELSEC 디바이스 코드와 번호이며 예를 들어 `D100`입니다. 필수입니다. | 자유 입력 | 비어 있음 |
| **읽기 길이 (바이트, 비우면 자동)** | 읽을 때마다 옮길 바이트 수입니다. 비우면 데이터 형식이 읽기 크기를 정합니다. | 1 이상, 또는 비움 | 비어 있음 |

주소는 대소문자를 구별하지 않고 가장 긴 코드가 이깁니다. 그래서 `SD100`은 스텝 릴레이 `S`가 아니라 특수 레지스터 100입니다. Mitsubishi가 십육진으로 번호를 매기는 디바이스, 곧 X, Y, B, W, SB, SW, DX, DY에서는 번호가 **십육진**이고, 그 밖의 모든 디바이스에서는 십진입니다(`X1F`는 입력 0x1F입니다). 받아들이는 디바이스 코드는 이렇습니다.

| 코드 | 디바이스 | 번호 매김 |
| --- | --- | --- |
| `M` | 내부 릴레이 | 십진 |
| `SM` | 특수 릴레이 | 십진 |
| `L` | 래치 릴레이 | 십진 |
| `F` | 어넌시에이터 | 십진 |
| `V` | 에지 릴레이 | 십진 |
| `S` | 스텝 릴레이 | 십진 |
| `X` | 입력 | 십육진 |
| `Y` | 출력 | 십육진 |
| `B` | 링크 릴레이 | 십육진 |
| `SB` | 특수 링크 릴레이 | 십육진 |
| `DX` | 다이렉트 입력 | 십육진 |
| `DY` | 다이렉트 출력 | 십육진 |
| `D` | 데이터 레지스터 | 십진 |
| `SD` | 특수 레지스터 | 십진 |
| `R` | 파일 레지스터 | 십진 |
| `ZR` | 확장 파일 레지스터 | 십진 |
| `W` | 링크 레지스터 | 십육진 |
| `SW` | 특수 링크 레지스터 | 십육진 |
| `Z` | 인덱스 레지스터 | 십진 |
| `TC` / `TS` / `TN` | 타이머 코일 / 접점 / 현재값 | 십진 |
| `SC` / `SS` / `SN` | 적산 타이머 코일 / 접점 / 현재값 | 십진 |
| `CC` / `CS` / `CN` | 카운터 코일 / 접점 / 현재값 | 십진 |

바탕에 있는 MC 라이브러리는 코드 `TT`, `TM`, `CT`, `CM`, `A`도 받아들입니다. 신호원 카드의 읽기 전용 **신호원 주소 (버스)** 줄은 편집하는 대로 조립된 주소를 보여 줍니다.

## 데이터 형식 {#data-types}

**데이터 형식** 선택 목록은 드라이버가 다룰 수 있는 네 형식을 내놓습니다.

| 데이터 형식 | 자동 읽기 길이 | 비고 |
| --- | --- | --- |
| Boolean | 1바이트 | 비트 디바이스에서는 이름으로 부른 그 릴레이 하나, 워드 디바이스에서는 0이 아닌 모든 워드 |
| Int32 | 4바이트 | 이어지는 16비트 워드 둘이며 예를 들어 `D100`과 `D101`입니다 |
| Float | 4바이트 | IEEE 단정밀도를 담은, 이어지는 워드 둘 |
| String | 16바이트 | 읽기 버퍼의 첫 NUL까지의 글자 |

워드 데이터는 MELSEC 고유의 리틀 엔디언 순서로 들어오고 저절로 해독됩니다. 바이트 순서 선택은 없습니다. 32비트 값은 이어지는 워드 디바이스 둘에 걸칩니다. 16자보다 긴 문자열이라면 **읽기 길이**를 저장된 글자를 담을 만큼 올리십시오. **읽기 길이**는 바이트 수이고 프로토콜은 16비트 워드 단위로 옮기므로, 홀수 길이는 마지막 바이트를 담는 워드까지 올림합니다.

비트 디바이스, 곧 드라이버가 한 번에 릴레이 하나씩 읽는 디바이스는 `X`, `Y`, `M`, `L`, `F`, `V`, `B`, `S`, `TS`, `TC`, `SS`, `SC`, `CS`, `CC`, `SB`, `DX`, `DY`입니다. 거기에 놓인 부울 태그는 입력한 그 주소에 대해서만 답하고 다른 무엇에 대해서도 답하지 않습니다. 그 밖의 코드는 모두 워드 디바이스이며, 타이머나 카운터의 현재값(`TN`, `SN`, `CN`)과 링크 레지스터(`W`, `SW`)도 여기에 듭니다. 거기서는 워드 전체가 판단하므로 `0x0100`을 담은 `D100`은 true로 읽힙니다.

PLC가 거부한 읽기(범위의 끝을 넘어선 주소 등)는 그 태그를 값 없이 남기고, 오류가 종료 코드와 매뉴얼에서의 뜻을 알려 줍니다. 예를 들어 `end code 0xC056 (the request goes past the last address of the device)`입니다. 장치의 다른 태그는 계속 읽습니다.

## 쓰기 {#writes}

**접근**이 읽기와 쓰기이거나 쓰기 전용인 태그는 읽기가 쓰는 것과 같은 디바이스 주소에 쓸 수 있습니다. 비트 디바이스에 대한 부울 쓰기는 이름으로 부른 릴레이 하나를 세우거나 지우며 그 이웃은 건드리지 않습니다. 그 밖의 것은 모두 온전한 16비트 워드로 씁니다. Int32와 Float은 워드 둘, 워드 디바이스 위의 부울은 워드 하나, 문자열은 태그의 **읽기 길이** 전체이며 앞에는 글자의 UTF-8 바이트가, 그 뒤에는 0이 놓이고 마지막 워드까지 올림합니다. 그래서 긴 글자 위에 짧은 글자를 쓰면 값 전체가 바뀌고 예전 것은 하나도 남지 않습니다. 선언된 길이에 들어가지 않는 글자는 크기에 맞게 잘리는 대신, 진단 로그에 길이가 적힌 채 거부됩니다. 새 태그는 읽기 전용으로 시작합니다.

PLC가 거부한 쓰기는 거부로 돌아오고, 같은 방식으로 종료 코드와 그 뜻을 알려 줍니다. CPU가 RUN 중이어서 거부된 쓰기(종료 코드 0x0055)는 그것을 허용하는 설정과 함께 장치 페이지에도 나옵니다([PLC 준비](#prepare-the-plc) 참고).

## 장치 검색 {#discovery}

이 드라이버의 MC 프로토콜에는 브로드캐스트 검색이 없으므로 Connector는 장치 검색 단추를 보여 주지 않습니다. 장치와 주소는 손으로 추가하십시오.

## 알아 두면 좋은 것 {#good-to-know}

- 이 드라이버의 모든 태그는 1초 주기로 고정되어 읽힙니다. 보통의 읽기 주기 칸은 나오지 않습니다.
- 이 드라이버는 이진 3E 프레임만 쓰고 ASCII는 쓰지 않습니다. ASCII 코드로 설정된 연결에서는 아무것도 읽지 못합니다([PLC 준비](#prepare-the-plc) 참고).
- 닿지 않는 PLC는 시작할 때 아무 비용도 들이지 않습니다. 장치는 배경에서 계속 다시 시도하고, 연결이 이루어질 때까지 그 태그는 품질이 나쁜 것으로 읽힙니다.
- TCP 연결이 열리기까지 5초, 각 요청의 응답을 기다리는 데 10초가 주어집니다. 연결을 받아들이고도 제때 답하지 않는 PLC는 닿지 않는 PLC처럼 연결을 끊고 다시 시도합니다. 그 오류는 포트와 흔한 두 가지 이유를 밝힙니다. 포트가 ASCII 코드로 설정된 Q나 L CPU는 이진 요청에 아무것도 답하지 않으며, 그 포트에서 MC 프로토콜을 쓰지 않는 장비도 답하지 않습니다.
