You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@plc4x.apache.org by "susliks (Jira)" <ji...@apache.org> on 2022/07/26 09:43:00 UTC

[jira] [Created] (PLC4X-353) Issue with create PCCC connection problem

susliks created PLC4X-353:
-----------------------------

             Summary: Issue with create PCCC connection problem
                 Key: PLC4X-353
                 URL: https://issues.apache.org/jira/browse/PLC4X-353
             Project: Apache PLC4X
          Issue Type: Bug
          Components: Driver-Ethernet/IP
    Affects Versions: 0.9.1
            Reporter: susliks
         Attachments: EtherNetIP_PCCC_CM.pcapng, decodeerror.png

Hello,I want to register PCCC connection manager after registering the session of ethernet/ip.But I cant receive the response with PCCC connection manager.

I create the pccc cm request in EtherNet/IP connectResponse's handle just like S7Driver.
{quote} 

@Override
    public void onConnect(ConversationContext<ENipPacket> context) {
        logger.debug("Sending RegisterSession ENIP Package");
        System.out.println("Sending RegisterSession ENIP Package");
        ENipConnectionRequest connectionRequest =
            new ENipConnectionRequest(0L, 0L, emptySenderContext, 0L);
        context.sendRequest(connectionRequest)
            .expectResponse(ENipPacket.class, REQUEST_TIMEOUT)
            .check(q -> q instanceof ENipConnectionRequest)
            .handle(enipConnectionRequest -> {
                if (enipConnectionRequest.getStatus() == 0L) {
                    long sessionHandle = enipConnectionRequest.getSessionHandle();
                    short[] b = enipConnectionRequest.getSenderContext();
                    enipDriverContext.setSessionHandle(sessionHandle);
                    enipDriverContext.setSenderContext(b);
                    logger.debug("Got assigned with Session {}", sessionHandle);
                    System.out.println(enipDriverContext.getSessionHandle());
                    enipDriverContext.setOtoTconnectionID(0x8000000f);
                    enipDriverContext.setTtoOconnectionID(0x80fe000e);
                    enipDriverContext.setConnectionSerialID(0x000f);
                    ENipCipRRData CM_ConnectRequest =
                        new ENipCipRRData(enipDriverContext.getSessionHandle(),0L,enipDriverContext.getSenderContext(),0L,0x0014,
                            new CipExchange(new NullAddressItem(),
                                new UnconnectedDataItem(new CipForwardOpenRequest(
                                    new ForwardOpenRequest(enipDriverContext.getOtoTconnectionID(),enipDriverContext.getTtoOconnectionID(),enipDriverContext.getConnectionSerialID())
                                ))));
                    System.out.println("Sending CM ENIP Package");

                    context.sendRequest(CM_ConnectRequest)
                        .expectResponse(ENipPacket.class, REQUEST_TIMEOUT)
                        .check(p -> p instanceof ENipCipRRData)
                        .unwrap(p -> (ENipCipRRData) p)
                        .check(p-> p.getExchange().getItem_0() instanceof NullAddressItem)
                        .check(p-> p.getExchange().getItem_1() instanceof UnconnectedDataItem)
                        .unwrap(p -> (UnconnectedDataItem) p.getExchange().getItem_1())
                        .check(p -> p.getService() instanceof CipForwardOpenResponse)
                        .unwrap(p -> (CipForwardOpenResponse) p.getService())
                        .check(p -> p.getOpenResponse() instanceof ForwardOpenResponse)
                        .handle(p ->
Unknown macro: \{                            System.out.println("get OtoTconnectionID");                            enipDriverContext.setOtoTconnectionID(p.getOpenResponse().getOtoT_ConnectionID());                            System.out.println(enipDriverContext.getOtoTconnectionID());                            context.fireConnected();                        }
);
                } else {
                    logger.warn("Got status code [{}]", enipConnectionRequest.getStatus());
                }

            })
{quote}
Now I find some problem but I dont know what cause it.In Plc4xNetttyWarpper decode function,It cant receive the second response.Wireshark captured the correct packet.

Here is my driver code
{quote}package org.apache.plc4x.java.enip;

import io.netty.buffer.ByteBuf;
import org.apache.plc4x.java.api.metadata.PlcDriverMetadata;
import org.apache.plc4x.java.enip.context.EnipDriverContext;
import org.apache.plc4x.java.spi.connection.GeneratedDriverBase;
import org.apache.plc4x.java.spi.configuration.Configuration;
import org.apache.plc4x.java.spi.connection.PlcFieldHandler;
import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer;
import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer;
import org.apache.plc4x.java.enip.configuration.ENIPConfiguration;
import org.apache.plc4x.java.enip.field.ENipFieldHandler;
import org.apache.plc4x.java.api.value.PlcValueHandler;
import org.apache.plc4x.java.spi.values.IEC61131ValueHandler;
import org.apache.plc4x.java.enip.protocol.ENipProtocolLogic;
import org.apache.plc4x.java.enip.readwrite.*;
import org.apache.plc4x.java.enip.readwrite.io.*;


import java.util.function.Consumer;
import java.util.function.ToIntFunction;

public class ENIPDriver extends GeneratedDriverBase<ENipPacket>{
    public static final int PORT = 44818;
    @Override
    public String getProtocolCode()\{return "enip";}
    @Override
    public String getProtocolName() {
        return "EthernetIP";
    }

    @Override
    protected Class<? extends Configuration> getConfigurationType() {
        return ENIPConfiguration.class;
    }
    @Override
    protected PlcFieldHandler getFieldHandler() {
        return new ENipFieldHandler();
    }
    @Override
    protected PlcValueHandler getValueHandler() {
        return new IEC61131ValueHandler();
    }
    @Override
    protected String getDefaultTransport() {
        return "tcp";
    }
    /** Estimate the Length of a Packet */
    public static class ByteLengthEstimator implements ToIntFunction<ByteBuf> {
        @Override
        public int applyAsInt(ByteBuf byteBuf) {
            if (byteBuf.readableBytes() >= 4) {
                //Second byte for the size and then add the header size 24
                int size = byteBuf.getUnsignedShort(byteBuf.readerIndex()+1)+24;
                return size;
            }
            return -1;
        }
    }
    @Override
    public PlcDriverMetadata getMetadata() {
        return new PlcDriverMetadata() {
            @Override
            public boolean canDiscover() {
                return true;
            }
        };
    }
    @Override
    protected ProtocolStackConfigurer<ENipPacket> getStackConfigurer() {
        return SingleProtocolStackConfigurer.builder(ENipPacket.class, ENipPacketIO.class)
                .withProtocol(ENipProtocolLogic.class)
                .withDriverContext(EnipDriverContext.class)
                .withPacketSizeEstimator(ByteLengthEstimator.class)
                .littleEndian()
                .build();
    }
    @Override
    protected boolean canRead() {
        return true;
    }
    @Override
    protected boolean canWrite() {
        return true;
    }


}
{quote}
Here is error message
{quote}
set Driver Context
Sending RegisterSession ENIP Package
completed
DecodingENipConnectionRequest[sessionHandle=1604640755,status=0,senderContext={0,0,0,0,0,0,0,0},options=0]
1604640755
Sending CM ENIP Package
7月 26, 2022 5:36:26 下午 io.netty.channel.DefaultChannelPipeline onUnhandledInboundException
警告: An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
java.io.IOException: 连接被对方重设
	at java.base/sun.nio.ch.FileDispatcherImpl.read0(Native Method)
	at java.base/sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
	at java.base/sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276)
	at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:233)
	at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:223)
	at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:356)
	at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253)
	at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132)
	at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Thread.java:829)

