0

我读过,与创建更多订阅相比,将多个变量放入一个订阅中是更好的做法。

我正在使用这个示例(https://github.com/node-opcua/node-opcua-htmlpanel)并想在订阅中阅读更多变量。

我的代码负责读取一个变量——一个节点。

const nodeIdToMonitor = 'ns=3;s="OP_UA_FB_DB"."OPC_Data"."Data_integer"';

const itemToMonitor = {
      nodeId: nodeIdToMonitor,
      attributeId: AttributeIds.Value,
    };
    const parameters = {
      samplingInterval: 100,
      discardOldest: true,
      queueSize: 100,
    };
    const monitoredItem = await subscription.monitor(
      itemToMonitor,
      parameters,
      TimestampsToReturn.Both
    );

    monitoredItem.on("changed", (dataValue) => {
      io.sockets.emit("message", {
        value: dataValue.value.value,
        timestamp: dataValue.serverTimestamp,
        nodeId: nodeIdToMonitor,
        browseName: "ISP",
      });
    });
4

1 回答 1

2

要在一个订阅中监视多个变量,您可以使用monitorItems方法调用。此方法调用将要监视的节点数组作为输入,并为数组中存在的所有节点创建监视项。

这是一个示例代码片段,您可以使用它来监控多个节点,

const parameters1: MonitoringParametersOptions = {
    discardOldest: true,
    queueSize: 100,
    samplingInterval: 100,
    filter: new DataChangeFilter({
        deadbandType: DeadbandType.Absolute,
        deadbandValue: 0.1,
        trigger: DataChangeTrigger.StatusValueTimestamp,
    }),
};
const itemsToMonitor2: ReadValueIdOptions[] = [
{
    attributeId: AttributeIds.Value,
    nodeId: nodeIdToMonitor
},
{
    attributeId: AttributeIds.Value,
    nodeId: nodeIdToMonitor1
}];

const item2 = (await subscription.monitorItems(
    itemsToMonitor2,
    parameters1,
    TimestampsToReturn.Both))

// If a data change is detected print the value
item2.on("changed", (monitoredItem: ClientMonitoredItemBase, dataValue: DataValue, index: number) => {
    console.log("Index", index);
    console.log(" The value has changed : ", dataValue.toString());  
});

我看到您正在使用开源 OPC UA 实现。以下是您可能有兴趣尝试的开源实现列表:

如果您正在寻找更多实践信息,还可以查看以下资源:

于 2020-07-21T11:39:16.763 回答