Connection to Matrikon OPC Simulation Server via Utgard


I am using the Matrikon OPC Server for Simulation and Testing, instead of TOPServer, along with the tutorial HowToStartWithUtgard. I am not able to connect to the server. This is the error that I get:

    15:02:18.452 [main] DEBUG o.j.dcom.transport.JIComTransport - Socket closed... Socket[unconnected] host XXX.XXX.XX.X, port 135
15:02:18.453 [main] WARN  org.jinterop.dcom.core.JIComServer - Got the class not registered exception , will attempt setting entries based on status flags...
15:02:18.468 [main] INFO  org.openscada.opc.lib.da.Server - Failed to connect to server
org.jinterop.dcom.common.JIException: Class not registered. If you are using a DLL/OCX , please make sure it has "DllSurrogate" flag set. Faq A(6) in readme.html. [0x80040154]
    at org.jinterop.dcom.core.JIComServer.init(Unknown Source) ~[org.openscada.jinterop.core_2.0.8.201303051454.jar:na]
    at org.jinterop.dcom.core.JIComServer.initialise(Unknown Source) ~[org.openscada.jinterop.core_2.0.8.201303051454.jar:na]
    at org.jinterop.dcom.core.JIComServer.<init>(Unknown Source) ~[org.openscada.jinterop.core_2.0.8.201303051454.jar:na]
    at org.openscada.opc.lib.da.Server.connect( ~[org.openscada.opc.lib_1.0.0.201303051455.jar:na]
    at com.matrikonopc.utgard.tutorial.UtgardReadTutorial.main( [bin/:na]
Caused by: org.jinterop.dcom.common.JIRuntimeException: Class not registered. If you are using a DLL/OCX , please make sure it has "DllSurrogate" flag set. Faq A(6) in readme.html. [0x80040154]
    at Source) ~[org.openscada.jinterop.core_2.0.8.201303051454.jar:na]
    at ndr.NdrObject.decode(Unknown Source) ~[org.openscada.jinterop.deps_1.0.0.201303051454.jar:na]
    at Source) ~[org.openscada.jinterop.deps_1.0.0.201303051454.jar:na]
    at Source) ~[org.openscada.jinterop.deps_1.0.0.201303051454.jar:na]
    ... 5 common frames omitted
15:02:18.469 [main] INFO  org.openscada.opc.lib.da.Server - Destroying DCOM session...
15:02:18.470 [main] INFO  org.openscada.opc.lib.da.Server - Destroying DCOM session... forked
80040154: Unknown error (80040154)
15:02:18.499 [OPCSessionDestructor] DEBUG org.openscada.opc.lib.da.Server - Starting destruction of DCOM session
15:02:18.500 [OPCSessionDestructor] INFO  org.jinterop.dcom.core.JISession - About to destroy 0 sessesion which are linked to this session: 1325311425
15:02:18.500 [OPCSessionDestructor] INFO  o.j.dcom.core.JIComOxidRuntime - destroySessionOIDs for session: 1325311425
15:02:18.500 [OPCSessionDestructor] INFO  org.openscada.opc.lib.da.Server - Destructed DCOM session
15:02:18.501 [OPCSessionDestructor] INFO  org.openscada.opc.lib.da.Server - Session destruction took 27 ms

I do not know where I should register the Class and what Class it refers to.
asked on Stack Overflow Jul 29, 2015 by julianfperez

2 Answers


It is referring to the clsid you're attempting to use -- it is not in the registry. Can you double check that you're using the correct one for Matrikon OPC Simulation Server?

answered on Stack Overflow Nov 8, 2015 by Sammy Larbi

Working demo, tested on Windows 10 and Java 8.

User must have administrator rights on Windows.

Errors that might occur:

00000005: Login error (does the user has administrator rights !?)
8001FFFF: Firewall, RPC dynamic ports are not open (see below)
80040154: Double check CLSID in registry, below HKEY_CLASSES_ROOT

Firewall rules

netsh advfirewall firewall add rule^

rem the next one does not seems needed
netsh advfirewall firewall add rule name="DCOM" dir=in action=allow protocol=TCP localport=135

Java code

package demo.opc;

import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.openscada.opc.lib.common.ConnectionInformation;
import org.openscada.opc.lib.da.AccessBase;
import org.openscada.opc.lib.da.DataCallback;
import org.openscada.opc.lib.da.Item;
import org.openscada.opc.lib.da.ItemState;
import org.openscada.opc.lib.da.Server;
import org.openscada.opc.lib.da.SyncAccess;

public class UtgardReaderDemo {
   * Main application, arguments are provided as system properties, e.g.<br>
   * java -Dhost="localhost" -Duser="admin" -Dpassword="secret" -jar demo.opc.jar<br>
   * Tested with a windows user having administrator rights<br>
   * @param args unused
   * @throws Exception in case of unexpected error
  public static void main(String[] args) throws Exception {
    Logger.getLogger("org.jinterop").setLevel(Level.ALL); // Quiet => Level.OFF

    final String host = System.getProperty("host", "localhost");
    final String user = System.getProperty("user", System.getProperty(""));
    final String password = System.getProperty("password");
    // Powershell: Get-ItemPropertyValue 'Registry::HKCR\Matrikon.OPC.Simulation.1\CLSID' '(default)'
    final String clsId = System.getProperty("clsId", "F8582CF2-88FB-11D0-B850-00C0F0104305");
    final String itemId = System.getProperty("itemId", "Saw-toothed Waves.Int2");

    final ConnectionInformation ci = new ConnectionInformation(user, password);

    final Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());

    final AccessBase access = new SyncAccess(server, 1000);
    access.addItem(itemId, new DataCallback() {
      public void changed(final Item item, final ItemState state) {



plugins {
  id 'java-library'
  id 'eclipse'

repositories {

dependencies {
  implementation 'org.bouncycastle:bcprov-jdk15on:1.60'
  implementation 'org.openscada.utgard:org.openscada.opc.lib:1.5.0'

jar  {
  manifest {
      'Class-Path': configurations.runtimeClasspath.collect { 'lib/' + it.getName() }.join(' '),
      'Main-Class': 'demo.opc.UtgardReaderDemo'

assemble {
  dependsOn 'dependenciesCopy'

task dependenciesCopy(type: Copy) {
  group 'dependencies'
  from sourceSets.main.compileClasspath
  into "$libsDir/lib"
answered on Stack Overflow Jan 29, 2019 by Frédéric

User contributions licensed under CC BY-SA 3.0