0

我实际上正在开发一个从 19 个 PLC 西门子 S1500 和 1 个 modicon 读取数据的项目。我在本教程之后使用了刮刀工具:

PLC4x刮刀教程

但是当刮板工作一段时间时,我得到以下异常:

在此处输入图像描述

我已将预定时间更改为 1 到 100 之间,当刮板收到相同数量的消息时,我总是会遇到相同的异常。

我已经测试过使用 PlcDriverManager 而不是 PooledPlcDriverManager 是否可以解决,但同样的问题仍然存在。

在我的 pom.xml 中,我使用以下依赖项:

        <dependency>
            <groupId>org.apache.plc4x</groupId>
            <artifactId>plc4j-scraper</artifactId>
            <version>0.7.0</version>
        </dependency>

我尝试将版本更改为旧版本,例如 0.6.0 或 0.5.0,但问题仍然存在。

如果我使用 modicon (Modbus TCP),我也会在一段时间后得到这个异常。

任何人都知道为什么会发生这个错误?提前致谢。

编辑:使用刮板版本 0.8.0-SNAPSHOT 我继续遇到这个问题。

Edit2:这是我的代码,我认为问题可能是在我的刮刀中我打开了很多连接,当它达到 65526 条消息时它失败了。但是由于所有的处理都发生在 lambda 函数内部并且我使用的是 PooledPlcDriverManager,我认为刮板只使用一个连接,所以我不知道错误在哪里。

 try {
        // Create a new PooledPlcDriverManager
        PlcDriverManager S7_plcDriverManager = new PooledPlcDriverManager();


        // Trigger Collector
        TriggerCollector S7_triggerCollector = new TriggerCollectorImpl(S7_plcDriverManager);

        // Messages counter
        AtomicInteger messagesCounter = new AtomicInteger();


        // Configure the scraper, by binding a Scraper Configuration, a ResultHandler and a TriggerCollector together
        TriggeredScraperImpl S7_scraper = new TriggeredScraperImpl(S7_scraperConfig, (jobName, sourceName, results) -> {
            LinkedList<Object> S7_results = new LinkedList<>();

            messagesCounter.getAndIncrement();

            S7_results.add(jobName);
            S7_results.add(sourceName);
            S7_results.add(results);

            logger.info("Array: " + String.valueOf(S7_results));
            logger.info("MESSAGE number: " + messagesCounter);

            // Producer topics routing
            String topic = "s7" + S7_results.get(1).toString().substring(S7_results.get(1).toString().indexOf("S7_SourcePLC") + 9 , S7_results.get(1).toString().length());
            String key = parseKey_S7("s7");
            String value = parseValue_S7(S7_results.getLast().toString(),S7_results.get(1).toString());
            logger.info("------- PARSED VALUE -------------------------------- " + value);

            // Create my own Kafka Producer
            ProducerRecord<String, String> record = new ProducerRecord<String, String>(topic, key, value);

            // Send Data to Kafka - asynchronous
            producer.send(record, new Callback() {
                public void onCompletion(RecordMetadata recordMetadata, Exception e) {
                    // executes every time a record is successfully sent or an exception is thrown
                    if (e == null) {
                        // the record was successfully sent
                        logger.info("Received new metadata. \n" +
                                "Topic:" + recordMetadata.topic() + "\n" +
                                "Partition: " + recordMetadata.partition() + "\n" +
                                "Offset: " + recordMetadata.offset() + "\n" +
                                "Timestamp: " + recordMetadata.timestamp());
                    } else {
                        logger.error("Error while producing", e);
                    }
                }
            });



        }, S7_triggerCollector);
        

        S7_scraper.start();
        S7_triggerCollector.start();


        } catch (ScraperException e) {
            logger.error("Error starting the scraper (S7_scrapper)", e);
        }
4

1 回答 1

1

所以最后确实是PLC随机挂断了连接。然而,NiFi 集成应该更优雅地处理这种情况。我针对这个特定错误实施了修复...您能否尝试一下 0.8.0-SNAPSHOT 版本(如果我们碰巧已经发布了,请使用 0.8.0)

于 2020-08-31T12:53:09.020 回答