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 프로젝트 생성
- Visual Studio에서 새로운 C# Windows Forms App (.NET Framework) 또는 WPF App 프로젝트를 생성합니다. (콘솔 앱도 무방하나, 테스트가 편리하도록 UI 앱을 권장합니다.)
2️⃣ NModbus 패키지 설치
NModbus는 NuGet 패키지로 제공되므로 쉽게 설치할 수 있습니다.
- 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 클릭하고 'NuGet 패키지 관리(Manage NuGet Packages)' 를 선택합니다.
- '찾아보기(Browse)' 탭에서 NModbus를 검색합니다.
- 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}");
}
}
🔍 코드 설명
- using System.IO.Ports;: .NET의 기본 시리얼 통신 클래스를 사용하기 위해 포함합니다.
- using Modbus.Device;: NModbus 라이브러리의 핵심 네임스페이스입니다.
- serialPort.PortName = ...: Windows 장치 관리자에서 확인한 COM 포트 이름을 지정합니다.
- serialPort.BaudRate = ...: 통신 속도를 설정합니다. 장치와 반드시 일치해야 합니다.
- Parity.None, StopBits.One: Modbus RTU 통신에서 가장 흔하게 사용되는 설정(8N1)입니다. 장치의 설정을 따라야 합니다.
- serialPort.Open();: 물리적인 시리얼 포트 연결을 시작합니다.
- 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
'HW SW 개발' 카테고리의 다른 글
| 📍 이더캣의 내부 구조 완전 해부: 프레임, ESC, DC 메커니즘 (1/3) (0) | 2025.12.05 |
|---|---|
| ✍️ C#으로 Modbus/RS-485 마스터(Master) 통신 정복하기 (3/3) (0) | 2025.12.03 |
| 💾 C#으로 Modbus/RS-485 마스터(Master) 통신 정복하기 (2/3) (0) | 2025.12.03 |
| C#에서 Modbus RTU 프로토콜 사용하기 (2) | 2025.01.04 |
| C# Modbus 사용하기 (1) | 2025.01.04 |