什么是OPC
OPC是工业控制和生产自动化领域中使用的硬件和软件的接口标准,以便有效地在应用和过程控制设备之间读写数据。O代表OLE(对象链接和嵌入),P (process过程),C (control控制)。
OPC标准采用C/S模式,OPC服务器负责向OPC客户端不断的提供数据。
OPC服务器包括3类对象(Object):服务器对象(Server)、组对象(Group)和项对象(Item)。
如何采集
这里使用Java 采集 OPC数据的 JEasyOpc 框架
首先创建OPC服务链接 把要采集的OPC服务信息写到XML中读取XML
@Slf4j
@Component
public class OpcService {
private Map<String,OpcGroup> groupSourceMap = new HashMap<>();
private JOpc jopc;
public JOpc getJopc() {
return jopc;
}
@PostConstruct
private void initOpc() {
boolean b = opcInit();
if (!b) {
log.error("JOPC 连接失败,开始重连。");
} else {
log.info("JOPC 连接成功");
}
}
/**
* 初始化opc服务
*/
private boolean opcInit() {
log.info("JOPC 开始初始化");
try {
JOpc.coInitialize();
log.info("建立JOPC服务对象");
SAXReader reader = new SAXReader();
File file = new File("C://opcConfig.xml");
Document license = reader.read(file);
Element rootElement = license.getRootElement();
Element conf = rootElement.element("conf");
String ip = conf.element("ip").getText();
String server = conf.element("server").getText();
String handle = conf.element("handle").getText();
String groupName = conf.element("group").getText();
Element items = rootElement.element("items");
List<Element> elements = items.elements();
OpcGroup group = new OpcGroup(groupName, true, 20, 0.0f);
/**name属性表示OPC服务器中的ItemID**/
elements.forEach(element -> {
OpcItem item1 = new OpcItem(element.getText(), true, "");
group.addItem(item1);
});
jopc = new JOpc(ip, server, handle);
jopc.connect();
jopc.addGroup(group);
log.info("JOPC 开始注册分组");
jopc.registerGroups();
log.info("JOPC 注册分组成功");
groupSourceMap.put(groupName, group);
} catch (Exception e) {
log.error("JOPC 连接异常", e);
return false;
}
return true;
}
/**
* 断开连接
*/
@PreDestroy
private void coUninitialize() {
log.info("JOPC 断开连接");
JOpc.coUninitialize();
}
public OpcGroup getGroupById(String id) {
return groupSourceMap.get(id);
}
}
根据XML中配置的GROUP信息注册到服务中 读取Item信息
public OpcGroup synchReadGroup(OpcGroup group)
throws ComponentNotFoundException, SynchReadException {
try {
if (group == null) {
throw new ComponentNotFoundException("NullPointerException");
}
return synchReadGroupNative(group);
}
catch (ComponentNotFoundException e) {
throw new ComponentNotFoundException(Translate.getString("COMPONENT_NOT_FOUND_EXCEPTION") + " " +
(group == null ? "null" : group.getGroupName()));
}
catch (SynchReadException e) {
throw new SynchReadException(Translate.getString("SYNCH_READ_EXCEPTION"));
}
}
使用 synchReadGroup 异步读取 Itme中的数据并展示