# Beckhoff ADS

> ADS/AMS로 Beckhoff TwinCAT PLC에 접속합니다. AMS 경로, 런타임 포트, 심볼 경로, 그리고 읽기 길이.

**Beckhoff ADS** 드라이버는 AMS 경로 위에 실리는 TwinCAT 자동화 프로토콜인 ADS로 Beckhoff TwinCAT PLC와 이야기합니다. 값의 주소는 PLC 프로그램 안의 심볼 경로로 적으므로, 입력하는 것이 TwinCAT 프로젝트가 선언한 그대로입니다. [Connector](connector)에서 Beckhoff ADS 드라이버 아래에 장치를 추가하십시오. 패널은 이 프로토콜이 쓰는 칸만 보여 줍니다.

## 연결 {#connection}

| 칸 | 뜻 | 기본값 |
| --- | --- | --- |
| **호스트** | PLC의 IP 주소입니다. 그 AMS 넷 id는 이 주소에서 `{ip}.1.1`로 만들어집니다. **PLC의 AMS 넷 id**로 정하지 않는 한, PLC의 AMS 넷 id는 이 주소 뒤에 `.1.1`을 붙인 것입니다. 이름으로 적으면 먼저 그 IPv4 주소로 풀어냅니다. | 비어 있음 |
| **포트** | 대상 런타임의 AMS 포트입니다. 851은 TwinCAT 3 PLC 런타임 1이고, 그다음 TwinCAT 3 런타임은 거기에서 하나씩 올라갑니다(852, 853, …). 칸이 비어 있으면 851이 회색으로 보이고 그 런타임이 쓰입니다. 0으로 저장된 장치도 똑같이 보입니다. | 851 |
| **로컬 IP (AMS)** | 이 스테이션 자신의 IP 주소이며, 그 AMS 넷 id는 여기에서 `{ip}.1.1`로 만들어집니다. PLC에 설정된 AMS 경로와 맞아야 합니다. 칸이 비어 있으면 PLC에 닿는 네트워크에서의 이 스테이션 주소를 쓰고, 그 주소를 회색으로 보여 줍니다. 칸에 값을 입력하면 그 값이 대신 쓰입니다. | 비어 있음 |
| **PLC의 AMS 넷 id** | PLC 자신의 AMS 넷 id이며, id가 IP 주소 뒤에 `.1.1`을 붙인 것이 아닌 PLC를 위한 것입니다. 0부터 255까지의 숫자 여섯 개를 점으로 구분해 적으며, TwinCAT XAE의 **SYSTEM > Routes**, **NetId Management** 탭의 **Target NetId**에 나오는 값입니다. 칸이 비어 있으면 호스트의 IPv4 주소 뒤에 `.1.1`을 붙인 것을 쓰고, 그것을 회색으로 보여 줍니다. AMS 넷 id가 아닌 값이면 장치는 연결되지 않은 채로 남고 무엇을 적어야 하는지 알려 줍니다. | 비어 있음 |
| **읽기 주기 (ms)** | 스스로 값을 정하지 않은 태그에 적용되는 장치 전체의 읽기 주기. | 1,000 |

장치 머리글은 조립된 endpoint를 보여 줍니다. 예를 들어 `ads://192.168.0.1:192.168.0.50:851`(로컬 IP, PLC IP, AMS 포트)입니다. 태그마다 자기 **읽기 주기 (ms)**를 정할 수 있으며, 태그 값이 0이면 장치의 주기로 되돌아갑니다.

