# Siemens S7

> S7comm의 주소나 S7CommPlus의 변수 이름으로 Siemens S7 PLC에 접속합니다. 접근 칸, 랙과 슬롯, 메모리 영역, 형식 있는 바이트와 비트 주소 지정, 변수 이름, HMI 설정, 그리고 고유 데이터 형식.

**Siemens S7** 드라이버는 ISO-on-TCP 위에 실리는 고전적인 Step 7 프로토콜인 S7comm으로 Siemens S7 PLC와 이야기합니다. 절대 주소 지정, 곧 메모리 영역과 데이터 블록 번호와 바이트와 비트를 쓰므로, 엔지니어링 프로젝트에서 심볼을 내보내지 않아도 동작합니다. [Connector](connector)에서 Siemens S7 드라이버 아래에 장치를 추가하고 아래 칸을 채우십시오. 패널은 이 프로토콜이 쓰는 칸만 보여 줍니다.

여기까지가 **주소로 지정** 접근입니다. 장치마다 **접근**을 고릅니다. 위와 같은 **주소로 지정**, 또는 TIA Portal과 Siemens HMI가 쓰는 프로토콜인 S7CommPlus로 하는 **이름으로 지정**입니다. 이름으로 지정에서는 각 태그가 TIA Portal이 쓰는 그대로 변수 이름을 적고, 형식은 CPU가 알려 줍니다.

## 접근 {#access}

