java读取OPC DA数据---Utgard
Utgard库已经过时,原作者早已删除库,建议使用OPC UA,兼容OPC DA。
下面讲解Utgard使用
-
C#和C++都不用配置DCOM,直接调用函数
-
既然是非要用Java,那就别想太方便,需要配置DCOM(后面博客介绍)。
Java实现OPC客户端有两种
有两种开源包,分别是JeasyOpc和utgard(Openscada),他们的区别如下:
Utgard | Jeasyopc | |
---|---|---|
Linux下 | 支持(纯Java编写) | 不支持 |
Windows64位下 | 支持 | 不支持 |
用户名密码 | 需要 | 不需要 |
组查询 | 不支持 | 支持 |
压力测试(单线程同步) | 略快7W点大约在4224ms | 略慢7W点大约在22540ms |
压力测试(单线程异步) | 略快 | 略慢 |
压力测试(单线程发布订阅) | 无 | 无 |
经对比分析,我们采用Utgard(Openscada)开源技术,Openscada可以很好的实现与OPC服务器的链接及读写数据等功能,还可以随时获取和修改OPC的Server和Item的属性状态信息。所以它能够很好的满足我们的需求,建议使用Openscada。
关于Utgard
-
Utgard是一个开源的项目,基于j-interop做的,用于和OPC SERVER通讯。
-
j-interop是纯java封装的用于COM/DCOM通讯的开源项目,这样就不必使用JNI
-
Utgard则是纯java编写,就是不支持opc 3.0协议。
关于JeasyOPC
- 借助一个dll库来实现的和OPCServer的通信,但是JCustomOpc.dll,,太老了,而且支持只32位系统
- JEasy是java调用动态连接库,底层用的是jni,dll库比较老。
建议选择Utgard
java使用Utgard读取OPC数据
pom.xml引入包
xml
<dependency>
<groupId>org.openscada.utgard</groupId>
<artifactId>org.openscada.opc.lib</artifactId>
<version>1.5.0</version>
<exclusions>
<exclusion>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.65</version>
</dependency>
<dependency>
<groupId>org.openscada.utgard</groupId>
<artifactId>org.openscada.opc.dcom</artifactId>
<version>1.5.0</version>
</dependency>
伪代码读取OPC
java
import org.jinterop.dcom.common.JIErrorCodes;
import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.JIVariant;
import org.openscada.opc.dcom.da.OPCSERVERSTATE;
import org.openscada.opc.lib.common.ConnectionInformation;
import org.openscada.opc.lib.da.*;
import java.util.concurrent.Executors;
public class Test {
public static void main(String[] args) throws Exception {
test();
}
public static void test() throws Exception {
final ConnectionInformation ci = new ConnectionInformation();
ci.setHost("10.211.55.4");
ci.setUser("OPCUser");
ci.setPassword("opcuser");
//注册表ID,可以在"组件服务"里看到 也可以在我的博客(https://blog.csdn.net/yinjl123456/article/details/121756075)中找到
ci.setClsid("7BC0CC8E-482C-47CA-ABDC-0FE7F9C6E729");
Item item = null;
Server server = new Server(ci, null);
try {
server.connect();
Group group = server.addGroup();
item = group.addItem("tongdao.tag1.aaa");
System.out.println("111111==" + getVal(item.read(true).getValue()));
Thread.sleep(2000);
System.out.println("ddddd===" + server.getServerState());
System.out.println("ddddd===" + server.getServerState().getServerState());
//ddddd===OPC_STATUS_RUNNING
if (OPCSERVERSTATE.OPC_STATUS_RUNNING == server.getServerState().getServerState()) {
System.out.println("OPC_STATUS_RUNNING ---------");
}
Group group2 = server.addGroup();
item = group2.addItem("tongdao.tag1.abc");
System.out.println("22222==" + getVal(item.read(true).getValue()));
Thread.sleep(2000);
server.dispose();
System.out.println("xxxxxx===" + server.getServerState());
//xxxxxx===null
if (null == server.getServerState()) {
System.out.println("OPC no ==================");
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取value
* @param var
* @return
* @throws JIException
*/
private static Object getVal(JIVariant var) throws JIException {
Object value;
int type = var.getType();
switch (type) {
case JIVariant.VT_I2:
value = var.getObjectAsShort();
break;
case JIVariant.VT_I4:
value = var.getObjectAsInt();
break;
case JIVariant.VT_I8:
value = var.getObjectAsLong();
break;
case JIVariant.VT_R4:
value = var.getObjectAsFloat();
break;
case JIVariant.VT_R8:
value = var.getObjectAsDouble();
break;
case JIVariant.VT_BSTR:
value = var.getObjectAsString2();
break;
case JIVariant.VT_BOOL:
value = var.getObjectAsBoolean();
break;
case JIVariant.VT_UI2:
case JIVariant.VT_UI4:
value = var.getObjectAsUnsigned().getValue();
break;
case JIVariant.VT_EMPTY:
throw new JIException(JIErrorCodes.JI_VARIANT_IS_NULL, "Variant is Empty.");
case JIVariant.VT_NULL:
throw new JIException(JIErrorCodes.JI_VARIANT_IS_NULL, "Variant is null.");
default:
throw new JIException(JIErrorCodes.JI_VARIANT_IS_NULL, "Unknown Type.");
}
return value;
}
}
参考链接:
https://www.cnblogs.com/Frankie1980/p/10830119.html
https://www.cnblogs.com/ioufev/p/9928971.html
https://www.hifreud.com/2014/12/27/opc-4-client-invoke-use-utgard/
https://blog.csdn.net/wise18146705004/article/details/82347926