Запишите значение с помощью OPC UA Java (OPC Foundation)

Я пытаюсь подключиться к удаленной среде с помощью java-стека OPC UA от OPC Foundation. Чтение значений работает правильно, для этого я использую следующий код:

NodeId nodeId= NodeId.get(IdType.String, 2, "TYPES!M!MULTIPLYER!MU_79.MULTIPLYER_BIAS");
ReadResponse res = mySessionChannel.Read(null, 500.0, TimestampsToReturn.Source, new ReadValueId(nodeId, Attributes.Value, null, null));

Теперь я пытаюсь использовать команду записи, чтобы установить эту (входную) переменную следующим образом:

NodeId nodeId = NodeId.get(IdType.String, 2, "TYPES!M!MULTIPLYER!MU_79.MULTIPLYER_BIAS");
DataValue dataValue = new DataValue(new Variant(999));
WriteValue writeValue[] = new WriteValue[1];
writeValue[0] = new WriteValue(nodeId, Attributes.Value, "0", dataValue);

RequestHeader requestHeader = new RequestHeader(nodeId, null, null, null, null, null, null);
WriteRequest writeRequest = new WriteRequest(requestHeader, writeValue);
WriteResponse response = mySessionChannel.Write(writeRequest);

Команда записи выполняется без ошибок, но значение никогда не меняется. Кто-нибудь может мне помочь?


person user3083205    schedule 11.12.2013    source источник


Ответы (1)


Вы определяете «0» как IndexRange (3-й параметр WriteValue). Я считаю, что у вас есть скалярная переменная, поэтому вместо этого вы должны просто использовать null.

Также вам нужно проверить ответ, чтобы увидеть, успешен он или нет.

E: параметр записи должен соответствовать DataType узла Variable.

person Jouni Aro    schedule 11.12.2013
comment
Я изменил его на null, значение не меняется, и ответ следующий: WriteResponse (id = 1474131049) ResponseHeader = ResponseHeader (id = 676105376) ServiceDiagnostics = DiagnosticInfo (id = 967078155) localizedText = null locale = null innerDiagnosticInfo = null inner symbolicId = null = null additionalInfo = null stringTable = null stringArray = class java.lang.String [0] namespaceUri = null StringTable = class java.lang.String [0] - person user3083205; 12.12.2013
comment
RequestHandle = UnsignedInteger (id = 1526310589) значение = 1 Timestamp = DateTime (id = 1925333515) value = 130393207472672000 AdditionalHeader = null ServiceResult = StatusCode (id = 2163771) значение = 0 DiagnosticInfos = class org.opcagniltinfo.ua. ] Results = class org.opcfoundation.ua.builtintypes.StatusCode [1] [0] = StatusCode (id = 2006760845) значение = -2139881472 - person user3083205; 12.12.2013
comment
Лучше распечатать StatusCodes в виде строки: она сообщит вам фактический код, например response.getResults () [0] - person Jouni Aro; 13.12.2013
comment
Для меня это действительно имеет больше смысла: Bad_TypeMismatch (0x80740000) Значение, указанное для атрибута, не того же типа, что и значение атрибута. Теперь посмотрим, как я могу это исправить. - person user3083205; 16.12.2013
comment
Вам нужно найти DataType узла, на который вы пишете, и указать соответствующее значение. UA не позволяет серверу автоматически преобразовывать типы данных. - person Jouni Aro; 18.12.2013