ADS는 PLC가 AMS 경로를 가진 스테이션에만 답합니다. 어떤 경로를 어디에 추가할지는 [PLC 준비](#prepare-the-plc)에 있습니다.

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

TwinCAT PLC는 AMS 라우터가 경로를 가진 스테이션에만 ADS로 답합니다. 경로가 없으면 라우터는 TCP 포트 48898에서 연결을 받아들인 뒤 그것을 닫거나 전혀 답하지 않으므로, 네트워크 길이 멀쩡해도 연결이 실패합니다. 이 스테이션으로 가는 정적 경로를 PLC에 한 번 추가하십시오.

| TwinCAT Add Route 대화 상자의 칸 | 값 |
| --- | --- |
| 이름: **Route Name (Target)** | 아무 이름이나 됩니다. 알림은 이 스테이션의 컴퓨터 이름을 제안합니다. |
| 넷 id: **AmsNetId** | 이 스테이션 주소 뒤에 `.1.1`을 붙인 것으로, 드라이버가 **로컬 IP (AMS)**에서 만들어 내는 것과 같습니다. |
| 전송: **Transport Type** | 전송 방식 `TCP_IP` |
| 주소: **Address Info** | 이 스테이션의 주소이며, **IP Address**를 선택합니다. |
| 경로 종류: **Target Route**와 **Remote Route** | `Static`과 `None` |

TwinCAT XAE에서 대상 시스템으로 PLC를 고르고 **SYSTEM > Routes**의 **Static Routes** 탭을 연 다음 Add를 누르십시오. PLC 자체의 데스크톱에서는 알림 영역의 TwinCAT 아이콘에서 **Router > Edit Routes**로 같은 목록이 열립니다.

주소는 PLC에 닿는 네트워크에서의 이 스테이션 주소입니다. 네트워크 카드가 여러 장인 컴퓨터는 카드마다 주소가 있고, 경로는 거기에 적은 주소에만 통합니다. **로컬 IP (AMS)**가 비어 있는 동안 드라이버는 Windows가 PLC에 닿을 때 거치는 카드의 주소를 쓰고, 칸은 그 주소를 회색으로 보여 줍니다. 경로에 적는 것은 그 주소입니다. 칸에 값을 입력하면 그 값이 대신 쓰이므로 경로에도 그 값을 적어야 합니다.

PLC의 라우터가 경로가 없어서 스테이션을 거절하면, 장치 페이지가 드라이버 오류 대신 알림으로 그것을 알려 줍니다. 추가할 준비가 된 경로(그 이름, 이 스테이션의 AMS 넷 id, 그 주소와 전송 방식, 각각 복사 버튼이 붙음)와 TwinCAT에서 그것을 추가하는 곳입니다. PLC가 답하면 알림은 저절로 사라지고, 저널과 에이전트도 같은 경로를 읽습니다. 연결을 거부하거나 조용히 있는 포트는 경로가 없는 것이 아니라 있는 그대로 알려 줍니다.

스테이션은 PLC를 AMS 넷 id로 부르고, PLC의 라우터는 자기 id로 온 것에만 답합니다. 그래서 스테이션이 쓰는 id와 AMS 넷 id가 다른 PLC도 전혀 답하지 않으며, 이는 경로가 없을 때와 똑같아 보입니다. PLC에 경로가 이미 있는데도 답하지 않으면, TwinCAT XAE의 **SYSTEM > Routes**, **NetId Management** 탭에서 **Target NetId**를 확인하고 그것을 **PLC의 AMS 넷 id**에 입력하십시오. 알림은 스테이션이 쓰는 id를 알려 줍니다.

## 주소 지정 {#addressing}

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

| 칸 | 뜻 | 받는 값 | 기본값 |
| --- | --- | --- | --- |
| **심볼** | PLC 프로그램에 있는 변수의 심볼 경로입니다. 필수입니다. | 자유 입력, 예를 들어 `MAIN.fValue` | 비어 있음 |
| **읽기 길이 (바이트, 비우면 자동)** | 읽을 때마다 옮길 바이트 수입니다. 비우면 데이터 형식이 읽기 크기를 정합니다. | 1 이상, 또는 비움 | 비어 있음 |

심볼 경로는 TwinCAT이 보여 주는 그대로입니다. 프로그램 변수는 `MAIN.fValue`, 전역 변수 목록은 `GVL.MachineSpeed`나 `GVL_Settings.rSetpoint`입니다. 드라이버는 PLC에서 이름으로 심볼을 풀어내고 그 원시 바이트를 읽습니다. 자동으로 정해지는 읽기 길이는 이렇습니다.

| 데이터 형식 | 자동 읽기 길이 |
| --- | --- |
| Boolean | 1바이트 |
| Int32 | 4바이트 |
| Float | 4바이트 |
| String | 16바이트 |

16자보다 긴 문자열이라면 **읽기 길이**를 선언된 크기에 맞게 정하십시오(TwinCAT의 `STRING(80)`은 글자 80바이트가 필요합니다). 신호원 카드의 읽기 전용 **신호원 주소 (버스)** 줄은 편집하는 대로 조립된 주소를 보여 줍니다.

PLC가 거부한 읽기(PLC에 없는 심볼이나 읽기를 허용하지 않는 심볼의 읽기 등)에서는 태그가 값 없이 남고, 태그의 이유에 ADS 오류 코드와 그 뜻이 나옵니다. 예를 들어 `ADS error 0x710 (no symbol by that name)`입니다. 연결은 그대로 유지되고 다른 태그는 계속 읽습니다. 이유는 PLC가 답한 다음 읽기에서 사라집니다.

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

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

| 데이터 형식 | PLC 쪽 대응 | 비고 |
| --- | --- | --- |
| Boolean | BOOL | 1바이트이며 0이 아니면 true |
| Int32 | DINT | PLC와 같은 리틀 엔디언 |
| Float | REAL | PLC와 같은 리틀 엔디언 |
| String | STRING | 읽기 버퍼의 첫 NUL까지의 글자 |

바이트 순서는 PLC 자신의 리틀 엔디언이며 저절로 처리됩니다. 바이트 순서 선택은 없습니다. 문자열 읽기는 돌려받은 버퍼를 첫 NUL 종료 문자까지 해독하므로, 짧은 문자열 뒤의 채움 값이 값 안으로 새어 드는 일은 없습니다. 다른 TwinCAT 너비(INT, LREAL, WORD, …)는 제시되지 않습니다. 그런 변수는 PLC 프로그램에서 위의 네 형식 가운데 하나로 내놓아야 여기에서 읽을 수 있습니다.

## 쓰기 {#writes}

**접근**이 읽기와 쓰기이거나 쓰기 전용인 태그는 쓸 수 있습니다. 쓰기는 같은 심볼을 풀어내고 값의 바이트를 씁니다. 부울은 1바이트, Int32와 Float은 4바이트입니다. 문자열 쓰기는 태그의 **읽기 길이** 전체를 놓습니다. 앞에는 글자의 UTF-8 바이트가, 그 뒤에는 0이 놓입니다. 그래서 긴 글자 위에 짧은 글자를 쓰면 값 전체가 바뀌고 예전 것은 하나도 남지 않습니다. 선언된 길이에 들어가지 않는 글자는 크기에 맞게 잘리는 대신, 진단 로그에 길이가 적힌 채 거부됩니다. 새 태그는 읽기 전용으로 시작합니다.

PLC가 거부한 쓰기(쓰기를 허용하지 않는 심볼에 대한 쓰기 등)는 ADS 오류 코드와 그 뜻을 담아 거부로 돌아옵니다. 예를 들어 `ADS error 0x704 (the symbol may not be written)`입니다. 연결은 그대로 유지됩니다.

## 장치 검색 {#discovery}

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

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

- 첫 연결이 실패하는 흔한 이유는 AMS 경로입니다. PLC에 있는 경로의 AMS 넷 id는 정확히 스테이션 IP 뒤에 `.1.1`을 붙인 것이어야 하며, 장치 페이지가 추가할 경로 전체를 알려 줍니다.
- 드라이버는 연결마다 각 심볼의 핸들을 PLC에 한 번만 요청하고, 연결이 닫힐 때 핸들을 돌려줍니다. PLC 다운로드 뒤에 PLC가 더는 받아들이지 않는 핸들은 다음 읽기에서 바뀌므로, 태그는 새 프로그램으로 계속 읽습니다. 다운로드가 이름을 바꾸거나 없앤 심볼은 이름이 다시 맞을 때까지 그 태그를 `ADS error 0x710 (no symbol by that name)`과 함께 값 없이 남깁니다.
- 닿지 않는 PLC는 시작할 때 아무 비용도 들이지 않습니다. 장치는 배경에서 계속 다시 시도하고, 연결이 이루어질 때까지 그 태그는 품질이 나쁜 것으로 읽힙니다.
