본문 바로가기
HW SW 개발

C#에서 Modbus RTU 프로토콜 사용하기

by 아이텍 2025. 1. 4.
반응형

C#에서 Modbus RTU 프로토콜을 사용하는 방법에 대해 자세히 알아보겠습니다. Modbus RTU는 시리얼 통신을 통해 장치 간 데이터를 전송하는 데 사용되는 프로토콜입니다. C#에서 이를 구현하기 위해 NModbus 라이브러리를 사용할 수 있으며, 직접 시리얼 통신을 구현하는 방법도 있습니다.

Modbus RTU 개요
Modbus RTU: Modbus 프로토콜의 한 형태로, RS-232 또는 RS-485와 같은 시리얼 통신을 통해 데이터를 전송합니다.
용도: 주로 PLC, 센서, 계측기기 등과의 통신에 사용됩니다.
C#에서 Modbus RTU 구현하기
C#에서 Modbus RTU를 구현하기 위해 NModbus 라이브러리를 사용할 수 있으며, 직접 시리얼 포트를 통해 통신하는 방법도 있습니다.

NModbus 설치
NuGet 패키지 관리자를 통해 NModbus를 설치할 수 있습니다.
bash


Install-Package NModbus
Modbus RTU 예제 코드
아래는 C#에서 Modbus RTU를 사용하는 간단한 예제입니다.

csharp


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

class Program
{
    static void Main()
    {
        // 시리얼 포트 설정
        SerialPort serialPort = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
        serialPort.Open();

        // Modbus RTU 마스터 생성
        var master = ModbusSerialMaster.CreateRtu(serialPort);

        // 레지스터 읽기
        ushort startAddress = 1;
        ushort numRegisters = 5;
        ushort[] registers = master.ReadHoldingRegisters(1, startAddress, numRegisters);

        // 읽은 레지스터 출력
        for (int i = 0; i < registers.Length; i++)
        {
            Console.WriteLine($"Register {startAddress + i}: {registers[i]}");
        }

        // 연결 종료
        serialPort.Close();
    }
}
설명: 위 코드는 Modbus RTU를 통해 특정 COM 포트에서 장치의 홀딩 레지스터를 읽어오는 예제입니다.
직접 Modbus RTU 구현
NModbus를 사용하지 않고 직접 Modbus RTU를 구현할 수도 있습니다. 아래는 기본적인 구조를 설명합니다.

기본 구조
SerialPort 클래스: C#의 Systehttp://m.IO.Ports 네임스페이스를 사용하여 시리얼 포트를 설정합니다.
CRC 계산: Modbus RTU는 데이터의 무결성을 확인하기 위해 CRC(순환 중복 검사)를 사용합니다.
예제 코드
csharp


using System;
using Systehttp://m.IO.Ports;

class ModbusRTU
{
    private SerialPort _serialPort;

    public ModbusRTU(string portName)
    {
        _serialPort = new SerialPort(portName, 9600, Parity.None, 8, StopBits.One);
        _serialPort.Open();
    }

    public void ReadHoldingRegisters(byte slaveId, ushort startAddress, ushort numRegisters)
    {
        byte[] frame = new byte[5];
        frame[0] = slaveId; // Slave ID
        frame[1] = 0x03; // Function code for Read Holding Registers
        frame[2] = (byte)(startAddress >> 8); // Start address high byte
        frame[3] = (byte)(startAddress & 0xFF); // Start address low byte
        frame[4] = (byte)(numRegisters); // Number of registers

        // CRC 계산 및 프레임 전송
        // ...
    }

    public void Close()
    {
        _serialPort.Close();
    }
}
설명: 위 코드는 Modbus RTU의 기본적인 프레임 구조를 설정하는 예제입니다. CRC 계산 및 데이터 전송 부분은 추가 구현이 필요합니다.

 

 

 

 

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

Modbus와 RS-485, 그리고 C# 환경 준비 ⚙️ 안녕하세요, 산업 자동화와 데이터 수집에 관심 있는 C# 개발자 여러분!이번 연재에서는 C# .NET 환경에서 Modbus RTU 프로토콜을 사용하여 RS-485 통신 기반의

moneygeneration.tistory.com

 

반응형