Lastupdate : 2026. 08.26
1. 사전 준비 (라이브러리 설치)
Visual Studio의 [도구] ➔ [NuGet 패키지 관리자] ➔ [설루션용 NuGet 패키지 관리]에서 아래 라이브러리를 검색해서 설치하자.
- 패키지 이름: NModbus (또는 최신 .NET 환경에서 호환되는 NModbus 포크 버전) (또는 패키지 관리자 콘솔에서 Install-Package NModbus 입력)
- 설치화면 I.

- 설치화면 II.

Install-Package NModbus
- 설치확인화면 III.

사용예:
using System;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;
using NModbus;
string serverIp = "172.16.32.108"; // 대상 장치 IP
int port = 502;
CancellationTokenSource cts = new CancellationTokenSource();
Console.WriteLine("[시스템] Modbus TCP 자동 재접속 클라이언트를 시작...");
// 메인 루프: 연결이 끊기면 무한으로 재접속 시도
while (!cts.Token.IsCancellationRequested)
{
TcpClient client = null;
IModbusMaster master = null; // 수정됨: IModbusIpMaster -> IModbusMaster
try
{
// 1. 서버 연결 시도
client = new TcpClient();
Console.WriteLine($"[연결 시도] {serverIp}:{port} 연결 중...");
// 연결 타임아웃 설정 (3초 안에 응답 없으면 예외 발생)
var connectTask = client.ConnectAsync(serverIp, port);
if (await Task.WhenAny(connectTask, Task.Delay(3000)) != connectTask)
{
throw new TimeoutException("연결 시간 초과");
}
Console.WriteLine("[연결 성공] 통신을 시작.");
// 2. NModbus 3.x 버전에 맞는 Master 생성 방식
var factory = new ModbusFactory();
master = factory.CreateMaster(client); // 수정됨: CreateIpMaster -> CreateMaster
// 3. 수신(폴링)을 담당하는 백그라운드 스레드 실행
await RunCommunicationLoop(master, cts.Token);
}
catch (Exception ex)
{
Console.WriteLine($"[통신 오류 또는 연결 끊김] {ex.Message}");
}
finally
{
// 사용한 자원(소켓 등) 깨끗이 정리
master?.Dispose();
client?.Dispose();
Console.WriteLine("[자원 해제] 연결을 닫고 재접속을 준비.");
}
// 4. 바로 재시도하면 서버에 부하를 주므로 3초 대기 후 재접속 시도
if (!cts.Token.IsCancellationRequested)
{
Console.WriteLine("[재접속 대기] 3초 후 다시 연결을 시도...");
await Task.Delay(3000, cts.Token);
}
}
// ==========================================
// 통신 및 데이터 수신 루프 메서드
// ==========================================
async Task RunCommunicationLoop(IModbusMaster master, CancellationToken cancellationToken) // 수정됨
{
byte slaveId = 1;
ushort startAddress = 0;
ushort numRegisters = 10;
while (!cancellationToken.IsCancellationRequested)
{
// 데이터 읽기 (Function 3 예시)
ushort[] registers = await master.ReadHoldingRegistersAsync(slaveId, startAddress, numRegisters);
Console.WriteLine($"[수신 데이터] Reg[0]: {registers[0]}, Reg[1]: {registers[1]}");
// 주기 조절 (1초 간격)
await Task.Delay(1000, cancellationToken);
}
}
라이브러리를 사용할지, 아니면 기존처럼 C# 기본 TcpClient로 직접 소켓 통신을 구현할지 고민.
두 방식의 장단점을 명확하게 비교
1. NModbus 라이브러리를 사용할 때
- 장점:
- 생산성 최고: Modbus 프로토콜은 바이트 단위의 프레임(Function Code, 주소, 데이터, CRC 체크섬 등)을 엄격하게 지켜야 하는데, 라이브러리가 이 복잡한 과정을 전부 알아서 처리해 줌 (master.ReadHoldingRegistersAsync 한 줄이면 끝난다.)
- 오류 방지: 통신 과정에서 발생할 수 있는 프로토콜 규칙 오류나 CRC 에러 계산 등을 직접 구현할 필요가 없어 개발 시간이 획기적으로 줄어든다.
- 단점:
- 혹시 겪을수 있는 라이브러리 버전(3.x)에 따라 네임스페이스나 메서드 이름이 바뀔 때 문서를 찾아봐야 하는 약간의 러닝커브가 있다.
2. 직접 TcpClient로 구현할 때
- 장점:
- 외부 의존성 제로: NuGet 패키지를 쓸 필요가 없으므로 버전 호환성 문제로 골치 아플 일이 전혀 없다.
- 완벽한 제어: Modbus TCP 패킷(MBAP Header + PDU) 구조를 직접 바이트 배열(byte [])로 조립하고 파싱 하므로, 프로토콜 구조를 뼛속까지 이해할 수 있다.
- 단점:
- 구현의 번거로움: 소켓으로 바이트를 보낸 뒤, 응답 데이터의 바이트 배열을 받아와서 Function Code가 에러인지 정상인지, CRC나 트랜잭션 ID는 맞는지 직접 쪼개고 검증하는 코드를 일일이 다 짜야 한다. (생각보다 손이 많이 가고 실수가 발생하기 쉽다.)
💡 최종 추천
- 안전하고 빠른 개발을 원한다면 👉 NModbus 라이브러리 사용을 추천.
- 비록 처음에 설정과 버전 차이 때문에 약간의 시행착오가 있었지만, 일단 한번 세팅해 두면 이후부터는 센서나 PLC 데이터를 읽고 쓰는 비즈니스 로직(핵심 기능) 개발에만 집중할 수 있어 훨씬 효율적.
- 만약 프로토콜을 직접 바이트 단위로 제어하는 재미를 느끼고 싶거나 외부 라이브러리 자체를 배제하고 싶다면 👉 직접 구현도 나쁘지 않지만, 산업용 현장에서 안정성과 유지보수를 고려한다면 검증된 라이브러리를 쓰는 것이 실무 표준이래나 뭐래나.
이미 NModbus 패키지도 설치했고 기본 구조를 잡아가고 있으니, 이번 기회에 라이브러리를 활용해 빠르게 기능을 완성해 볼가 한다 나는~~
'프로그램 > C#' 카테고리의 다른 글
| [C#] NModbus 라이브러리 사용 예 (Ver 2) (0) | 2026.08.24 |
|---|---|
| [C#] NModbus 라이브러리 사용 예 (Ver 3) (0) | 2026.08.24 |
| [C#] NModbus 라이브러리 사용 예 (Ver 4) (0) | 2026.08.24 |
| [C#] INI 대신 Json 을 사용한 환경값 저장 모듈 (0) | 2026.07.01 |
| [C#] 디버깅 출력 예 (0) | 2026.06.29 |
| [C#] 콘솔 앱 (.NET Core)로 작성된DLL 리눅에서 실행키 위한 환경구축 (0) | 2018.09.21 |
| [ C# ] Embedded Compact7 용 프로그램 컴파일 속도향상 (0) | 2017.07.01 |
| [ C# ] 쓰레드 상에 디스플레이를 델리게이트를 이용할때 구현방법 (0) | 2017.05.22 |
| [C#] Windows Embedded Compact 7 에서 SQLite 를 사용하기위한 [연재3] (0) | 2017.04.27 |
| [C#] Windows Embedded Compact 7 에서 SQLite 를 사용하기위한 [연재2] (0) | 2017.04.27 |












