본문 바로가기
HW SW 개발

🚀 C#으로 Modbus/RS-485 마스터(Master) 통신 정복하기

by 아이텍 2025. 12. 3.
반응형

 Modbus와 RS-485, 그리고 C# 환경 준비 ⚙️

 

 

 

안녕하세요, 산업 자동화와 데이터 수집에 관심 있는 C# 개발자 여러분!

이번 연재에서는 C# .NET 환경에서 Modbus RTU 프로토콜을 사용하여 RS-485 통신 기반의 산업용 장치(PLC, 센서 등)와 데이터를 주고받는 마스터(Master) 통신 프로그램을 직접 개발하는 방법을 알아봅니다.

첫 번째 시간인 오늘은 통신의 기본 개념을 이해하고 개발을 위한 환경을 준비하는 과정을 다룹니다.


1. Modbus 통신, 왜 사용해야 할까요?

Modbus는 1979년에 Modicon사(현 Schneider Electric)에 의해 개발된 직렬 통신 프로토콜입니다.

가장 큰 특징은 단순성개방성입니다. 프로토콜 구조가 매우 간단하고 로열티 없이 누구나 사용할 수 있어, 거의 모든 산업용 장비(PLC, HMI, 인버터, 전력량계 등)의 표준 통신 방식으로 자리 잡았습니다.

📜 Modbus RTU vs. Modbus TCP

Modbus는 크게 두 가지 형태로 사용됩니다.

  • Modbus RTU (Remote Terminal Unit):
    • RS-232/RS-485와 같은 시리얼 통신(직렬 통신) 기반으로 동작합니다.
    • 데이터가 이진(Binary) 형식으로 전송되어 효율적입니다.
    • 이번 연재에서 중점적으로 다룰 방식입니다.
  • Modbus TCP (Transmission Control Protocol):
    • 이더넷(Ethernet) 네트워크 기반으로 동작합니다.
    • 데이터가 TCP/IP 패킷에 담겨 전송됩니다.

2. 시리얼 통신의 기반: RS-485의 이해

Modbus RTU는 흔히 RS-485 물리 계층 위에서 동작합니다. RS-485는 산업 현장에 최적화된 시리얼 통신 규격으로, 몇 가지 중요한 특징이 있습니다.

📌 RS-485의 핵심 특징

특징 설명
차동 신호 (Differential Signaling) 두 개의 와이어(A, B)의 전압 차이로 신호를 전달하여 노이즈에 매우 강합니다.
반이중 통신 (Half-Duplex) 한 번에 한 방향으로만 데이터를 전송할 수 있습니다. 마스터가 요청하면 슬레이브가 응답하는 방식으로 작동합니다.
멀티 드롭 (Multi-Drop) 하나의 마스터에 최대 32개의 장치(슬레이브)를 연결하여 통신할 수 있습니다. 각 슬레이브는 **고유한 ID(Slave ID)**를 가집니다.

우리가 C#으로 구현할 **마스터(Master)**는 슬레이브들에게 명령을 보내고 응답을 받는 주체가 됩니다.


3. C# 개발 환경 준비: NModbus 라이브러리 활용

C#에서 Modbus RTU 통신을 구현하려면 시리얼 포트(COM Port) 제어부터 데이터 패킷 구성(CRC 체크섬 포함)까지 직접 처리해야 합니다. 하지만 다행히 이러한 복잡한 작업을 대신해주는 훌륭한 라이브러리가 있습니다.

우리는 가장 널리 사용되는 C# Modbus 라이브러리 중 하나인 NModbus를 사용할 것입니다.

1️⃣ Visual Studio 프로젝트 생성

  1. Visual Studio에서 새로운 C# Windows Forms App (.NET Framework) 또는 WPF App 프로젝트를 생성합니다. (콘솔 앱도 무방하나, 테스트가 편리하도록 UI 앱을 권장합니다.)

2️⃣ NModbus 패키지 설치

NModbus는 NuGet 패키지로 제공되므로 쉽게 설치할 수 있습니다.

  1. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 클릭하고 'NuGet 패키지 관리(Manage NuGet Packages)' 를 선택합니다.
  2. '찾아보기(Browse)' 탭에서 NModbus를 검색합니다.
  3. NModbus4 패키지를 선택하고 프로젝트에 설치합니다.

3️⃣ 하드웨어 및 테스트 환경 준비