| 관점 | 주소로 지정 | 이름으로 지정 |
| --- | --- | --- |
| 프로토콜 | ISO-on-TCP 위의 S7comm, 포트 102 | ISO-on-TCP 안의 TLS 1.3 위의 S7CommPlus, 포트 102 |
| CPU | S7-300, S7-400, S7-1200, S7-1500 | 펌웨어 V2.9 이상의 S7-1500, 펌웨어 V4.5 이상의 S7-1200으로, TIA Portal V17 이상에서 구성한 것 |
| 장치의 칸 | 호스트, 랙 / 슬롯 | 호스트, 사용자 이름과 비밀번호(둘 다 선택) |
| 태그가 적는 것 | 영역, DB 번호, 바이트와 비트, 그리고 데이터 형식 | 변수 이름(예: `GanterOpt.Real_`). 형식은 CPU가 알려 줍니다 |
| CPU 쪽 | PUT/GET 허용과 최적화하지 않은 데이터 블록([CPU 준비하기](#prepare-the-cpu)) | 바꿀 것이 없습니다. 최적화된 데이터 블록도 읽고, PUT/GET도 필요 없습니다 |
| 장치 검색 | 없음 | CPU의 변수([장치 검색](#discovery)) |

지금 만드는 장치는 **이름으로 지정**으로 시작합니다. 이 선택이 생기기 전에 저장된 장치는 늘 읽던 대로 **주소로 지정**으로 계속 읽습니다. 접근을 바꿔도 태그의 형식 있는 주소와 변수 이름이 모두 남으므로, 되돌리면 모든 것이 제자리에 있습니다. 이름으로 지정일 때 장치 머리글은 랙과 슬롯이 없는 엔드포인트를 보여 줍니다. 예를 들어 `s7://192.168.0.2?access=name`입니다. 이름으로 하는 접근에 답하지 않는 CPU는 장치 페이지에서 그렇게 알려 줍니다([이름으로 하는 접근이 없는 CPU](#a-cpu-without-the-access-by-name)).

## 연결 {#connection}

| 칸 | 뜻 | 기본값 |
| --- | --- | --- |
| **호스트** | CPU(또는 그 앞에 놓인 CP 모듈)의 IP 주소나 호스트 이름. | 비어 있음 |
| **접근** | **주소로 지정** 또는 **이름으로 지정**([접근](#access)). | 이름으로 지정 |
| **랙 / 슬롯** | 주소로 지정일 때만입니다. Siemens 하드웨어 구성에 설정된 대로의 CPU 랙 번호와 슬롯 번호입니다. 한 줄에 놓인 숫자 상자 둘이며, 앞이 랙, 뒤가 슬롯입니다. | 0 / 0 |
| **사용자 이름 / 비밀번호** | 이름으로 지정일 때만이며, 둘 다 선택입니다. 비밀번호는 CPU의 접근 수준이 요구할 때의 CPU 보호 비밀번호이고, 사용자 이름은 사용자를 관리하는 CPU일 때만입니다. 이 컴퓨터에 보호되어 저장됩니다. | 비어 있음 |
| **읽기 주기 (ms)** | 스스로 값을 정하지 않은 태그에 적용되는 장치 전체의 읽기 주기. | 1,000 |

TCP 포트는 102(ISO-on-TCP)로 고정이므로 포트 칸이 없습니다. 장치 머리글은 조립된 endpoint를 보여 줍니다. 예를 들어 `s7://192.168.0.2:0:1`(호스트, 랙, 슬롯)입니다.

랙과 슬롯은 하드웨어와 맞아야 합니다. S7-1200과 S7-1500 CPU는 랙 0, 슬롯 0이나 1에서 답하고, 흔한 S7-300 CPU는 랙 0, 슬롯 2에 있으며, S7-400의 랙은 구성에 따라 다릅니다. 슬롯이 틀리면 잘못된 데이터를 읽는 것이 아니라 연결이 실패합니다.

태그마다 자기 **읽기 주기 (ms)**를 정할 수 있으며, 태그 값이 0이면 장치의 주기로 되돌아갑니다.

## 이름으로 읽기 {#read-by-name}

이름으로 읽는 장치의 태그는 신호원 카드의 **변수 이름** 칸에 TIA Portal이 쓰는 그대로 변수를 적습니다. 데이터 블록과 변수, 멤버 앞에는 마침표, 배열의 요소는 대괄호입니다. TIA Portal의 큰따옴표는 입력해도 되며(`"GanterOpt".Real_`) 지워집니다.

| TIA Portal의 변수 | 변수 이름 |
| --- | --- |
| 데이터 블록 `GanterOpt`의 `Real_` | `GanterOpt.Real_` |
| UDT 인스턴스 `Udt_`의 `Valor` | `GanterOpt.Udt_.Valor` |
| 배열 `Vetor`의 요소 0 | `GanterOpt.Vetor[0]` |
| DTL `DataHora` | `GanterOpt.DataHora`: 태그 하나, 날짜와 시각 |

영역도 DB 번호도 바이트도 입력하지 않습니다. 변수가 어디에 있고 어떤 형식인지는 CPU가 알려 주고, 드라이버는 그것을 태그의 데이터 형식으로 읽습니다.

| CPU의 형식 | 데이터 형식 | 참고 |
| --- | --- | --- |
| Bool | Boolean | |
| Byte, USInt / SInt | Byte / SByte | 부호 없음 / 부호 있음 |
| Word, UInt / Int | UInt16 / Int16 | 부호 없음 / 부호 있음 |
| DWord, UDInt / DInt | UInt32 / Int32 | 부호 없음 / 부호 있음 |
| LWord, ULInt / LInt | UInt64 / Int64 | 64비트 전부를 정확하게 |
| Real / LReal | Float / Double | |
| Char, String | String | 주소로 지정과 같은 Windows-1252 |
| WChar, WString | String | UTF-16, 어떤 문자든 |
| Time, S5Time | Int32 | 밀리초 |
| LTime | Int64 | 나노초 |
| Time_Of_Day | UInt32 | 자정부터의 밀리초, 24 h 미만 |
| Date, Date_And_Time, DTL, LDT | DateTime | 날짜만 / 날짜와 시각 |

장치 검색은 각 태그에 변수의 데이터 형식과 단위(ms, ns)를 붙입니다. 손으로 만든 태그는 고른 데이터 형식을 가지며, CPU의 값은 그 형식으로 변환됩니다.

String이나 WString은 블록에 선언된 길이로 통째로 씁니다. 드라이버는 그 길이를 첫 쓰기 전에 변수에서 읽습니다. 더 긴 텍스트는 두 길이를 밝히며 거부되고 아무것도 보내지 않으며, String은 Windows-1252에 없는 문자를 거부합니다. DTL은 날짜와 시각으로 통째로 읽고 씁니다. 여덟 필드를 따로 내놓는 일은 없습니다. 필드 하나만 쓰면 어떤 값이든(월 90까지) 받아들이기 때문입니다. 형식의 범위를 벗어난 값(24 h 이상의 Time_Of_Day, Int에 40000)은 범위를 밝히며 거부되고 아무것도 보내지 않습니다. CPU에 없는 이름은 태그의 오류가 되어 그렇게 알려 줍니다. DTL의 필드 하나만 이름으로 적으면 DTL을 적으라는 안내를 받습니다.

### HMI 설정 {#the-hmi-settings}

TIA Portal은 데이터 블록의 변수마다 설정 세 가지를 블록의 열에 둡니다. 스테이션은 CPU가 무엇을 통과시키든 Siemens 자신의 HMI와 OPC UA 서버처럼 그 설정을 따릅니다.

| TIA Portal의 설정 | 선택하지 않았을 때 |
| --- | --- |
| **Accessible from HMI/OPC UA/Web API** | 변수를 읽지도 쓰지도 않습니다. 태그의 오류가 이 설정의 이름을 밝히고, 장치 검색은 그 변수를 내놓지 않습니다. |
| **Visible in HMI engineering** | 장치 검색은 그 변수를 내놓지 않습니다. 손으로 그 변수를 적은 태그는 평소대로 읽습니다. |
| **Writable from HMI/OPC UA/Web API** | 변수는 읽기 전용입니다. 쓰기는 이 설정의 이름을 밝히며 거부되고, 태그의 **접근**은 읽기 전용을 내놓으며 그 이유를 알려 주고, 장치 검색은 읽기 전용으로 내놓습니다. |

### 이름으로 하는 접근이 없는 CPU {#a-cpu-without-the-access-by-name}

연결은 받아들이지만 이름으로 하는 접근에 답하지 않는 CPU(펌웨어 V2.9 이전의 S7-1500, V4.5 이전의 S7-1200, V17 이전의 TIA Portal에서 구성한 프로젝트, 또는 S7comm만 하는 CPU)에서는 장치가 오프라인으로 남습니다. 장치 페이지는 오류 대신 알림으로 그것을 알려 줍니다. CPU에 필요한 것, TIA Portal이 펌웨어를 보여 주는 곳(CPU가 실행하는 것은 **Online & diagnostics**, 프로젝트가 적은 버전은 CPU 속성의 **General > Catalog information**), 그리고 세 가지 길입니다.

1. CPU 펌웨어를 업데이트하고, TIA Portal 프로젝트에서도 CPU에 같은 버전을 설정한 뒤 하드웨어 구성을 다운로드합니다. 펌웨어만 업데이트해서는 충분하지 않습니다.
2. **접근**을 **주소로 지정**으로 바꾸고, PUT/GET을 허용하고 데이터 블록의 최적화를 끕니다([CPU 준비하기](#prepare-the-cpu)).
3. CPU 자신의 OPC UA 서버(S7-1500, 또는 펌웨어 V4.4 이상의 S7-1200)를 [OPC UA](driver-opc-ua) 드라이버로 읽습니다.

장치의 각 태그도 자기 페이지에 같은 알림을 달고, CPU가 이름으로 답하게 되면 알림은 저절로 사라집니다. 진단 로그와 에이전트도 장치의 오류에서 같은 단계를 읽습니다.

## CPU 준비하기 {#prepare-the-cpu}

이 절은 주소로 지정 접근에 관한 것입니다. 이름으로 읽는 장치에는 이 설정이 하나도 필요 없습니다.

S7-1200이나 S7-1500은 CPU 자신의 두 가지 설정이 갖춰졌을 때만 S7comm의 절대 주소 지정에 응합니다. 둘 다 TIA Portal에서 설정하고 CPU에 다운로드합니다. S7-300이나 S7-400에는 둘 다 필요 없습니다.

| 설정 | TIA Portal에서의 위치 | 없을 때 |
| --- | --- | --- |
| **Permit access with PUT/GET communication from remote partner** 체크 | CPU의 장치 구성을 열고 CPU를 선택한 뒤 **Properties > General > Protection & Security > Connection mechanisms**를 엽니다. 하드웨어 구성을 다운로드합니다(**Download to device > Hardware configuration**). 프로그램만 다운로드해서는 이 설정이 전달되지 않습니다. | CPU가 연결은 받아들이지만 모든 읽기와 쓰기를 거부합니다. 장치는 연결된 채로 남고, 그 태그는 품질이 나쁜 것으로 읽힙니다. |
| **Optimized block access** 체크 해제(스테이션이 읽는 모든 데이터 블록에서) | 프로젝트 트리의 **Program blocks** 아래에서 데이터 블록을 마우스 오른쪽 버튼으로 클릭한 뒤 **Properties > General > Attributes**를 엽니다. 블록을 컴파일하고 다운로드합니다. 그러면 블록의 **Offset** 열에 각 변수가 시작하는 위치가 나타나며, 그것이 태그의 **시작 바이트**에 넣는 값입니다. | CPU가 그 블록의 어떤 바이트도 주소로 내주지 않습니다. 그 태그는 품질이 나쁜 것으로 읽히고, 장치의 다른 태그는 계속 읽힙니다. |

**Optimized block access**를 바꾸면 다운로드할 때 데이터 블록이 다시 초기화되어 변수가 시작값으로 돌아갑니다. 플래그 메모리(M), 입력(I), 출력(Q)은 언제나 주소를 지정할 수 있으며 바꿀 필요가 없습니다. 최적화된 상태로 두어야 하는 데이터 블록은 다른 방법으로 읽을 수 있습니다. PLC 프로그램이 스테이션이 읽는 값을 최적화되지 않은 데이터 블록이나 플래그 메모리로 복사하고 태그가 그곳을 가리키게 하거나, 스테이션이 PLC 자체의 OPC UA 서버(S7-1500, 펌웨어 4.4 이상의 S7-1200)를 거쳐 [OPC UA](driver-opc-ua) 드라이버로 읽습니다.

CPU가 두 설정 중 하나 때문에 거부하면, 장치 페이지가 어느 설정인지를 이 단계들과 함께 알림으로 알려 줍니다. 이 알림은 CPU가 받아들이면 저절로 사라집니다. 데이터 블록이면 그 블록과, 읽히지 않게 된 태그의 이름을 보여 줍니다. 진단 로그와 에이전트도 같은 단계를 읽습니다. CPU에 없는 데이터 블록과 데이터 블록의 끝을 넘어선 주소는 그것을 가리키는 태그에서 있는 그대로 알려 줍니다.

## 주소 지정 {#addressing}

이 절과 뒤의 두 절(데이터 형식, 쓰기)은 주소로 지정 접근에 관한 것입니다. 이름으로 하는 접근은 [이름으로 읽기](#read-by-name)에 있습니다.

S7 태그의 주소는 자유 입력 문자열이 아니라 형식 있는 칸으로 적습니다. 패널은 태그의 신호원 카드에 이 칸들을 보여 줍니다.

| 칸 | 뜻 | 받는 값 | 기본값 |
| --- | --- | --- | --- |
| **영역** | 읽을 메모리 영역. | `DataBlock`, `Merker`, `ProcessInput`, `ProcessOutput`, `Timer`, `Counter` | `DataBlock` |
| **DB 번호** | 어느 데이터 블록인지이며, 영역이 `DataBlock`일 때에만 나옵니다. | 0 이상 | 1 |
| **시작 바이트** | 값이 시작되는 영역 안의 바이트 위치입니다. `Timer`와 `Counter` 영역에서는 상자의 이름이 **타이머 번호**나 **카운터 번호**가 되고, 대신 타이머나 카운터의 번호를 묻습니다. | 0 이상 | 0 |
| **비트 (0~7)** | 시작 바이트 안의 비트 위치입니다. 부울 태그에만 나옵니다. | 0~7 | 0 |
| **최대 길이 (비우면 254)** | 선언된 S7 STRING 또는 WSTRING의 최대 길이(문자 수)입니다. `Timer`와 `Counter` 영역 밖의 문자열 태그에만 나옵니다. | STRING은 1~254, WSTRING은 1~16382, 또는 비움 | 비어 있음 |
| **PLC의 문자열 형식** | 블록에서 텍스트가 선언된 형식으로, 길이 옆에 있습니다. `STRING`(문자 하나에 1바이트, Windows-1252) 또는 `WSTRING`(문자 하나에 2바이트, UTF-16, 어떤 문자든)입니다. 최대 길이가 나오는 곳에만 나옵니다. | `STRING`, `WSTRING` | `STRING` |

영역은 흔히 쓰는 Siemens 표기와 대응합니다. `Merker`는 플래그 메모리(M), `ProcessInput`은 프로세스 이미지 입력(I/E), `ProcessOutput`은 프로세스 이미지 출력(Q/A)이고, `Timer`와 `Counter`는 S7-300과 S7-400 CPU의 타이머와 카운터 영역입니다. 타이머와 카운터의 주소는 바이트가 아니라 번호로 적습니다. `Timer`에 번호 5를 적으면 T5를 읽고, `Counter`에 번호 3을 적으면 C3을 읽습니다. 고전적인 절대 주소를 옮기면 이렇습니다.

| 고전적인 주소 | 데이터 형식 | 입력할 칸 |
| --- | --- | --- |
| REAL을 담은 `DB5.DBD12` | Float | 영역 `DataBlock`, DB 번호 5, 시작 바이트 12 |
| `DB1.DBX3.4` | Boolean | 영역 `DataBlock`, DB 번호 1, 시작 바이트 3, 비트 4 |
| INT를 담은 `DB2.DBW20` | Int16 | 영역 `DataBlock`, DB 번호 2, 시작 바이트 20 |
| `MW10` | Int16 | 영역 `Merker`, 시작 바이트 10 |
| `M10.3` | Boolean | 영역 `Merker`, 시작 바이트 10, 비트 3 |
| `IB2` | Byte | 영역 `ProcessInput`, 시작 바이트 2 |
| `Q4.1` | Boolean | 영역 `ProcessOutput`, 시작 바이트 4, 비트 1 |
| `T5` | Int16 | 영역 `Timer`, 타이머 번호 5 |
| `C3` | Int16 | 영역 `Counter`, 카운터 번호 3 |

부울 태그는 버스에서 정확히 비트 하나를 읽고 쓰며, 둘레의 바이트를 결코 다시 쓰지 않습니다. 그 밖의 모든 형식은 시작 바이트에서 자기 데이터 형식의 정확한 너비만큼 바이트 단위로 주소가 매겨집니다. 신호원 카드의 읽기 전용 **신호원 주소 (버스)** 줄은 편집하는 대로 조립된 주소를 보여 줍니다.

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

태그의 **데이터 형식**이 버스 위의 S7 고유 형식을 정합니다. S7 고유 너비 열세 가지를 모두 쓸 수 있습니다.

| 데이터 형식 | S7 형식 | 버스 위 크기 |
| --- | --- | --- |
| Boolean | BOOL | 1비트 |
| SByte | SINT | 1바이트 |
| Byte | USINT | 1바이트 |
| Int16 | INT | 2바이트 |
| UInt16 | UINT | 2바이트 |
| Int32 | DINT | 4바이트 |
| UInt32 | UDINT | 4바이트 |
| Int64 | LINT | 8바이트 |
| UInt64 | ULINT | 8바이트 |
| Float | REAL | 4바이트 |
| Double | LREAL | 8바이트 |
| String | STRING 또는 WSTRING | 최대 길이 + 2바이트(STRING), 최대 길이 × 2 + 4바이트(WSTRING) |
| DateTime | DTL | 12바이트 |

여러 바이트로 이루어진 값은 S7 고유의 빅 엔디언 바이트 순서를 저절로 씁니다. 바이트 순서 선택이 없는 것은 필요하지 않기 때문입니다.

문자열 태그는 표준 S7 STRING 배치를 읽습니다. 선언된 최대 길이 1바이트, 현재 길이 1바이트, 그다음 문자이며, 문자 하나가 Windows-1252로 1바이트입니다. Windows-1252는 TIA Portal과 Siemens HMI가 STRING을 보여 줄 때 쓰는 코드 페이지입니다. 그래서 스테이션이 쓴 텍스트는 TIA Portal과 HMI에 그대로 보이고("Peça 12"는 "Peça 12" 그대로입니다), 스테이션도 같은 텍스트로 다시 읽습니다. **최대 길이**는 문자 수로 세고, 블록의 STRING 선언과 맞아야 하며(비우면 S7의 최대인 254입니다), 드라이버는 읽을 때마다 최대 길이 + 2바이트를 옮깁니다. DateTime 태그는 S7-1200/1500 계열의 DTL 구조체(연도부터 나노초까지)와 대응합니다. 예전의 8바이트 DATE_AND_TIME은 제시되지 않습니다.

**PLC의 문자열 형식**이 `WSTRING`인 문자열 태그는 대신 S7 WSTRING 배치를 읽습니다. 선언된 최대 길이 1워드, 현재 길이 1워드, 그다음 문자이며, 문자 하나가 UTF-16으로 2바이트이므로 어떤 문자든 들어갑니다("中"은 "中"으로 쓰이고 그대로 다시 읽힙니다). **최대 길이**는 여전히 문자 수로 세고, 1부터 16382까지이며, 블록의 WString 선언과 맞아야 합니다(비우면 254이며, TIA Portal이 길이 없이 선언된 WString에 주는 길이입니다). 드라이버는 읽을 때마다 최대 길이 × 2 + 4바이트를 옮깁니다. S7comm은 CPU에서 형식을 읽을 수 없으므로 형식은 변수와 맞아야 합니다. WString 변수에 대해 `STRING`으로 남은 태그는 잘못된 배치로 읽고 씁니다. 이 칸이 생기기 전에 저장된 태그는 모두 `STRING`입니다.

## 쓰기 {#writes}

**접근**이 읽기와 쓰기이거나 쓰기 전용인 태그는 쓸 수 있습니다. 쓰기는 읽기와 같은 영역과 바이트와 비트를 가리킵니다. 부울 쓰기는 자기 비트 하나를 정하고, 그 밖의 것은 형식의 정확한 바이트를 씁니다. 새 태그는 읽기 전용으로 시작합니다.

**최대 길이**보다 많은 바이트가 필요한 문자열 쓰기는 거부되며 아무것도 전송되지 않습니다. 크기에 맞게 잘라 쓰는 일은 없습니다. 진단 로그와 에이전트에는 예를 들어 "The DB1 byte 44 write was not sent: the text takes 21 bytes, and the STRING holds 20."라고 나옵니다. **최대 길이**와 정확히 같은 길이의 텍스트는 전부 그대로 씁니다.

Windows-1252에 없는 문자(예를 들어 한자)가 들어 있는 문자열 쓰기도 같은 방식으로 거부되며, 그 문자를 물음표로 바꿔 쓰는 일은 없습니다. 진단 로그와 에이전트에는 예를 들어 "The DB1 byte 44 write was not sent: the STRING holds Windows-1252 characters only, and '中' (U+4E2D) is not one of them; it fits once the tag's text type in the PLC and the PLC variable are both WSTRING."라고 나옵니다. 태그 패널은 같은 이유를 스테이션의 언어로 보여 줍니다.

이런 텍스트를 쓰려면 블록에서 변수를 WString으로 선언하고 태그의 **PLC의 문자열 형식**을 `WSTRING`으로 정하십시오. WSTRING은 문자 하나를 2바이트로 세므로, **최대 길이**보다 긴 텍스트는 같은 방식으로 거부되고 아무것도 전송되지 않습니다. 예를 들어 "The DB1 byte 94 write was not sent: the text takes 42 bytes, and the WSTRING holds 40 (20 characters of two bytes)."라고 나옵니다.

## 장치 검색 {#discovery}

이름으로 읽는 CPU는 자기 변수를 나열합니다. S7comm은 아무것도 나열하지 않고, 브로드캐스트로 CPU를 찾지도 못합니다. 드라이버 페이지에서는 **스캔 범위** 카드의 **스캔할 CPU**가 어느 CPU인지 정합니다. 이 드라이버의 Siemens 장치 가운데 CPU를 이름으로 읽는 장치(그 장치의 호스트에서 스캔하고 그 장치의 비밀번호로 로그인합니다. 비밀번호로 보호된 CPU가 변수를 나열하는 방법입니다)이거나, **여기에 입력한 주소**로 CPU 주소를 **CPU 주소**에 넣습니다.

**장치 검색**은 그 CPU를 변수를 태그로 가진 장치 하나로 내놓습니다. 내놓는 것은 CPU가 HMI에서 접근할 수 있고 보인다고 표시한 변수로, 모두 선택되어 있고, CPU가 알려 준 형식을 가지며, CPU가 HMI에서 쓸 수 없다고 표시한 곳은 읽기 전용입니다. 목록은 이름의 경로에 따른 트리입니다. 데이터 블록, 그다음 각 구조체 또는 UDT 인스턴스와 각 배열, 그리고 변수이며, 변수는 각각 다른 변수와 겹치지 않는 이름의 가장 짧은 끝부분(`Real_`, `Valor`, `Vetor[0]`)으로 이름이 붙습니다. 가지를 선택하면 그 아래 전부가 선택되거나 해제되고, 가지는 그 변수 가운데 몇 개가 선택되었는지 알려 줍니다. DTL은 변수 하나입니다. **장치 추가**는 선택한 태그를 가진, 이름으로 읽는 장치를 만듭니다.

이 스테이션의 Siemens 장치가 이미 이름으로 읽는 CPU는 스캔이 어떻게 지정했든 그 장치입니다. 스캔은 그 장치의 비밀번호로 로그인하고, **태그로 추가**는 아직 태그가 없는 변수를 추가합니다. 이름으로 읽는 장치의 페이지에서는 태그 카드의 **태그 검색**이 그 장치 하나에 대해 같은 트리로 같은 일을 합니다([장치 검색](connector-discovery#discovering-a-devices-tags) 참고). 주소로 지정하는 장치에는 태그 검색이 없습니다. 태그는 손으로 추가하십시오.

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

- Timer와 Counter 영역은 S7-300과 S7-400 CPU에만 있습니다. S7-1200에는 이 영역이 없고, S7-1500은 PUT/GET을 허용해도 S7comm으로 이 영역을 읽으면 "Address out of range"로 거부합니다. 그럴 때는 PLC 프로그램에서 타이머나 카운터의 값을 데이터 블록이나 플래그 메모리로 복사해 두고 거기서 읽으십시오. 영역이 있는 CPU에서는 바이트 위치가 아니라 번호로 주소를 매깁니다. 상자는 타이머나 카운터 자체를 묻습니다(T0, T1, T2와 C0, C1, C2). 값 하나가 16비트 워드 하나이므로 Int16과 짝지으십시오. 그보다 넓거나 좁은 데이터 형식은 거부되고 태그 이름이 진단 로그에 남으며, 그 장치의 다른 태그는 계속 읽힙니다.
- 닿지 않는 PLC는 시작할 때 아무 비용도 들이지 않습니다. 장치는 배경에서 계속 다시 시도하고, 연결이 이루어질 때까지 그 태그는 품질이 나쁜 것으로 읽힙니다.
- 장치가 온라인이 된 뒤에 뽑힌 케이블은 다음 읽기에서 알아차립니다. 장치는 오프라인이 되고 그 태그의 품질은 나빠지며, 네트워크가 돌아오면 스스로 다시 연결합니다. CPU가 거부하는 주소는 그렇게 하지 않으므로, 잘못 입력한 태그 하나가 그 장치의 나머지를 함께 끌어내리는 일은 결코 없습니다. 읽기에서 연결이 끊긴 것을 알게 된 태그는 장치와의 연결이 끊어졌다는 것을 스테이션의 언어로 전하고, Sharp7의 말은 이벤트 페이지에 남습니다.
