Невозможно записать в тег с помощью node-opcua (BadTypeMismatch)
Я использую node-opcua, чтобы написать логическое значение для установки тега сброса. Вот мой код:
var nodesToWrite = new Array();
nodesToWrite.push({
nodeId: 'ns=2;s=Paint.PLC.Reset_Auto_Blocked_Time',
attributeId: opcua.AttributeIds.Value,
indexRange: null,
value: {
value: {
dataType: opcua.DataType.Boolean,
value: true
}
}
});
self.uaSession.write(nodesToWrite, function (err, statusCode, diagnosticInfo) {
if (!err) {
console.log(" write ok");
console.log(statusCode);
console.log(diagnosticInfo);
} else {
console.log(" write err = ", err);
}
})
На самом деле он не вызывает "err", потому что консоль записывает это:
[{ [Number: 2155085824
value: 2155085824,
description: 'The value supplied for the attribute is not of the same type as the attribute\'s value.',
name: 'BadTypeMidmatch' }]
[]
Однако это явно ошибка, и запись никогда не завершается. Тег установлен в KEPServer как логическое значение и работает нормально. Я не уверен, почему он говорит, что это несоответствие. Любая помощь?
1 ответ
Просто используйте "Boolean" в value.value.dataType.
Пример:
nodesToWrite.push({
nodeId: 'ns=2;s=Paint.PLC.Reset_Auto_Blocked_Time',
attributeId: opcua.AttributeIds.Value,
indexRange: null,
value: {
value: {
dataType: "Boolean",
value: true
}
}
});
Есть возможность читать builtInType узлов
const nodeToRead = {
nodeId: 'ns=2;s=Paint.PLC.Reset_Auto_Blocked_Time',
attributeId: opcua.AttributeIds.DataType,
};
const dataValue = await self.uaSession.read(nodeToRead);
// check IdentifierType(Numeric) and identifierNumeric(1 to 25) of dataType
// E.g: Boolean - 1, String - 12, Int16 - 4 , etc
// Fill nodesToWrite depending on the builtInType
const nodesToWrite = [];
nodesToWrite.push({
nodeId: 'ns=2;s=Paint.PLC.Reset_Auto_Blocked_Time',
attributeId: opcua.AttributeIds.Value,
indexRange: null,
// check builtInType-type and fill nodesToWrite
});
await self.uaSession.write(nodesToWrite);
Похоже, opcua.DataType.Boolean не является ожидаемым типом.
Сначала я произвел бы чтение переменной, чтобы проверить, какой тип dataType установлен:
var nodeToRead = {
nodeId: 'ns=2;s=Paint.PLC.Reset_Auto_Blocked_Time',
attributeId: opcua.AttributeIds.Value,
};
self.uaSession.read(nodeToRead , function (err, dataValue) {
if (!err) {
console.log(" read ok");
console.log(dataValue.toString());
} else {
console.log(" read err = ", err);
}
});