使用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日

相关文章

  • SpringBoot整合阿里 Druid 数据源的实例详解

    下面是Spring Boot整合阿里Druid数据源的实例详解。 一、什么是阿里Druid 概述:Druid是一个高性能的开源数据库连接池组件,由阿里巴巴开发。Druid提供了强大的监控和扩展功能,可以很好地和其他框架集成,如Spring框架、Hibernate框架等。 Druid主要功能: 数据库连接池 监控统计 数据库访问 数据源管理 二、通过Sprin…

    Java 2023年6月3日
    00
  • 基于tomcat8 编写字符编码Filter过滤器无效问题的解决方法

    下面是关于基于tomcat8编写字符编码Filter过滤器无效问题的解决方法的完整攻略。 问题背景 在使用tomcat8进行web开发的过程中,我们经常需要使用Filter来对字符编码进行过滤,以避免出现乱码等问题。但是有些情况下,我们编写的过滤器并不能很好地工作,导致过滤器无效。这时候就需要寻找原因并解决问题。 解决方法 方法一:修改web.xml配置文件…

    Java 2023年5月20日
    00
  • 一文带你轻松应对Springboot面试小结

    一、简介 该攻略主要介绍了如何应对Spring Boot面试中常见的问题,并详细解答了每一个问题。通过学习该攻略,可以更好地了解和掌握Spring Boot的相关知识,增加面试成功的概率。 二、Spring Boot常见问题 什么是Spring Boot? Spring Boot是一个基于Spring框架的开发的Web框架,它通过自动化配置提供了一种快速构建…

    Java 2023年5月15日
    00
  • Java多线程——基础概念

    Java多线程——基础概念 什么是进程和线程 在操作系统中,一个正在运行的程序称为进程(process),进程可以拥有多个相互独立执行流程,称为线程(thread)。一个进程中至少有一个主线程。 为什么需要使用多线程 多线程的主要目的是提高程序的效率,特别是在当程序需要同时执行多个耗时操作时,可以通过多线程将这些操作并发地执行,提高整个程序的执行效率。同时,…

    Java 2023年5月19日
    00
  • SpringMvc响应数据及结果视图实现代码

    针对SpringMvc响应数据及结果视图实现代码的完整攻略,我们可以分为以下几个部分进行讲解。 一、SpringMVC响应数据的方式 SpringMVC提供了多种方式响应数据,分别如下: 转发 forward 重定向 redirect 返回JSON数据 返回XML数据 返回文件 1. 转发 forward 使用转发可以将请求转发给其他控制器或JSP页面。实现…

    Java 2023年6月15日
    00
  • javaSE基础如何通俗的理解javaBean是什么

    JavaSE作为Java语言的基础和通用部分,包含了大量的API和基础概念。其中,JavaBean是JavaSE中的一个重要概念,它作为JavaSE中的一个基础部分,也是JavaEE开发中常用的一种设计模式。下面我们来详细讲解如何通俗的理解JavaBean。 一、JavaBean的含义 JavaBean是一种Java语言编写的可重用组件。它通常用于表示一个实…

    Java 2023年5月20日
    00
  • IDEA2022创建Maven Web项目教程(图文)

    让我为您详细讲解“IDEA2022创建Maven Web项目教程(图文)”的完整攻略: 1. 准备工作 在开始创建 Maven Web 项目前,您需要先准备好以下环境与工具: IntelliJ IDEA 2022 JDK 8或以上版本 Maven 3.6.0 或以上版本 2. 创建 Maven Web 项目 启动 IntelliJ IDEA,并选择菜单栏中的…

    Java 2023年5月19日
    00
  • 详解SpringBoot 快速整合MyBatis(去XML化)

    我来详细讲解“详解SpringBoot快速整合MyBatis(去XML化)”的完整攻略。 添加依赖 在 pom.xml 文件中添加如下依赖: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-bo…

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