java连接opcserver

参考:

  https://blog.csdn.net/ioufev/article/details/81240572
  https://wenku.baidu.com/view/20a9fb6aee06eff9aef807c9.html
  https://www.hifreud.com/2014/12/27/opc-4-client-invoke-use-utgard/
  file:///D:/tmp/jeasyopc-2.3.2/jeasyopc-2.3.2/doc/manual/guide.html#Quick_Start

前言:

  java连接opcserver的两种方式,代码都很简单,概念也容易理解,但是第一次对windows的dcom配置调试非常痛苦,因为调试的代码异常根本没有什么有用的信息。可能因为是安全等级的原因,只有服务器端才能知道异常信息,连接客户端只知道连接失败了,提示:登录被拒绝。

准备环境:

  一台windows10专业版的电脑作为opc服务器(家庭版无法配置dcom模块)
  一台windows7的电脑安装opc客户端(使用了hyper-v虚拟机建了一台虚拟机,由于jeasyopc只支持32位的电脑,所以装了32位的windows7操作系统)

需要的工具:

  MatrikonOPC Server for Simulation(模拟测试用的服务端)
  MatrikonOPC Explorer(连接opcserver的客户端)
  eclipse(用于代码调试)

连接方式:

本次使用了两种方式去连接opcserver:Utgard以及Jeasyopc

测试步骤:
1,先在模拟opc服务端的服务器上安装MatrikonOPC Server for Simulation

ps:安装很简单,其他帖子里面有。

2,在opc客户端的服务器上安装MatrikonOPC Explorer

ps:安装服务端的时候会自动安装客户端,也可以单独下载安装。创建连接的时候,注意填写ProgID:ProgID是程序给某个CLSID指定一个易记的名字。 在注册表中HKey_Classes_Root下可查看。

3,配置两台电脑的dcom;

ps:这个东西网上有很多文档,并且细节上还各不相同,我感觉原则上你使用的用户,要属于组Distributed COM User,并且要有读写权限,配置中标识属性中通常建议选交互式用户,但是我的现场环境是选的下列用户(客户环境不能修改),也可以登录。另外网上教程里说服务器和客户端都需要配本地DTC的属性里的网络DTC属性,由于客户生产服务器不敢修改任何配置,所以我跳过了这一步,也没有任何问题。

4,在MatrikonOPC Explorer种调试是否能远程获取服务端的tag;

ps:如果这步通了,说明dcom配置没有问题。这步我卡了很久,刚开始一直搜索不到服务器上的opc,没有任何提示信息,于是检查windows服务器的登录安全日志,发现一直报错登录失败,找不到用户,发现虚拟机里登录的用户admin,在服务器上并不存在,于是在服务器端添加用户admin,并配置好dcom权限,问题解决(就是说你必须本地建一个和服务器端dcom标识配置的用户同名同密码的用户,并在客户端本地登录这个用户,再使用客户端去连)。在现场环境还出现一个问题,客户端搜索了服务器上的opc后,报错提示服务器异常,后来发现是由于现场服务器主备切换后没有连接到正确的opcserver导致。

5,写代码获取服务端的tag;

ps:按其他帖子里写就好了,两种方式都可以获取数据成功。但是jeasyopc查询服务列表一直报找不到主机,但是其他获取数据的接口又可以获取数据,不知道为什么,由于底层封装的c++代码,也没法跟踪调试。

最后就是用写好的代码连接生产环境DCS系统自带的的opcserver。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 Java 连接 OPC Server,需要使用 OPC Foundation 提供的 Java COM 桥接器(Java COM Bridge)以及 OPC Server 的 COM 接口。Java COM 桥接器可以将 Java 代码转换为 COM 组件,从而实现 JavaOPC Server 的通信。 以下是一个简单的示例代码,用于连接 OPC Server 并读取其中的一个变量: ```java import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import org.jinterop.dcom.common.JIException; import org.jinterop.dcom.core.JIVariant; import org.openscada.opc.lib.common.ConnectionInformation; import org.openscada.opc.lib.da.AccessBase; import org.openscada.opc.lib.da.AccessBase.OperationResults; import org.openscada.opc.lib.da.Async20Access; import org.openscada.opc.lib.da.AutoReconnectController; import org.openscada.opc.lib.da.Item; import org.openscada.opc.lib.da.ItemState; import org.openscada.opc.lib.da.SyncAccess; public class OPCClient { private static final String CLSID = "F8582CF2-88FB-11D0-B850-00C0F0104305"; // OPC Server 的 CLSID private static final String PROG_ID = "OPC.SimaticNET"; // OPC Server 的 ProgID private static final String SERVER_NAME = "localhost"; // OPC Server 的机器名或 IP 地址 private static final String ITEM_ID = "Random.Real8"; // 需要读取的变量的 ID public static void main(String[] args) throws Exception { // 构造 OPC Server连接信息 ConnectionInformation ci = new ConnectionInformation(); ci.setClsid(CLSID); ci.setProgId(PROG_ID); ci.setHost(SERVER_NAME); // 创建一个同步访问对象 SyncAccess syncAccess = new SyncAccess(ci, 1000); // 连接 OPC Server syncAccess.connect(); // 获取需要读取的变量 Item item = syncAccess.addItem(ITEM_ID); // 读取变量的值 ItemState itemState = item.read(true); System.out.println("Value: " + itemState.getValue().getObjectAsDouble()); // 关闭同步访问对象 syncAccess.dispose(); } } ``` 在这个示例中,我们使用了 Java COM 桥接器和 OPC Foundation 提供的 OPC DA (Data Access)库来连接 OPC Server 并读取其中的一个变量。具体来说,我们首先构造了 OPC Server连接信息,然后创建了一个同步访问对象,使用这个访问对象连接 OPC Server。接着,我们获取需要读取的变量,并使用 `read()` 方法读取变量的值。最后,我们关闭同步访问对象。 需要注意的是,这个示例中使用了同步访问对象来读取变量的值。如果需要异步访问,可以使用 `Async20Access` 类来实现。此外,还可以使用 `AutoReconnectController` 类来实现自动重连功能,从而保证程序的稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值