Как подключиться к ПЛК и получить данные

Мне нужно встроить сервер OPC в приложение eclipse RCP, но я не знаю, с чего начать. Я использую opcua4j в качестве примера для создания сервера, но не могу понять, как подключиться к удаленному устройству ПЛК.

Мой вопрос: как общаться с удаленным клиентом с сервера с помощью OPC, учитывая IP-адрес клиента?

Ps: Какой лучший учебник/книга о программировании opc ua java?


person keysuke    schedule 05.11.2013    source источник


Ответы (2)


Это может привести к тому, что вы столкнетесь с работой серверов OPC, я не слишком уверен, насколько вы знаете, так что извините, если я передаю. Сервер OPC опрашивает, а не использует стиль связи запрос/ответ. Он опрашивает теги, а не устройства.

Проверьте эту ссылку для Java - OPC Deve - http://www.opcconnect.com/java.php#javacom

ОРС 101

Вам нужно будет разработать:

  • Канал
  • Устройство
  • Переменные

Каждый канал определяет две вещи. Указываются два аспекта: 1. Физическая среда (сетевой адаптер, такой как ваше стандартное устройство Ethernet или последовательный порт) 2. Используемый протокол (MODBUS, Allen Bradley, GE-Fanuc и т. д.). Это означает, что каждый канал не может размещать устройства на разных носителях или протоколах.

Устройство В этом поле указывается несколько вещей. Это:

  1. Адрес. Это может быть IP-адрес (для протоколов, передаваемых через Ethernet, таких как IDEC Serial Encapsulated Protocol), или идентификационный номер для последовательной связи, такой как Profibus или Modbus ASCII/RTU.
  2. Специфическая информация о драйвере. Сюда может входить указание модели процессора или используемой карты ввода-вывода. Это варьируется среди водителей.

Переменные — это место, где определяются «теги».

  1. Название тэга
  2. Адрес ПЛК. Например, M1 или RW1 или 49075 (хотя зависит от драйвера)
  3. Тип данных — Boolean, Word и т. д.

Каждый тег или переменная процесса имеет как данные, так и метаданные. Это может включать в себя переменную, последнее обновление, состояние тега и т. д., инженерные единицы.

Окончательно

На самом деле я не программировал свой собственный сервер OPC, но вышеизложенное может помочь. Я не уверен, сколько дает вышеприведенный Java SDK, но подумайте о безопасности своего приложения.

Можно ли запустить сервер OPC, опрашивая данные, а затем ваше приложение взаимодействует с сервером OPC? Это может помочь избежать возни (по крайней мере, слишком много) с OPC. Вы можете получить OPC-серверы на основе Java, а не работать на любой платформе, и я уверен, что у большинства из них есть API или, по крайней мере, способ передачи данных.

Редактировать

Ознакомьтесь с программным пакетом Pi (http://www.osisoft.com/). Это может помочь с этим.

person James    schedule 13.11.2013

Вы можете попробовать использовать ознакомительную версию 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, а затем модель данных ПЛК, чтобы добавить ее к вашему текущему серверу. Затем эта модель данных имеет подключение к вашему ПЛК и его возможные методы, позволяя клиентам OPC-UA подключаться к вашему серверу на основе простого uri, такого как «opc.tcp://localhost:52000/OPCUA/servername» или http. Это вы запускаете его локально. В противном случае это должен быть IP на этом.

Когда клиенты затем просматривают это, они могут видеть переменные, методы, события, тревоги и т. Д., Которые вы создали в своей модели данных. И можно использовать методы и много разных классных вещей.

person vonGohren    schedule 24.11.2013