PLCnext Control에서 OPC UA 클라이언트 구성 단계별 가이드
펌웨어 버전 2023.0에는 오랫동안 기다려온 OPC UA 클라이언트 구성 요소가 포함되어 있습니다. PLCnext Info Center에는 이 기능에 대한 좋은 기술 참조가 있습니다.
이 튜토리얼은 PLCnext Control 장치에서 OPC UA 클라이언트를 구성해 OPC UA 서버와 데이터를 교환하는 방법을 단계별로 보여줍니다.
필요한 것:
- 펌웨어 버전 2023.0 이상을 실행하는 PLCnext Control 장치(OPC UA 클라이언트 역할). PLCnext Control 장치의 펌웨어 업그레이드가 필요하면 Info Center에 표시된 절차를 따르세요.
- PLCnext Engineer 버전 2023.3 이상.
- OPC UA 서버. 이 기사에서는 두 번째 PLCnext Control 장치를 OPC UA 서버로 사용하지만, 클라이언트에 사용하는 것과 같은 PLCnext Control 장치를 사용하거나 또는 (예: Windows PC에서 실행되는) 제3자 OPC UA 서버를 사용할 수도 있습니다. 제3자 서버의 경우 아래 "서버" 단계를 해당 서버에 맞게 조정하는 방법을 찾아야 합니다.
- Unified Automation의 UaExpert. OPC UA 서버 태그에 대한 정보를 얻어 우리 OPC UA 클라이언트 구성에 사용하기 위해 필요합니다.
OPC UA 통신 구성 시 기억해야 할 핵심 사항 중 하나는 보안상의 이유로 OPC UA 클라이언트와 OPC UA 서버가 서로를 신뢰해야 한다는 것입니다. 따라서 클라이언트와 서버 장치 간에 보안 인증서가 교환되어야 합니다. 이 절차는 클라이언트 장치와 서버 장치 사이를 오가야 하므로 다소 혼란스러울 수 있습니다. 보안 검사를 비활성화하지 않고 절차를 단순화하는 제안이 있으면 댓글로 자유롭게 추가해 주세요.
절차
OPC UA 서버 장치
-
PLC의 IP 주소로 브라우징해 웹 기반 관리(WBM) 사이트를 엽니다.
-
구성 메뉴에서 System Services 항목을 선택합니다.
-
이미 활성화되어 있지 않다면 OPC UA Server 서비스를 활성화합니다.
-
필요한 경우 Apply and reboot 버튼을 누릅니다.
-
PLCnext Engineer를 엽니다.
-
PLCnext Control 장치용 템플릿을 사용해 새 PLCnext Engineer 프로젝트를 생성합니다.
-
PLCnext Engineer 프로젝트에서 PLC의 IP 주소를 설정합니다.
-
OPC UA Server 구성 페이지에서:
-
DNS name / IP address를 클라이언트가 서버에 접근할 때 사용할 DNS 이름이나 서버의 IP 주소로 설정합니다. 이 정보는 OPC UA 서버 보안 인증서에 포함됩니다. 많은 OPC UA 클라이언트는 인증서의 이 정보가 서버 URL과 일치하지 않으면 서버 인증서를 거부합니다.
-
Visibility of variables를 Marked로 설정합니다. 이는 OPC 속성으로 표시된 모든 변수가 OPC UA 서버를 통해 접근 가능함을 의미합니다.
-
OPC UA 서버가 노출할 변수를 생성합니다. 해당 변수에 OPC 체크박스가 체크되어 있는지 확인하세요. 아래 예제에서는 Main 프로그램에 두 개의 변수가 생성되었습니다.
-
새 Input 값 수신 시 Output 변수가 변경되도록 로직을 추가합니다. 이 예제에서 Main 프로그램은 다음 코드를 실행합니다:
Server_Data_Out := Server_Data_In + 1;
-
프로젝트를 작성하고 시작합니다.
참고: PLCnext Engineer 버전 2025.0 이상에는 OPC UA 클라이언트에서 변수 항목을 생성하는 데 사용할 수 있는 "browse" 기능이 포함되어 있습니다. 이 탐색 기능을 사용하면 UaExpert를 사용해 서버 변수 정보를 얻을 필요가 없으며, 다음 세 단계를 건너뛸 수 있습니다.
-
UaExpert를 사용해 PLC 사용자명과 암호로 OPC UA 서버에 연결합니다. 인증서가 "Untrusted"라는 경고가 표시되지만 다른 경고는 없어야 합니다.
-
서버 인증서를 영구적으로 또는 이번 세션만 신뢰합니다.
-
각 서버 변수에 대해 Node ID 이름과 Namespace를 기록합니다.
-
서버 PLC의 WBM 사이트를 다시 엽니다.
-
보안 메뉴에서 Certificate Authentication 항목을 선택합니다.
-
Identity Stores 탭을 선택합니다.
-
OPC UA-self-signed [서버] Identity Store에서 인증서를 다운로드합니다. 키 쌍은 다운로드할 필요가 없습니다.
OPC UA 클라이언트 장치
-
PLC의 IP 주소로 브라우징해 웹 기반 관리(WBM) 사이트를 엽니다.
-
구성 메뉴에서 System Services 항목을 선택합니다.
-
이미 활성화되어 있지 않다면 OPC UA Client 서비스를 활성화합니다.
-
필요한 경우 Apply and reboot 버튼을 누릅니다.
-
재부팅 완료 후 WBM 사이트에 다시 로그인하고 보안 메뉴에서 Certificate Authentication 항목을 선택합니다.
-
Trust Stores 탭을 선택합니다.
-
앞서 다운로드한 OPC UA-self-signed [서버] 인증서를 OPC UA Client라는 Trust Store에 추가합니다. 이제 OPC UA 클라이언트는 OPC UA 서버가 신원을 확인하는 데 사용하는 보안 인증서를 신뢰합니다. 이 단계는 서버 인증서가 변경될 때마다 반복해야 합니다.
-
Identity Stores 탭을 선택합니다.
-
OPC UA Client self-signed Identity Store에서 인증서를 다운로드합니다. 키 쌍은 다운로드할 필요가 없습니다.
OPC UA 서버 장치
-
PLC의 IP 주소로 브라우징해 웹 기반 관리(WBM) 사이트를 엽니다.
-
보안 메뉴에서 Certificate Authentication 항목을 선택합니다.
-
Trust Stores 탭을 선택합니다.
-
앞서 다운로드한 OPC UA Client self-signed 인증서를 OPC UA-configurable이라는 Trust Store에 추가합니다. 이제 OPC UA 서버는 OPC UA 클라이언트가 신원을 확인하는 데 사용하는 보안 인증서를 신뢰합니다. 이 단계는 클라이언트 인증서가 변경될 때마다 반복해야 합니다.
OPC UA 클라이언트 장치
-
PLCnext Engineer를 엽니다.
-
PLCnext Control 장치용 템플릿을 사용해 새 PLCnext Engineer 프로젝트를 생성합니다. OPC UA 클라이언트와 서버에 같은 장치를 사용하는 경우 같은 PLCnext Engineer 프로젝트가 사용됩니다.
-
PLCnext Engineer 프로젝트에서 PLC의 IP 주소를 설정합니다.
-
펌웨어 버전 2023.6 이전 PLC만 해당: OPC UA Server 구성 페이지에서 Visibility of variables를 Marked로 설정합니다. OPC UA 클라이언트를 위해 이 OPC UA 서버 설정이 필요해 이상해 보이지만, 펌웨어 버전 2023.6 이상에서 수정되었습니다.
-
OPC UA 서버의 변수와 연결될 변수를 생성합니다. 펌웨어 버전 2023.6 이전 PLC만 해당: 해당 변수에 OPC 체크박스가 체크되어 있는지 확인하세요(펌웨어 버전 2023.6 이상에서는 체크박스가 필요하지 않습니다).
아래 예제에서는 Main 프로그램에 두 개의 변수가 생성되었습니다.
-
OPC UA Client Connections 탭에서 아래와 같이 서버 1개와 변수 그룹 2개를 추가합니다.
서버 URL, 사용자명, 암호는 사용하는 OPC UA 서버에 맞게 변경해야 합니다.
-
"Subscribe" 변수 그룹에 아래와 같이 변수 매핑 1개를 추가합니다.
이렇게 하면 원격 변수( OPC UA 서버 상)의 값이 PLCnext Engineer 프로젝트의 로컬 변수로 자동 전송됩니다.
-
"Write" 변수 그룹에 아래와 같이 변수 매핑 1개를 추가합니다.
이렇게 하면 PLCnext Engineer 프로젝트의 로컬 변수 값이 원격 변수( OPC UA 서버 상)로 자동 전송됩니다.
-
PLCnext Engineer 프로젝트를 작성하고 시작합니다.
-
디버그 모드에서 변수 Client_Data_out의 값을 변경합니다. 이 값은 OPC UA 서버의 변수 Server_Data_In에 기록됩니다. 서버에서 이 값이 증가해 변수 Server_Data_Out에 기록됩니다. 해당 변수 값이 클라이언트의 변수 Client_Data_In로 전송됩니다.
작동하지 않나요?
PLCnext Info Center(페이지 하단)의 Troubleshooting Guide를 확인하세요.
자주 묻는 질문
Q: 클라이언트가 인증서/키 인증을 사용해 OPC UA 서버에 연결할 수 있나요?
A: 현재는 불가능합니다.
Q: OPC UA 클라이언트는 서버 암호를 어떻게 저장하나요?
A: 현재 OPC UA 서버 암호는 클라이언트 구성 파일에 평문으로 저장되지만, PLCnext Runtime 개발자들이 더 안전한 암호 저장 방법을 개발 중입니다.
Q: OPC UA 서버에서 읽은 데이터에 대한 품질 정보(예: 상태 코드, 타임스탬프)를 얻을 수 있나요?
A: 현재는 불가능합니다. 죄송합니다.
이 기사는 2025.03.24에 업데이트되어 PLCnext Engineer에서 이제 사용 가능한 Server Browse 기능에 대한 정보를 포함합니다.
부록: 파일 기반 구성
PLCnext Engineer의 OPC UA 클라이언트 구성은 컨트롤러에서 XML 형식으로 저장됩니다. PLCnext Engineer를 사용하지 않는 애플리케이션의 경우 컨트롤러에서 XML 구성을 직접 작성해 OPC UA 클라이언트를 구성할 수 있습니다.
이 예제에서 준비된 구성은 다음 XML 파일로 표현됩니다:
-
기본 OPC UA 클라이언트 설정에 필요한 변경 사항은 파일 /opt/plcnext/projects/current/Services/OpcUA/Modules/Client/client.module.config에 정의됩니다:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <OpcUAClientModuleConfigurationDocument schemaVersion="1.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.phoenixcontact.com/schema/opcuaclientmoduleconfig" xmlns="https://www.phoenixcontact.com/schema/opcuaclientmoduleconfig"> <Application> <CertificateStore> <SelfSignedIdentityStoreName>OPC UA Client self-signed</SelfSignedIdentityStoreName> <GivenIdentityStoreName>OPC UA Client</GivenIdentityStoreName> <TrustStoreName>OPC UA Client</TrustStoreName> </CertificateStore> <SessionSecurity> <ApplicationAuthentication>false</ApplicationAuthentication> <ApplicationUriCheck>true</ApplicationUriCheck> <CertificateHostnameCheck>true</CertificateHostnameCheck> <CertificateTimeCheck>true</CertificateTimeCheck> <CertificateIssuerTimeCheck>true</CertificateIssuerTimeCheck> <PasswordEncryptionCheck>true</PasswordEncryptionCheck> </SessionSecurity> <Timeouts> <SessionTimeout>1200000</SessionTimeout> <ConnectTimeout>5000</ConnectTimeout> <WatchdogTimeout>5000</WatchdogTimeout> <CallTimeout>10000</CallTimeout> </Timeouts> </Application> </OpcUAClientModuleConfigurationDocument>
-
OPC UA 클라이언트 연결은 파일 /opt/plcnext/projects/current/Services/OpcUA/Modules/Client/Configs/ clientconnections.xml에 정의됩니다:
<?xml version="1.0" encoding="utf-8"?> <eUAClientConfigurationDocument xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:uax="https://opcfoundation.org/UA/2008/02/Types.xsd" xmlns="https://phoenixcontact.com/OpcUA/PLCnext/UAClientConfig/Types.xsd"> <eUAClientConfiguration> <Name>ClientConnectionsConfiguration</Name> <NamespaceArray> <uax:String>https://phoenixcontact.com/OpcUA/PLCnext/GlobalDataSpace/</uax:String> </NamespaceArray> ServerConnections <eUAClientServerConnection> <EncodingMask>3</EncodingMask> <Endpoint> <uax:EndpointUrl>opc.tcp://192.168.1.10:4840</uax:EndpointUrl> <uax:SecurityMode>Sign_2</uax:SecurityMode> <uax:SecurityPolicyUri>https://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256</uax:SecurityPolicyUri> </Endpoint> <UserTokenType>UserName_1</UserTokenType> <UserName>admin</UserName> <Password>xxxxxxxx</Password> </eUAClientServerConnection> </ServerConnections> <VariableGroups> <eUAClientVariableGroup> <GroupType>Write_1</GroupType> <CycleTime>100</CycleTime> <NodeMappings> <eUAClientNodeMapping> <LocalVariable> <uax:Identifier>ns=1;s=Arp.Plc.Eclr/MainInstance.Client_Data_Out</uax:Identifier> </LocalVariable> RemoteVariableDescriptor <EncodingMask>2</EncodingMask> <ServerIndex>1</ServerIndex> <NodeId> <uax:Identifier>ns=1;s=Arp.Plc.Eclr/MainInstance.Server_Data_In</uax:Identifier> </NodeId> </RemoteVariableDescriptor> </eUAClientNodeMapping> </NodeMappings> </eUAClientVariableGroup> <eUAClientVariableGroup> <GroupType>Subscribe_0</GroupType> <CycleTime>100</CycleTime> <NodeMappings> <eUAClientNodeMapping> <LocalVariable> <uax:Identifier>ns=1;s=Arp.Plc.Eclr/MainInstance.Client_Data_In</uax:Identifier> </LocalVariable> RemoteVariableDescriptor <EncodingMask>2</EncodingMask> <ServerIndex>1</ServerIndex> <NodeId> <uax:Identifier>ns=1;s=Arp.Plc.Eclr/MainInstance.Server_Data_Out</uax:Identifier> </NodeId> </RemoteVariableDescriptor> </eUAClientNodeMapping> </NodeMappings> </eUAClientVariableGroup> </VariableGroups> </eUAClientConfiguration> </eUAClientConfigurationDocument>
이 파일은 앞서 UaExpert로 기록한 Namespace와 Node ID 정보를 사용해 클라이언트가 접근할 서버 변수를 지정합니다.
-
위 파일에서 다음을 애플리케이션에 맞게 변경하세요:
중요: 이 예제에서 UaExpert의 Node ID 문자열에 ns=6 텍스트가 포함되어 있었습니다. 위 XML 파일에서는 이것이 ns=1로 변경되었습니다. "namespace" 매개변수(ns)는 로컬 클라이언트의 네임스페이스 목록 인덱스이기 때문입니다. 이 예제에서 UaExpert에서 복사한 Namespace 이름이 우리 clientconfig.xml 파일의 네임스페이스 목록에서 첫 번째(유일한) 네임스페이스입니다.
OPC UA 클라이언트 구성 파일을 변경한 후 PLCnext Runtime을 재시작해야 합니다.