Skip to content
자료실로 돌아가기

산업용 아두이노에서 Modbus RTU 구현 실전 가이드

RS-485 결선부터 ILIB 라이브러리를 사용한 MPINO 컨트롤러의 Modbus RTU 마스터/슬레이브 구현, HMI·SCADA 연동까지 다룹니다.

9분 분량

Modbus RTU란 무엇이며 왜 산업 네트워크를 지배하는가

Modbus RTU는 1979년 Modicon이 발표한 직렬 통신 프로토콜로, 오늘날에도 필드 디바이스, PLC, HMI, SCADA 시스템을 연결하는 산업 자동화의 사실상 표준입니다. 마스터-슬레이브 구조의 간결한 바이너리 요청-응답 메시지를 직렬 물리 계층(대부분 RS-485) 위에서 전송하며, 모든 트랜잭션은 16비트 CRC로 보호되어 공장 현장의 전기적 노이즈가 공정 데이터를 손상시키지 않도록 합니다.

프로토콜은 디바이스 메모리를 네 개의 주소 공간으로 구성합니다. 즉 디스크리트 입력(읽기 전용 비트), 코일(읽기/쓰기 비트), 입력 레지스터(읽기 전용 16비트 워드), 홀딩 레지스터(읽기/쓰기 16비트 워드)입니다. 이 단순한 모델은 ILOGICS MPINO 컨트롤러의 물리 I/O에 그대로 대응됩니다. 디지털 입력은 디스크리트 입력으로, 릴레이 및 트랜지스터 출력은 코일로, 아날로그 채널은 입력 레지스터로 매핑됩니다.

MPINO-8A8R 또는 MPINO-16A8R8T 같은 산업용 Arduino에서 Modbus RTU는 저비용의 개방형 프로그래머블 하드웨어와 기존 계측 설비를 잇는 가교입니다. 거의 모든 HMI와 SCADA 패키지가 Modbus RTU 드라이버를 기본 제공하므로, MPINO를 Modbus 슬레이브로 노출하면 별도의 프로토콜 개발 없이 수많은 제조사의 장비와 상호 운용됩니다.

Modbus RTU를 위한 RS-485 물리 배선

MPINO 제품군의 Modbus RTU는 2선식(공통선 포함) RS-485 버스 위에서 동작합니다. 모든 장치는 데이지 체인 멀티드롭 토폴로지로 연결되며, A는 A끼리, B는 B끼리, 그리고 데이터 쌍과 함께 공통 신호 접지(GND/COM)를 배선합니다. 스타 배선이나 긴 분기선(stub)은 반사파를 유발해 CRC가 의존하는 비트 타이밍을 손상시키므로 피해야 합니다.

MPINO는 오토 디렉션 RS-485 트랜시버를 사용하므로, 펌웨어가 송신 전후로 별도의 드라이버 인에이블(DE/RE) 핀을 제어할 필요가 없습니다. 트랜시버가 UART 송신 라인을 감지해 드라이브와 수신 모드를 자동 전환하므로, 마스터가 버스를 너무 일찍 또는 늦게 해제하는 흔한 타이밍 버그가 사라집니다.

버스 양쪽 물리적 끝단에는 A-B 간 120Ω 종단 저항을 연결해 케이블 특성 임피던스에 정합시키고, 페일세이프 바이어스 저항을 추가해 유휴 라인이 정의된 상태를 유지하도록 합니다. RS-485 정격 차폐 연선을 사용하고 차폐는 한쪽 끝에서만 접지하며, VFD나 모터 동력 케이블과 분리해 배선하십시오. MPINO-8A8R-S와 MPINO-16A16R은 RS-485와 I²C를, ATmega2560 기반의 MPINO-8A8R, MPINO-16A8R8T, MPINO-16A8R은 RS-485에 더해 RS-232와 UART를 제공합니다.

마스터 대 슬레이브: MPINO 역할 선택

Modbus RTU에서는 정확히 하나의 장치만 마스터가 되어 모든 트랜잭션을 개시하고, 나머지 장치는 주소가 지정될 때만 응답하는 슬레이브가 됩니다. MPINO는 두 역할 모두 수행할 수 있으며, ILOGICS ILIB 라이브러리는 Modbus RTU 마스터와 슬레이브 스택을 모두 구현합니다.

