前言
實現原理和核心參照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()之前調用。