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_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
https://blog.csdn.net/lgbisha/article/details/82898228

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
opc-utgard 是一个开源项目,它是 OPC(OLE for Process Control)的 Java 实现。OPC 是一种广泛使用的工业自动化通信标准,用于在不同设备之间实现数据交换和通信。 opc-utgard 的源码可以通过 GitHub 平台进行获取和查看。该项目提供了 OPC 客户端库的 Java 实现,使得开发者可以使用 Java 语言轻松地与 OPC 服务器进行通信。 在 opc-utgard 的源码中,我们可以找到一些核心的类和接口,例如:Server、Group、Item 等。通过 Server 类,我们可以连接到 OPC 服务器,并进行连接管理。Group 类用于创建 OPC 组,用于管理与 OPC 服务器的数据交换。Item 类则用于定义与 OPC 数据项相关的信息,例如数据类型、读取和写入数据等。 opc-utgard 的源码实现了 OPC Data Access v2.0(DA 2.0)规范,这是一种常见的 OPC 规范,用于获取实时数据。它还支持异步读取和写入数据,以提高通信效率。除了 DA 2.0,opc-utgard 还支持 OPC Alarm and Events(AE)规范,用于处理与报警和事件相关的功能。 通过研究 opc-utgard 的源码,我们可以深入了解 OPC 通信协议的实现细节,学习如何使用 Java 语言与 OPC 服务器进行通信和数据交换。此外,我们还可以根据实际需要对源码进行调整和定制,以满足特定的应用场景。 总之,opc-utgard 的源码是一个极具价值的资源,可以为开发者提供学习和开发 OPC 相关应用程序的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值