Post

[Robot] 산업용 통신 구조

[Robot] 산업용 통신 구조

통신이란?

디바이스 간에 정보를 주고받는 방법 중 하나

기기간 신호가 전달될 때 제대로 된 신호를 전달하지 못하거나 중간에 제3자가 개입하여 잘못된 정보가 전달될 경우 큰 사고로 이어질 수 있음

데이터를 어떤 방식으로 전송하고, 어떻게 보안 처리하여 안전하게 전달할지에 대한 이해가 필요


통신 용어

BPS

1초에 보낼 수 있는 BIT의 양

9600BPS는 1초에 9600개의 BIT 신호 전송 가능

Baud Rate

초당 보내야 하는 의미있는 데이터 수(PULSE의 양) 또는 초당 변조 횟수(FREQUENCY)

일반적인 PC에서 BAUD RATE와 BPS는 동일하다

사용자가 정의한 수신 데이터의 크기가 8BIT, BPS가 9600일 때 BAUD RATE는 아래와 같다

BAUD RATE=9600BPS/8BIT=1200BAUD RATE

비트 주기 =1200HZ또는 1/1200*1000000(US)=833.3(US)

Start bit, Stop bit

데이터 비트의 범위 식별 및 비동기식 통신 방신에서 시작과 끝을 결정하는 신호

실제 데이터는 시작 비트 뒤에 삽입되어 전송됨

사전 설정된 규칙에 따라 실제 데이터 전송 → PARITY BIT → STOP BIT로 통신이 종료됨

ASCII CODE= 7BIT(문자 주소)+1BIT(에러 검출)

image.png

Parity bit

데이터의 구조 및 오류를 체크하는 신호

짝수(Even), 홀수(Odd), 마크(Mark), 스페이스(Space) 패리티 비트 등이 존재

짝수 패리티와 홀수 패리티 비트가 범용적으로 사용

데이터의 비트의 1의 개수를 체크하여 짝수/홀수일 때 설정한 짝수/홀수 패리티 비트가 활성화되어 비트의 짝수/홀수를 맞추고 데이터의 오류를 체크함

7bit of datacounts of 1-bits8bits including Parity (Even)8bits including Parity (Odd)
000000000000000000000001
101000131010001110100010
110100141101001011010011
111111171111111111111110

통신의 종류

유선 통신: RS-232, RS-485, Ethernet 등 대부분 직렬(Serial) 통신을 사용
무선 통신: 적외선, NFC, 블루투스, Wi-Fi 등이 있음

디지털 I/O 통신

전기의 전압을 활용하여 기기간 전류를 입력 또는 출력하는 형식

NPN/PNP에 따라 제어 타입이 바뀌며, 전압의 크기에 따라 기준 전압이 달라짐

시리얼(Serial) 통신

가장 범용적인 통신 방식

적은 수의 케이블로 데이터를 전송 가능하며, 다양한 종류의 케이블로 연결이 가능

직렬 통신

  • 최소 1개의 통신 라인으로 데이터를 8비트씩 순차적으로 전송
  • 데이터 전송이 많아지면 시간이 많이 소요되며, 통신의 시작과 끝을 체크하기가 어려울 수 있음

병렬 통신

  • 8개의 통신 라인으로 데이터를 8비트씩 동시에 전송
  • 시간적, 물리적 비용이 많이 들어 직렬 통신에 비해 덜 사용됨

동기식 전송 vs 비동기식 전송

 동기식 전송비동기식 전송
통신 속도고속저속
회로 복잡도복잡간단
구축 비용고가저가
동기 제어 방식클럭 동기START/STOP 비트
전송 단위블록 단위문자 단위
적용 예전화, ATM, 데이터 통신망RS-232, RS-485

동기식 전송

  • 시작과 끝을 알리는 클럭 신호가 추가
  • 오류가 적고 빠른 데이터 전송이 가능
  • 물리적인 배선이 필요하며 회로도가 복잡함

비동기식 전송

  • Start 비트Stop 비트로 시작과 끝을 구분
  • 배선이 간단하고 저비용의 간단한 통신 구성이 가능
  • 데이터 손실 위험이 있고 통신 속도가 상대적으로 느림

