본문 바로가기
PLC 프로그래밍/MELSEC PLC

Ethernet 통신 하기[3]

by lemy 2019. 2. 20.
반응형


Ethernet 통신 하기[3]


죄송해서 출처를 계속 찾아보니 melsec PLC 동호회(http://cafe.daum.net/melsec)의 회색늑대 (grizlupo)님의 초보 통신 이야기 연재글 이었군요. 감사드립니다.

초보 통신 이야기 연재글은 Ethernet 뿐만 아니라 시리얼 통신등의 주제도 다루고 있습니다.  

회색늑대 (grizlupo)님의 초보 통신 이야기중 Ethernet 통신에 관련하여 전반적으로 이해 할 수 있는 좋은 글입니다. 총 3회 분량의 글 입니다.


12. 생존확인 (Existence Confirmation)

OPEN 설정의 한 항목이기는 하지만 통신 그 자체만을 위한 지금까지와의 설정과는 조금 다른 성격의 것입니다. 

생존확인이라는 말처럼 상대국이 통신이 가능한지 어떤지를 확인할것인가? 말것인가?를 결정하는 설정입니다. 당연히 연결이 이루어지고 난 다음의 일입니다. 연결이 애초에 이루어지지 않았다면 생존확인이라는 것을 하고 있을 필요도 없는 일이니까요 ^^;


통신에서의 연결이라는 것은 내가 얘기를 하면 상대방이 대답을 하는가? 하지 않는가?의 문제입니다. 대답을 하면 연결되어 있는 것이고, 그렇지 않으면 끊어진 것입니다. TCP에서 말하는 연결이라는 것은 TCP 프로토콜이 규정하는 어떤 메세지를 상대방에 보냈을 때 상대방이 그에 맞는 대답을 했는가 하는 것입니다.


우리가 TCP 컨넥션 하나를 설정하고 OPEN이라는 과정을 거치면 모듈 내부적으로는 이와 같은 규정에 따라 서로 짧은 메세지를 주고 받음으로써 실제로 통신이 가능하는 것을 확인하게 되고, 그것이 성공하면 연결되는 것입니다. 하지만 이것은 어디까지만 처음 한번에 해당하는 것입니다. 한번 연결이 이루어지고 나면 둘 중에 누군가가 이제는 끊겠다는 메세지를 주고 받는 CLOSE 과정을 거치지 않는 이상 연결은 계속 이어집니다. 쭉~.


한번 연결이 성공하면 연결은 계속해서 이어집니다. 심지어 둘 사이의 통신선을 잘라버려도 말입니다. 그래서 생존확인이라는 과정을 필요로 하는 것입니다. 즉, OPEN 과정에 준하는 동작을 일정한 주기로 계속 하는 것입니다. 그러면 잘 대답하다가 어느 순간부터 대답이 없어졌다면 상대방과의 연결에 문제가 생긴것이고, 이더넷 모듈은 이를 감지하고, 사용자에게 통보를 할 수 있게 되는 것입니다. 이것이 생존 확인입니다.


통신은 잘못될 가능성이 언제나 있는 것입니다. 그래서 이러저러한 문제에 대해서 항상 대처가 가능한 형태로 프로그램되어져야 합니다. 

그런 의미에서 이유 없이 이 설정은 사용하는 것으로 설정하는 것이 좋습니다. 


생존확인이라는 과정을 앞서도 말한 것처럼 일정 간격으로 OPEN에 준하는 동작을 하는 것입니다. 그렇다면 얼마의 주기로 할 것인가? 당근 파라메터에 있습니다. 이더넷 모듈 설정 중에 Initial settings 이라는 것이 있습니다. 이 설정에 보면 각종 시간에 대한 설정이 있습니다. 

그 중에서 하단부에 있는 Dest. Confirmation Start Interval로 시작하는 세 개의 항목이 생존확인을 위한 것입니다. 차례대로 첫 연결 후 얼마 후부터 생존확인을 시작할 것인가? 일단 생존확인을 시작했다면 얼마의 주기로 할 것인가? 응답이 없다면 몇번까지 재시도를 하고 문제가 있는 것으로 처리를 할 것인가? 입니다.


그리고 어떤 방법으로 생존확인을 할 것인가 하는 것은 이미 IP를 설정하면서 열어 본 적이 있는 Operational settings에 보시면 KeepAlive를 사용하는 방법과 Ping을 사용하는 두 가지 방법 중에 하나를 선택할 수 있도록 되어 있습니다. 

기본값은 KeepAlive를 사용하는 방법으로 이는 TCP의 일부분인 KeepAlive라는 값을 사용하는 방법입니다. 단어에는 풍기는 것처럼 생존확인을 위한 용도로 만들어진 것이니까 이를 사용하는 것이 가장 좋은 방법입니다.

하지만 경우에 따라 이 방법이 통하지 않는 장비가 간혹있습니다. KeepAlive에 대한 것을 구현해 놓지 않은 것입니다. 이런 경우에라도 Ping에 의한 방법은 대부분 통합니다. TCP/IP를 구현하는 장비에서 거의 표준적으로 구현해 두어야 하는 부분이니까요!


가능하면 생존확인을 하도록 설정하고, 설정한 후에는 반드시 연결 케이블 빼보는 방법등으로 자동적으로 연결이 종료되는 것을 확인하셔서야 합니다. 

그리고 가능하면 그러한 상황에서 다시 케이블을 꽂으면 연결이 다시 이루어질 수 있도록 끊임없이 연결을 재시도하도록 프로그램을 해 두는 것도 잊지 마십시요


13. 데이터링크 (Data-Link)

데이터링크란? PLC와 PLC 사이에서 서로의 디바이스를 읽고 쓸 수 있도록 해주는 기능을 말합니다. MELSECNET이나 CC-Link는 이러한 링크가 파라메터 설정만으로 자동으로 이루어집니다. ‘자동링크’ 정도로 표현할 수 있을 것입니다. 하지만 애석하게도 이더넷 모듈은 이런 자동링크 기능을 지원하지 않고 있습니다. 이더넷 모듈로는 그러한 기능이 불가능한 것이 아니라 단지 지원하고 있지 않은 것입니다. 미쯔비시 내부적인 문제이겠지만 그런 용도라면 ‘MELSECNET을 사용하라!’뭐 그런 생각이 깔려 있는 것 같습니다. 하지만 시스템의 구성상 이더넷으로 모두 연결되어 있는데도 불구하고 단지 이 자동링크 기능때문에 MELSECNET을 추가해야 할지 어떨지를 고민하는 경우가 왕왕 생길 때면 정말이지 아쉽습니다.


그렇다고 링크가 되지 않는 것은 아닙니다. 링크를 위한 명령들이 따로 마련되어 있습니다. 자동링크가 되는 MELSECNET이나 CC-Link 같은 경우에도 파라메터에 설정할 수 없는 조금 많은 데이터를 보내고자 할 때도 이 링크 관련 명령들을 사용합니다. 물론 자동은 아닙니다. 링크 관련 명령들을 사용해서 래더로 직접적으로 프로그램을 해 주어야 합니다. 하지만 상대 PLC의 디바이스 영역을 지정해서 읽거나 쓸 수 있다는 것이 매력적인 것입니다.


링크 관련 명령을 사용하면 상대방 PLC의 디바이스를 읽어 오는 것은 물론이고, 상대방 PLC의 디바이스에 직접적으로 값을 기록할 수도 있습니다. 따라서 이더넷으로 연결되어 있는 PLC 중에서 어느 한 PLC만 이런 링크 관련 명령으로 서로 간의 디바이스 영역을 읽어오고 쓰도록 프로그램 한다면 자동링크와 비슷한 기능을 만들어 낼 수도 있습니다. 다른 PLC 들은 따로 래더 프로그램을 하지 않아도 됩니다. 링크 기능에서 사용하는 프로토콜은 이더넷 모듈 차원에서 처리되어 이더넷 모듈이 CPU 모듈의 디바이스를 읽고 쓰는 역할을 대신하기 때문에 래더 프로그램이 필요없는 것입니다. 물론 이 프로토콜은 내부적으로만 사용되는 것이고, MC 프로토콜처럼 공개되어 있지는 않은 것입니다.


이에 대한 설명은 이더넷 모듈의 응용편에 실려 있습니다. 또한 여러 통신에서 함께 사용할 수 있는 명령이기 때문에 Q공통명령편에도 이에 대한 설명이 실려 있습니다. 두 설명서를 모두 보셔야 합니다. (G.READ, GP.READ, 혹은 J.READ, JP.READ)


14. 상대국 디바이스 읽기/쓰기

전체적으로는 READ라고 표현되는 명령입니다. 경우에 따라 G.READ, GP.READ, 혹은 J.READ, JP.READ라고 사용할 수 있습니다. G와 J의 차이는 적용할 통신 모듈을 I/O로 지정하는지 국번으로 지정하는지의 차이입니다. 즉, 전용명령의 형태라는 것입니다.


다른 전용명령들 처럼 정말이지 많은 값들을 필요로 합니다. 하지만 단순합니다. 즉, 상대방의 아무개 디바이스를 자신의 아무개 디바이스로 읽겠다. 뭐 그런 정도의 설정입니다.


GP.READ K0 D0 W0 W0 M0


이 명령이 수행되면 상대국의 W0 영역이 자신의 W0 영역으로 읽힙니다. 얼마나 읽는지 상대방은 누구인지 등은 D0의 컨트롤 데이터에 지정됩니다. 명령이 완료되면 M0과 M1이 다른 전용명령과 같이 완료와 에러를 표시하는 용도로 사용됩니다.


컨트롤 데이터에는 예상하시는 대로 상당히 많은 값들을 설정해야 합니다.


▶ S1+0: 도달 확인 이라는 설정과 이상 발생시 그 시간이 함께 기록되는지에 대한 설정입니다. 

개인적으로는 도달 확인이라는 것이 구체적으로 무엇인지 모르겠지만 1로 고정되어 있다고 되어 있으므로 H0001이라는 값을 사용합니다.

▶ S1+1: 정상완료되면 0, 아니면 에러코드가 담기는 자리입니다. 통상적으로 모든 전용명령이 이곳을 그런 용도로 사용하니까 낯설지가 않습니다. ^^

▶ S1+2: 자국 사용 채널, 설명서에는 모두 8개의 채널이 가능하다고 되어 있습니다. 각각의 채널은 독립적으로 동작하므로 동시에 최대 8개의 PLC와 통신을 할 수 있다는 것으로 해석해도 무방할 것 같습니다. 물론 8개 보다 많은 경우라면 하나의 채널을 번갈아 사용하는 수 밖에 없을 것입니다. 즉, 한번은 A라는 PLC와 통신을 하고 다음번에는 B, 그리고 다시 A 이런 식이 되겠죠!

▶ S1+3: 더미(Dummy, Spare)

▶ S1+4: 대상국 네트워크 번호

▶ S1+5: 대상국 국번

▶ S1+6: 더미(Dummy, Spare)

▶ S1+7: 재송신 회수, 재송신 결과 - 명령을 내릴 때는 재송신 회수가 되고, 명령이 종료된 때에는 재송신 한 회수가 됩니다.

▶ S1+8: 도달 감시시간 - 통신이기 때문에 이런 설정이 있는 것이겠죠! 이 시간 안에 상대국의 이더넷 모듈이 적절한 반응을 보이지 않으면 앞서 설정한 회수 만큼 재시도를 해보고 그래도 안되면 에러 처리됩니다.

▶ S1+9: 읽을 데이터 수를 지정합니다. 무엇을 읽는지는 명령의 인수로서 주어졌습니다.

▶ S1+10: 더미(Dummy, Spare)

▶ S1+11: 시계 세트 플래그 (데이터의 유효/무효 상태가 저장, 이상시)

▶ S1+12: 시계 데이터(이상시만 세트) 앞서 S1+0에서 에러 발생시 시간을 기록하도록 설정한 경우 아마도 이곳에 시간이 설정되는 것으로 보입니다.

▶ S1+13: 시계 데이터(이상시만 세트)

▶ S1+14: 시계 데이터(이상시만 세트)

▶ S1+15:: 시계 데이터(이상시만 세트)

▶ S1+16: 이상 검출 네트워크 번호

▶ S1+17: 이상 검출국번


대부분의 경우 네트워크가 달랑 하나 뿐이기 때문에 대상국의 이상이 곧 이상 검출 네트워크와 국번이 되겠지만 여러 네트워크로 구성된 경우라면 그렇지 않을 수도 있을 것입니다. 그래서 이런 식의 용어가 사용되는 것 같습니다. 정작 중요한 것은 상대방이 누구인지 그리고 얼마의 디바이스를 읽는지 뿐인데 정말이지 많이도 주어야 합니다.


비슷한 방법으로 쓰기를 할 때는 WRITE 라는 명령을 사용합니다. READ와 WRITE는 워드 디바이스만을 읽고 쓸 수 있습니다. 비트 디바이스는 안 됩니다.


▶  기타

READ와 WRITE 명령 외에도 데이터 링크용 명령에는 몇가지가 더 있습니다. 관련 설명서를 참조 하십시요.


* 전자 메일의 송수신용

MRECV 수신한 전자 메일을 읽는다.

MSEND 전자 메일을 송신한다.


* 디바이스 데이터의 읽기/쓰기용

READ 타국의 워드 디바이스의 데이터를 읽는다.

SREAD 타국의 디바이스를 읽는다.(완료 디바이스가 부착) 

WRITE 타국의 디바이스에 쓴다. 

SWRITE 타국의 디바이스에 쓴다.(완료 디바이스가 부착) 

ZNRD 타국의 디바이스를 읽는다.(ACPU용) 

ZNWR 타국의 디바이스에 쓴다.(ACPU용) 


* 메시지(임의 데이터)의 송수신용

SEND 타국에 데이터를 송신한다. 

RECV 타국에서의 수신 데이터를 읽는다. (메인 프로그램용)

RECVS 타국에서의 수신 데이터를 읽는다. (인터럽트 프로그램용)


* 시계 읽기/쓰기, 리모트 RUN/STOP

REQ 타국을 리모트 RUN/STOP한다. ; 타국의 시계 데이터를 읽는다/쓴다.



반응형

'PLC 프로그래밍 > MELSEC PLC ' 카테고리의 다른 글

시리얼 통신 하기[1]  (0) 2019.03.06
전압 강하 계산 엑셀 TOOL  (2) 2019.02.28
Ethernet 통신 하기[2]  (0) 2019.02.20
Ethernet 통신 하기[1]  (0) 2019.02.16
MELSEC-Q PLC/ CC-LINK DATA BOOK  (1) 2019.01.20

댓글