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

시리얼 통신 하기[3]

by lemy 2019. 3. 7.
반응형




시리얼 통신 하기[3]


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

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


시리얼 통신 모듈

지금 부터 하고자 하는 것은 시리얼 통신 모듈 사용 설명서를 그대로 정리해서 옮기고자 하는 것이 아닙니다. 단지 그 설명서에 익숙해질 수 있도록 돕자는 것입니다. 따라서 최종적으로는 반드시 사용 설명서를 함께 보셔야 합니다.


PLC를 사용해서 시리얼 통신을 하기 위해서는 반드시 시리얼 통신 모듈이 있어야 합니다. Q시리즈에서라면 QJ71C24N나 QJ71C24N-R2입니다. 시리얼 통신 모듈은 우리가 RS-232와 RS-422/485 통신을 할 수 있도록 해 줍니다.


시리얼 통신 모듈은 그 자체만으로 이미 하나의 완벽한 시스템이다. 한 세트의 PLC를 구성하는 경우, 시리얼 통신 모듈은 분명 시리얼 통신을 위한 한 부분일 뿐입니다. 그래서 ‘그 자체만으로 이미 하나의 완벽한 시스템이다’라는 말이 좀 이상하게 들릴 수도 있겠지만 이것 또한 분명한 사실입니다. 왜냐하면 시리얼 통신 모듈은 그 자체만으로 스스로 무언가를 할 수 있기 때문입니다. 그 안에는 자체적이고, 독립적인 처리를 할 수 있는 CPU가 따로 포함되어 있습니다. 물론 자체적인 메모리도 있습니다. 즉, 완벽한 하나의 시스템 맞습니다.


이렇듯 시리얼 통신 모듈은 그 자체만으로 완벽한 시스템이기 때문에 적어도 시리얼 통신을 하는데 있어서 만은 그 누구의 도움도 필요치 않습니다. 제가 강조 하고 싶은 것이 바로 이것 입니다. 다시 말해, 시리얼 통신 모듈을 사용해서 시리얼 통신을 하는데 있어 프로그래머가 할 일은 하나도 없습니다. 그럼에도 불구하고 무언가가 필요하다고 생각되고, 실제로 무언가를 해 주어야 하는 것은 통신 그 자체를 위한 것이라기 보다는 통신이 적용되어야 할 구체적인 주변 상황을 규정하기 위한 것입니다.


이름을 불러 주었을 때 비로소 꽃이 된다.

시리얼 통신 모듈은 분명 그 자체만으로도 완벽합니다. 하지만 이것이 꽃이 되기 위해서는 그 이름이 불려져야 합니다. 즉, 설정이라는 과정을 통해 전송 속도, 데이터 비트, 패리티, 그리고 교신 프로토콜 등등을 알려 주어야 합니다. 그래야만 비로소 시리얼 통신 모듈은 나에게로 와서 시리얼 통신을 도와 주는 멋진 친구가 되는 것입니다.


1. 전송 설정과 비트열

전송 설정은 데이터가 7비트인지 8비트인지, 정지 비트가 1비트 인지 2비트인지, 패리티 비트가 있는지 없는지, 있다면 짝수 패리티 인지, 홀수 패리티 인지 등을 설정하는 과정입니다. 그런데 온통 비트, 비트, 비트에 대한 얘기 뿐입니다. 분명 통신은 서로 바이트를 주고 받는 일이라고 했는데 정작 시리얼 통신 모듈에서는 왜? 온통 비트에 관한 얘기 뿐인가?


이름을 불러주기 전까지, 즉, 설정을 하기 전까지 시리얼 통신 모듈은 아무런 의미도 없는 그저 이마에 빨간 LED만 깜빡거리는 하나의 몸짓에 지나지 않는 것이기 때문에, 먼저 이 문제에 대해서 왜 그런지를 분명히 하는 것이 좋을 것 같습니다. 결론부터 먼저 말씀 드리면 시리얼 통신은 바이트가 아닌 비트만을 전송할 수 있기 때문에 온통 비트에 대한 얘기만 나오는 것은 당연한 것입니다. 프로그래머가 느끼는 통신의 최소 단위는 분명 바이트이지만, 정작 그 바이트들을 전송해야 하는 시리얼 통신, RS-232는 한 번에 한 비트만을 전송할 수 있을 뿐인 것입니다. 그래서 시리얼 통신 모듈은 내부적으로 여러 비트들을 모아 모아서 프로그래머가 불편하지 않도록 한꺼번에 전송해 주도록 되어 있습니다. 그래서 이것을 사용하는 입장에 있는 프로그래머에게 전송의 최소 단위는 여전히 바이트 일 수 있는 것입니다.


