使用java的milo框架访问OPCUA服务的过程

使用Java的Milo框架访问OPCUA服务的过程包括以下步骤:

  1. 引入依赖

在Maven项目中,需要在pom.xml文件中引入以下依赖:

<dependencies>
    <dependency>
        <groupId>org.eclipse.milo</groupId>
        <artifactId>milo-client-sdk</artifactId>
        <version>0.3.9</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.milo</groupId>
        <artifactId>milo-sdk-server</artifactId>
        <version>0.3.9</version>
    </dependency>
</dependencies>

这里我们使用的是Milo的客户端和服务端sdk。

  1. 创建OPCUA客户端
// 创建 OPCUA client
OpcUaClientConfig config = OpcUaClientConfig.builder()
    .setApplicationName(LocalizedText.english("OPCUA-Client"))
    .setApplicationUri("urn:localhost:OPCUA:Client")
    .setEndpoint(endpoint)
    .setRequestTimeout(uint(5000))
    .build();

OpcUaClient client = OpcUaClient.create(config);

其中,endpoint是OPCUA服务的地址。在该步骤中,我们创建了一个OPCUA客户端的配置,然后使用配置创建了一个OPCUA客户端。

  1. 连接OPCUA服务
// 连接OPCUA服务
client.connect().get();

在此步骤中,我们通过client.connect().get()方法连接OPCUA服务。

  1. 读取节点值
// 读取节点值
List<NodeId> nodeIds = new ArrayList<>();
nodeIds.add(new NodeId(2, "/Static/AllProfiles/DeviceSetPoint"));
nodeIds.add(new NodeId(2, "/Dynamic/CoolingWaterInletTemperature"));

Map<NodeId, DataValue> values = client.readValues(0, TimestampsToReturn.Both, nodeIds).get();

for(Map.Entry<NodeId, DataValue> entry : values.entrySet()) {
    NodeId nodeId = entry.getKey();
    DataValue dataValue = entry.getValue();
    System.out.println(nodeId + " value is " + dataValue.getValue().getValue());
}

以上代码展示了如何读取两个节点的值。在readValues方法中,第一个参数是最大的数据变化历史记录数;第二个参数是时间戳返回模式;第三个参数是Node ID列表。在读取完成后,我们可以迭代values的条目并输出每个节点的值。

  1. 写入节点值
// 写入节点值
NodeId nodeId = new NodeId(2, "/Dynamic/CoolingWaterInletTemperature");
DataValue setValue = new DataValue(new Variant(Double.valueOf("50.5")));
StatusCode statusCode = client.writeValue(nodeId, setValue).get();

以上代码展示了如何写入节点的值。在写入之前,我们需要指定要写入的节点并构造要写入的DataValue。在写入完成后,我们可以通过getValue()方法获取写入的值,并检查StatusCode以确保写入成功。

示例1:

import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue;
import org.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText;
import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
import org.eclipse.milo.opcua.stack.core.types.builtin.Variant;
import org.eclipse.milo.opcua.stack.core.types.structured.EndpointDescription;
import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
import org.eclipse.milo.opcua.sdk.client.api.session.ClientSession;
import org.eclipse.milo.opcua.sdk.client.api.subscriptions.UaMonitoredItem;
import org.eclipse.milo.opcua.sdk.client.api.subscriptions.UaSubscription;
import org.eclipse.milo.opcua.sdk.client.subscriptions.OpcUaSubscriptionManager;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;

import static org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned.uint;

public class OPCUAExample {

    public static void main(String[] args) throws Exception {
        // OPCUA服务地址
        String endpointUrl = "opc.tcp://localhost:53530/OPCUA/SimulationServer";

        // 创建OPCUA客户端
        EndpointDescription endpoint = EndpointDescription.parse(endpointUrl);
        OpcUaClientConfig config = OpcUaClientConfig.builder()
                .setApplicationName(LocalizedText.english("OPCUA-Client"))
                .setApplicationUri("urn:localhost:OPCUA:Client")
                .setEndpoint(endpoint)
                .setRequestTimeout(uint(5000))
                .build();
        OpcUaClient client = OpcUaClient.create(config);

        try {
            // 连接OPCUA服务
            client.connect().get();

            // 读取节点值
            readValues(client);

            // 监听节点数据变化
            monitorValues(client);

            // 写入节点值
            writeValue(client);
        } finally {
            client.disconnect().get();
        }
    }

