电力通信规约-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运用到实际场景中。

相关推荐
戮戮5 小时前
Spring Cloud Gateway 零拷贝参数校验:一种高性能网关架构实践
java·网络·架构·gateway
2501_933329555 小时前
企业媒体发布与舆情管理实战:Infoseek舆情系统技术架构与落地解析
大数据·开发语言·人工智能·数据库开发
"菠萝"5 小时前
C#知识学习-021(文字关键字)
开发语言·学习·c#
minji...5 小时前
Linux 线程同步与互斥(二) 线程同步,条件变量,pthread_cond_init/wait/signal/broadcast
linux·运维·开发语言·jvm·数据结构·c++
zhangzeyuaaa5 小时前
Python 中的 Map 和 Reduce 详解
开发语言·python
游乐码6 小时前
c#HashTable
开发语言·c#
alengan6 小时前
cocos自动编译-Android自动出apk包
java·eclipse
漫霂6 小时前
二叉树的统一迭代遍历
java·算法
文静小土豆6 小时前
K8s 滚动更新在 Java 应用中的实践与优化
java·容器·kubernetes
小白学大数据6 小时前
Scrapy 分布式爬虫:大规模采集汽车之家电车评论
开发语言·分布式·爬虫·scrapy