Generic EtherNet/IP Client Device - java.lang.RuntimeException: Unable to parse Class/Instance/Attribute definitions

@pturmel

Hey Phil, I'm trying to import an L5X file into a generic ENet client device via the device's Configuration -> Import Supplemental CIP Class Definitions, it said it imported successfully but I saw this in the logs, and the supplmental defs document is blank if I try to look at it via the link:
image

I'm using the latest v2.1.8.233041759 module

This is the log error below. Any ideas? Maybe I'm doing something wrong? I haven't set a pingable IP address as I don't have a PLC (I had blank IP address at first but the device didn't show up at all without one), I was just hoping to use it to provide me with the tags in a PLC programme while in dev.

java.lang.RuntimeException: Unable to parse Class/Instance/Attribute definitions

at com.automation_pros.enip1.client.ClsInstAttrTypes.parse(ClsInstAttrTypes.java:914)

at com.automation_pros.enip1.driver.CipClient.(CipClient.java:253)

at com.automation_pros.enip1.config.CipClientDriverType.createDriver(CipClientDriverType.java:55)

at com.inductiveautomation.ignition.gateway.opcua.server.DriverAdapter$DriverAddressSpace.startup(DriverAdapter.kt:146)

at com.inductiveautomation.ignition.gateway.opcua.server.DriverAdapter.startup(DriverAdapter.kt:82)

at com.inductiveautomation.ignition.gateway.opcua.server.DeviceManager$DeviceAddressSpace.startup(DeviceManager.kt:434)

at com.inductiveautomation.ignition.gateway.opcua.server.DeviceManager.createAndStartupDevice(DeviceManager.kt:230)

at com.inductiveautomation.ignition.gateway.opcua.server.DeviceManager.access$createAndStartupDevice(DeviceManager.kt:52)

at com.inductiveautomation.ignition.gateway.opcua.server.DeviceManager$DeviceSettingsRecordListener$recordUpdated$1.invokeSuspend(DeviceManager.kt:388)

at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)

at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)

at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:274)

at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:85)

at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59)

at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)

at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:38)

at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)

at com.inductiveautomation.ignition.gateway.opcua.server.DeviceManager$DeviceSettingsRecordListener.recordUpdated(DeviceManager.kt:333)

at com.inductiveautomation.ignition.gateway.opcua.server.DeviceManager$DeviceSettingsRecordListener.recordUpdated(DeviceManager.kt:308)

at com.inductiveautomation.ignition.gateway.localdb.PersistenceInterfaceImpl.notifyRecordUpdated(PersistenceInterfaceImpl.java:179)

at com.inductiveautomation.ignition.gateway.redundancy.RedundantPersistenceInterfaceImpl.doNotifyRecordUpdated(RedundantPersistenceInterfaceImpl.java:111)

at com.inductiveautomation.ignition.gateway.redundancy.RedundantPersistenceInterfaceImpl$RecordUpdateListener.recordUpdated(RedundantPersistenceInterfaceImpl.java:407)

at com.inductiveautomation.ignition.gateway.redundancy.RedundantPersistenceInterfaceImpl$RecordUpdateMessage.notify(RedundantPersistenceInterfaceImpl.java:457)

at com.inductiveautomation.ignition.gateway.redundancy.RedundantPersistenceInterfaceImpl$RecordUpdateListener.receiveCall(RedundantPersistenceInterfaceImpl.java:390)

at com.inductiveautomation.ignition.gateway.redundancy.QueueableMessageReceiver.receiveCall(QueueableMessageReceiver.java:47)

at com.inductiveautomation.ignition.gateway.redundancy.RedundancyManagerImpl.dispatchMessage(RedundancyManagerImpl.java:1030)

at com.inductiveautomation.ignition.gateway.redundancy.RedundancyManagerImpl$ExecuteTask.run(RedundancyManagerImpl.java:1098)

at com.inductiveautomation.ignition.common.execution.impl.BasicExecutionEngine$ThrowableCatchingRunnable.run(BasicExecutionEngine.java:544)

at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)

at java.base/java.util.concurrent.FutureTask.run(Unknown Source)

at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)

at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)

at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

at java.base/java.lang.Thread.run(Unknown Source)

Caused by: java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0

at java.base/jdk.internal.util.Preconditions.outOfBounds(Unknown Source)

at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Unknown Source)

at java.base/jdk.internal.util.Preconditions.checkIndex(Unknown Source)

at java.base/java.util.Objects.checkIndex(Unknown Source)

at java.base/java.util.ArrayList.remove(Unknown Source)

at com.automation_pros.odva.cip.path.CipPath.parseType(CipPath.java:389)

at com.automation_pros.odva.cip.path.CipPath.parse(CipPath.java:476)

at com.automation_pros.odva.cip.path.CipPath.parseTag(CipPath.java:770)

at com.automation_pros.odva.cip.path.CipPath.parseTag(CipPath.java:562)

at com.automation_pros.enip1.client.ClsInstAttrTypes$StructDetail.finish(ClsInstAttrTypes.java:734)

at com.automation_pros.enip1.client.ClsInstAttrTypes$Parser.endElement(ClsInstAttrTypes.java:896)

at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)

at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)

at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)

at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)

at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)

at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)

at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)

at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)

at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)

at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)

at com.automation_pros.enip1.client.ClsInstAttrTypes.parse(ClsInstAttrTypes.java:912)

Nevermind, I found your post documenting the procedure and switched to the Host device instead. Very cool :slight_smile:

@pturmel Maybe found a bug - I created the Host device with a temp name, imported the L5X, confirmed it worked, then renamed the device to the proper name, and the imported L5X def tags were all gone. I had to reimport it again to get the tags back

Hmm. Will investigate. (BTW, note that 2.1.8 is the latest.)