Eclipse Milo : Simatic S7-1500에서 사용자 지정 데이터 유형 노드 읽기 및 디코딩

Nov 26 2020

문제와 내가 의심하는 부분이 잘못되었습니다. Siemens Simatic S7-1500에서 사용자 지정 데이터 유형 노드를 읽으려고하는데 디코딩이 실패합니다.

Error running client example: max string length exceeded (length=1819042152, max=2097152)
org.eclipse.milo.opcua.stack.core.UaSerializationException: max string length exceeded (length=1819042152, max=2097152)

지금까지 수행 한 작업 : 우선 클라이언트 예제 모듈에서 ReadWriteCustomDataTypeNodeExample을 읽고 사용해 보았습니다. 기본적으로이 예제를 복사하고 10 개의 부울을 포함하는 Status라는 새 사용자 정의 유형에 대해 CustomStructType을 대체했습니다. CustomStructType 클래스와 마찬가지로, 디코더 .readBoolean ()을 사용하여 ByteString에서 부울 값을 읽는 정적 코덱을 Status에 추가했습니다. 이것은 완벽하게 작동합니다. 노드를 읽고 수정 한 다음 OPC UA 서버에 다시 기록했습니다. 여태까지는 그런대로 잘됐다.

    NodeId binaryEncodingId = new NodeId(3, "TE_\"DB_FUNCTION_STATUS\".\"TEST\"");
// Register codec with the client DataTypeManager instance
client.getDataTypeManager().registerCodec(
        binaryEncodingId,
        new TestNode.Codec().asBinaryCodec()
);

// synchronous read request via VariableNode
NodeId nodeId = new NodeId(3, "\"DB_FUNCTION_STATUS\".\"TEST\"");
UaVariableNode node = client.getAddressSpace().getVariableNode(nodeId);
DataValue value = node.readValue();

logger.info("====== Reading value from OPC UA Server =======");
logger.info("Value={}", value);

Variant variant = value.getValue();
ExtensionObject xo = (ExtensionObject) variant.getValue();

TestNode decoded = (TestNode) xo.decode(
        client.getSerializationContext()
);
logger.info("Decoded={}", decoded);

다음으로 위와 동일하게 수행하고 싶지만 문자열과 정수를 포함하는 다른 사용자 정의 유형 TestNode를 사용합니다. 디코더 .readString () 및 디코더 .readInt16 ()을 사용하는 코덱으로 클래스를 만들었습니다. 이 노드에 대한 ByteString을 읽고 디코딩하려고하면 두 가지 문제가 나타납니다.

  • readInt16 ()은 UaExpert로이 노드를 읽을 때 내가 보는 값과 다른 값을 읽습니다.
  • readString ()은 위에서 언급 한 예외를 발생시킵니다.

이 순간, 나는 조사를 시작했고 다음을 발견했습니다.

  • 나는 readString ()이 OPC UA String 유형 노드 ns0; i = 12를 사용한다고 가정합니다. https://support.industry.siemens.com/cs/document/109780313/under-which-node-ids-do-you-find-the-type-descriptions-of-the-simatic-data-types-in-the-opc-ua-server-of-a-simatic-s7-1200-s7-1500-?dti=0&lc=en-GB, Siemens OPC UA 서버는 ns = 3; i = 3014를 사용합니다. 이것은 아마도 그것이 잘못된 곳이지만 확실하지 않습니다.
  • 또한 readInt16 ()이 실제 값과 다른 값을 읽는 이유를 이해할 수 없습니다. 값 및 데이터 유형과 함께 UaExpert의 노드를 보여주는 스크린 샷을 추가했습니다. 이미지 : UaExpert의 TestNode

이 상황에서 내 옵션은 무엇입니까?

답변

JakubZnamenáček Dec 01 2020 at 13:00

나는이 주제 에서왔다

Java에서 구조에 대한 코드를 제공 할 수 있습니까? 나는 그것을 테스트 할 수 있도록 동일한 PLC를 가지고 있습니다.

BTW 나는 문제없이 Int32와 String을 읽을 수있었습니다. 이 얼마나 내 옆에있는 유형의 외모 문자열 , INT32 . 위에서 제공 한 링크 를 확인 했고 우리의 int가 비슷하여 문제가 없지만 내 문자열이 다릅니다.