기존 HMI, SCADA 프런트엔드 또는 PLC가 MPINO의 입력을 읽고 릴레이를 제어해야 한다면 MPINO를 슬레이브로 설정합니다. 이때 HMI가 마스터가 되어 일정한 스캔 주기로 홀딩 레지스터와 코일을 폴링합니다. 이것이 가장 일반적인 구성으로, MPINO는 어떤 Modbus 마스터든 주소를 지정해 사용할 수 있는 원격 I/O 블록처럼 동작합니다.

MPINO가 다른 필드 장치를 제어해야 한다면, 예를 들어 Modbus 전력계, 온도 트랜스미터, 인버터(VFD)를 읽고 로컬에서 반응해야 한다면 마스터로 설정합니다. 마스터 모드에서 MPINO 스케치는 일정에 따라 읽기/쓰기 펑션 코드를 발행하고 응답을 처리합니다. 단일 RS-485 세그먼트에서는 한 장치가 한 번에 하나의 역할만 유지합니다.

MPINO I/O를 위한 레지스터 및 코일 매핑

명확하게 문서화된 레지스터 맵은 MPINO 펌웨어와 통신하는 모든 클라이언트 사이의 계약입니다. 매핑을 한 번 정한 뒤 펌웨어 개정 전반에 걸쳐 안정적으로 유지하십시오. MPINO-8A8R의 일반적인 관례는 8개 디지털 입력을 디스크리트 입력 10001-10008, 8개 릴레이 출력을 코일 00001-00008, 4개 아날로그 입력을 입력 레지스터 30001-30004에 노출하는 것입니다.

아날로그 값은 특히 주의가 필요합니다. MPINO 아날로그 프런트엔드는 analogReference(EXTERNAL)를 요구하며, 10비트 ADC는 0-1023 카운트를 반환합니다. 이를 입력 레지스터에 원시값으로 게시하거나 펌웨어에서 공학 단위로 스케일링할 수 있습니다. 레지스터 30001이 원시 카운트인지 밀리볼트인지 공정값인지 HMI 통합 담당자가 알 수 있도록 스케일링 계수를 레지스터 맵에 기록하십시오.

MPINO-16A8R8T 같은 대형 컨트롤러는 16개 디지털 입력, 8개 릴레이 및 8개 트랜지스터 출력을 코일로, 4개 아날로그 입력과 2개 아날로그 출력을 레지스터로, 2개 NTC 온도 채널을 추가 입력 레지스터로 확장 매핑합니다. 전체 맵을 제품과 함께 한 페이지 문서로 게시하면 MPINO는 모든 Modbus 마스터를 위한 즉시 적용 가능한 원격 I/O 노드가 됩니다.

ILIB 라이브러리로 Modbus RTU 구현하기

ILOGICS ILIB 라이브러리는 MPINO 하드웨어와 오토 디렉션 RS-485 트랜시버에 최적화된 Modbus RTU 구현을 제공하므로, 프로토콜 배관 작업 대신 애플리케이션 로직에 집중할 수 있습니다. 보드는 표준 Arduino IDE에서 ATmega128 또는 ATmega2560 타깃에 맞춰 MegaCore 코어를 선택해 프로그래밍합니다.

아래 스니펫은 MPINO-8A8R을 주소 1, 19200 baud의 Modbus RTU 슬레이브로 구성하여, 8개 디지털 입력과 8개 릴레이 코일을 매핑함으로써 HMI 마스터가 실시간 입력 상태를 읽고 릴레이를 제어할 수 있게 합니다. 트랜시버가 오토 디렉션이므로 스케치는 DE/RE 핀을 전혀 다루지 않습니다.

플래싱 후 임의의 Modbus RTU 마스터를 슬레이브 주소 1로 지정하고 매핑된 코일과 디스크리트 입력을 폴링하여, 상위 제어 시스템과 통합하기 전에 배선과 CRC 상태가 정상인지 확인하십시오.

#include <ILIB.h>

// MPINO-8A8R as Modbus RTU slave, address 1, 19200 baud
ModbusSlave mb;

const uint8_t DI_PINS[8] = {22,23,24,25,26,27,28,29};
const uint8_t RELAY_PINS[8] = {30,31,32,33,34,35,36,37};

void setup() {
  analogReference(EXTERNAL);          // required for MPINO analog
  for (uint8_t i = 0; i < 8; i++) {
    pinMode(DI_PINS[i], INPUT);
    pinMode(RELAY_PINS[i], OUTPUT);
  }
  mb.begin(1, 19200);                 // slave id 1, RS-485 auto-direction
}

