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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章