728x90

 

  • 목표: 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 등의 툴 설정이 필요합니다.

kepware 채널 설정


필수 조건
:

  • 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 이용

728x90

+ Recent posts