    private static void readValues(OpcUaClient client) throws ExecutionException, InterruptedException {
        // 读取节点值
        List<NodeId> nodeIds = new ArrayList<>();
        nodeIds.add(new NodeId(2, "/Static/AllProfiles/DeviceSetPoint"));
        nodeIds.add(new NodeId(2, "/Dynamic/CoolingWaterInletTemperature"));

        Map<NodeId, DataValue> values = client.readValues(0, TimestampsToReturn.Both, nodeIds).get();

        for(Map.Entry<NodeId, DataValue> entry : values.entrySet()) {
            NodeId nodeId = entry.getKey();
            DataValue dataValue = entry.getValue();
            System.out.println(nodeId + " value is " + dataValue.getValue().getValue());
        }
    }

    private static void monitorValues(OpcUaClient client) throws ExecutionException, InterruptedException {
        // 订阅节点值变化
        UaSubscription subscription = client.getSubscriptionManager().createSubscription(1000.0).get();

        NodeId nodeId = new NodeId(2, "/Static/AllProfiles/DeviceSetPoint");

        UaMonitoredItem monitoredItem = subscription.createMonitoredItem(
                nodeId,
                OpcUaSubscriptionManager.DEFAULT_ITEM_SETTINGS,
                (item, value) -> System.out.println(item.getReadValueId().getNodeId() + " value has changed: " + value.getValue())
        ).get();

        // 等待值变化
        Thread.sleep(10000);

        monitoredItem.delete();
        subscription.delete();
    }

    private static void writeValue(OpcUaClient client) throws ExecutionException, InterruptedException {
        // 写入节点值
        NodeId nodeId = new NodeId(2, "/Dynamic/CoolingWaterInletTemperature");
        DataValue setValue = new DataValue(new Variant(Double.valueOf("50.5")));
        StatusCode statusCode = client.writeValue(nodeId, setValue).get();

        // 检查写入是否成功
        if (statusCode.isGood()) {
            System.out.println("Value has been written successfully");
        } else {
            System.out.println("Writing failed");
        }
    }
}

在此示例中,我们连接到了OPCUA服务并展示了如何读取、监视和写入节点的值。

示例2:

import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue;
import org.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText;
import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
import org.eclipse.milo.opcua.stack.core.types.builtin.Variant;
import org.eclipse.milo.opcua.stack.core.types.structured.EndpointDescription;
import org.eclipse.milo.opcua.sdk.client.OpcUaClient;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;

import static org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned.uint;

public class OPCUAExample {

    public static void main(String[] args) throws Exception {
        // OPCUA服务地址
        String endpointUrl = "opc.tcp://localhost:53530/OPCUA/SimulationServer";

        // 创建OPCUA客户端
        EndpointDescription endpoint = EndpointDescription.parse(endpointUrl);
        OpcUaClientConfig config = OpcUaClientConfig.builder()
                .setApplicationName(LocalizedText.english("OPCUA-Client"))
                .setApplicationUri("urn:localhost:OPCUA:Client")
                .setEndpoint(endpoint)
                .setRequestTimeout(uint(5000))
                .build();
        OpcUaClient client = OpcUaClient.create(config);

        try {
            // 连接OPCUA服务
            client.connect().get();

            // 读取节点值
            readValues(client);

            // 写入节点值
            writeValue(client);
        } finally {
            client.disconnect().get();
        }
    }

    private static void readValues(OpcUaClient client) throws ExecutionException, InterruptedException {
        // 读取节点值
        List<NodeId> nodeIds = new ArrayList<>();
        nodeIds.add(new NodeId(2, "/Static/AllProfiles/DeviceSetPoint"));
        nodeIds.add(new NodeId(2, "/Dynamic/CoolingWaterInletTemperature"));

        Map<NodeId, DataValue> values = client.readValues(0, TimestampsToReturn.Both, nodeIds).get();

        for(Map.Entry<NodeId, DataValue> entry : values.entrySet()) {
            NodeId nodeId = entry.getKey();
            DataValue dataValue = entry.getValue();
            System.out.println(nodeId + " value is " + dataValue.getValue().getValue());
        }
    }

