0

我有一个节点 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 等客户端中看到这一点,并调用可以正常工作的方法:

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 客户端应用程序,它在 Trends 对象下没有显示任何内容:

OPC UA 客户端应用程序

其他一切似乎都可以访问,我可以请求变量,设置监控一切都很好。

有什么我只是在这里遗漏的东西,还是 QtOpcUa 和其他客户的问题?

我可以通过创建变量而不是捕获输入和输出参数以及表示方法调用的布尔值来解决此问题,但是将所有内容绑定在一个方法中要简洁得多。

谢谢

4

0 回答 0