通过Utgard读取Opc数据

代码如下

package com.zhou.demo.utils;

import lombok.extern.slf4j.Slf4j;
import org.jinterop.dcom.common.JIException;
import org.openscada.opc.lib.common.ConnectionInformation;
import org.openscada.opc.lib.common.NotConnectedException;
import org.openscada.opc.lib.da.AccessBase;
import org.openscada.opc.lib.da.AddFailedException;
import org.openscada.opc.lib.da.DuplicateGroupException;
import org.openscada.opc.lib.da.Group;
import org.openscada.opc.lib.da.Item;
import org.openscada.opc.lib.da.Server;
import org.openscada.opc.lib.da.SyncAccess;

import java.net.UnknownHostException;
import java.nio.channels.AlreadyConnectedException;
import java.util.concurrent.Executors;

/**
 * @ClassName OpcUtils
 * @Author JackZhou
 * @Date 2019/11/5  17:47
 **/
@Slf4j
public class OpcUtils {

    public static void main(String[] args) {
        ConnectionInformation ci = new ConnectionInformation();
        ci.setHost("localhost");
        ci.setUser("OPCServer");
        ci.setPassword("password");
        ci.setClsid("F8582CF2-88FB-11D0-B850-00C0F0104305");
        //ci.setProgId("Matrikon.OPC.Simulation.1");
        //syncOpcRead(ci);
        asyncOpcRead(ci);
    }

    /**
      * @Author JackZhou
      * @Description  同步读取opc数据
     **/
    public static void syncOpcRead(ConnectionInformation ci){
        Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());
        try {
            server.connect();
            Group group = server.addGroup();
            Item item = group.addItem("test.f001");
            log.info("ItemName:[" + item.getId()+ "],value:”" + item.read(false).getValue());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (JIException e) {
            e.printStackTrace();
        } catch (org.openscada.opc.lib.common.AlreadyConnectedException e) {
            e.printStackTrace();
        } catch (AddFailedException e) {
            e.printStackTrace();
        } catch (NotConnectedException e) {
            e.printStackTrace();
        } catch (DuplicateGroupException e) {
            e.printStackTrace();
        }
    }

    /**
     * @Author JackZhou
     * @Description  异步路线读取opc数据
     **/
    public static void asyncOpcRead(ConnectionInformation ci){
        Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());
        String itemId = "test.f001";
        try {
            server.connect();
            AccessBase access = new SyncAccess(server,500);
            access.addItem(itemId, (item, state) ->
                    log.info("ItemName:[" + item.getId()+ "],value:”" + state.toString()));
            // start reading
            access.bind();
            // wait a little bit
            Thread.sleep(20 * 1000);
            // stop reading
            access.unbind();
        } catch (AlreadyConnectedException e) {
            e.printStackTrace();
        } catch (DuplicateGroupException e) {
            e.printStackTrace();
        } catch (JIException e) {
            e.printStackTrace();
        } catch (NotConnectedException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (AddFailedException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (org.openscada.opc.lib.common.AlreadyConnectedException e) {
            e.printStackTrace();
        } finally {
            server.disconnect();
        }
    }
}

注意事项如下

OPC和Dcom配置,一定要配置好Dcom;不然很懵逼,发现很好的配置教程如下

https://www.cnblogs.com/ioufev/p/9365919.html

如果Dcom设置有问题或者用户名密码有问题,都会报错0x00000005

org.jinterop.dcom.common.JIException: Access is denied, please check whether the [domain-username-password] are correct. Also, if not already done please check the GETTING STARTED and FAQ sections in readme.htm. They provide information on how to correctly configure the Windows machine for DCOM access, so as to avoid such exceptions.  [0x00000005]

ProdId无法使用报错0xC0000034,需要使用CisId

org.jinterop.dcom.common.JIException: Message not found for errorCode: 0xC0000034

如果Clsid设置错误,极可能报错RuntimeException: java.lang.ArrayIndexOutOfBoundsException: 16

注意clsId不是组件服务里面的服务id;注意不是下面这个应用程序ID,虽然长的很像很像!

而是注册表里面的clsid;如下图所示;

 如果有opc server不明白的地方,欢迎查看我之前的文章~

如果需要Utgard相关jar包,在我的下载资源里下载utgard jar包;或者留言我

发布了62 篇原创文章 · 获赞 33 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/Zzhou1990/article/details/102961854
opc