- 목표: LS산전 PLC와 C# 앱 간의 OPC UA 통신 기본 예제 구현
- 언어/환경: Visual Studio, C#, .NET Framework 또는 .NET 6 이상
OPC UA란?
OPC UA (Open Platform Communications Unified Architecture)는 산업 자동화 환경에서 기기 간 데이터 통신을 위한 플랫폼 독립형, 확장성 있는 표준 프로토콜입니다.
OPC UA는 기존 DCOM 기반 OPC Classic의 한계를 극복하며, 보안, 플랫폼 독립성, 확장성을 갖춘 통신 방식으로 대부분의 PLC 제조사에서 지원합니다.
1. LS산전 OPC UA 기본 설정 확인

LS ELECTRIC PLC (예: XGT 시리즈)는 OPC UA 서버 기능이 내장된 모델이 있으며, 별도의 OPC UA 서버 보드나 GLOFA-GMWIN 등의 툴 설정이 필요합니다.

필수 조건:
- LS PLC에 OPC UA 기능이 활성화되어 있어야 함 / 이더넷 포트 <–> 컴퓨터, 공유기에 랜으로 연결
- IP 주소, 포트 (기본: opc.tcp://<IP주소>:4840) 확인
- 서버 인증서 설정 허용 또는 신뢰 인증서 사전 등록
2. C# OPC UA 클라이언트 라이브러리 설치
C#에서는 OPC Foundation의 OPC UA .NET Standard 라이브러리를 사용합니다.
NuGet 패키지 설치:
Install-Package OPCFoundation.NetStandard.Opc.Ua
또는 .NET CLI 사용 시:
dotnet add package OPCFoundation.NetStandard.Opc.Ua
3. 기본 통신 예제 코드 (데이터 읽기)
다음은 LS산전 OPC UA 서버에 연결하여 노드 값을 읽는 간단한 예제입니다.
using System;
using System.Threading.Tasks;
using Opc.Ua;
using Opc.Ua.Client;
using Opc.Ua.Configuration;
namespace LsOpcUaClient
{
class Program
{
static async Task Main(string[] args)
{
// 애플리케이션 구성
var config = new ApplicationConfiguration()
{
ApplicationName = "LSOpcUaClient",
ApplicationType = ApplicationType.Client,
SecurityConfiguration = new SecurityConfiguration
{
ApplicationCertificate = new CertificateIdentifier(),
AutoAcceptUntrustedCertificates = true, // 테스트용
},
TransportConfigurations = new TransportConfigurationCollection(),
TransportQuotas = new TransportQuotas { OperationTimeout = 15000 },
ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 }
};
await config.Validate(ApplicationType.Client);
// OPC UA 엔드포인트 설정
var endpointURL = "opc.tcp://192.168.0.100:4840"; // PLC의 OPC UA 주소 입력
var endpointDescription = CoreClientUtils.SelectEndpoint(endpointURL, useSecurity: false);
var endpointConfiguration = EndpointConfiguration.Create(config);
var endpoint = new ConfiguredEndpoint(null, endpointDescription, endpointConfiguration);
// 세션 생성
var session = await Session.Create(config, endpoint, false, "LS OPC UA Client", 60000, null, null);
Console.WriteLine("OPC UA 세션 연결 완료.");
// 노드 값 읽기
string nodeId = "ns=2;s=TAG1"; // PLC의 실제 노드 ID 입력
DataValue value = session.ReadValue(nodeId);
Console.WriteLine($"노드 값: {value.Value}");
// 세션 종료
session.Close();
Console.WriteLine("세션 종료 완료.");
}
}
}
🔍 주요 설명:
- endpointURL: LS PLC의 IP와 포트를 입력
- nodeId: LS PLC에 정의된 태그 (예: s=DB1.Tag1 또는 ns=2;s=MyTag)
- AutoAcceptUntrustedCertificates = true: 인증서 자동 수락 (실제 운영에선 보안 정책 필요)
4. 예제 실행 전 체크리스트
| PLC의 OPC UA 서버 활성화 여부 | ✅ |
| 포트 방화벽 허용 (기본 4840) | ✅ |
| PLC에 등록된 노드 ID 확인 | ✅ |
| 인증서 정책 확인 및 설정 | ✅ |

