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

시리얼 통신 하기[4]

by lemy 2019. 3. 7.
반응형



시리얼 통신 하기[4]


출처: melsec PLC 동호회(http://cafe.daum.net/melsec)의 회색늑대 (grizlupo)님의 초보 통신 이야기 연재글 입니다. 

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


2. 교신 프로토콜 설정

이미 프로토콜에 대해서는 언급을 했습니다. MC 프로토콜이니, 무수순이니, 쌍방향이니 하는 것들이 그것입니다. 하지만 이런 것들은 프로그램을 해야 하는 대상으로 생각하고 계셨을 것입니다. 제가 그런 측면을 강하게 부각 시켰으니까요. 그런데 새삼스럽게 무슨 설정을 해야 한다는 것일까? 하고 의아하시는 분이 있을 수도 있겠습니다. 하지만 프로토콜은 프로그램과도 아주 깊은 연관이 있는 것인 동시에 설정을 해 주어야만 하는 대상이기도 합니다.


무수순이라는 것을 언급하면서 무수순은 사용자 정의 프로토콜이라는 점을 말씀 드렸습니다. 무수순은 ‘사용자 정의’ , 그리고 그것에 반대되는 원래 부터 정해진 프로토콜 MC 프로토콜, 이 중 래더 프로그램의 대상이 되는 것은 사용자 정의 프로토콜입니다. MC 프로토콜은 시리얼 통신 모듈 자체적으로 처리가 이루어지므로 그와 관련 한 래더 프로그램은 전혀 필요치가 않습니다.


이런 두 측면 때문에 시리얼 통신 모듈은 자신이 어떻게 동작해야 하는지를 분명히 알고 있어야 합니다. 즉, 자신이 MC 프로토콜로 동작해야 한다면 수신되는 문자들을 모두 자신이 해석하고, 그에 맞는 응답을 스스로 송신해야 합니다. 하지만 사용자 프로토콜이라면 그것은 수신되는 내용을 그대로 래더 프로그램에 전달해 주어야 하고 래더 프로그램이 송신하라고 하는 내용만을 송신해야 한다는 것입니다.


만약 외부 장치는 MC 프로토콜을 사용하는데, 시리얼 통신 모듈의 설정이 무수순으로 되어 있다면 어떻게 될까요? 시리얼 통신 모듈은 외부 장치가 전달하는 내용들을 전혀 신경 쓰지 않게 됩니다. 시리얼 통신 모듈은 무수순으로 동작하도록 설정되었기 때문에 수신되는 내용들이 분명히 MC 프로토콜임에도 불구하고 그 내용들을 자신이 분석하기 보다는 그냥 래더 프로그램에 전달해 버리는 것입니다. 그것이 혹시 MC 프로토콜이 아닐까? 하는 좀 더 높은 차원의 기능을 하지는 않습니다. 그렇게 되면 참 좋을 것 같은데... 애석하게도....


그 반대여도 마찬가지 입니다. 시리얼 통신 모듈은 MC 프로토콜을 사용하는 것으로 되어 있는데, 외부 장치는 MC 프로토콜을 전혀 알지 못하는 바코드 리더 같은 장비를 연결했다면 둘은 동상이몽을 꾸는 것입니다.


일반적으로 많은 FA 장비들을 접하다 보면 이런 저런 PLC와의 통신을 지원한다는 문구를 포함하고 있는 것을 보게 됩니다. 그러면서 지원 가능한 PLC를 잔뜩 나열하는 경우에 그것은 해당 PLC가 규정한 프로토콜대로 통신을 할 수 있다는 것입니다. 멜섹이라면 바로 MC 프로토콜대로 통신을 해서 PLC의 디바이스를 직접 읽고 쓸 수 있기 때문에 설정을 하는 정도만 하면 된다는 의미입니다.


대표적인 것이 터치 스크린입니다. 터치 스크린을 사용하면서 PLC 측에 래더 프로그램을 하는 사람은 아무도 없습니다. 그렇게 하려는 사람도 없구요. 하지만 터치 스크린을 설치 하는 과정에서 반대편 PLC가 무엇인지를 구체적으로 알려 주어야만 합니다. 이 설정이 잘못되면 터치 스크린은 절대로 제대로 동작하지 않습니다. 서로 다른 프로토콜로 동상이몽을 꾸고 있기 때문에 통신이 되지 않는 것은 당연한 것입니다.


이 밖에도 로봇 업체에서 제공되는 로봇 컨트롤러들도 PLC와의 통신을 위해 해당 PLC의 통신 프로토콜을 지원하는 경우가 많이 있습니다. 물론 그렇지 않고, 자신만의 프로토콜을 제공하고 PLC 프로그래머에게 무수순 방식으로 그것에 맞추어서 래더 프로그램을 하도록 하는 경우도 있지만 저를 포함하는 거의 모든 PLC 프로그래머들은 이런 형태를 아주 아주 싫어합니다. 그래서 컨트롤러 제공 업체에게 반대로 PLC의 프로토콜을 지원해 달라고 압력을 가하게 되는 경우가 많습니다. 그러면 대부분의 컨트롤러 업체들은 들어줄 수 밖에 없습니다. 강하게 밀어부쳐 보십시요 ^^;


3. 여러가지 MC 프로토콜

MC 프로토콜이라고 하더라도 다섯 가지 형식 중에 하나를 선택하도록 되어 있습니다. 이 형식이라는 것은 기본적인 전송 포맷에 관련한 것으로 기본적으로 MC 프로토콜이라는 범주에 속하지만 전송 포맷이 아주 조금씩 차이가 납니다.


<명령> 최종적으로 <명령>이라는 것을 전달한다고 할 때, 형식1은 <명령>만을 전송하는 형태입니다. 하지만 형식3같은 경우에는 <STX> + <명령> + <ETX> 형태로 전송합니다. 형식4 같은 경우에는 <명령> + <CR> +<LF> 형태로 전송하는 정도의 차이가 있습니다. 하지만 아주 근본적인 것은 거의 같습니다. 하지만 형식이 다른 경우 근본적인 내용은 같더라도 통신이 이루어질 수 없습니다. 아주 사소한 차이라도 생긴다면 통신은 불가능합니다. 따라서 MC 프로토콜이라고 하더라도 구체적으로 어떤 형식을 구현하고 있는지를 분명하게 짚어 주어야 합니다. 그리고 같은 MC 프로토콜이라고 하더라도 A시리즈에서와 Q시리즈에서 사용하는 것에는 조금씩의 차이가 있습니다. 그러므로 번거롭더라도 자세하게 무엇을 사용하는지에 대한 정보를 가지고 계셔야 합니다.


터치 스크린과 같은 제품을 다룰 때 PLC의 모델이 다른 경우에는 아예 적용되는 통신 드라이버가 다르기 때문에 별 어려움이 없지만 형식의 경우에는 여러 형식 중에 하나만을 이미 구현해 놓은 상태이기 때문에 터치 스크린의 설정 화면에서 PLC의 종류를 선택하는 것만으로는 부족합니다. 반드시 그것이 구현하고 있는 형식을 알아서 PLC 측의 교신 프로토콜 설정을 제대로 해 두셔야만 통신이 될 수 있습니다.


4. 비 공개의 수 많은 프로토콜

MC 프로토콜은 책으로도 제공이 되는 공개되어 있는 것이기 때문에 그 내용을 파악하는데 문제가 없습니다. 하지만 멜섹이 내부적인 통신에서도 MC 프로토콜을 사용하는가? 라는 질문에 답은 ‘아니오!’ 입니다. 내부적으로는 자신들만의 공개되지 않은 프로토콜을 사용합니다.


PLC의 CPU 모듈에도 시리얼 포트가 있습니다. 하지만 터치 스크린 같은 제품을 설정하다보면 이것을 일반 시리얼 통신 모듈과 완전히 구별해서 따로 다루고 있습니다. 이것이 따로 일 수 밖에 없는 이유가 서로 다른 프로토콜을 사용하기 때문입니다. 그리고 CPU의 시리얼 포트가 사용하는 프로토콜은 비 공개입니다. 터치 스크린을 제조하는 업체에서는 그 프로토콜 내용을 다른 어떤 방법을 통해 알아냈을 것입니다. 어쩌면 두 업체 간의 협약이 있을 지도 모르지만 아무튼 일반적으로 공개되어 있지는 않습니다.


CPU에 있는 시리얼 포트에 연결해서는 아무리 MC 프로토콜을 보내더라도 시리얼 통신 모듈이 보이는 것과 같은 반응을 하지는 않습니다. RS-232라는 것은 동일하지만 둘은 하늘과 땅의 차이만큼 극명합니다. 되느냐 안 되는냐, 죽느냐 사느냐의 양단 결정 밖에 없으니까요. 교신 프로토콜 설정 중에 ‘GPPW 접속’ 이라는 형태도 이런 비 공개의 프로토콜 범주 입니다. 미쯔비시 제품들 간의 설정에서는 간혹 ‘GPPW 접속’이라는 설정을 사용하는 경우가 있습니다. 그럴 수 있는 것이 자신들만의 프로토콜이니까 그들간에는 아무런 문제가 없기 때문에 가능한 일입니다. 하지만 다른 업체들의 제품에서 ‘GPPW 접속’을 선택 하라고 하는 경우는 거의 없을 겁니다.


5. 배선

RS-232가 사용하는 신호선들의 의미를 대충 알아 보겠습니다. 통신이라고 하면 뭔가 특별하게 느껴지는 면이 없잖아 있습니다. 하지만 통신 이라는 것도 결국에는 전선에 전기가 흐르는 일일 뿐입니다. 앞서 설명을 위해서 통신을 반대편에 램프를 설치한 스위치 정도로 취급한 적이 있습니다. 이런 관점에서 볼 때 RS-232는 이런 램프와 스위치 쌍을 서로 엇갈리게 2개 가지고 있는 형태입니다.


◆ SD, RD

내 쪽이 스위치이고, 반대쪽이 램프인 (+)선을 SD(또는 TXD), 그 반대를 RD(또는 RXD)라고 합니다. 그리고 둘의 공통 (-)선이 SG입니다. 사실 이렇게 3가닥만 있으면 데이터를 주고 받을 수 있습니다. 그리고 실제로 이렇게 3가닥만을 배선하는 경우도 많이 있습니다. 3가닥만으로 데이터를 주고 받는데 아무런 지장이 없다면 그 밖의 선들은 다 무언가? 가장 일반적인 말로 표현한다면 확인용 신호들 입니다. 반대편 장비가 동작 중인지? 송신을 해도 되는 것인지? 수신되는 데이터가 있는지? 뭐 그런 것들입니다. 

◆ DTR, DSR

DTR과 DSR(또는 ER과 DR)은 서로간의 동작 가능 여부를 확인하고, 확인시켜주는 역할을 합니다. 자신이 동작 가능한 상태이면 DTR 신호를 ON 시킵니다. 그리고 이 신호는 반대편 장비의 DSR에 연결이 되기 때문에 반대편 장비는 자신의 DSR 신호를 확인하는 것으로 반대편 장비가 동작 가능하다는 것을 알게 됩니다. 그래서 때때로 자신의 DTR 신호를 반대편 장비로 연결하지 않고, 그냥 자신의 DSR에 점프 시켜 버리는 경우가 있습니다. 이렇게 하면 설사 내부적으로 DSR 신호를 통해 반대편 장비의 동작 가능 여부를 확인하는 장비라고 하더라도 DTR-DSR 점프에 의해 자신이 준비가 되었다면 반대편 장비도 준비가 된 것으로 확인해 되므로 장비는 이것이 점프에 의한 것이라는 것을 대부분 모르게 됩니다. 하지만 몇몇 얄미운 장비들은 반대편의 DSR를 먼저 확인한 후에 자신의 DTR 신호를 ON하는 경우가 있습니다. 이런 경우에는 점프시키는 것이 무의미합니다. 

◆ RTS, CTS

RTS, CTS 송신 요구 신호는 두 가지 의미로 사용됩니다. 하나는 반대편 장비에게 송신을 해도 좋다는 의미로 사용되고, 다른 하나는 자신이 송신을 한다는 의미로 사용됩니다. 장비에 따라 둘 중 하나의 의미로 사용됩니다. 반대편 장비에게 송신을 하도록 하는 경우에는 반대편 장비의 CTS 신호와 연결되어 반대편 장비가 송신을 해도 된다는 것을 알려 줍니다. 이런 식으로 사용될 때 RTS 신호는 자신이 수신할 수 있는 상황일 때 ON하고, 그렇지 않을 때 OFF하는 형태로 동작합니다.

반대로 자신이 송신할 수 있을 때 ON하는 형태의 경우에는 자신의 CTS로 점프시켜서 스스로에게 송신이 가능함을 알림과 동시에 반대편의 CD 신호로 연결해서 반대편 장비에게 데이터가 수신될 것이라는 것을 알리는 역할을 합니다. 전자와 같은 형태는 자신이 수신을 할 수 있는지 없는지를 상대 장비에게 알려서, 준비 안된 상태에서 데이터가 전송되어 데이터가 버려지는 것을 막는 효과를 가집니다. 이렇게 서로의 동작을 조율하는 것을 핸드쉐이킹 이라고 하는데, RTS-CTS 신호선을 이용하는 것은 물리적으로 연결된 신호선을 이용하는 것이기 때문에 하드웨어 핸드쉐이킹 이라고 합니다.

하지만 후자의 경우에는 직접적으로 송/수신을 통제하지는 못하고, 데이터가 전달 될 것이라는 것을 일반적으로 통보해 주는 형태입니다. 즉, 반대편 장비는 CD 신호가 ON하면 데이터가 수신되는 것이므로 다른 일을 하고 있다 가도 즉시 데이터를 수신할 준비를 해야 하는 것입니다. 멜섹의 시리얼 통신 모듈은 후자의 형태를 사용합니다. 따라서 멜섹의 경우에는 RTS-CTS의 점프가 반드시 있어야 합니다. 점프가 없으면 CTS  신호를 받을 수 없기 때문에 송신을 하지 않게 됩니다. 그러므로 반대편 장비가 핸드쉐이킹 없이 데이터 선만을 사용하는 장비라고 하더라도 반드시 RTS-CTS는 점프 시켜 주어야 합니다.

◆ RI

일반적인 통신에서는 의미가 없고, 모뎀을 사용하는 경우 전화벨이 울리는 것을 알리는 신호 입니다.


6. I/O와 버퍼 메모리

시리얼 통신 모듈과 같은 소위 말하는 인텔리전트 모듈들을 다루는 근본적인 방법은 모두 같습니다. 따라서 지금 설명하는 내용은 이더넷 모듈이나 위치결정 모듈과 같은 모든 확장 모듈에도 적용될 수 있는 일반적인 내용입니다.이러한 인텔리전트 모듈들과 CPU가 연결될 수 있는 길은 두 가지 입니다. 하나는 I/O이고, 다른 하나는 버퍼 메모리라고 하는 것입니다. I/O는 입/출력 모듈에서의 그것과 같은 것입니다. 단지 그 I/O가 외부에 터미널 형태로 나타나지 않기 때문에, 모듈 내부에서만 사용될 수 있다는 것이 다를 뿐입니다.


일반적인 입/출력 모듈의 경우에는 입력 혹은 출력 접점만을 가지기 때문에 입/출력 접점을 한꺼번에 가진다는 것이 조금 어색하게 생각되시는 분들이 있을 수도 있겠습니다만 그냥 지금 부터는 하나의 모듈은 입/출력을 모두 가진다고 생각 하십시요. 설사 그것이 입력 모듈이라고 하더라도 출력 접점을 가지고 있다고, 하지만 외부에 보이지 않는 것 뿐이라고 그렇게 생각 하십시요.


일반적으로 모듈을 다룰 때 우리는, ‘이 모듈 몇 점 차지하냐?’ 라는 형태의 질문을 자주 합니다. 물론 답은 거의 대부분 ‘32점이요’ 일 겁니다. 그렇습니다. 일반적으로 인텔리전트 모듈들은 32점을 차지합니다. 이것은 다시 말해 입력 32점과 출력 32점이 동시에 가능하다는 말입니다. 


버퍼 메모리는 인텔리전트 모듈이 가지고 있는 메모리라고 생각하시면 될 것 같습니다. 처음 시리얼 통신 모듈에 대한 얘기를 시작하면서 시리얼 통신 모듈은 그 자체로 완전한 하나의 시스템이라고 강조했습니다. 이 때 시리얼 통신 모듈은 독립적인 CPU도 가졌고, 독립적인 메모리도 가지고 있다고 말씀 드렸습니다. 이 독립된 메모리를 버퍼 메모리라고 생각하시면 될 것 같습니다.


따라서 CPU는 자신의 디바이스 메모리가 아니기 때문에 MOV와 같은 자신의 메모리를 대상으로 하는 명령으로는 버퍼 메모리에 접근할 수 없습니다. 그래서 버퍼 메모리를 읽고 쓰기 위해 FROM, TO라는 두개의 특별한 명령을 추가로 가집니다. FROM은 버퍼 메모리에서 값을 읽고 싶을 때 사용하고, TO는 버퍼 메모리에 값을 기록하고 싶을 때 사용합니다.


따라서 FROM, TO 명령을 사용할 때는 어느 모듈의 버퍼 메모리를 읽고 쓰는 것인지, 버퍼 메모리 중에서 어느 번지의 어느 만큼을 읽고 쓰는 것인지를 알려 주어야 합니다. 읽고 쓴다고 표현했지만 사실 이것은 버퍼 메모리의 내용을 CPU의 디바이스 메모리로 옮겨 놓는 것입니다. 즉, FROM 명령을 사용해서 버퍼 메모리를 읽는다는 것은 버퍼 메모리의 내용을 CPU의 디바이스 메모리로 옮겨 놓는 것이고, TO 명령을 사용해서 버퍼 메모리에 쓴다는 것은 CPU의 디바이스 메모리를 버퍼 메모리로 옮겨 놓는 것에 다름 아닙니다.


FROM H2 K100 D1000 K20


이 명령은 H2 즉, 할당된 I/O가 H20인 모듈 - 모두 32점 짜리 모듈이 장착된 경우 두번째 모듈입니다 - 의 버퍼 메모리 중에서 K100 에서부터 K20개를 D1000으로 읽어오도록 하는 명령입니다. 실제로 우리는 인텔리전트 모듈들을 사용하면서 이와 같은 FROM, TO 명령과 모듈에 할당된 I/O를 ON/OFF 시키는 방법으로 그 모듈을 제어하게 됩니다.


다시 말해 위에 예로 든 FROM 명령은 어떤 알 수 없는 통신 모듈에서라면 모듈이 수신한 문자들을 읽는 오는 것일 수도 있고, 또 다른 어떤 알 수 없는 서보 모터 제어 모듈에서라면 모터의 현재 위치와 각종 리미트들의 상태등을 읽어 오는 것일 수도 있습니다. 즉, FROM, TO로 도배가 되어 있는 프로그램만 달랑 봐서는 이것이 도대체 무슨 일을 하는 것인지 절대로 알 수가 없습니다. 때때로 FROM, TO 명령들 만을 옮겨 적고는 이게 무슨 일을 하는 건지 자세하게 설명해 달라시는 분들이 가끔 계십니다. 하지만 이제부터는 그러지 마십시요. 정말이지 미련한 질문이고, 절대로 원하는 답을 얻을 수 없는 질문입니다.


이것은 반대로 시리얼 통신 모듈과 같은 특수 모듈을 다루는 프로그램은 반드시 해당하는 모듈의 설명서를, 특히나 I/O 할당과 버퍼 메모리가 어떻게 사용되는지를 설명하고 있는 설명서를 반드시 필요로 한다는 것입니다. 외형적으로 FROM, TO 명령만으로 모든 것이 이루어지지만 FROM, TO만을 알아서는 절대로 아무것도 할 수 없다는 것을 다시 한번 강조하고 싶습니다. 


반응형

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

시리얼 통신 하기[6]  (0) 2019.03.08
시리얼 통신 하기[5]  (0) 2019.03.08
시리얼 통신 하기[3]  (0) 2019.03.07
시리얼 통신 하기[2]  (0) 2019.03.06
시리얼 통신 하기[1]  (0) 2019.03.06

댓글