콘텐츠로 이동
무료 평가 시작

직렬 회선: RTU와 ASCII

직렬 회선(serial line) Modbus는 RS-232나 RS-485로 연결한 장비 사이에서 PDU에 주소와 오류 검사를 붙여 보냅니다. 전송 모드(transmission mode)는 RTU와 ASCII 두 가지이며, 한 버스의 모든 장비가 같은 모드와 같은 통신 설정을 써야 합니다. 이 페이지는 MODBUS over Serial Line Specification and Implementation Guide V1.02의 §2 데이터 링크 계층과 §3 물리 계층을 근거로 합니다.

직렬 명세는 클라이언트를 마스터(master), 서버를 슬레이브(slave)라고 부릅니다. 한 버스에는 클라이언트가 하나만 있고, 서버는 최대 247개입니다(§2.1).

주소 용도(§2.3)
0 브로드캐스트(broadcast). 모든 서버가 처리하고 아무도 응답하지 않습니다.
1~247 서버 개별 주소
248~255 예약

요청은 두 가지 방식으로 보냅니다(§2.2).

  • 유니캐스트(unicast): 주소 1~247의 서버 하나에 보내고 응답을 기다립니다. 클라이언트는 응답 제한 시간(response timeout) 동안 기다리고, 응답이 없으면 오류로 처리합니다.
  • 브로드캐스트: 주소 0으로 보냅니다. 쓰기 요청에만 씁니다. 응답이 없으므로 클라이언트는 서버들이 처리할 시간인 회신 지연(turnaround delay)만큼 기다린 뒤 다음 요청을 보냅니다.

직렬 회선은 바이트를 문자(character) 단위로 보냅니다. 문자 하나는 시작 비트, 데이터 비트, 패리티 비트, 정지 비트로 이뤄집니다.

모드 데이터 비트 기본 형식 허용 형식 문자당 비트
RTU(§2.5.1) 8 8E1(짝수 패리티, 정지 1) 8O1, 8N2 11
ASCII(§2.5.2) 7 7E1 7O1, 7N2 10
  • 기본 패리티는 짝수(even)입니다.
  • 패리티를 쓰지 않으면 문자 길이를 맞추기 위해 정지 비트 2개가 필요합니다. PDComm은 패리티 없음과 정지 비트 1의 조합(8N1, 7N1)을 Invalid endpoint configuration으로 거부합니다. 장비가 8N1로 설정돼 있으면 장비를 8E1(권장)이나 8N2로 바꿉니다.
  • 명세 §3.2는 9600bps와 19200bps를 필수로 정하고, 기본값을 19200bps로 정합니다.

PDComm은 transport가 rtu이면 데이터 비트 8, ascii이면 7을 자동으로 고릅니다. 패리티(parity)와 정지 비트(stop_bits)는 구성에서 지정합니다.

RTU는 바이트를 그대로 보냅니다. 프레임은 주소 1바이트, PDU, CRC 2바이트입니다.

+--------+---------------------+---------+---------+
| 주소 1B | PDU | CRC 하위 | CRC 상위 |
+--------+---------------------+---------+---------+
01 03 00 00 00 0A C5 CD

RTU에는 시작·끝 문자가 없습니다. 대신 침묵 시간으로 프레임을 나눕니다(§2.5.1.1).

  • t3.5: 프레임 사이에는 문자 3.5개 이상의 침묵이 있어야 합니다.
  • t1.5: 프레임 안에서 문자 사이 간격이 문자 1.5개를 넘으면 그 프레임은 불완전한 것으로 버립니다.
  • 19200bps보다 빠르면 t1.5는 750µs, t3.5는 1.750ms로 고정합니다.
속도, 형식 문자 시간 t1.5 t3.5
9600bps, 8E1 1.146ms 1.719ms 4.011ms
19200bps, 8E1 0.573ms 0.860ms 2.006ms
38400bps 이상 0.750ms 1.750ms