Exception in thread "main" org.apache.plc4x.java.api.exceptions.PlcConnectionException: java.util.concurrent.ExecutionException: org.apache.plc4x.java.api.exceptions.PlcIoException: Connection terminated by remote
	at org.apache.plc4x.java.spi.connection.DefaultNettyPlcConnection.connect(DefaultNettyPlcConnection.java:142)
	at org.apache.plc4x.java.PlcDriverManager.getConnection(PlcDriverManager.java:74)
	at org.apache.plc4x.java.examples.enip.test.EnipExample.main(EnipExample.java:15)
Caused by: java.util.concurrent.ExecutionException: org.apache.plc4x.java.api.exceptions.PlcIoException: Connection terminated by remote
	at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:395)
	at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1999)
	at org.apache.plc4x.java.spi.connection.DefaultNettyPlcConnection.connect(DefaultNettyPlcConnection.java:133)
	... 2 more
Caused by: org.apache.plc4x.java.api.exceptions.PlcIoException: Connection terminated by remote
	at org.apache.plc4x.java.spi.connection.DefaultNettyPlcConnection.lambda$connect$1(DefaultNettyPlcConnection.java:124)
	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578)
	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:552)
	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491)
	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616)
	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:605)
	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
	at io.netty.channel.AbstractChannel$CloseFuture.setClosed(AbstractChannel.java:1182)
	at io.netty.channel.AbstractChannel$AbstractUnsafe.doClose0(AbstractChannel.java:773)
	at io.netty.channel.AbstractChannel$AbstractUnsafe.close(AbstractChannel.java:749)
	at io.netty.channel.AbstractChannel$AbstractUnsafe.close(AbstractChannel.java:620)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.closeOnRead(AbstractNioByteChannel.java:105)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.handleReadException(AbstractNioByteChannel.java:130)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:177)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Thread.java:829)
{quote}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)