이제 비트들을 모아서 하나의 바이트가 되도록 한다는 것은 알았습니다. 그렇다면 구체적으로 비트들을 어떻게 모을 것인가? 하는 문제를 풀어야 합니다. 하지만 우리가 새삼 다시 풀어야 하는 문제는 아니고, 이미 RS-232 라는 이름 아래에 모든 것들이 규정되어 있습니다. 우리는 그 내용만 파악하면 되는 것입니다.


RS-232는 한 바이트를 전송하기 위해 <시작비트> + <데이터 비트열> + <패리티> + <정지비트> 라는 프로토콜을 사용합니다. 이것도 전송 규약 즉, 프로토콜이라고 부릅니다. 프로토콜이라는 말은 이런 형태를 지칭하는 아주 일반적인 용어입니다.


RS-232 프로토콜에서 실제로 전달되기를 원하는 것은 <데이터 비트열> 입니다. 그 나머지 것들은 들러리들입니다. 그렇다면 왜 이런 들러리들을 세우는가? 그것은 <STX> + “LON” + <ETX>에서 <STX>, <ETX>를 붙이는 것과 같은 이유에서 입니다. <STX>와 <ETX>는 “LON”이 커맨드라는 것을 분명히 하기 위한 것입니다. RS-232 프로토콜에서 <시작 비트>와 <정지 비트>도 같습니다. <데이터 비트열>을 분명히 하기 위한 것입니다. 즉, 한 바이트의 비트열을 전송하기 위해서는 가장 먼저 <시작 비트>를 보내 이후로 전송되는 것이 <데이터 비트열>이라는 것을 분명히 합니다. 그리고 정해진 길이의 <데이터 비트열>을 전송한 후에 <정지 비트>를 보내 전송이 끝났음을 분명히 하는 것입니다.


이제 우리는 설정 과정을 통해 RS-232 프로토콜의 각 항목들이 구체적으로 어떠해야 하는지를 시리얼 통신 모듈에게 알려주면 되는 것입니다. 이것이 전송 설정입니다. Q 이전의 제품에서는 이러한 설정을 딥스위치로 했습니다. 하지만 Q시리즈의 PLC에서는 DX-Developer에서 프로그램적으로 해결합니다. 구체적인 설명은 QJ71C24 기본편에 잘 나와 있습니다. ‘4.5 GPPW에서의 설정’이라는 제목으로 나옵니다.


◆ 시작비트: 시작비트는 항상 하나가 있습니다. 따라서 따로 설정을 해 주지는 않습니다.

◆ 데이터 비트: 7개 인지 8개인지를 선택할 수 있습니다. 원래의 RS-232C에는 5, 6, 7, 8 중에서 하나를 선택할 수 있도록 되어 있지만 우리가 사용할 시리얼 통신 모듈은 7인지 8인지 만을 선택할 수 있습니다.

◆ 패리티 비트: 패리티 비트는 주어진 데이터가 제대로 전송된다는 것을 확인하기 위한 용도로 추가되는 것으로 있을 수도 없을 수도 있습니다. 있다면 홀수 패리티이거나 짝수 패리티일 수 있습니다. 양쪽을 같게만 한다면 홀수로 할 지 짝수로 할지는 마음대로 선택하시면 됩니다.


패리티라는 것이 무엇인지도 모르겠다는 사람을 위해 간단히 설명을 하면 데이터 비트들 중에서 1인 비트의 수와 패리티 비트를 합 했을 때 그 갯수가 짝수가 되도록 하는 것이 짝수 패리티이고, 홀수가 되도록 하는 것이 홀 수 패리티 입니다. 만약 8개의 데이터 비트가 10010001이라면 여기에는 1이 세개 있습니다. 만약 이 상태에서 짝수 패리티를 사용하는 것으로 했다면 데이터 비트에서 1의 갯수 셋과 패리티 비트를 합했을 때 짝수가 되려면 패리티 비트도 1이 되어야 합니다. 이 경우 패리티 비트 자리에는 1이 전달됩니다. 만약 홀 수 패리티로 하기로 했다면 이미 데이터 비트의 1의 갯수가 셋으로 홀수이기 때문에 패리티 비트 자리에는 0이 전달되어 전체적으로는 홀수가 되도록 하는 것입니다. 이게 패리티 비트 입니다. 


이렇게 패리티 비트를 사용한 경우 만약에 비트들이 전달되는 과정에서 무슨 문제가 있어 원래는 1이었던 비트가 0으로 되어 버렸다면 그것을 수신한 쪽에서 패리티를 맞춰 보면 틀리게 됩니다. 이런 경우 패리티 에러가 발생하는 것입니다. 하지만 만약에 원래 1이었던 것이 0이 되고, 원래 0이었던 것이 1로 되는 변경이 한꺼번에 일어나면 이건 패리티만으로 찾아내지 못합니다. 이런 한계 때문에 패리티를 설정하지 않거나 한다고 해도 뭔가를 해 줄 것으로 기대하지는 않습니다.