5. [실무 팁] 데이터 변경 이벤트 처리 (Subscription 방식)
OPC UA는 클라이언트가 주기적으로 값을 읽는 Polling 방식 외에도, 서버에서 값 변경 시 자동 통지받는 Subscription 방식을 지원합니다.
이를 활용하면 다음과 같은 이점이 있습니다:
✅ Subscription 방식의 장점
- 실시간 데이터 반영 가능
- CPU 부하 절감 (Polling 대비)
- 산업 현장 이벤트 기반 제어에 적합
예제: 값 변경 시 자동 알림 받기
// Subscription 및 이벤트 핸들링 예제
var subscription = new Subscription(session.DefaultSubscription)
{
PublishingInterval = 1000 // 1초 간격으로 변경사항 체크
};
// 모니터링할 노드 지정
var monitoredItem = new MonitoredItem(subscription.DefaultItem)
{
DisplayName = "MyTag",
StartNodeId = "ns=2;s=TAG1", // LS PLC의 노드 ID
SamplingInterval = 500, // 샘플링 주기 (ms)
QueueSize = 10,
DiscardOldest = true
};
// 변경 시 이벤트 핸들러 등록
monitoredItem.Notification += OnValueChanged;
// 구독 항목에 추가하고 세션에 등록
subscription.AddItem(monitoredItem);
session.AddSubscription(subscription);
subscription.Create();
콜백 함수 정의
private static void OnValueChanged(MonitoredItem item, MonitoredItemNotificationEventArgs e)
{
foreach (var value in item.DequeueValues())
{
Console.WriteLine($"[{DateTime.Now}] {item.DisplayName} 변경됨: {value.Value}");
}
}
6. 실무 노하우: Subscription 구현 시 주의점
| 팁 | 설명 |
| 1. PublishingInterval 과 SamplingInterval 적절 조절 | 너무 짧게 잡으면 불필요한 이벤트가 많아지고 성능 저하 |
| 2. QueueSize 조정 | 네트워크 지연 시 데이터 누락 방지 |
| 3. Network Loss 대비 재접속 로직 구현 | KeepAlive 체크 및 세션 오류 시 재연결 |
| 4. 노드가 Null 또는 Bad Status인 경우 체크 | 일부 PLC에서는 데이터 초기화 전 Null 또는 StatusCode.Bad 리턴 |
| 5. 인증서 신뢰 문제로 Subscription 실패 가능 | 개발 중 AutoAcceptUntrustedCertificates = true 설정으로 임시 우회 |
고급 확장: 알람 연동
- LS PLC에서 설정한 특정 조건 (예: 알람 태그)이 True로 바뀌는 순간만 감지하여 UI에 경고 표시
- 예: ns=2;s=Alarm_MotorOverheat가 True → 팝업 or 로그 기록
if ((bool)value.Value == true)
{
Console.WriteLine("🔥 모터 과열 경고!");
}
이처럼 Subscription 기반 구조는 SCADA 시스템, 디지털 트윈, AI 기반 제어 시스템에서 핵심 요소로 사용됩니다.
* 전용 모듈이 없는 경우, BridgeWare의 LSE OPC Server를 사용하여 LS산전 PLC(Glofa, XGT, Master-K)와 데이터를 수집 가능 / 모드버스 TCP 이용
'산업 IoT & 스마트 팩토리 디지털트윈 > OPC UA 표준 통신' 카테고리의 다른 글
| OPC UA & C# 통신 예제 – IOT(아두이노) 연동편 (0) | 2026.02.12 |
|---|---|
| OPC UA & C# 통신 예제 – Siemens S7-1200/1500 PLC 연동편 (0) | 2026.02.12 |
| OPC UA & C# 통신 예제 - OMRON NX/NJ PLC 연동편 (0) | 2026.02.12 |
| OPC UA & C# 통신 예제 – 미쯔비시 MELSEC PLC 연동편 (0) | 2026.02.12 |
| OPC UA 쉽게 이해하기: 구조부터 Python 예제까지 한눈에 정리! (0) | 2025.06.09 |