    private static void writeValue(OpcUaClient client) throws ExecutionException, InterruptedException {
        // 写入节点值
        NodeId nodeId = new NodeId(2, "/Dynamic/CoolingWaterInletTemperature");
        DataValue setValue = new DataValue(new Variant(Double.valueOf("50.5")));
        StatusCode statusCode = client.writeValue(nodeId, setValue).get();

        // 检查写入是否成功
        if (statusCode.isGood()) {
            System.out.println("Value has been written successfully");
        } else {
            System.out.println("Writing failed");
        }
    }
}

在此示例中,我们连接到了OPCUA服务并展示了如何读取和写入节点的值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用java的milo框架访问OPCUA服务的过程 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java实现数字炸弹

    Java实现数字炸弹是一种常见的编程练习,主要是为了训练学生对于递归算法的理解和运用能力,以下是数字炸弹的完整攻略: 什么是数字炸弹? 数字炸弹指的是在一个数字序列中寻找出现次数最高的数字,并将出现次数最高的数字从序列中删除,接着重复以上步骤,直到序列为空。 怎样实现数字炸弹? 1. 将数字序列分解为数字数组 在Java中,我们可以将数字序列转化为数字数组,…

    Java 2023年5月23日
    00
  • java计算两个日期中间的时间

    如果想要计算两个日期中间的时间,可以使用Java的Date和Calendar类来处理,具体步骤如下: 使用SimpleDateFormat类将输入的两个日期字符串转换为Date对象。 String startDate = "2021-01-01"; String endDate = "2021-06-30"; Simp…

    Java 2023年5月20日
    00
  • Java对Excel表格的上传和下载处理方法

    Java可以使用Apache POI库来实现Excel表格的上传和下载处理。具体的处理方法可以分为三个步骤:导入POI库,读取Excel文件,写入Excel文件。下面我们就详细介绍这三个步骤。 1. 导入POI库 首先需要将POI库导入到Java项目中,可以通过Maven等方式引入POI库。在Maven中,引入POI库的方法如下: <!–Apache…

    Java 2023年5月19日
    00
  • 什么是同步代码块?

    以下是关于同步代码块的完整使用攻略: 同步代码块 同步代码块是指在多线程编程中,使用 synchronized 关键字来实现对共享资源的访问控制的一种方式。同步代码块可以将需要同步的代码块包裹起来,从而保证同一时间只有一个线程可以访问共享资源,避免线程之间的竞争和冲突。 同步代码块的语法格式如下: synchronized (object) { // 需要同…

    Java 2023年5月12日
    00
  • MyBatis Generator ORM层面的代码自动生成器(推荐)

    MyBatis Generator是一个ORM层面的代码自动生成器,它可以根据数据库表结构自动生成Java代码的ORM映射文件、实体类以及Mapper接口,从而大大提高开发效率。 下面是使用MyBatis Generator生成ORM代码的完整攻略: 准备工作 首先,我们需要安装JDK和MySQL数据库,并在MySQL中创建好要生成ORM代码的数据库表。 接…

    Java 2023年5月20日
    00
  • 什么是Java调试技术?

    什么是Java调试技术 Java调试技术是在开发过程中定位和解决问题的必备能力之一。它通过一系列调试工具、调试器和技巧,帮助我们快速定位代码问题并进行修复。 Java调试技术的使用攻略 步骤1:启用调试模式 在开发Java应用程序时,应该启用调试模式,这样可以让我们在程序中设置断点,并允许调试器来监视变量和执行。 在启用调试模式时,需要在运行Java应用程序…

    Java 2023年5月11日
    00
  • XML与HTML的结合(上)

    下面我来为您详细讲解“XML与HTML的结合(上)”的完整攻略。 首先,让我们先明确一下XML和HTML的区别。HTML(Hypertext Markup Language)是一种用于创建网页的标记语言,而XML(Extensible Markup Language)则是一种通用的标记语言,用于描述数据。 因为XML具有更加灵活的结构和语法,所以可以用来描述…

    Java 2023年5月23日
    00
  • Mybatis中 SQL语句复用

    Mybatis作为一款主流的ORM框架,可以有效地简化数据库操作。SQL语句的编写是Mybatis中的重要环节,而SQL语句复用则是其中重要的一块。本文将为您详细讲解Mybatis中SQL语句复用的完整攻略。 1. 基本概念 Mybatis支持多种方式实现SQL语句复用,其中最常用的方式是使用组合SQL。组合SQL即通过组合多个SQL语句实现复杂查询的效果。…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部