Java OPC UA简介

1. 概述

OPC(OLE for Process Control,面向过程控制对象链接)是一种广泛应用于工业自动化领域的通信标准协议。OPC UA(OPC Unified Architecture)是在OPC基础上发展出的新一代通信协议,提供了更强大、更灵活、更安全的功能。

本文将介绍如何使用Java编写OPC UA应用程序,并提供相关代码示例。

2. 准备工作

在开始编写Java OPC UA应用程序之前,需要进行以下准备工作:

2.1 安装JDK

首先确保计算机上已经安装了JDK(Java Development Kit)。可以从Oracle官网下载并安装最新版的JDK。

2.2 导入OPC UA库

Java OPC UA通常使用Eclipse Milo库来实现。可以通过在项目的构建路径中添加Eclipse Milo库的jar文件来导入。

<dependency>
    <groupId>org.eclipse.milo</groupId>
    <artifactId>milo-client-sdk</artifactId>
    <version>0.4.0</version>
</dependency>

2.3 创建OPC UA服务器

在进行Java OPC UA编程之前,需要先创建一个OPC UA服务器。可以使用第三方软件,如OPC UA模拟器,或者使用Java库来创建。

以下是使用Eclipse Milo库创建一个简单的OPC UA服务器的示例代码:

public class MyOpcServer {

    public static void main(String[] args) throws Exception {
        OpcUaServerConfig serverConfig = OpcUaServerConfig.builder()
                .setApplicationUri("urn:my-opc-server")
                .setApplicationName(LocalizedText.english("My OPC Server"))
                .build();

        OpcUaServer server = new OpcUaServer(serverConfig);

        server.getNamespaceManager().registerAndAdd(
                "urn:my-opc-server",
                idx -> new MyNamespace(server, "My OPC Server")
        );

        server.startup().get();

        System.out.println("OPC UA Server started");

        server.awaitTermination();
    }
}

这段代码创建了一个名为"My OPC Server"的OPC UA服务器,并使用了"urn:my-opc-server"作为应用程序标识符。

3. 连接到OPC UA服务器

编写Java OPC UA应用程序之前,需要先连接到已经创建的OPC UA服务器。可以使用以下代码示例来连接到服务器:

OpcUaClientConfig clientConfig = OpcUaClientConfig.builder()
        .setApplicationName(LocalizedText.english("My OPC Client"))
        .setEndpoint(endpoint)
        .setRequestTimeout(UInteger.valueOf(5000))
        .build();

OpcUaClient client = OpcUaClient.create(clientConfig);

其中,endpoint是OPC UA服务器的地址,如"opc.tcp://localhost:4840"。clientConfig对象包含了与服务器进行通信所需的配置信息。

4. 浏览和读取节点

连接到OPC UA服务器后,可以使用BrowseServiceReadService来浏览和读取节点。

以下是一个读取节点值的示例代码:

NodeId nodeId = new NodeId(2, "MyVariable");

DataValue value = client.readValue(
        0, TimestampsToReturn.Both, nodeId).get();

System.out.println("Value: " + value.getValue());

这段代码读取了名为"MyVariable"的节点的值,并打印输出。

5. 写入节点值

除了读取节点的值,还可以使用WriteService来写入节点的值。

以下是一个写入节点值的示例代码:

NodeId nodeId = new NodeId(2, "MyVariable");

Variant variant = new Variant(42);

StatusCode statusCode = client.writeValue(
        nodeId, variant).get();

System.out.println("Status: " + statusCode);

这段代码将数字42写入名为"MyVariable"的节点。

6. 监听节点变化

在某些情况下,需要实时监视节点的变化。可以使用SubscriptionService来订阅节点值的变化。

以下是一个订阅节点变化的示例代码:

NodeId nodeId = new NodeId(2, "MyVariable");

UaSubscription subscription = client.getSubscriptionManager()
        .createSubscription(1000.0).get();

client.getSubscriptionManager().addSubscriptionListener(subscriptionId -> {