◆ 정지 비트: 1 혹은 2 중에서 선택할 수 있습니다.

◆ 전송속도: 1초에 몇 개의 비트를 전달할 것인가? 하는 것입니다. 전송 속도의 설정은 전송 설정과 함께 반드시 해 주어야 하는 아주 중요한 것입니다. 왜냐하면 RS-232 통신을 하는 양쪽 장비는 전송 설정과 전송 속도 설정이 똑 같아야만 통신을 할 수 있기 때문입니다.


시리얼 통신은 반대편에 LED 램프를 하나 설치해 두고, 그것을 켰다가 껐다가 하는 것으로 정보를 전달하는 것입니다. 모오스 부호와 비교해 볼 수도 있겠지만 모오스 부호는 길게 켜지느나 짧게 켜지느냐의 차이를 이용하는데 반해 시리얼 통신은 켜졌는지 꺼졌는지의 차이를 이용하기 때문에 모오스 부호와는 달리 시간이 아주 중요해 집니다


속도는 1bps 즉, 1 초에 하나의 비트을 전송하고, 전송할 내용은 1001이라고 하겠습니다. 이것을 사람이 한다고 상상해 본다면 이런 모습을 것입니다. 사람은 시계를 보면서 처음 1초 동안은 LED를 켜는 스위치를 누르고 있어야 합니다. 그리고 다음 2초 동안은 LED를 켜는 스위치를 놓아서 LED를 꺼 놓은 채로 두어야 합니다. 기리고 마지막 1초 동안은 다시 LED를 켜야 합니다. 같은 방법으로 반대편에서 이 신호를 사람이 해석하려면 역시 기계를 가지고 있어야 합니다. 처음 1초 동안 LED가 켜지는 것을 보고 아 1이구나 하는 것을 알게 됩니다. 다음 2초 동안 꺼진 것을 확인함으로써 00이구나 하는 것을 알게 되고, 마지막 1초 동안 켜지는 것을 확인하는 것으로 1이라는 것을 알게 됩니다. 따라서 전체적으로 1001이라는 것을 알게 됩니다. 여기서 만약 시계를 제외시킨다면 서로 간에 신호의 의미를 제대로 파악하는 것은 불가능합니다. 


만약 위와 같이 송신한 내용을 2bps를 사용해서 수신한다면 수신측에서는 처음 0.5초 동안 LED가 켜져 있기 때문에 1, 다음 0.5초 동안에도 LED가 켜져 있기 때문에 1, 이런 식으로 정작 송신된 것은 1001이지만 수신되는 내용은 11000011이 되어 버립니다. 즉, 절대적으로 양측의 속도 설정은 같아야 합니다. 


현재 RS-232C가 낼 수 있는 최고 속도는 115200입니다. 하지만 산업용 장비들 중에는 의외로 아직도 9600를 사용하는 경우가 많습니다. 12배의 속도 차이가 남에도 불구하고, 9600을 기본으로 하는 것은 이 속도가 통상적으로 안정적인 속도라고 생각하기 때문입니다. 하지만 요즘의 기술 기준에서 본다면 시대에 뒤 떨어진 생각일 뿐입니다. 


모두들 USB를 아실 겁니다. USB 외장 하드, USB 메모리, USB 아무개 등등 온갖 제품들이 쏟아져 나오니까요. 이 USB 역시 넓은 범위에서 시리얼 통신 입니다. USB 자체가 Universal Serial Bus의 약자로 그 이름에 분명하게 시리얼이라는 것이 포함되어 있습니다. USB 2.0의 경우 100M의 속도를 지원합니다. RS-232에 비하면 정말 격세지감입니다. 하지만 그 근본적인 원리는 둘이 서로 다르지 않습니다. 


실제로 전송 설정이 맞지 않아도, 전송 속도가 맞지 않아도 무언가를 전송하고, 무언가를 받을 수는 있습니다. 하지만 그렇게 전송된 것은 쓰레기에 지나지 않습니다. 때때로 이러한 설정이 맞지 않아 아무 의미도 없는 쓰레기를 수신하면서 “배선도 제대로 했고, 통신도 하는 것 같은데 이상한 문자가 들어옵니다. 왜 그렇죠???”라고 질문하시는 초보분들이 있습니다. 이제 이런 질문을 하기 전에 반드시 양쪽 장비의 전송 설정과 전송 속도를 먼저 확인해서 똑 같은 데도 불구하고 같은 현상이 있다면 그 때 누군가에게 질문을 해야 합니다.


반응형

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

시리얼 통신 하기[5]  (0) 2019.03.08
시리얼 통신 하기[4]  (0) 2019.03.07
시리얼 통신 하기[2]  (0) 2019.03.06
시리얼 통신 하기[1]  (0) 2019.03.06
전압 강하 계산 엑셀 TOOL  (2) 2019.02.28

댓글