0: 너 이거 왜하는데?

PLC와 PC 통신을 하려고 그런다.

1: 어떻게 할껀데?

일단 PLC와 PC 통신 하기 전에 usb to rs232 Converter를 이용해서 Tx로 쏜걸 Rx에서 받는 걸 파이썬(pyserial)으로 구현할꺼다.



서론 : 시리얼 통신이 뭔데?



시리얼 통신이 무엇일까?


단어를 이해하기 위해서는 각 단어의 의미를 먼저 알아보는게 좋다.


통신은 지나가는 유치원생한테 물어봐도 대충 무슨 의미인지는 알겠고... 시리얼... 시리얼...


시리얼? 이미지 검색결과


이 시리얼을 의미하는 것은 절대 아닐테고....(죄송합니다)


시리얼은 Serial. 즉 직렬이란 의미이다.


직렬의 반대는 그럼 병렬일텐데...


A컴퓨터와 B컴퓨터가 서로 통신한다고 쳤을 때 병렬은 한 번에 여러개의 데이터를 전송할 수 있다. 왜냐? 병렬이니깐

하지만 병렬로 A컴퓨터와 B컴퓨터를 연결하면 돈이 많이들겠다. 왜냐?? 세상에 공짜는 없으니깐 말이다. 한 번에 여러 개의 데이터를 보낸다는 의미는 말그대로 전선이 많이 들어갔다는 소리다.


반대로 직렬은 그럼... 선이 한 개이고 이 하나의 선만으로 데이터를 전송하는 것이다.


자.... 그럼 하나의 선만으로 어떻게 데이터를 주고 받을 것인가?


컴퓨터는 알다시피 머리가 상당히 나빠 0이랑 1밖에 모른다. 당연히 전선이 하나만 연결이 되어있으니깐 두 컴퓨터간에 약간의 약속이 필요하다. 그게 바로 baud rate(보레이트)라고 하는 놈이다.


만약 A컴퓨터가 0000 1111 0101 1010 이라는 데이터를 보내고 싶어한다. 그런데 B라는 놈은 000 011 110 101 101 0 과 같은 식으로 데이터를 받았다고 치자. 그럼 두 놈이 원활한 의사소통이 되겠는가? 당연히 될 수가 없다.


그래서 일반적으로 serial 통신을 할 때는 baud rate를 통신하려는 기기끼리 서로 맞춰준다.



그리고 또 솔직히 말하면 serial 통신이 전선이 딱 하나만 있는 건 아니다. 송신선과 수신선이 서로 나뉘어져 있어 송신과 수신을 동시가 할 수 있는 것도 있고(full duplex) 송신선과 수신선이 하나로 이루어져 있어 한 번에 송신과 수신을 할 수 없는 놈도 있다.(half duplex)


또한 단순히 전압의 차이만을 이용하여 회로 구성이 간단하지만 노이즈에 좀 취약한 가장 기본적인 시리얼 통신인 RS-232가 있고, 232에서는 송신선을 하나의 전선으로 구성했다면, 2개의 전선을 이용하여 그 2개의 전선의 전위차를 가지고 통신하는 RS-422, 485와 같은 Serial 통신 방법 등 다양하게 있다.


각 시리얼 통신의 차이를 구글에 검색해보면 정말 잘 나와있는 글들이 많으니 시리얼 통신 설명은 여기까지 하겠다.


준비물



1. RS233 to usb converter
2. Jump Cable(female - female)
3. 컴퓨터

만 있으면 테스트 해볼 수 있다.


준비 과정


1. 위의 그림처럼 점프 케이블을 이용해 RS232의 Rx와 Tx를 연결시켜준다.



2. ["Win + X" -> 장치관리자]에서 "USB Serial Converter"가 있는지 확인한다.


3. 만약 연결이 안되었거나, 앞에 느낌표가 있으면 온라인으로 드라이버 찾기 하면 자알 찾아준다.


4. 처음 연결해서 드라이버를 설치하면 컴퓨터를 껐다 켜야 제대로 인식한다.



5. 위의 사진처럼 USB Serial Port의 번호(COM3)를 확인한다.


6. pip install pyserial을 이용하여 pyserial을 설치해주고


7. 아래의 코드를 한 번 집어넣어본다.

import serial

ser = serial.Serial("COM3", 115200, timeout = 1)
while True:
print("insert op :", end=' ')
op = input()
ser.write(op.encode())
print("R: ", ser.readline())

if op is 'q':
ser.close()


8. 참고로 COM 포트 번호는 사람마다 다 다를 수 있다.


9. 출력 결과는 이와 같이 Rs232에서 출력한 값을 받아오는 것이다. 


10. 앞에 b는 byte 표시다. byte 타입의 문자열로 보내는 이유는(op.encode()) 유니코드로 보내면 에러 떠서 못받는다.




























+ Recent posts