• 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.utgardgroupId>
    			<artifactId>org.openscada.opc.libartifactId>
    			<version>1.5.0version>
    			<exclusions>
    				<exclusion>
    					<groupId>org.bouncycastlegroupId>
    					<artifactId>bcprov-jdk15onartifactId>
    				exclusion>
    			exclusions>
    		dependency>
    		<dependency>
    			<groupId>org.bouncycastlegroupId>
    			<artifactId>bcprov-jdk15onartifactId>
    			<version>1.65version>
    		dependency>
    		<dependency>
    			<groupId>org.openscada.utgardgroupId>
    			<artifactId>org.openscada.opc.dcomartifactId>
    			<version>1.5.0version>
    		dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    伪代码读取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;
            }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104

    参考链接:
    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

  • 相关阅读:
    ROS知识点——生成点云,发布、订阅ROS点云话题
    【git】超详细使用指令
    恋爱脑学Rust之dyn关键字的作用
    基于SpringBoot的“冬奥会科普平台”的设计与实现(源码+数据库+文档+PPT)
    java tcp 发送日志
    【Linux】GDB调试器学起来!指令全解,建议收藏
    npm cnpm pnpm yarn 有什么区别? 哪个更好用呢?
    【软考 系统架构设计师】案例分析③ 面向对象设计
    设计模式19-状态模式
    重生奇迹mu获取武器装备的主要方法
  • 原文地址:https://blog.csdn.net/yinjl123/article/details/134384374