注:da有很大的局限性,并且已经过时,推荐使用ua,可以不用配置dcom并且兼容da,我的另一篇文章里有写 java opc-ua 读写、订阅操作_weixin_45411740的博客-CSDN博客

第一步你需要下载一个kepserver,去官网下载就好,或者找我下载,我这边提供一个无限时长的,

第二步,配置dcom,如果你的kepserver和你的java客户端在一台电脑上,只需要配置这台电脑,如果不在一台电脑上,那么就需要两台电脑都配置,配置Dcom网上教程很多,我这里就不挂了

第三步,java代码编写

读取

package tcb;import java.util.concurrent.Executors;import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.JIString;
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.DataCallback;
import org.openscada.opc.lib.da.Item;
import org.openscada.opc.lib.da.ItemState;
import org.openscada.opc.lib.da.Server;
import org.openscada.opc.lib.da.SyncAccess;public class UtgardTutorial1 {public static void main(String[] args) throws Exception {// 连接信息final ConnectionInformation ci = new ConnectionInformation();ci.setHost("127.0.0.1");         // 电脑IPci.setDomain("");                  // 域,为空就行ci.setUser("jltcopc");             // 电脑上自己建好的用户名ci.setPassword("jltc8606");          // 用户名的密码// 使用MatrikonOPC Server的配置// ci.setClsid("F8582CF2-88FB-11D0-B850-00C0F0104305"); // MatrikonOPC的注册表ID,可以在“组件服务”里看到// final String itemId = "u.u";    // 项的名字按实际// 使用KEPServer的配置ci.setClsid("7BC0CC8E-482C-47CA-ABDC-0FE7F9C6E729"); // KEPServer的注册表ID,可以在“组件服务”里看到final String itemId = "通道 9.设备 1.tag";    // 项的名字按实际,没有实际PLC,用的模拟器:simulator// final String itemId = "通道 1.设备 1.标记 1";// 启动服务final Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());try {// 连接到服务server.connect();// add sync access, poll every 500 ms,启动一个同步的access用来读取地址上的值,线程池每500ms读值一次// 这个是用来循环读值的,只读一次值不用这样final AccessBase access = new SyncAccess(server, 500);// 这是个回调函数,就是读到值后执行这个打印,是用匿名类写的,当然也可以写到外面去access.addItem(itemId, new DataCallback() {@Overridepublic void changed(Item item, ItemState itemState) {int type = 0;try {type = itemState.getValue().getType(); // 类型实际是数字,用常量定义的} catch (JIException e) {e.printStackTrace();}System.out.println("监控项的数据类型是:-----" + type);System.out.println("监控项的时间戳是:-----" + itemState.getTimestamp().getTime());System.out.println("监控项的详细信息是:-----" + itemState);// 如果读到是short类型的值if (type == JIVariant.VT_I2) {short n = 0;try {n = itemState.getValue().getObjectAsShort();} catch (JIException e) {e.printStackTrace();}System.out.println("-----short类型值: " + n);}// 如果读到是字符串类型的值if(type == JIVariant.VT_BSTR) {  // 字符串的类型是8JIString value = null;try {value = itemState.getValue().getObjectAsString();} catch (JIException e) {e.printStackTrace();} // 按字符串读取String str = value.getString(); // 得到字符串System.out.println("-----String类型值: " + str);}}});// start reading,开始读值access.bind();// wait a little bit,有个10秒延时Thread.sleep(10 * 1000);// stop reading,停止读取access.unbind();} catch (final JIException e) {System.out.println(String.format("%08X: %s", e.getErrorCode(), server.getErrorMessage(e.getErrorCode())));}}
}写
package tcb;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.DataCallback;
import org.openscada.opc.lib.da.Group;
import org.openscada.opc.lib.da.Item;
import org.openscada.opc.lib.da.ItemState;
import org.openscada.opc.lib.da.Server;
import org.openscada.opc.lib.da.SyncAccess;public class UtgardTutorial2 {public static void main(String[] args) throws Exception {// 连接信息final ConnectionInformation ci = new ConnectionInformation();ci.setHost("127.0.0.1");          // 电脑IPci.setDomain("");                   // 域,为空就行ci.setUser("jltcopc");              // 用户名,配置DCOM时配置的ci.setPassword("jltc8606");           // 密码// 使用MatrikonOPC Server的配置// ci.setClsid("F8582CF2-88FB-11D0-B850-00C0F0104305"); // MatrikonOPC的注册表ID,可以在“组件服务”里看到// final String itemId = "u.u";    // 项的名字按实际// 使用KEPServer的配置ci.setClsid("7BC0CC8E-482C-47CA-ABDC-0FE7F9C6E729"); // KEPServer的注册表ID,可以在“组件服务”里看到final String itemId = "通道 9.设备 1.tag";    // 项的名字按实际,没有实际PLC,用的模拟器:simulator// final String itemId = "通道 1.设备 1.标记 1";// create a new server,启动服务final Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());try {// connect to server,连接到服务server.connect();// add sync access, poll every 500 ms,启动一个同步的access用来读取地址上的值,线程池每500ms读值一次// 这个是用来循环读值的,只读一次值不用这样final AccessBase access = new SyncAccess(server, 500);// 这是个回调函数,就是读到值后执行再执行下面的代码,是用匿名类写的,当然也可以写到外面去access.addItem(itemId, new DataCallback() {@Overridepublic void changed(Item item, ItemState state) {// also dump valuetry {if (state.getValue().getType() == JIVariant.VT_UI4) { // 如果读到的值类型时UnsignedInteger,即无符号整形数值System.out.println("<<< " + state + " / value = " + state.getValue().getObjectAsUnsigned().getValue());} else {System.out.println("<<< " + state + " / value = " + state.getValue().getObject());}} catch (JIException e) {e.printStackTrace();}}});// Add a new group,添加一个组,这个用来就读值或者写值一次,而不是循环读取或者写入// 组的名字随意,给组起名字是因为,server可以addGroup也可以removeGroup,读一次值,就先添加组,然后移除组,再读一次就再添加然后删除final Group group = server.addGroup("test");// Add a new item to the group,// 将一个item加入到组,item名字就是MatrikonOPC Server或者KEPServer上面建的项的名字比如:u.u.TAG1,PLC.S7-300.TAG1final Item item = group.addItem(itemId);// start reading,开始循环读值access.bind();// add a thread for writing a value every 3 seconds// 写入一次就是item.write(value),循环写入就起个线程一直执行item.write(value)ScheduledExecutorService writeThread = Executors.newSingleThreadScheduledExecutor();writeThread.scheduleWithFixedDelay(new Runnable() {@Overridepublic void run() {final JIVariant value = new JIVariant("24");  // 写入24try {System.out.println(">>> " + "写入值:  " + "24");item.write(value);} catch (JIException e) {e.printStackTrace();}}}, 5, 3, TimeUnit.SECONDS); // 启动后5秒第一次执行代码,以后每3秒执行一次代码// wait a little bit ,延时20秒Thread.sleep(20 * 1000);writeThread.shutdownNow();  // 关掉一直写入的线程// stop reading,停止循环读取数值access.unbind();} catch (final JIException e) {System.out.println(String.format("%08X: %s", e.getErrorCode(), server.getErrorMessage(e.getErrorCode())));}}
}
这里通常会出现两个错误点

1.00000005,这个错误是由于账户密码错误导致

解决办法如下,

1.检查用户民密码,

2.检查有没有配置到Dcom组

3.配置注册表访问权限,具体步骤如下

右键点击权限

点击添加,高级,查找,找到你dcom配置的账户,应用,确定。

不能保存时,点击高级,点击更改,修改所有者为当前登录的用户

4.点击本地安全策略,把网络访问修改为经典

至此,0000005的问题应该可以全部解决

2.80010111问题

这个问题其实是由于电脑版本的问题,windows 2004之后的协议都是5.7,utgard的协议是5.6的,把windows降到1909就不会报这个错了

在这里查看电脑版本,不能回退版本的只能重装了,我这边是在公司的云服务器上搭建了一个虚拟机,然后重新装了一个win10之后测试成功

java opc da 连接 kepserver 报错 踩坑 解决办法相关推荐

  1. 终端连接mysql是出现error 2003_远程连接MySQL报错ERROR 2003解决办法

    转自https://blog.csdn.net/hjwang1/article/details/51669223 问题代码代码 ERROR 2003 (HY000): Can't connect to ...

  2. mysql1846错误_远程连接MySQL报错ERROR 2003解决办法

    转自https://blog.csdn.net/hjwang1/article/details/51669223 问题代码代码 ERROR 2003 (HY000): Can't connect to ...

  3. 登录mysql报错2059_navicat连接mysql报错2059的解决方法

    navicat连接mysql报错2059的解决方法 发布时间:2020-12-21 10:27:37 来源:亿速云 阅读:82 作者:小新 栏目:数据库 这篇文章给大家分享的是有关navicat连接m ...

  4. python运行启动报错解决方法_51testing:iOS自动化测试的那些干货:关于appium启动报错问题的解决办法...

    原标题:51testing:iOS自动化测试的那些干货:关于appium启动报错问题的解决办法 我们在进行iOS Appium自动化测试的时候,会遇到环境配置.兼容使用问题,这里做个总结,以避免后续踩 ...

  5. pom.xml内容没有错,但一直报错红叉 解决办法

    转自:http://www.cnblogs.com/sxdcgaq8080/p/5590254.html [maven] pom.xml内容没有错,但一直报错红叉 解决办法 1.首先看一下下面的这两个 ...

  6. CFX计算报错和相应解决办法(浮点错误等-持续更新)

    CFX计算报错和相应解决办法(浮点错误等-持续更新) 1.CFX浮点错误 Floating point exception:Overflow 数值计算过大,浮点数位数不够,使用双精度double类型计 ...

  7. python modulenotfounderror_python 服务器运行代码报错ModuleNotFoundError的解决办法

    一.问题描述 一段 Python 代码在本地的 IDE 上运行正常,部署到服务器运行后,出现了 ModuleNotFoundError: No module named 'xxx" 错误. ...

  8. IndexError: list index out of range--Python报错原因及解决办法

    报错原因 一.括号里面的索引index超出范围 例如:要查找最后一个明星的名字'Hannah Quinlivan',Index输入为4.在Python中,第四个元素的索引为3,因为索引是从0开始的.如 ...

  9. mysql1055_MySQL5.7 group by新特性报错1055的解决办法

    项目中本来使用的是mysql5.6进行开发,切换到5.7之后,突然发现原来的一些sql运行都报错,错误编码1055,错误信息和sql_mode中的"only_full_group_by&qu ...

最新文章

  1. 认知与设计:理解UI设计准则——序
  2. Google 选择 Jetty 放弃 Tomcat
  3. 怎样制作一个 Python Egg
  4. php计算时间顺延3分,PHP关于strtotime函数的大坑
  5. 基于ASP.NET 3.5 Web Service 的JSON扩展应用
  6. linux I/O 栈 预习(上)
  7. Spring Boot 的starter pom
  8. linux-文件的删除与创建
  9. Ubuntu 17.04 壁纸设计大赛 已经开幕
  10. 数据库msqlserver的几种类型及解决MSSQLServer服务启动不了的问题
  11. 哈夫曼树的建立(二叉链表)
  12. 织梦后台怎么上传mp4视频到网站中
  13. 吐槽、吐槽、吐槽!!!!!!
  14. 《天赋》:第一章 天赋
  15. 秀!如何搭建一个永久运行的个人服务器?
  16. IOS开发之证书共享(团队协同开发)
  17. Python 使用Pandas在原有Excel文件中创建子表格
  18. Chef 安装教程【系列教程一】
  19. PV、UV、VV、IP的区别
  20. 30、python散点图绘制简单操作

热门文章

  1. 3000元组装电脑配置推荐2023 3000元台式电脑配置清单2023
  2. 计算机服务器水冷系统设计,高温不宕机!解密IBM水冷技术发展史
  3. 外汇天眼:美国房价7月出现两年来首次下跌 美国楼市或大幅减速
  4. 【ACWing】320. 能量项链
  5. 复古情调效果器插件 XLN Audio RC-20 Retro Color 1.1.1.2 WiN
  6. hive over窗口函数的使用
  7. Tsung笔记之分布式增强跳出SSH羁绊篇
  8. Audio Bit Depth Super-Resolution with Neural Networks
  9. 腾讯地图和百度地图经纬度存在偏差,需要转换
  10. WS2812b幻彩ARGB灯珠的STM32F103的CPU-SPI方式驱动