void loop() {
  // Map 8 digital inputs -> discrete inputs 1..8
  for (uint8_t i = 0; i < 8; i++)
    mb.setDiscreteInput(i, digitalRead(DI_PINS[i]));

  mb.poll();                          // service master requests

  // Apply coils 1..8 -> 8 relays
  for (uint8_t i = 0; i < 8; i++)
    digitalWrite(RELAY_PINS[i], mb.getCoil(i));
}

HMI 및 SCADA와의 통합

MPINO가 Modbus RTU에 정상적으로 응답하면, HMI 또는 SCADA 플랫폼과의 통합은 설정 작업입니다. HMI 드라이버에서 MPINO의 baud rate, 패리티, 스톱 비트에 맞는 Modbus RTU 직렬 채널을 생성한 뒤, 설정된 주소로 슬레이브를 추가하고 게시한 맵의 코일, 디스크리트 입력, 레지스터에 화면 객체를 바인딩합니다.

폴링 주기는 현실적으로 유지하십시오. 수십 개 포인트를 처리하는 ATmega128 또는 ATmega2560은 100-500 ms 스캔 주기에 안정적으로 응답하지만, 많은 레지스터를 50 ms 미만으로 공격적으로 폴링하면 애플리케이션 루프가 고갈될 수 있습니다. 관련 포인트를 연속된 레지스터 블록으로 묶으면 마스터가 단일 펑션 호출로 읽어 버스 트래픽과 지연이 줄어듭니다.

알람이나 인터록을 구동하는 SCADA 태그의 경우, MPINO가 부팅 중에 플레이스홀더가 아닌 실제 값을 게시하는지 확인하십시오. setup()에서 레지스터를 알려진 안전 상태로 초기화하고, 소스가 한 번 읽힌 후에만 포인트를 유효로 표시합니다. 이러한 원칙이 MPINO를 운영 제어 네트워크의 신뢰할 수 있는 노드로 유지합니다.

관련 컨트롤러

MPINO-8A8R-S 산업용 아두이노 컨트롤러 — 전면 이미지

MPINO-8A8R-S

MPINO-8A8R-S 산업용 아두이노 컨트롤러

8 DI / 8 Relay / 4 AI / 2 NTC / RS-485 / I²C
₩82,500
MPINO-8A8R 산업용 아두이노 컨트롤러 — 전면 이미지

MPINO-8A8R

MPINO-8A8R 산업용 아두이노 컨트롤러

8 DI / 8 Relay / 4 AI / RS-232 / RS-485 / UART / I²C
₩88,000
MPINO-16A8R8T 산업용 아두이노 컨트롤러 — 전면 이미지

MPINO-16A8R8T

MPINO-16A8R8T 산업용 아두이노 컨트롤러

16 DI / 8 Relay / 8 Transistor / 4 AI / 2 AO / 2 NTC / RS-232 / RS-485 / UART / I²C
₩110,000

관련 가이드

FAQ

어떤 MPINO 모델이 RS-485 기반 Modbus RTU를 지원합니까?

나열된 모든 MPINO 컨트롤러는 RS-485를 제공하며 ILIB 라이브러리를 통해 Modbus RTU를 실행합니다. MPINO-8A8R-S와 MPINO-16A16R은 ATmega128에 RS-485와 I²C를 사용하고, MPINO-8A8R, MPINO-16A8R8T, MPINO-16A8R은 ATmega2560에 RS-485와 함께 RS-232 및 UART를 추가로 제공합니다.

RS-485 송신 방향 제어를 위해 DE/RE 핀을 제어해야 합니까?

아니요. MPINO는 UART 송신 라인을 기준으로 드라이브와 수신을 자동 전환하는 오토 디렉션 RS-485 트랜시버를 사용합니다. 스케치와 ILIB 라이브러리는 드라이버 인에이블 핀을 전혀 토글하지 않으므로 Modbus 타이밍 오류의 빈번한 원인이 제거됩니다.

하나의 MPINO가 Modbus 마스터이면서 동시에 슬레이브가 될 수 있습니까?

단일 RS-485 세그먼트에서는 한 장치가 한 번에 하나의 역할만 유지합니다. ILIB는 마스터와 슬레이브 스택을 모두 지원하므로, 여러 직렬 포트를 가진 MPINO는 한 포트에서 상위 SCADA 마스터에 대한 슬레이브로, 별도 포트에서 하위 장치에 대한 마스터로 동작할 수 있습니다.