用java访问远程的opcDa获取数据的代码怎么写
时间: 2024-03-09 15:47:48 浏览: 15
访问远程的 OPC DA 服务器,可以使用 J-Integra COM Bridge 实现 Java 与 COM 之间的互操作性。下面是一个简单的 Java 代码示例,用于连接 OPC DA 服务器并获取数据:
```java
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class OpcDaClient {
private ActiveXComponent opcServer;
private Dispatch opcGroup;
private Variant[] opcValues;
private ScheduledExecutorService executor;
private String itemId;
public OpcDaClient(String serverProgId, String itemId) {
ComThread.InitSTA();
opcServer = new ActiveXComponent(serverProgId);
opcGroup = opcServer.invokeGetComponent("OPCGroups").invokeGetComponent("Add").toDispatch();
opcValues = new Variant[1];
executor = Executors.newSingleThreadScheduledExecutor();
this.itemId = itemId;
}
public void start() {
executor.scheduleAtFixedRate(() -> {
try {
Variant[] itemValues = opcGroup.invoke("SyncRead", new Variant[] {1, new Variant[] {itemId}, opcValues.length}).toSafeArray();
opcValues = itemValues[0].toSafeArray().getVariantArray();
System.out.println("OPC value: " + opcValues[0].getFloat());
} catch (Exception e) {
e.printStackTrace();
}
}, 0, 500, TimeUnit.MILLISECONDS);
}
public void stop() {
executor.shutdown();
opcServer.invoke("Disconnect");
ComThread.Release();
}
public static void main(String[] args) {
String serverProgId = "Matrikon.OPC.Simulation.1";
String itemId = "Random.Real8";
OpcDaClient client = new OpcDaClient(serverProgId, itemId);
client.start();
}
}
```
在上面的代码中,我们使用 J-Integra COM Bridge 库来连接 OPC DA 服务器,其中 `serverProgId` 表示 OPC DA 服务器的 ProgID,`itemId` 表示要读取的 OPC 项的标识符。在 `start()` 方法中,我们使用定时任务定期读取 OPC 项的值,并将其输出至控制台。在 `stop()` 方法中,我们关闭了定时任务并断开了与 OPC DA 服务器的连接。最后,在 `main()` 方法中,我们创建了一个 `OpcDaClient` 对象并启动它。