0

我正在使用 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 中设置为布尔值并且工作正常。我不知道为什么它说它是不匹配的。有什么帮助吗?

4

3 回答 3

0

只需在 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
            }
        }
    });
于 2019-08-21T02:32:28.370 回答
0

有一个选项可以读取节点的 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);
于 2019-08-24T21:36:40.717 回答
0

看起来 opcua.DataType.Boolean 不是预期的类型。

我将首先读取变量以验证设置的数据类型:

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);
    }
});
于 2018-08-30T16:53:01.673 回答