통신 방식

  • 단방향 통신(Simplex, One-way): 한 방향으로만 전송 가능하며, 수신 측에서 송신 측으로 응답 불가능 (예: 라디오).
  • 양방향 통신, 이중화 통신(Duplex, Two-Way) : 반이중 전송방식, 전이중 전송방식이 있음
  • 반이중 통신(Half Duplex): 양방향 통신이 가능하지만, 특정 시점에는 한 방향으로만 전송 가능 (예: 무전기).
  • 전이중 통신(Full Duplex): 양방향으로 동시에 데이터 전송이 가능 (예: 전화기).

통신 규격

RS-232 통신 규격

가장 보편적인 SERIAL 통신 규격

전압 레벨에 따라 A,B,C타입으로 분류 (보편적으로 RS-232C 사용)

전기적 신호 및 물리적인 핀에 의한 제어 신호를 규정하나 프로토콜은 정의하지 않음

전이중(FULL DUPLEX) 통신 방식 지원

장치간 다중 연결 불가능

TX, RX, GND 3라인으로 통신

최대 19.2K Baud rate(19.2Khz)로 통신이 가능하지만(약 20m), 거리에 따라서 최대 통신 속도가 제한

RS-422 통신 규격

하나의전송 객체에 대하여 다중 수신 객체를 지정할 수 있음

정의된 프로토콜은 없지만 다중 객체에 대한 주소 지정(어드레싱)이 필요함

전이중(Full Duplex)를 지원하며, 2개의 TX라인, 2개의 RX라인, GND라인 총 5개의 라인으로 통신

RS-485 통신 규격

RS-422의 확장 규격

한 라인에 구축된 모든 장비들이 송수신 가능

반이중(Half Duplex)과 전이중(Full Duplex)통신 모두 지원

반이중 통신의 경우 3선, 전이준 통신의 경우 5선 필요

  • 통신 규격 비교
특성RS-232CRS-423RS-422RS-485
동작모드SINGLE-ENDEDSINGLE-ENDEDDIFFERENTIALDIFFERENTIAL
최대 Driver 수11132
최대 Receiver 수1103232
최대 송신거리15m1200m1200m1200m
최고 통신속도20Kbps100Kbps10Mbps10Mbps
지원 전송방식전이중전이중전이중반이중/전이중

Serial USB 통신

일반적으로 PC에서 볼 수 있는 USB PORT를 활요하는 통신

키보드, 마우스 등 PORT에 단순 삽입만으로 작동하여 범용성이 뛰어남

일반적으로 USB 2.0의 경우 RX, TX, VCC, GND 4선을 이용

Serial 통신 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import serial

# 시리얼 포트 설정
ser = serial.Serial(
    port='COM1',           # 포트 이름 (운영체제에 맞게 변경)
    baudrate=9600,         # 통신 속도
    parity=serial.PARITY_NONE,  # 패리티 비트 없음
    stopbits=serial.STOPBITS_ONE,  # 스톱 비트 1개
    bytesize=serial.EIGHTBITS,     # 8비트 데이터 전송
    timeout=0              # 타임아웃 설정 (비동기적 통신)
)

# 연결된 포트 확인
print(f"연결된 포트: {ser.portstr}")

# 데이터 전송 방식 (여러 가지 방법으로 데이터 전송)

# 출력 방식 1: 문자열을 ASCII로 변환하여 전송
ser.write(bytes('hello', encoding='ascii'))  # 문자열을 ASCII로 변환하여 전송

# 출력 방식 2: 바로 바이트 데이터를 전송
ser.write(b'hello')  # 바이트 문자열로 직접 전송

# 출력 방식 3: 특정 바이트 시퀀스를 전송 (예: 0xFF, 0xFE, 0xAA)
ser.write(b'\xff\xfe\xaa')  # 바이트 데이터로 특정 값 전송

# 출력 방식 4: 정수 리스트를 바이트 배열로 변환하여 전송
vals = [12, 0, 0, 0, 0, 0, 0, 0, 7, 0, 36, 100]  # 전송할 정수 값 리스트
ser.write(bytearray(vals))  # 정수 리스트를 바이트 배열로 변환하여 전송

# 데이터 수신 방식
# 입력 방식 1: 수신된 데이터가 있을 때 현재 읽을 수 있는 데이터 모두 읽기
received_data = ser.read(ser.inWaiting())  # 입력 버퍼에 있는 모든 데이터 읽기
if received_data:
    print(f"받은 데이터: {received_data}")

# 시리얼 포트 닫기
ser.close()
print("포트가 닫혔습니다.")

This post is licensed under CC BY 4.0 by the author.