Rockwell EtherNet/IP
EtherNet/IP로 Allen-Bradley 컨트롤러에 접속합니다. ControlLogix, CompactLogix, PLC-5, SLC 500, MicroLogix, Micro800과 그 태그 주소, 데이터 형식, 네트워크 검색.
Rockwell EtherNet/IP 드라이버는 EtherNet/IP로 Allen-Bradley / Rockwell 컨트롤러와 이야기합니다. ControlLogix와 CompactLogix 컨트롤러는 Logix 프로젝트에 선언된 컨트롤러 태그 이름으로, Micro800은 전역 변수 이름으로, PLC-5, SLC 500, MicroLogix는 데이터 파일 주소로 값의 주소를 적으며, 레지스터 지도는 끼어들지 않습니다. Connector에서 Rockwell EtherNet/IP 드라이버 아래에 장치를 추가하고 컨트롤러 제품군을 고르십시오. 패널은 그 제품군이 쓰는 칸만 보여 줍니다.
컨트롤러 제품군
장치의 컨트롤러 제품군이 컨트롤러에 닿는 방법과 그 태그의 주소를 적는 방법을 정합니다.
| 컨트롤러 제품군 | 컨트롤러 | 태그 주소 | 슬롯 |
|---|---|---|---|
| ControlLogix / CompactLogix | ControlLogix, CompactLogix | 컨트롤러 태그, 태그 이름 | 있음 |
| PLC-5 | 이더넷 포트가 있는 PLC-5(PLC-5/20E, /40E, /80E) | 데이터 파일 주소, 예: N7:0 |
없음 |
| SLC 500 | SLC 5/05 | 데이터 파일 주소 | 없음 |
| MicroLogix | MicroLogix 1100과 1400, 나머지는 1761-NET-ENI를 거쳐 | 데이터 파일 주소 | 없음 |
| Micro800 | Micro820, Micro850, Micro870 | 컨트롤러 태그, 전역 변수 이름 | 없음 |
기본값은 ControlLogix / CompactLogix이며, 이 칸이 생기기 전에 만든 장치도 여기에 해당하므로 지금까지와 똑같이 읽습니다. 백플레인을 거쳐 슬롯으로 닿는 것은 ControlLogix와 CompactLogix 컨트롤러뿐입니다. 다른 제품군은 자기 이더넷 포트에서 응답하므로 그 장치에는 슬롯 칸이 없습니다. 장치 검색은 컨트롤러의 신원에서 제품군을 읽으므로, 찾은 컨트롤러는 제품군이 이미 골라진 채로 도착합니다.
연결
| 칸 | 뜻 | 기본값 |
|---|---|---|
| 호스트 | 컨트롤러 이더넷 포트의 IP 주소나 호스트 이름. | 비어 있음 |
| 컨트롤러 제품군 | 컨트롤러가 속한 제품군입니다. 아래 칸들과 태그 주소를 적는 방법을 정합니다. | ControlLogix / CompactLogix |
| 슬롯 | ControlLogix / CompactLogix만 해당합니다. 컨트롤러가 섀시의 몇 번째 자리에 꽂혀 있는지이며 0부터 셉니다. | 0 |
| 읽기 주기 (ms) | 스스로 값을 정하지 않은 태그에 적용되는 장치 전체의 읽기 주기. | 1,000 |
포트 칸은 없습니다. EtherNet/IP는 표준 TCP 포트 44818을 씁니다. CIP 경로는 백플레인과 슬롯으로 이루어지므로 섀시 어디에 꽂힌 컨트롤러에도 닿을 수 있습니다. 검색으로 찾은 컨트롤러는 슬롯 0에서 시작하며, 이 칸이 그것을 고치는 자리입니다. 랙 칸은 없습니다. CIP 경로는 랙 번호를 담지 않기 때문입니다. 요청은 10초 뒤에 시간이 초과됩니다. 장치 머리글은 조립된 endpoint를 보여 줍니다. 예를 들어 eip://192.168.0.10:0이며, 주소 뒤의 숫자가 슬롯입니다.
다른 제품군의 컨트롤러는 슬롯을 담지 않으며, 머리글은 그 대신 제품군을 보여 줍니다. 예를 들어 eip://192.168.0.20?family=slc500입니다.
태그마다 자기 읽기 주기 (ms)를 정할 수 있으며, 태그 값이 0이면 장치의 주기로 되돌아갑니다.
주소 지정
Rockwell 태그의 주소는 태그 신호원 카드의 두 칸으로 적습니다.
| 칸 | 뜻 | 받는 값 | 기본값 |
|---|---|---|---|
| 컨트롤러 태그 | 컨트롤러에 선언된 그대로의 태그 이름입니다. 필수입니다. | 자유 입력 | 비어 있음 |
| 태그 안 오프셋 (바이트, BOOL은 비트) | 그 태그의 데이터 안에서 값이 놓인 자리입니다. 바이트 위치이며, 부울 태그에서는 비트 위치입니다. | 0~255 | 0 |
드라이버는 이름으로 부른 컨트롤러 태그를 열고, 그 데이터 버퍼에서 오프셋 자리의 값을 집어 옵니다. 평범한 원자적 태그라면 오프셋은 0으로 둡니다. 오프셋은 컨트롤러 태그 하나가 여러 채널을 섬길 수 있게 하는 것입니다. 구조체 맨 앞의 DINT는 오프셋 0이고, 그로부터 네 바이트 뒤의 REAL은 오프셋 4이며, 부울 태그에서는 오프셋이 바이트가 아니라 비트를 셉니다.
| 읽으려는 것 | 컨트롤러 태그 | 오프셋 | 데이터 형식 |
|---|---|---|---|
컨트롤러 범위의 DINT Counter |
Counter |
0 | Int32 |
Main에 있는 프로그램 범위의 DINT |
Program:Main.Counter |
0 | Int32 |
REAL 배열의 원소 Temps[2] |
Temps[2] |
0 | Float |
BOOL 배열의 원소 Flags[5] |
Flags[5] |
0 | Boolean |
구조체 Recipe 안의 두 번째 DINT |
Recipe |
4 | Int32 |
Flags에 담긴 데이터의 비트 3 |
Flags |
3 | Boolean |
BOOL 배열에서 인덱스는 컨트롤러의 32비트 워드가 아니라 BOOL을 가리킵니다. Flags[5]는 5번 BOOL이며, 비트 오프셋은 지정한 BOOL부터 이어서 세므로 Flags[5]에 오프셋 2면 7번 BOOL입니다.
이름은 마침표까지 그대로 통째로 컨트롤러에 닿고, 같은 태그의 읽기와 쓰기는 같은 자리에 놓입니다. 그것이 Program:Main.Counter 같은 프로그램 범위 이름이 동작하는 이유입니다. 점으로 이어진 멤버 경로(MyUdt.Member)는 컨트롤러가 그 멤버를 이름으로 공개할 때 컨트롤러가 풀어냅니다. 공개하지 않을 때는 컨트롤러 범위의 기본 태그를 이름으로 부르고 바이트 오프셋으로 그 안에 닿으십시오. 이 방법은 언제나 동작합니다. 신호원 카드의 읽기 전용 신호원 주소 (버스) 줄은 편집하는 대로 조립된 주소를 보여 줍니다.
Micro800도 같은 방식으로 Level 같은 전역 변수 이름으로 주소를 적습니다. 이름을 댈 프로그램 범위 태그는 없습니다.
데이터 파일 주소
PLC-5, SLC 500, MicroLogix 태그의 주소는 데이터 파일 주소라는 칸 하나로 적습니다. 파일 문자와 번호, 콜론, 요소 순으로 쓰고, 그 뒤에 점 다음 멤버나 슬래시 다음 비트를 붙입니다. 주소가 요소, 멤버, 비트를 스스로 나타내므로 오프셋 칸은 없습니다. 이 칸은 드라이버가 읽을 수 없는 주소를 입력하는 동안 거부하고 그 이유를 알려 줍니다.
| 파일 | 예 | 읽는 것 | 데이터 형식 |
|---|---|---|---|
| 정수(N) | N7:0, N7:0/15 |
16비트 워드 또는 그 비트 중 하나 | Int16 또는 UInt16, 비트이면 Boolean |
| 비트(B) | B3:0, B3:0/2 |
16비트 워드 또는 그 비트 중 하나 | Int16 또는 UInt16, 비트이면 Boolean |
| 부동소수점(F) | F8:1 |
32비트 부동소수점 값 | Float |
| 긴 정수(L) | L9:0 |
32비트 정수 | Int32 또는 UInt32 |
| 타이머(T) | T4:0.ACC, T4:0.PRE, T4:0.DN |
ACC나 PRE, 또는 비트 EN, TT, DN | Int16 또는 UInt16, 비트이면 Boolean |
| 카운터(C) | C5:0.ACC, C5:0.PRE, C5:0.DN |
ACC나 PRE, 또는 비트 CU, CD, DN, OV, UN | Int16 또는 UInt16, 비트이면 Boolean |
| 제어(R) | R6:0.LEN, R6:0.POS |
LEN이나 POS | Int16 또는 UInt16 |
| 상태(S) | S:1, S:1/15 |
상태 파일의 워드 또는 그 비트 중 하나 | Int16 또는 UInt16, 비트이면 Boolean |
| 입력(I), 출력(O) | I:0, I:0/1, O:0/1 |
입력 또는 출력 이미지의 워드 또는 그 비트 중 하나 | Int16 또는 UInt16, 비트이면 Boolean |
고를 수 있는 데이터 형식은 파일을 따르며, 태그의 형식을 담지 않는 파일의 주소를 입력하면 형식이 그 파일의 형식으로 바뀝니다. 상태, 입력, 출력 파일은 프로그래밍 소프트웨어가 쓰는 대로 번호를 빼고 쓸 수 있습니다. 드라이버는 이를 S2:1, I1:0/1, O0:0/1로 보내며, 신호원 주소 (버스) 줄이 그것을 보여 줍니다. 입력이나 출력 주소에서 요소는 이미지 안의 워드 위치입니다. MicroLogix의 내장 입력은 I:0/0부터 시작합니다. 타이머, 카운터, 제어 요소는 멤버 중 하나를 통해 읽으며 통째로 읽지 않습니다. 문자열, ASCII, BCD, 메시지, PID 파일은 읽지 않습니다. PLC-5는 입출력 번호를 8진수로 매기며 드라이버는 이 번호를 읽지 않으므로, 그 I와 O 파일은 거부됩니다. 그런 값은 프로그램이 복사해 두는 데이터 파일을 통해 읽으십시오. 파일이 있는지는 읽어 봐야 압니다. 컨트롤러에 없는 파일(N9가 없는데 N9:0)은 그 태그의 첫 읽기부터 오류로 읽히며, 장치의 다른 태그는 계속 읽습니다.
데이터 형식
원자적 CIP 형식은 모두 태그의 데이터 형식으로 쓸 수 있습니다.
| 데이터 형식 | CIP 형식 | 크기 |
|---|---|---|
| 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바이트 |
구조체와 UDT는 지원하지 않습니다. 위의 원자적 형식만 읽고 쓸 수 있으며, 그 안의 멤버에 닿기 위해 바이트 오프셋이 있는 것입니다. 문자열은 일부러 선택 목록에 없습니다. Logix STRING은 원자적 형식이 아니라 길이와 82바이트 배열로 이루어진 구조체이며, 드라이버는 그것을 읽지도 쓰지도 못합니다. 버스 위의 바이트 순서는 CIP 자신의 리틀 엔디언이며 저절로 처리됩니다. 바이트 순서 선택은 없습니다.
PLC-5, SLC 500, MicroLogix에서는 그 대신 형식이 데이터 파일을 따릅니다. 위의 데이터 파일 주소 표에 나온 그대로입니다.
쓰기
접근이 읽기와 쓰기이거나 쓰기 전용인 태그는 쓸 수 있습니다. 쓰기는 요청받은 값만 보내고 그 옆의 것은 아무것도 보내지 않습니다. 그래서 같은 순간에 컨트롤러에서 바뀐 비트나 멤버가 조금 전 값으로 되돌려지는 일은 없습니다.
| 태그가 가리키는 것 | 쓰기가 보내는 것 |
|---|---|
| 원자적 태그 전체(오프셋 0이고 태그 자체의 크기), 또는 BOOL 태그 | 그 값을 그 태그로 |
정수 태그의 비트 하나(Flags, 오프셋 3, Boolean) |
그 비트만 Flags.3으로. 컨트롤러가 그 자리에서 비트를 바꾸고 다른 비트는 그대로 둡니다 |
BOOL 배열의 원소(Flags[5], Boolean) |
그 BOOL만 배열 첫 워드의 비트 5(Flags[0].5)로. 컨트롤러가 그 자리에서 바꾸고 워드의 다른 BOOL은 그대로 둡니다 |
구조체 안의 값(Recipe, 오프셋 4) |
그 멤버만 이름으로(Recipe.Speed). 이름은 컨트롤러가 공개하는 구조체 정의에서 찾습니다 |
태그의 나머지까지 되돌려 써야만 할 수 있는 쓰기는 거부되고, 그 이유에 주소가 나옵니다. 원자적 태그의 일부(DINT의 오프셋 2에 있는 Int16), REAL의 비트, 구조체의 어떤 멤버도 값의 크기로 그 오프셋에서 시작하지 않는 경우가 그렇습니다. 그럴 때는 값을 그 자체의 이름으로 적으십시오. 예를 들어 Recipe.Speed를 오프셋 0으로 적습니다. 드라이버는 태그의 쓰기가 어디에 닿는지를 첫 쓰기 때 알아내고, 장치가 연결되어 있는 동안 그것을 기억합니다. 새 태그는 읽기 전용으로 시작합니다.
데이터 파일 주소는 이름 그대로 씁니다. 워드, 부동소수점 값, 멤버는 통째로 쓰고, 비트(B3:0/2, T4:0.DN)는 그것만 씁니다. 컨트롤러는 그 비트를 그 자리에서 바꾸고 워드의 다른 비트는 그대로 둡니다.
장치 검색
Connector의 장치 검색 단추는 이 컴퓨터가 붙어 있는 모든 네트워크에 CIP List Identity 요청을 브로드캐스트하고, 새 응답 없이 10초가 지날 때까지 계속 듣습니다. 스캔은 도는 동안 그 네트워크의 이름을 밝히므로, 결과가 0이어도 물음이 실제로 어디로 갔는지 알 수 있습니다. 가상 머신이나 WSL이나 VPN을 위한 가상 어댑터가 있는 스테이션은 운전자가 생각하는 것보다 네트워크가 많은 일이 흔하고, 후보가 그 가운데 하나에서 올 수도 있습니다.
요청을 실어 나를 수 없는 인터페이스는 건너뜁니다. 올라와 있지 않은 것, 루프백과 터널 어댑터, 그리고 DHCP에 아무도 답하지 않아 인터페이스가 스스로 붙인 주소(169.254.x.x)입니다. 컨트롤러 자신의 신원 응답인 답만 후보 장치가 되며, 이름은 eip:// 뒤에 그 주소를 붙인 것입니다. EtherNet/IP 포트에서 답하는 그 밖의 것은 무시되고 그 사실이 진단 로그에 남습니다. Omron 컨트롤러도 같은 요청에 답하지만 역시 제외되며, 진단 로그에 따로 한 줄이 남습니다. NJ, NX, NY 컨트롤러는 대신 Omron 드라이버의 스캔이 내놓습니다. 후보마다 스캔은 이어서 컨트롤러 범위의 태그 목록을 읽고, 그 원자적 태그를 오프셋 0의 후보 채널로 내놓습니다. 원자적 형식의 배열은 그 형식으로 첫 원소를 내놓고(Temps[0], 2차원이면 Grid[0,0]), BOOL 배열은 첫 BOOL의 Boolean으로 내놓습니다(Flags[0]).
장치 검색은 드라이버가 주기적으로 읽을 수 없는 것을 버립니다. 구조체와 UDT 태그(Logix STRING도 여기에 듭니다)는 버려지고, Program:과 Task:와 Map: 항목은 건너뜁니다. 이 컴퓨터가 붙어 있지 않은 네트워크의 컨트롤러는 브로드캐스트에 답하지 않습니다. 그런 것은 손으로 추가하십시오. 그 밖의 형식의 태그(시스템 형식 등)도 내놓지 않으며, 그 사실이 진단 로그에 남습니다.
컨트롤러가 응답하는 신원에는 카탈로그 번호가 들어 있고, 그 번호가 제품군을 알려 줍니다. PLC-5, SLC 500, MicroLogix, Micro800은 제품군이 골라지고 주소에도 그것이 적힌 채로 도착합니다(eip://192.168.0.20?family=micrologix). PLC-5, SLC 500, MicroLogix는 태그 목록을 공개하지 않으므로 후보 채널 없이 도착하고, 태그는 데이터 파일 주소로 입력합니다. Micro800의 태그 목록은 Logix와 같은 방식으로 읽습니다.
이미 있는 Logix 또는 Micro800 컨트롤러는 자기 페이지에서 태그 목록을 다시 읽습니다. 태그 카드 머리의 태그 검색은 아직 태그가 없는 컨트롤러 태그만, 대소문자를 구분하지 않고 이름으로 비교해 제시합니다. 데이터 파일 컨트롤러에는 읽을 목록이 없으므로 태그 검색이 없습니다(장치의 태그 검색 참고).
알아 두면 좋은 것
- 컨트롤러로 가는 모든 요청은 10초 뒤에 시간이 초과되고, 장치 검색이 듣는 창은 10초 동안 조용하면 닫힙니다.
- 드라이버는 컨트롤러 태그를 한 번만 열고 장치가 연결되어 있는 동안 계속 열어 둡니다. 그래서 태그가 수십 개인 컨트롤러도 이미 열어 둔 세션 위에서 읽히고, 읽을 때마다 열고 닫는 일은 없습니다. 실패한 읽기는 자기 태그를 놓아주고, 다음 읽기가 이름으로 다시 엽니다.
- Logix 프로젝트에서 태그 이름을 바꾸면 채널이 조용히 끊어집니다. 그때부터 태그는 설정된 이름이 다시 맞을 때까지 품질이 나쁜 것으로 읽힙니다.