Python OPC-UA

10059 단어 Pythonopcuatech

하고 싶은 일


클라이언트 PC 측 Pytohon에서 OPC-UA 서버에 연결하고 싶습니다.

배경.


작업 중에는 현장 버스를 사용하는 개발 환경을 갖추어야 한다.
이더넷, PROFFINET 등 공업용 현장 버스를 이용하여 통신을 하려면 환경을 만들기가 매우 어렵다.나는 간단하게 구축할 수 있는 환경이 없다고 생각한다.
OPC-UA가 등장했습니다.
OPC-UA는 상기 현장 버스의 협의를 지원하기 때문에 OPC-UA 서버가 구축될 수 있다면 클라이언트는 현장 버스 통신을 할 필요가 없다.
또 이 서버는 래스퍼리피에서도 구축이 가능하다는 점[1]도 좋았다.
간단한 환경이라면 값싼 구축이 큰 동력이 될 수 있으니 한번 해보고 싶어요.

컨디션

  • OS:Windows11
  • Python:3.8.10
  • 서버측


    우선 서버 준비를 하세요.
    서버는 Unified-Automation의 데모 서버를 사용합니다.
    웹 사이트 위 레이블의 "Downloads"에서 "OPC UA Servers"를 선택하면 OPC UC++ Demo Server(Windows)에서 다운로드할 수 있습니다.
    !
    Demo Server를 다운로드하려면 사용자가 로그인해야 합니다.
    다운로드 설치가 완료되면 서버 응용 프로그램을 시작합니다.
    아마도 이때 한 서버opc.tcp://localhost:48010가 일어났을 것이다.
    터미널이 나오면 다음과 같은 내용이 나타날 것이다.
    UaCPPServer
    ***************************************************
     Server opened endpoints for following URLs:
         opc.tcp://host_name:48010
    ***************************************************
    ***************************************************
     Press x to shutdown server
    ***************************************************
    
    👆host_나는name가 실제로는 자신의 컴퓨터 이름이라고 생각한다.
    서버 측의 준비는 이것으로 끝냅니다.

    클라이언트


    다음은 고객을 위한 준비입니다.
    클라이언트는python의 freeopcua 프로그램 라이브러리를 사용합니다.
    pip라면 다음과 같이 설치할 수 있습니다.
    pip install opcua
    
    작업을 확인하는 클라이언트 어플리케이션
    처음에는 어떤 물건인지 몰라서 인터넷 앱에 의존했다.
    클라이언트 애플리케이션에는 UaExpert라는 애플리케이션이 있습니다.
    이것도 Unified-Automation 웹사이트에서 OPC UA Client→Ua Expert로 다운로드할 수 있다.(또 후술 코드의 노드에 대한 조사 방법을 몰라서 이번에 이 프로그램으로 조사를 진행했다.)
    [추기]
    freeopcua가github에 게재한Simple OPC-UA GUI client라는 응용 프로그램도 있다.pip install opcua-client에 설치하고 opcua-client에 시작합니다.
    이 편리한 곳은 데이터를 간단하게 도표로 표시할 수 있는 곳이다.
    메뉴에 차트 추가를 표시하려면 노드 목록에서 마우스 오른쪽 버튼을 클릭합니다.
    업데이트 간격Interval을 조정할 수 있습니다.

    각본


    freeopcua github의 example부터 만지작거려client-minimal.py.
    client-minimal_demo.py
    import sys
    sys.path.insert(0, "..")
    
    from opcua import Client
    
    try:
    	client = Client("opc.tcp://localhost:48010") # connect to demo server
    	client.connect()
    
    	root = client.get_root_node()
    	print("Objects node is: ", root)
    	print("Children of root are: ", root.get_children())
    	var = root.get_child([
    		"0:Objects", 
    		"0:Server", 
    		"3:AreaAirConditioner",
    		"3:AirConditioner_1",
    		"3:Temperature",
    	])
    	print("var is: ", var)
    	print(var.get_data_value())
    finally:
    	client.disconnect()
    
    Client에서 실례적인 고객류를 connect에 연결한다.root = client.get_root_node()에서 루트 노드를 얻었습니다.root.get_children()는 루트의 하위 노드입니다.var = root.get_child에서 직접 가져올 노드를 지정할 수 있습니다.
    여기var에서 프레젠테이션 서버의 AirConditioner 모델의 온도Temperature를 얻습니다.var.get_data_value()를 통해 var의 데이터를 얻다.var.get_value()에서도 노드의 값만 꺼낼 수 있습니다.
    그럼 이 스크립트를 실행하세요.

    실행 결과


    다음 출력을 얻었습니다.
    cryptography is not installed, use of crypto disabled
    cryptography is not installed, use of crypto disabled
    Objects node is:  i=84
    Children of root are:  [Node(TwoByteNodeId(i=87)), Node(TwoByteNodeId(i=85)), Node(TwoByteNodeId(i=86))]
    var is:  ns=3;s=AirConditioner_1.Temperature
    DataValue(Value:Variant(val:71.26239999999964,type:VariantType.Double), StatusCode:StatusCode(Good), SourceTimestamp:2022-05-01 03:53:33.253081)
    
    최초의 출력에서 Node id를 얻었고 마지막 출력에서 변수 데이터의 노드와 그 값을 얻을 수 있다.
    !AirConditioner_1Tempurature71.26...로 에어컨 온도의 표시(섭씨가 아니라 화씨인 것 같다)로 알 수 있다.
    cryptography is not installed, use of crtpto disabled
    이런 로그는 출력되지만 암호화 프로토콜을 사용하지 않아서 출력된 로그입니다.사용 시 증명서 등이 필요합니다.

    총결산·감상

  • Demo Server를 사용하여 OPC-UA 테스트용 서버를 구축했습니다.
  • freeopcua 라이브러리로 테스트용 클라이언트 스크립트를 기술하고 실행합니다.
  • 스크립트 자체는 생각보다 간단하게 썼고github의 example에는 재연 후 바로 움직이는 스크립트가 남아 있어 문서를 찾지 못하더라도 직감적으로 무엇을 쓸 수 있다.
    데이터만 얻으면 금방 뭐라도 할 수 있을 것 같은데.
    이어 랩베리피에 OPC-UA 서버를 구축해 파이톤에서 통신을 시작해 보려고 한다.
    각주
    https://www.slideshare.net/ssuserd477fa/ethercatprofinet-opc-ua ↩︎

    좋은 웹페이지 즐겨찾기