IT’s Ha

[OPC] 5. C#을 통한 OPC UA Client 개발 - Write 본문

OPC

[OPC] 5. C#을 통한 OPC UA Client 개발 - Write

Deleloper Ha 2024. 2. 15. 22:53
728x90
반응형

안녕하세요. 이번 포스팅은 OPC UA Client Write 문의가 와서 급하게 작성하였습니다.

이번 포스팅은 먼저 급하게 작성하고, 그 동안 다른 일에 집중하느라 늦었습니다.
그리고 테스트가 부족하여 양해 부탁드립니다.
이번 포스팅은 소스만 안내드리고, 문제 있는 부분에 대해서는 댓글과 메일 주시면 답변 드리도록 하겠습니다.

먼저, 하기위해 이전글에 대해서 참고 부탁드립니다. 

2023.03.30 - [OPC] - [OPC] 4. C#을 통한 OPC UA Client 개발

 

[OPC] 4. C#을 통한 OPC UA Client 개발

안녕하세요. 이번 포스팅은 OPC UA Client를 개발 포스팅을 진행하겠습니다. 이번 포스팅의 개발 환경은 C#을 통하여 개발하였고, .NET 7.0 그리고 Winform에서 구현하였습니다. 그리고 이전 포스팅에 대

oppr123.tistory.com

 1. OPC Ua Client Write

 private void nodeWrite(Session session, string nodeId, object value)
{
    try
    {
        // Value 값이 없으면 return
        if (value == null)
            return;
        WriteValueCollection nodeValues = new WriteValueCollection();
        WriteValue nodeWrite = new WriteValue();
        nodeWrite.NodeId = nodeId;
        nodeWrite.AttributeId = Attributes.Value;
        nodeWrite.Value.WrappedValue = new Variant(value);


        /*
         * 1. Request Header를 이용한 처리 
         * */
        RequestHeader requestHeader = new RequestHeader();
        requestHeader.ReturnDiagnostics = (uint)DiagnosticsMasks.All;

        // Result 처리를 위한 변수 
        StatusCodeCollection results = null;
        DiagnosticInfoCollection diagnosticInfos = null;

        ResponseHeader responseHeader = session.Write(
            requestHeader,
            nodeValues,
            out results,
            out diagnosticInfos);

        ClientBase.ValidateResponse(results, nodeValues);
        ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodeValues);

        //결과에 대한 처리 
        if (StatusCode.IsBad(results[0]))
        {
            if (EventList.Items.Count > 100)
                EventList.Items.RemoveAt(EventList.Items.Count - 1);
            EventList.Items.Insert(0, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            EventList.Items[0].SubItems.Add("[Write 에러 ]");
        }
        /*
         * 2. Session에 Write 처리 
         * */

        ResponseHeader result2 = session.Write(null, nodeValues, out _, out _);

        // 결과를 확인하여 에러가 있는지 확인합니다.
        
    }
    catch (Exception ex)
    {
        if (EventList.Items.Count > 100)
            EventList.Items.RemoveAt(EventList.Items.Count - 1);
        EventList.Items.Insert(0, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        EventList.Items[0].SubItems.Add("[Write 에러 ] : "+ ex.ToString() );
    }
}

일단 2가지 방법으로 설명을 하였습니다. 하나는 ResponseHeader에 응답을 기다리고 결과를 처리하기 위한 방법과 그냥 결과를 처리하지 않고 쓰기만 하기 위한 2가지 방법을 표현 하였습니다. 1번이 조금더 여러가지 경우에 수를 대비 할 수있을 거라 예상합니다.

위에서 말씀드린거처럼 테스트화면까지 보여드리지 못하여 죄송합니다. 지금은 PLC가 없어 기회가 생기는데로 다시 한번 올리도록 하겠습니다. 

궁금하신 점이나 잘못된 점은 메일 또는 댓글에 남겨 주시면 수정 또는 답변 드리도록 하겠습니다. 감사합니다.

728x90
반응형

'OPC' 카테고리의 다른 글

[OPC] 4. C#을 통한 OPC UA Client 개발  (31) 2023.03.30
[OPC] 3. OPC UA와 PLC 통신 예제  (7) 2023.03.15
[OPC] 2. OPC UA와 OPC DA의 차이, PLC와 OPC통신  (0) 2023.03.15
[OPC] 1. OPC UA 서버의 이해  (0) 2023.03.08
[OPC]OPC  (0) 2023.02.15
Comments