原文鏈接:https://blog.csdn.net/yingzai1010/article/details/76154856/
基於opc對象的特征及關系的Utgard的使用
1.同步讀取某個點位的值
- Item項的read()方法
Server server = new Server(BaseConfiguration.getCLSIDConnectionInfomation(), Executors.newSingleThreadScheduledExecutor());
server.connect();
Group group = server.addGroup();
Item item = group.addItem(“Random.Real5”);
System.out.println(“ItemName:[” + item.getId()+ “],value:” + item.read(false).getValue());
2.基於AccessBase的Utgard的使用
2.1 循環同步讀取
使用SyncAccess類隔時間段地進行同步讀取數據 ,它實現了Runnable接口,實際上通過另一個線程進行同步讀,具體代碼如下:
public static void syncRead(Server server) throws Exception {
final String itemId = “Random.Int2”;
// 每隔1秒同步讀
AccessBase access = new SyncAccess(server, 1000);
access.addItem(itemId, new DataCallback() {@
Override
public void changed(Item item, ItemState itemState) {
System.out.println(itemState);
}
});
// start reading
access.bind();
// wait a little bit
Thread.sleep(5 * 1000);
// stop reading
access.unbind();
}
2.2 循環異步讀取
使用Async20Access類隔時間段地進行異步讀取數據,它實現了IOPCDataCallback接口,基於事件回調的實現,具體代碼如下:
public static void asyncRead(Server server) throws Exception {
final String itemId = “Random.Int2”;
// 第三個參數用於設置初始化時是否執行訪問
AccessBase access = new Async20Access(server, 1000, false);
access.addItem(itemId, new DataCallback() {@
Override
public void changed(Item item, ItemState itemState) {
System.out.println(“ >>> Asynchronized read: value = ”+itemState.getValue());
}
});
access.bind();
Thread.sleep(5 * 1000);
access.unbind();
}
數據讀取方式
同步訪問
OPC服務器把按照OPC應用程序的要求得到的數據訪問結果作為方法的參數返回給OPC應用程序,OPC應用程序在結果被返回為止一直必須處於等待狀態。
異步訪問
OPC服務器接到OPC應用程序的要求后,幾乎立即將方法返回。OPC應用程序隨后可以進行其他處理。當OPC服務器完成數據訪問時,觸發OPC應用程序的異步訪問完成事件,將數據訪問結果傳送給OPC應用程序。OPC應用程序在VB的事件處理程序中接受從OPC服務器傳送來的數據。
訂閱方式數據采集
並不需要OPC應用程序向OPC服務器要求,就可以自動接到從OPC服務器送來的變化通知的訂閱方式數據采集(Subscription)。服務器按一定的更新周期(UpdateRate)更新OPC服務器的數據緩沖器的數值時,如果發現數值有變化時,就會以數據變化事件(DataChange)通知OPC應用程序。如果OPC服務器支持不敏感帶(DeadBand),而且OPC標簽的數據類型是模擬量的情況,只有現在值與前次值的差的絕對值超過一定限度時,才更新緩沖器數據並通知OPC應用程序。由此可以無視模擬值的微小變化,從而減輕OPC服務器和OPC應用程序的負荷。
上述的OPC功能可以總結為如下表:
三種方式的性能總結: