电力通信规约-104实战

电力通信规约-104实战

概述

104规约在广泛应用于电力系统远动过程中,主要用来进行数据传输和转发,本文将结合实际开发实例来讲解104规约的真实使用情况。

实例讲解

因为个人技术栈是Java,所以本篇将采用Java实例来进行讲解。首先我们搭建一个springboot的基础工程,引入如下依赖:

<dependency>

<groupId>org.openmuc</groupId>

<artifactId>j60870</artifactId>

<version>1.7.2</version>

</dependency>

搭建好的项目之后我们进行核心类的设计,整体结构如下图所示:

接下来我将详细讲解一些这些核心类的作用和核心方法代码的说明,首先我们需要实现采集通信连接管理的功能,因为我这边使用的技术栈是spring boot,要实现在程序启动之后就能够初始化连接,这里我通过实现CommandLineRunner接口的方式来实现的。如下是采集通道类中的核心实现代码:

复制代码
for (AppConfig.IEC104ChannelConfig config : appConfig.getIec104channels()) {
    try {
        configs.add(config);
        IDataChannel<AppConfig.IEC104ChannelConfig> channel = new IEC104Channel();
        channel.init(config);
        channelMap.put(config.getId(), channel);
        channelStatusMap.put(config.getId(), false);
        iec104ChannelList.add((IEC104Channel) channel);
    } catch (Exception e) {
        log.warn("failed to create channel:{}", config, e);
    }
}

这里考虑到多通道的情况,所以在此使用了循环初始化的方式来做,这里往下具体实现创建连接的方法如下:

复制代码
/**
 * 创建连接
 * @throws IOException
 */
public void connect() throws IOException {
    try {
       InetAddress addr = InetAddress.getByName(connInfo.host);
       ClientConnectionBuilder clientConnectionBuilder = new ClientConnectionBuilder(addr).setPort(connInfo.port);
       conn = clientConnectionBuilder.connect();
       conn.setId(config.getId());
       conn.setMaxMessageInMinutes(config.getMaxMessageInMinute());
    } catch (Exception e) {
       logger.warn("failed to connect host: {}, try to connect host2 :{}", connInfo, connInfo2, e);
       //尝试连接备用地址
       if (connInfo2 != null) {
          logger.info("try to connect backup host: {}", connInfo2);
          InetAddress addr = InetAddress.getByName(connInfo2.host);
          ClientConnectionBuilder clientConnectionBuilder = new ClientConnectionBuilder(addr)
                .setPort(connInfo2.port);
          conn = clientConnectionBuilder.connect();
          conn.setId(config.getId());
          conn.setMaxMessageInMinutes(config.getMaxMessageInMinute());
       } else {
          throw e;
       }
    }
}

上面展示的创建连接的方法有个比较特殊的实现,就是备用地址连接的逻辑,这里也是根据实际业务来考虑的,因为一般发送数据主站会提供两个地址,进行主备的考虑,这样做的目的为了采集链路的稳定。

项目中还是实现了一个初始化数据的类 InitializeDataManager,这个类也需要在程序启动之后初始化的,所以也是通过实现CommandLineRunner接口的方式来实现的。做数据采集有一个很重要的环节就是对点,通俗来讲就是对方发过来的点位需要转换适配到我们的系统中,这里需要初始化我们需要的点位信息,所以定义了初始化数据的类。

接下来讲解一下最关键的一个类,事件监听器IEC104ClientEventListener的实现,首先我们需要实现ConnectionEventListener接口,在ConnectionEventListener接口中定义了如下两个方法:

复制代码
public interface ConnectionEventListener {
    void newASdu(ASdu var1, String var2);

    void connectionClosed(IOException var1);
}

在IEC104ClientEventListener中重写了这两个方法,其中newASdu是监听数据事件的connectionClosed是处理连接关闭事件的。

采集和监听部分设计完成之后,我们需要将采集的数据进行业务处理,这套系统开发的是采集光伏场站的数据,所以设计如下处理任务,分别用来采集逆变器,集电线的数据:

总结

本文讲解了104在光伏场站采集场景中的具体实践案例,通过对104程序设计的讲解,希望能够帮助我们将104运用到实际场景中。

相关推荐
foundbug9994 小时前
基于C#的OPC DA客户端实现源码解析
开发语言·c#
tb_first4 小时前
万字超详细苍穹外卖学习笔记2
java·jvm·数据库·spring·tomcat·maven
yuezhilangniao5 小时前
Next.js 项目运维手册-含-常用命令-常见场景
运维·开发语言·reactjs
短剑重铸之日5 小时前
《设计模式》第六篇:装饰器模式
java·后端·设计模式·装饰器模式
像少年啦飞驰点、5 小时前
零基础入门 Spring Boot:从‘Hello World’到可上线微服务的完整学习路径
java·spring boot·web开发·编程入门·后端开发
心 -5 小时前
全栈实时聊天室(java项目)
java
真智AI5 小时前
用 LLM 辅助生成可跑的 Python 单元测试:pytest + coverage 覆盖率报告(含运行指令与排坑)
python·单元测试·pytest
czxyvX5 小时前
016-二叉搜索树(C++实现)
开发语言·数据结构·c++
1104.北光c°5 小时前
【从零开始学Redis | 第一篇】Redis常用数据结构与基础
java·开发语言·spring boot·redis·笔记·spring·nosql
0思必得05 小时前
[Web自动化] Selenium处理文件上传和下载
前端·爬虫·python·selenium·自动化·web自动化