java讀取opc服務器

前言

實現原理和核心參照Java調用dll庫的方法,本文不在贅述,本文主要講jeasyopc的用法。

基本操作

基本類

JCustomOpc是jeasyopc的基本類,所有對opc的操作類都應該繼承它。
對opc操作有一個基本的通用形式和步驟:

初始化

  JCustomOpc.coInitialize();
  • 這是初始化方法,必須在剛進入程序時調用。

創建實例

JCustomOpc opc = new JCustomOpc("localhost", "KEPware.KEPServerEx.V4", "JOPC1");
  • 由於new JCustomOpc是個抽象方法,實際操作中是由其子類實現的。
  • 第一個參數是IP地址。
  • 第二個參數是服務名(將會在瀏覽類中提到)。
  • 第三個參數是這個實例的別名。

連接

  opc.connect();

逆初始化(暫譯)

  JCustomOpc.coUninitialize();
  • 在程序結束前調用這個方法,一般放在finally塊中。

瀏覽類

JOpcBrowser是瀏覽類,用於只知道服務器IP的情況下獲取其他各種信息,由於方法和速度的限制,不適合用來查詢數值數據。JOpcBrowser繼承JCustomOpc。

初始化並找到某IP下的服務名

  JOpcBrowser.coInitialize();
  String[] opcServers = JOpcBrowser.getOpcServers("localhost");

創建實例並連接(可以對照基本類方法)

  JOpcBrowser jbrowser = new JOpcBrowser("localhost",opcServers[0], "JOPCBrowser1");
  jbrowser.connect();

根據一個葉節點,找其下的所有子節點

  String[] leaves = jbrowser.getOpcBranch(leaf);
  • leaf爲String型。
  • 當leaf爲”“時,代表根節點。

根據一個葉節點,找到其下所有檢測項

  String[] items = jbrowser.getOpcItems(leaves[0], true);
  • 每個item由四個值組成,分別代表item name、value type、item path、value。並由;號隔開。

同步讀取(外部請求)

這個功能是外部請求查詢某個item信息時使用,由JOpc類實現。JOpc繼承JCustomOpc。

初始化並實例化

  JOpc.coInitialize();
  JOpc jopc = new JOpc("localhost", "KEPware.KEPServerEx.V4", "JOPC1");

實例化多個item

  OpcItem item1 = new OpcItem("Channel_1.Device_1.Tag_1", true, "");
  OpcItem item2 = new OpcItem("Device_1.Tag_2", true, "Channel_1");
  OpcItem item3 = new OpcItem("Tag_3", true, "Channel_1.Device_1");
  • 第一個參數是item的name。
  • 第二個參數表示是否激活查詢功能。
  • 第三個參數表示路徑,一個參數item的name是相對於這個路徑而言的。如果第三個參數是”“,就代表根路徑。

實例化分組,並添加item

JAVA
OpcGroup group1 = new OpcGroup("group1", true, 2000, 0.0f);
group1.addItem(item1);

- 第一個參數是group別名。
- 第二個參數表示整個分組是否激活查找功能。
- 第三個參數代表查詢頻率,單位:毫秒。(這個是異步的功能這裏用不到)。
- 第四個參數代表不工作區佔比(直譯,至今不明白是什麼意思)。
- 一個group可以添加多個item

給操作類添加分組

jopc.addGroup(group1);
  • 一個操作類可以添加多個分組。

連接並註冊分組

JAVA
jopc.connect();
jopc.registerGroups();

讀取group和item

   OpcGroup synchGroup = jopc.synchReadGroup(group1);
   OpcItem synchItem = jopc.synchReadItem(group1, item1);
  • 這兩方法可以獨立使用,互不相干。
  • 傳入參數必須是之前new的並加入jopc的實例,不能再new一個新的加進去

關於group和item的具體操作方法可以參看源碼,這裏重點提三個方法

激活或癱瘓某個分組

jopc.setGroupActivity(group1, boolean);
  • 這個group1也是之前實例化過,並已添加到jopc的分組。

激活或癱瘓某個item

jopc.setItemActivity(group, item1, boolean);
  • 這個group1和item1也是之前實例化過,並已添加到jopc的分組。

查看item的value type

Variant.getVariantName(item.getDataType())
  • item.getDataType()只會返回代表type的int,這個方法相當於翻譯了下

內部定時讀取(異步讀取)

這個功能,是java程序內開線程,定時讀取數據。這個功能由JEasyOpc類實現,它是對JOpc類的繼承和封裝

新建一個類實現OpcAsynchGroupListener接口的getAsynchEvent方法

  public class JEasyOpcExample implements OpcAsynchGroupListener {
        public void getAsynchEvent(AsynchEvent event) {
            log.debug(((JCustomOpc) event.getSource()).getFullOpcServerName() + "=>");
            log.debug("Package: " + event.getID());
            log.debug(event.getOPCGroup());
            List<OpcItem> list = event.getOPCGroup().getItems();
            for (OpcItem opcItem : list) {
                String key = opcItem.getItemName().trim();
                String value = opcItem.getValue().toString().trim();
                log.debug("數據監聽: " + key + ":" + value);
            }
        }
  }
  • 記這個類爲監聽器。
  • 每次拿到數據就會調用用getAsynchEvent方法去處理數據,具體實現看源碼。
  • getFullOpcServerName()方法返回的字符串裏面有三個信息:一ip,二opc服務名,三,我們給它取得別名。
    • event.getID()取出來的id,其實代表着我們第幾次調用這個方法。

主方法裏面實例化這個監聽器

  JEasyOpcExample test = new JEasyOpcExample();

初始化、實例化鏈接並加入監聽器

  JEasyOpc.coInitialize();
  JEasyOpc jopc = new JEasyOpc("localhost", "KEPware.KEPServerEx.V4", "JOPC1");

實例化多個item和group並把它們添加到jopc中,這個和上面同步讀取一樣,在此不表。

分組加監聽器

  group.addAsynchListener(test);
  • 一個分組可以加多個監聽器。

開啓線程

  jopc.start();
  • 線程開啓後將調用監聽器裏的方法。
  • 線程run方法裏自帶斷線重連功能,具體實現可以參照源碼。
  • 線程調用頻率是在group裏面設定的。

其他輔助方法

更改更新頻率:

    jopc.setGroupUpdateTime(group, 300);
  • 這裏傳的group也是之前new的實例。

線程終止:

    jopc.terminate();
  • 線程終止必須在JOpc.coUninitialize()之前調用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章