java连接OPC server开源的jar有两个,jeasyopc和Utgard;
jeasyopc : 底层依赖JNI,只能跑在windows环境,不能跨平台
Utgard; 全部基于dcom具有跨平台的特性
以下是jeasyopc连接Opc server的样例;Utgard的有机会再补;
Opc server简单配置
从上一篇OPC概述里,下载opc server安装,如图一个是opc server,一个是opc客户端;
demo如下图简单配置,不用像教程那么麻烦。
在Alias configuration右键 Insert Alias groups test.点击content 配置如下
通过opc explorer检查配置是否正确;可以看到能正常获取到数据f001
在client test上邮件add items配置f002
OK, server配置完毕同时通过client验证了;
jeasyopc配置指南
通过地址下载jeasyopc相关文件https://sourceforge.net/projects/jeasyopc/
注意jeasyopc 只支持32jdk;不然报错;需要下载32位jdk;
Exception in thread "main" java.lang.UnsatisfiedLinkError: *****\opc-demo\lib\JCustomOpc.dll:
Can't load IA 32-bit .dll on a AMD 64-bit platform
将jar包导入工程; -Dfile 为你的jar包路径
mvn install:install-file -Dfile=jeasyopc.jar -DgroupId=javafish.clients -DartifactId=jeasy-opc -Dversion=16.05.24 -Dpackaging=jar
pom.xml新增配置
<dependency>
<groupId>javafish.clients</groupId>
<artifactId>jeasy-opc</artifactId>
<version>16.05.24</version>
</dependency>
在项目下新建目录lib,将下载的dll JCustomOpc.dll放入进去;
在resource下建立javafish.clients.opc;新建JCustomOpc.properties,配置dll的路径
library.path = ./lib/JCustomOpc
代码比较简单,如下
@Slf4j
public class OpcUtils {
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
public static void main(String[] args) {
simpleDemo();
}
public static void simpleDemo() {
JOpc.coInitialize();
JOpc jopc = new JOpc("localhost", "Matrikon.OPC.Simulation.1", "JCustomOPC");
OpcItem item1 = new OpcItem("test.f001", true, "");
OpcGroup group = new OpcGroup("group1", true, 1000, 0.0f);
group.addItem(item1);
jopc.addGroup(group);
try {
jopc.connect();
log.info("OPC client is connected");
jopc.registerGroups();
log.info("OPC Group is registere");
} catch (ConnectivityException e2) {
e2.printStackTrace();
} catch (UnableAddItemException e) {
e.printStackTrace();
} catch (UnableAddGroupException e) {
e.printStackTrace();
}
try {
for (int i = 1; i <= 10; i++) {
log.info("开始第{}次获取遥测数据", i);
OpcItem responseItem = jopc.synchReadItem(group, item1);
log.info("返回结果item:{}", responseItem);
log.info("遥测数据时间{}, 遥测数据类型{}, 遥测数据值{}", sdf.format(responseItem.getTimeStamp().getTime()), Variant.getVariantName(responseItem.getDataType()), responseItem.getValue());
Thread.sleep(1000);
}
} catch (SynchReadException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
JOpc.coUninitialize();
}
}
}