用java连接远程的OPCDa协议获取数据的代码
时间: 2024-03-15 21:45:08 浏览: 97
以下是使用Java连接远程OPC DA协议获取数据的示例代码:
```java
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.JIVariant;
import org.openscada.opc.lib.common.ConnectionInformation;
import org.openscada.opc.lib.da.AccessBase;
import org.openscada.opc.lib.da.Item;
import org.openscada.opc.lib.da.ItemState;
import org.openscada.opc.lib.da.Server;
import org.openscada.opc.lib.da.SyncAccess;
public class OPCDASample {
private static final String CLSID = "F8582CF2-88FB-11D0-B850-00C0F0104305";
private static final String PROG_ID = "OPC.SimaticNET";
private static final String SERVER_HOST = "localhost";
private static final String ITEM_ID = "Random.Int1";
public static void main(String[] args) {
ConnectionInformation ci = new ConnectionInformation();
ci.setClsid(CLSID);
ci.setProgId(PROG_ID);
ci.setHost(SERVER_HOST);
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
try {
Server server = new Server(ci, executor);
server.connect();
AccessBase access = new SyncAccess(server, 1000);
access.addItem(ITEM_ID, new DataCallback());
executor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
access.bind();
Item item = access.getItem(ITEM_ID);
ItemState state = item.read(false);
System.out.println("Value: " + state.getValue().getObjectAsInt());
access.unbind();
} catch (Exception e) {
e.printStackTrace();
}
}
}, 0, 1, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
}
}
private static class DataCallback extends AccessBase {
@Override
public void dataChange(Item item, ItemState state) {
try {
Object value = state.getValue().getObject();
if (value instanceof JIVariant) {
value = ((JIVariant)value).getObject();
}
System.out.println("Callback Value: " + value);
} catch (JIException e) {
e.printStackTrace();
}
}
}
}
```
在上面的示例代码中,我们使用了 `org.openscada.opc.lib` 库来连接OPC DA服务器并获取数据。其中:
- `ConnectionInformation` 类用于指定OPC DA服务器的连接信息,包括 CLSID、ProgID、主机名等。
- `Server` 类用于连接OPC DA服务器。
- `AccessBase` 类提供了访问OPC DA服务器中某个数据项的方法。
- `SyncAccess` 类是 `AccessBase` 的子类,提供了同步读取数据的方法。
- `Item` 类表示OPC DA服务器中的一个数据项。
- `ItemState` 类表示数据项的状态,包括当前值、质量等信息。
- `DataCallback` 类继承了 `AccessBase`,用于处理数据项的变化。
在上面的代码中,我们使用了一个定时任务来读取数据项的值。可以根据实际需求进行调整。
阅读全文