通过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包;或者留言我

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值