java读取OPC DA数据---Utgard
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引入包
<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
相关文章:
java读取OPC DA数据---Utgard
java读取OPC DA数据—Utgard Utgard库已经过时,原作者早已删除库,建议使用OPC UA,兼容OPC DA。 下面讲解Utgard使用 C#和C都不用配置DCOM,直接调用函数 既然是非要用Java,那就别想太方便,需要配置DCOM(后…...
在 Android 上简单安全地登录——使用凭证管理器和密钥
我踏马很高兴地听说, Credential Manager的公开版本将于 11 月 1 日开始提供。Credential Manager 为 Android 带来了身份验证的未来,简化了用户登录应用程序和网站的方式,同时使其更加安全。 登录可能具有挑战性 - 密码经常使用,…...
【Python】上市公司数据进行经典OLS回归实操
一、题目二、数据合并、清洗、描述性统计1、数据获取2、数据合并3、选择董监高薪酬作为解释变量的理论逻辑分析 三、多元回归模型的参数估计、结果展示与分析1、描述性统计分析2、剔除金融类上市公司3、对所有变量进行1%缩尾处理4、0-1标准化,所有解释变量5、绘制热…...
科研学习|科研软件——有序多分类Logistic回归的SPSS教程!
一、问题与数据 研究者想调查人们对“本国税收过高”的赞同程度:Strongly Disagree——非常不同意,用“0”表示;Disagree——不同意,用“1”表示;Agree--同意,用“2”表示;Strongly Agree--非常…...
微服务简单理解与快速搭建
分布式和微服务 含义 微服务架构 微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服…...
QColorDialog开发实例
文章目录 一、QColorDialog基本用法:二、QColorDialog详解三、QColorDialog接口说明静态函数成员函数 四、QColorDialog代码开发实例 QColorDialog 是 Qt 框架中用于选择颜色的对话框类。它提供了一个用户友好的界面,允许用户选择颜色。以下是 QColorDi…...
linux实现全局快捷键
文章目录 第一步:加载KF5GlobalAccel库第二步:代码实现2.1 定义一个QAction2.2 KGlobalAccel::self()注册快捷键3 源码地址有一个需求,就是在应用在后台运行时,用户可以通过快捷键将应用唤起。或者应用响应。 其实就是全局快捷键的功能。 这个功能利用了linux操作系统中的d…...
共享台球室小程序系统:智能化预约与管理
在当今数字化的时代,共享经济模式已经渗透到各个领域。其中,共享台球室作为一个结合了传统与现代元素的项目,越来越受到年轻人的喜爱。为了满足市场需求,我们设计了一款基于微信小程序的共享台球室预约与管理系统,通过…...
百度文心一言
1分钟了解一言是谁? 一句话介绍【文心一言】 我是百度研发的人工智能模型,任何人都可以通过输入【指令】和我进行互动,对我提出问题或要求,我能高效地帮助你们获取信息、知识和灵感哦 什么是指令?我该怎么和你互动&am…...
225.用队列实现栈(LeetCode)
思路 思路:用两个队列实现栈后进先出的特性 ,两个队列为空时,先将数据都导向其中一个队列。 当要模拟出栈时,将前面的元素都导入另一个空队列,再将最后一个元素移出队列 实现 实现: 因为C语言没有库可以…...
汽车FMCW毫米波雷达信号处理流程(推荐---基础详细---清楚的讲解了雷达的过程---强烈推荐)
毫米波雷达在进行多目标检测时,TX发射一个Chirp,在不同距离下RX会接收到多个反射Chirp信号(仅以单个chirp为例)。 雷达通过接收不同物体的发射信号,并转为IF信号,利用傅里叶变换将产生一个具有不同的分离峰值的频谱,每个峰值表示在特定距离处存在物体。 请问,这种多目标…...
8.指令格式,指令的寻址方式
目录 一. 指令格式 二. 扩展操作码 三. 指令寻址 (1)指令寻址 (2)数据寻址 1.直接寻址 2.间接寻址 3.寄存器寻址 4.寄存器间接寻址 5.隐含寻址 6.立即寻址 7.基址寻址 8.变址寻址 9.相对寻址 10.堆栈寻址 一. 指令…...
k8s自定义Endpoint实现内部pod访问外部应用
自定义endpoint实现内部pod访问外部应用 endpoint除了可以暴露pod的IP和端口还可以代理到外部的ip和端口 使用场景 公司业务还还没有完成上云, 一部分云原生的,一部分是实体的 业务上云期间逐步实现上云,保证各个模块之间的解耦性 比如使…...
[100天算法】-分割等和子集(day 78)
题目描述 给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].示例 2:输入:…...
共享台球室小程序系统的数据统计与分析功能
随着共享经济的繁荣发展,共享台球室作为一种新型的娱乐方式,越来越受到年轻人的喜爱。为了更好地满足用户需求和提高管理效率,我们设计了一款基于微信小程序的共享台球室预订与管理系统。该系统不仅具备基本的预订和管理功能,还集…...
Istio学习笔记- 服务网格
Istio 服务网格 参考:Istio / Istio 服务网格 Istio 使用功能强大的 Envoy 服务代理扩展了 Kubernetes,以建立一个可编程的、可感知的应用程序网络。Istio 与 Kubernetes 和传统工作负载一起使用,为复杂的部署带来了标准的通用流量管理、遥…...
离散卡尔曼滤波器算法详解及重要参数(Q、R、P)的讨论
公开数据集中文版详细描述参考前文:https://editor.csdn.net/md/?not_checkout1&spm1011.2124.3001.6192神经元Spike信号分析参考前文:https://blog.csdn.net/qq_43811536/article/details/134359566?spm1001.2014.3001.5501神经元运动调制分析参考…...
伊朗黑客对以色列科技行业发起恶意软件攻击
最近,安全研究人员发现了一场由“Imperial Kitten”发起的新攻击活动,目标是运输、物流和科技公司。 “Imperial Kitten”又被称为“Tortoiseshell”、“TA456”、“Crimson Sandstorm”和“Yellow Liderc”,多年来一直使用“Marcella Flore…...
selenium报错:没有打开网页或selenium.common.exceptions.NoSuchDriverException
文章目录 问题解决方法 问题 当selenium的环境配置没有问题,但在使用selenium访问浏览器时并没有打开网页,或者出现selenium.common.exceptions.NoSuchDriverException报错信息(如下图所示)。 以上问题可能的原因是没有配置chrom…...
Java开源工具库使用之线上监控诊断库Arthas
文章目录 前言一、介绍1.1 功能1.2 原理 二、安装使用2.1 下载2.2 使用 三、常用3.1 实时查看3.2 追踪查看3.3 辅助命令3.4 热更新3.5 监控 四、实战4.1 CPU/内存占用过高4.2 接口耗时高4.3 找到类所在jar4.4 查找类的实例4.5 生成火焰图 参考 前言 在现代软件开发中ÿ…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