RS-485 다중 접속(multidrop) 버스에서는 모든 서버가 모든 프레임을 받습니다. 각 서버는 t3.5 침묵으로 프레임을 나누고, 자기 주소의 요청에만 응답합니다. 주소 0의 브로드캐스트 쓰기는 모든 서버가 적용하고 아무도 응답하지 않습니다.

USB-직렬 어댑터와 운영체제 드라이버는 받은 바이트를 묶어서 애플리케이션에 넘깁니다. FTDI 어댑터의 기본 지연 타이머는 16ms입니다. 그래서 PC에서 관찰한 바이트 간격은 실제 회선의 t1.5·t3.5가 아닙니다. PDComm은 다음과 같이 대응합니다.

  • 클라이언트는 응답을 기능 코드로 정해지는 길이와 CRC로 완성합니다. 바이트가 늦게 묶여 와도 응답을 버리지 않습니다.
  • 요청을 보내기 전에 남아 있던 입력을 버리고, 프레임 사이에 t3.5 이상을 둡니다.
  • trace의 직렬 기록은 timestamp_scope가 host_io_batch입니다. PC가 읽기를 마친 시각이며 UART 비트 시각이 아닙니다.

RTU는 CRC-16을 씁니다(§2.5.1.2). 초기값 0xFFFF, 다항식 0xA001(비트 반전한 0x8005)로 주소와 PDU 전체를 계산하고, 하위 바이트를 먼저 붙입니다. 01 03 00 00 00 0A의 CRC는 0xCDC5이므로 C5 CD 순서로 보냅니다. 받는 쪽은 CRC가 맞지 않으면 프레임을 버리고 응답하지 않습니다. 클라이언트에는 시간 초과로 보입니다.

ASCII는 각 바이트를 16진수 문자 두 개로 보냅니다(§2.5.2). 프레임은 :(0x3A)로 시작하고 CR LF로 끝납니다. 16진 문자는 대문자 09, AF만 씁니다.

: 01 03 00 00 00 0A F2 CR LF
| | | | +-- 끝 문자(종료 문자는 FC 08/03으로 바꿀 수 있음)
| | +- PDU +------ LRC
| +----- 주소
+-------- 시작 문자
  • LRC(§2.5.2.2): 주소와 PDU 바이트를 8비트로 더한 값의 2의 보수입니다. 01+03+00+00+00+0A = 0x0E이므로 LRC는 0xF2입니다.
  • 문자 사이 시간: ASCII는 문자 사이에 최대 1초까지 쉴 수 있습니다. PDComm의 ascii_timeout_ms(기본 1000)가 이 한도입니다. 넘으면 받던 프레임을 버립니다.
  • 같은 PDU가 RTU보다 두 배 넘게 길어지므로 효율은 낮지만, 사람이 읽기 쉽고 시간 조건이 느슨합니다.

명세 §3은 주로 RS-485를 다룹니다.

방식 설명
RS-485 2선식(two-wire) 장비 여러 대가 한 쌍의 선(D0, D1)과 공통선(Common)을 공유합니다. 반이중이므로 송신 장비가 드라이버 방향을 바꿉니다.
RS-485/RS-422 4선식(four-wire) 송신과 수신 쌍을 나눕니다. 선택 사항입니다.
RS-232 짧은 거리의 1:1 연결에 씁니다. 선택 사항입니다.
  • RS-485 버스의 양 끝에는 종단 저항을 달고, 버스가 쉬는 동안의 전압을 정하는 바이어스(polarization)를 한 곳에서 줍니다. 값과 위치는 장비와 어댑터 지침을 따릅니다.
  • RS-232 어댑터는 RS-485 포트와 직접 통신할 수 없습니다. 변환기가 필요합니다.
  • 설치한 배선은 실제 장비를 연결한 상태에서 점검합니다.

PC와 장비를 연결하는 절차는 가이드: 직렬 포트 구성에서 설명합니다.