Java如何采集OPC数据

什么是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中的数据并展示

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值