当前位置: 首页 > news >正文

java读取OPC DA数据---Utgard

java读取OPC DA数据—Utgard

Utgard库已经过时,原作者早已删除库,建议使用OPC UA,兼容OPC DA。

下面讲解Utgard使用
  • C#和C++都不用配置DCOM,直接调用函数

  • 既然是非要用Java,那就别想太方便,需要配置DCOM(后面博客介绍)。

Java实现OPC客户端有两种

有两种开源包,分别是JeasyOpc和utgard(Openscada),他们的区别如下:

UtgardJeasyopc
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引入包
<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

OPC DA客户端工具Opc quick client使用


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_RUNNINGif (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===nullif (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
https://blog.csdn.net/lgbisha/article/details/82898228

http://www.lryc.cn/news/230299.html

相关文章:

  • 在 Android 上简单安全地登录——使用凭证管理器和密钥
  • 【Python】上市公司数据进行经典OLS回归实操
  • 科研学习|科研软件——有序多分类Logistic回归的SPSS教程!
  • 微服务简单理解与快速搭建
  • QColorDialog开发实例
  • linux实现全局快捷键
  • 共享台球室小程序系统:智能化预约与管理
  • 百度文心一言
  • 225.用队列实现栈(LeetCode)
  • 汽车FMCW毫米波雷达信号处理流程(推荐---基础详细---清楚的讲解了雷达的过程---强烈推荐)
  • 8.指令格式,指令的寻址方式
  • k8s自定义Endpoint实现内部pod访问外部应用
  • [100天算法】-分割等和子集(day 78)
  • 共享台球室小程序系统的数据统计与分析功能
  • Istio学习笔记- 服务网格
  • 离散卡尔曼滤波器算法详解及重要参数(Q、R、P)的讨论
  • 伊朗黑客对以色列科技行业发起恶意软件攻击
  • selenium报错:没有打开网页或selenium.common.exceptions.NoSuchDriverException
  • Java开源工具库使用之线上监控诊断库Arthas
  • Nodejs操作缓存数据库-Redis
  • Springboot项目全局异常处理
  • 算法笔记-第七章-栈的应用(未完成)
  • Linux socket编程(3):利用fork实现服务端与多个客户端建立连接
  • 若依Linux与Docker集群部署
  • 20.2 设备树中的 platform 驱动编写
  • C++实现ransac
  • DNS域名解析服务
  • 【milkv】2、mpu6050驱动添加及测试
  • SpringCloud Alibaba(中):服务熔断降级-Sentinel
  • 模型的训练专题