1

我需要将 OPC 服务器嵌入到 Eclipse RCP 应用程序中,但我不知道从哪里开始。我以 opcua4j 为例来创建服务器,但不知道如何连接到远程 PLC 设备。

我的问题是如何使用 OPC 从服务器与远程客户端通信,给定客户端的 IP 地址?

Ps:关于opc ua java编程的最好的教程/书是什么?

4

2 回答 2

3

这可能会让您对 OPC 服务器的工作感到失望,我不太确定您知道多少,如果我转达,请见谅。OPC 服务器轮询而不是请求/回复的通信方式。它轮询标签而不是设备。

检查此链接以获取 Java - OPC 开发 - http://www.opcconnect.com/java.php#javacom

OPC 101

您将需要开发:

  • 渠道
  • 设备
  • 变量

每个通道指定两件事。指定的两个方面是: 1. 物理介质(网络适配器,例如标准以太网设备或串行端口) 2. 使用的协议(MODBUS、Allen Bradley、GE-Fanuc 等)。这意味着每个通道都不能在不同的介质或协议上托管设备。

设备 此字段指定了一些内容。这些是:

  1. 地址。这可以是 IP 地址(对于以太网通过的协议——例如 IDEC 串行封装协议),或者是用于串行通信的标识号,例如 Profibus 或 Modbus ASCII/RTU。
  2. 驱动程序特定信息 - 这可能包括指定 CPU 型号或正在使用的 I/O 卡。这因驱动程序而异。

变量是定义“标签”的地方。

  1. 标签名
  2. PLC 地址。例如 M1 或 RW1 或 49075(但驱动程序特定)
  3. 数据类型——布尔值、字等。

每个标签或过程变量都有数据和元数据。这可以包括变量、上次更新、标签的运行状况等、工程单位。

最后

我实际上并没有编写自己的 OPC 服务器,但以上内容可能会有所帮助。我不确定上面的 Java SDK 提供了多少,但请考虑应用程序中的安全性。

是否可以运行 OPC 服务器,轮询数据,然后您的应用程序与 OPC 服务器连接?这可以帮助您不必(至少)过多地使用 OPC。您可以获得基于 Java 的 OPC 服务器,而不是在任何平台上运行,我相信大多数都有 API,或者至少有一种通信数据的方式。

编辑

查看软件包 Pi ( http://www.osisoft.com/ )。这可能对此有所帮助。

于 2013-11-13T23:38:47.567 回答
1

您可以尝试使用ProSys OPC Java SDK的评估版本。这是一个非常简单的 SDK,它为您提供了有关如何从头开始创建服务器和客户端的教程。以下是创建一个没有地址空间的服务器是多么简单的代码:

private String APPNAME = "yourappname";
private String SERVER = "nameoftheserver";
private int PORT = 52000; #choose whatever

public void CreateOPCUAserver() {
    server = new UaServer();

    final PkiFileBasedCertificateValidator validator = new PkiFileBasedCertificateValidator();
    server.setCertificateValidator(validator);
    validator.setValidationListener(validationListener);

    ApplicationDescription appDescription = new ApplicationDescription();
    appDescription.setApplicationName(new LocalizedText(APPNAME, Locale.ENGLISH));
    appDescription.setApplicationUri("urn:localhost:UA:"+SERVER);
    appDescription.setProductUri("urn:snorre.com:UA:"+SERVER);
    appDescription.setApplicationType(ApplicationType.Server);
    try {
        server.setPort(PORT);
        server.setUseLocalhost(true);
        server.setUseAllIpAddresses(true);
        server.setServerName("OPCUA/"+APPNAME);

        final ApplicationIdentity identity = ApplicationIdentity.loadOrCreateCertificate(appDescription, "NTNU",
                /* Private Key Password */"opcua",
                /* Key File Path */new File(validator.getBaseDir(), "private"),
                /* Enable renewing the certificate */true,
                /* Additional host names for the certificate */server.getHostNames());

        server.setApplicationIdentity(identity);
        server.setSecurityModes(SecurityMode.ALL);
        server.addUserTokenPolicy(UserTokenPolicy.ANONYMOUS);
        server.addUserTokenPolicy(UserTokenPolicy.SECURE_USERNAME_PASSWORD);
        server.addUserTokenPolicy(UserTokenPolicy.SECURE_CERTIFICATE);


        server.init();
            String endpoint = String.format("opc.tcp://%s:%s/OPCUA/%s","localhost", PORT, APPNAME);
            server.addEndpoint(endpoint, SecurityMode.NONE, UserTokenPolicy.ANONYMOUS);  
        server.start();

        logger.info("*********important parameters for event transmission**********");
        logger.info("Servername "+endpoint);
        logger.info("Publishing interval: " + server.getSubscriptionManager().getMaxPublishingInterval());
        logger.info("Retransmition queue size: " + server.getSubscriptionManager().getMaxRetransmissionQueueSize());
        logger.info("Session timeout: " + server.getSessionManager().getMaxSessionTimeout());
        logger.info(logger.getClass().getCanonicalName());
        logger.info("****************************end ********************");

    } catch (UaServerException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecureIdentityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

您还必须创建一个非常基本的验证侦听器。只是为了让它运行

public class MyCertificateValidationListener implements CertificateValidationListener {
    @Override
    public ValidationResult onValidate(Cert certificate, ApplicationDescription applicationDescription, EnumSet<CertificateCheck> passedChecks) {
        // Do not mind about URI...
        if (passedChecks.containsAll(EnumSet.of(CertificateCheck.Trusted, CertificateCheck.Validity, CertificateCheck.Signature))) {
            if (!passedChecks.contains(CertificateCheck.Uri)) {
                try {
                    System.out.println("Client's ApplicationURI (" + applicationDescription.getApplicationUri()  + ") does not match the one in certificate: " + PkiFileBasedCertificateValidator.getApplicationUriOfCertificate(certificate));
                } catch (CertificateParsingException e) {
                    throw new RuntimeException(e);
                }
            }
            return ValidationResult.AcceptPermanently;
        }
        return ValidationResult.Reject;
    }
}

这没有任何身份验证,但它可以帮助您上路。现在您可以使用一些免费的客户端程序连接到您的服务器并进行浏览。您会看到那里有一些文件夹,但那是因为服务器最初带有这些文件夹。

现在服务器已启动并运行,您必须创建一个 AddresseSpace,然后将 PLC 的数据模型添加到您当前的服务器。然后,此数据模型与您的 PLC 及其可能的方法建立连接,使 OPC-UA 客户端可以通过简单的 uri 连接到您的服务器,例如“opc.tcp://localhost:52000/OPCUA/servername”或 http。这是您在本地运行它。否则它必须是一个IP。

当客户端随后浏览此内容时,他们可以看到您在数据模型中创建的变量、方法事件警报等。并且可以使用这些方法和许多不同的酷东西。

于 2013-11-24T19:04:29.510 回答