linux环境下C++ 调用Utgard 库访问OPCda服务器
时间: 2023-09-18 19:08:04 浏览: 125
utgard访问OPC server
Utgard 是一个Java库,用于连接 OPC DA 服务器,如果你想在Linux环境下使用C++调用Utgard库访问OPC DA服务器,你需要使用Java Native Interface(JNI)。
以下是一些步骤:
1.首先,在Linux系统上安装Java Development Kit(JDK)。
2.然后创建一个Java类来连接OPC DA服务器并实现所需的功能。
3.编译Java类并生成一个Java动态链接库(.so文件)。
4.在C++代码中使用JNI调用Java动态链接库。
下面是一个简单的示例:
Java类:
```java
import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.JIVariant;
import org.jinterop.dcom.core.JIString;
import org.openscada.opc.lib.common.ConnectionInformation;
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 OPCClient {
public static void main(String[] args) throws Exception {
// connect to an OPC DA server
ConnectionInformation ci = new ConnectionInformation();
ci.setHost("localhost");
ci.setUser("user");
ci.setPassword("password");
ci.setClsid("B3AF0BF6-4C0C-4804-A122-6F3B160F4397");
Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());
// create an item and read its value
Item item = server.getItemManager().getItem("Random.Int1");
SyncAccess syncAccess = new SyncAccess(server, 1000);
syncAccess.addItem(item);
syncAccess.bind();
ItemState itemState = item.read(syncAccess.getTransactionId()).get();
JIVariant jiVariant = itemState.getValue();
int value = jiVariant.getObjectAsInt();
System.out.println(value);
// write a value to the item
item.write(new JIVariant(new JIString("new value")));
// disconnect from the server
server.dispose();
}
}
```
编译Java类并生成一个Java动态链接库:
```bash
javac -cp .:utgard.jar OPCClient.java
javah -classpath .:utgard.jar -jni OPCClient
gcc -shared -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -o libOPCClient.so OPCClient.c -L. -lutgard
```
C++代码:
```c++
#include <jni.h>
int main() {
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_8;
vm_args.nOptions = 0;
vm_args.ignoreUnrecognized = JNI_FALSE;
JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
jclass cls = env->FindClass("OPCClient");
jmethodID mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
jobjectArray args = env->NewObjectArray(0, env->FindClass("java/lang/String"), NULL);
env->CallStaticVoidMethod(cls, mid, args);
jvm->DestroyJavaVM();
}
```
在编译C++代码时需要链接utgard库和jni库,如下所示:
```bash
g++ -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -L. -lutgard -ljvm -o main main.cpp
```
注意:以上示例仅演示了如何使用JNI调用Java动态链接库,具体的OPC DA连接实现需要根据自己的需求进行编写。
阅读全文