Чтение настраиваемого узла из OPCUA с помощью C ++ SDK - строка в качестве идентификатора узла - PullRequest
1 голос
/ 05 мая 2020

Я использую OP C UAs C ++ SDK и пытаюсь прочитать настраиваемые узлы.

При выполнении предоставленного примера сценария он отлично работает для чтения метки времени серверов (после урока 1: https://documentation.unified-automation.com/uasdkcpp/1.5.5/html/L3GettingStartedClientLesson01.html)

Теперь я пытаюсь прочитать настраиваемый узел, где идентификатор узла представляет собой строку - снимок экрана из UaExpert:

enter image description here

Но у меня возникла проблема с его реализацией вот так:

UaStatus SampleClient::read()
{
    UaStatus          result;
    ServiceSettings   serviceSettings;
    UaReadValueIds    nodeToRead;
    UaDataValues      values;
    UaDiagnosticInfos diagnosticInfos;
   // Configure one node to read
   // We read the value of the ServerStatus -> CurrentTime
   nodeToRead.create(1);
   //nodeToRead[0].AttributeId = OpcUa_Attributes_Value;
   //nodeToRead[0].NodeId.Identifier.Numeric = OpcUaId_Server_ServerStatus_CurrentTime;
   nodeToRead[0].AttributeId = 1;
   nodeToRead[0].NodeId.Identifier.String = "DISPLAY_VOLTAGE"; //"cant find operator which supports 
                                                               //type const char[16]"
   ...

Я также не уверен, является ли AttributeIde номером пространства имен NodeID, но я ничего не нашел иначе называется «AttributeId».

Возможно, мне нужно реализовать здесь свой собственный атрибут, но я не знаю, как:

typedef struct _OpcUa_String
{
    OpcUa_UInt          uReserved1;     /* Content is private to String Implementation */
#if OPCUA_STRING_SHORT
    OpcUa_UInt16        uReserved2;     /* Content is private to String Implementation */
#else /* OPCUA_STRING_SHORT */
    OpcUa_UInt32        uReserved2;     /* Content is private to String Implementation */
#endif /* OPCUA_STRING_SHORT */
    OpcUa_Void*         uReserved4;     /* Content is private to String Implementation */
} OpcUa_String, *OpcUa_pString;
#endif

Надеюсь, вы, ребята, подскажете, как для решения этой проблемы.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Я нашел способ, который работает:

nodeToRead[0].AttributeId = OpcUa_Attributes_Value;
UaNodeId volt(UaString("DISPLAY_VOLTAGE"), 1); //("Identifierstring", Namespace)
volt.copyTo(&nodeToRead[0].NodeId);
0 голосов
/ 05 мая 2020

Я думаю, вам стоит подумать о том, чтобы в будущем разместить свой вопрос на форуме Unified Automation, поскольку вы используете их продукт.

Я также думаю, что это должно сработать: , - значение, представляющее свойство узла, который вы хотите прочитать. В вашем случае Value, поэтому вы должны использовать OpcUa_Attributes_Value.

Вы также можете использовать OpcUa_Attributes_DisplayName, OpcUa_Attributes_NodeClass, ... в зависимости от того, какие свойства OP C UA узла, которые вы хотите прочитать. Вы можете найти список атрибутов здесь

...