我有一个节点OPC服务器,可以使用QtOpcUa客户端库与Qt应用程序连接。
在我的服务器上,我定义了一个基本上是粗略的历史访问请求的方法,因为尚不支持HDA,它接受一个start_date和end_date,然后向数据库查询它在数组中返回的相关值。
它看起来像这样:
const deviceTrends = namespace.addObject({
organizedBy: deviceObject,
browseName: strings.TREND_NODE
})
const method = namespace.addMethod(deviceTrends,{
nodeId: strings.NSI + part.name + "-Trend",
browseName: part.name + "-Trend",
inputArguments: [
{
name:"start_date",
description: { text: "Trend Start Date" },
dataType: opcua.DataType.DateTime
},{
name:"end_date",
description: { text: "Trend End Date" },
dataType: opcua.DataType.DateTime
}
],
outputArguments: [{
name:"Trend",
description:{ text: "Trend Data from start_date to end_date" },
dataType: opcua.DataType.String ,
valueRank: 1
}]});
method.bindMethod(function(inputArguments,context,callback) {
console.log("called")
const start = inputArguments[0].value;
const end = inputArguments[1].value;
console.log("Start: ", start);
console.log("End: ", end);
let sql = `SELECT Date date,
Name name,
Value value
FROM Trends
WHERE DateTime >= ? AND DateTime <= ?`;
var result = []
db.each(sql, [start, end], (err, row) =>
{
result.push(`${row.date}: ${row.name} - ${row.value}`)
})
console.log(result)
const callMethodResult = {
statusCode: opcua.StatusCodes.Good,
outputArguments: [{
dataType: opcua.DataType.String,
arrayType: opcua.VariantArrayType.Array,
value :result
}]
};
callback(null,callMethodResult);});}
我可以在诸如Prosys之类的客户端中看到此情况,并调用可以正常工作的方法:
但是我似乎无法从Qt调用此方法,但是我已经切掉了参数和结果处理程序的包装(它只是列出了接收到的参数):
QOpcUaNode* n = devices[deviceName].client->node("ns=1;s=Speed-Trend");
connect(n, &QOpcUaNode::methodCallFinished, [this, deviceName](QString methodNodeId, QVariant result, QOpcUa::UaStatusCode status)
{
qDebug() << " Response received ";
this->handleNodeTrendResponse(deviceName, methodNodeId, result, status);
});
n->callMethod(n->nodeId(), args);
踪迹:
Requesting Trend: From QDateTime(2018-10-07 13:13:56.766 BST Qt::TimeSpec(LocalTime)) TO QDateTime(2018-10-07 13:14:05.390 BST Qt::TimeSpec(LocalTime))
qt.opcua.plugins.open62541: Could not call method: BadNodeIdInvalid
Response received [Output from method result handler]
Device Name: "speed-device"
Method Node Id: "ns=1;s=Speed-Trend"
Result: QVariant(Invalid)
Result to List: << ()
Status: QOpcUa::UaStatusCode(BadNodeIdInvalid)
我似乎也无法在其他客户端上找到该方法,这是从手机上的OPC UA客户端应用程序获得的,该应用程序在“趋势”对象下未显示任何内容:
其他一切似乎都可以访问,我可以请求变量,设置监视一切正常。
这里是否缺少我的东西,或者QtOpcUa和其他客户端有问题吗?
我可以通过创建变量来捕获输入和输出参数以及一个布尔值来表示方法调用来解决此问题,但是将所有内容捆绑在一个方法中则显得很整洁。
谢谢