如何连接到plc并获取数据

时间:2013-11-05 18:33:02

标签: java plc opc

我需要将OPC服务器嵌入到eclipse RCP应用程序中,但我不知道从哪里开始。我使用opcua4j作为示例创建服务器,但无法弄清楚如何连接到远程PLC设备。

我的问题是如何在给定客户端的IP地址的情况下使用OPC与服务器的远程客户端进行通信?

Ps:有关opc ua java编程的最佳教程/书籍是什么?

2 个答案:

答案 0 :(得分:2)

这可能会让你对OPC服务器工作失败,我不太清楚你知道多少,如果我转发就很抱歉。 OPC服务器轮询而不是请求/回复通信方式。它会轮询标签而不是设备。

查看此链接以获取Java - OPC Deve - 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卡。这种情况因司机而异。
  3. 变量是定义“标签”的地方。

    1. 标记名称
    2. PLC地址。例如M1或RW1或49075(虽然特定于驱动程序)
    3. 数据类型 - 布尔值,Word等
    4. 每个标记或流程变量都包含数据和元数据。这可以包括变量,最后更新,标签的健康状况等,工程单位。

      最后

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

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

      修改

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

答案 1 :(得分: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。

当客户端浏览它时,他们可以看到您在数据模型中创建的变量,方法事件警报等。而且可以使用各种方法和不同的酷东西。