Modbus RTU 테스트를 위해서는 실제 RS-485 컨버터장치가 필요하지만, 개발 단계에서는 소프트웨어 시뮬레이터를 사용하는 것이 편리합니다.

  • USB-to-RS485 컨버터: PC와 RS-485 장치를 연결하기 위한 필수 하드웨어입니다.
  • Modbus 시뮬레이터: 슬레이브 장치 역할을 해주는 프로그램 (예: Modbus Poll, Modbus Slave).
  • 가상 시리얼 포트 프로그램 (선택 사항): 실제 컨버터 없이 PC 내부에서 가상의 COM 포트를 생성하여 NModbus와 시뮬레이터 간의 통신을 테스트할 때 유용합니다.

4. C# 코드 작성의 시작: 시리얼 포트 설정

NModbus를 사용하기 전에, 통신의 기반이 될 시리얼 포트(COM Port)를 먼저 설정해야 합니다.

📝 예제 코드: Modbus Serial Port 초기화

 

using Systehttp://m.IO.Ports;
using Modbus.Device;

// ... (클래스 내부)

// SerialPort 객체 생성
private SerialPort serialPort = new SerialPort();
private IModbusMaster master;

/// <summary>
/// 시리얼 포트 연결 및 Modbus 마스터 초기화 함수
/// </summary>
public void InitializeModbusMaster(string comPortName, int baudRate)
{
    try
    {
        // 1. 시리얼 포트 기본 설정
        serialPort.PortName = comPortName; // 예: "COM3"
        serialPort.BaudRate = baudRate;   // 예: 9600
        serialPort.DataBits = 8;
        serialPort.Parity = Parity.None; // Modbus RTU 표준 설정
        serialPort.StopBits = StopBits.One; // Modbus RTU 표준 설정
        
        // Timeout 설정 (밀리초)
        serialPort.ReadTimeout = 1000;  
        serialPort.WriteTimeout = 1000;

        // 2. 포트 열기
        if (!serialPort.IsOpen)
        {
            serialPort.Open();
        }

        // 3. NModbus 마스터 객체 생성 (RTU 프로토콜 지정)
        master = ModbusSerialMaster.CreateRtu(serialPort);

        Console.WriteLine($"Modbus RTU 마스터가 {comPortName}에 성공적으로 연결되었습니다.");
    }
    catch (Exception ex)
    {
        // 연결 실패 시 예외 처리
        Console.WriteLine($"연결 오류: {ex.Message}");
    }
}

 

🔍 코드 설명

  1. using System.IO.Ports;: .NET의 기본 시리얼 통신 클래스를 사용하기 위해 포함합니다.
  2. using Modbus.Device;: NModbus 라이브러리의 핵심 네임스페이스입니다.
  3. serialPort.PortName = ...: Windows 장치 관리자에서 확인한 COM 포트 이름을 지정합니다.
  4. serialPort.BaudRate = ...: 통신 속도를 설정합니다. 장치와 반드시 일치해야 합니다.
  5. Parity.None, StopBits.One: Modbus RTU 통신에서 가장 흔하게 사용되는 설정(8N1)입니다. 장치의 설정을 따라야 합니다.
  6. serialPort.Open();: 물리적인 시리얼 포트 연결을 시작합니다.
  7. ModbusSerialMaster.CreateRtu(serialPort);: 열린 시리얼 포트를 인수로 넘겨 NModbus RTU 마스터 인스턴스를 생성합니다. 이 객체가 실제 데이터 읽기/쓰기 명령을 수행합니다.

맺음말

이번 1회차에서는 Modbus와 RS-485의 기본 개념을 정립하고, NModbus 라이브러리를 설치한 후 C#에서 시리얼 포트를 설정하고 마스터 객체를 초기화하는 첫 단계를 완료했습니다.

 

 

💾 C#으로 Modbus/RS-485 마스터(Master) 통신 정복하기 (2/3)

 

💾 C#으로 Modbus/RS-485 마스터(Master) 통신 정복하기 (2/3)

Modbus RTU 데이터 읽기 (Read Operations) 💾안녕하세요. 지난 1회차에서는 Modbus RTU와 RS-485의 기본을 알아보고, NModbus 라이브러리를 설치하여 마스터 통신 환경을 준비했습니다.이번 2회차에서는 실제

moneygeneration.tistory.com

 

✍️ C#으로 Modbus/RS-485 마스터(Master) 통신 정복하기 (3/3)

 

✍️ C#으로 Modbus/RS-485 마스터(Master) 통신 정복하기 (3/3)

Modbus RTU 데이터 쓰기 및 예외 처리 (Write & Error Handling) ✍️안녕하세요. 드디어 C# Modbus RTU 마스터 통신 연재의 마지막 시간입니다.지난 2회차까지 데이터를 읽는(Read) 방법을 완벽히 이해했다면,

moneygeneration.tistory.com

 

반응형