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

相关推荐
矛取矛求3 分钟前
QT的前景与互联网岗位发展
开发语言·qt
Leventure_轩先生4 分钟前
[WASAPI]从Qt MultipleMedia来看WASAPI
开发语言·qt
向宇it18 分钟前
【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity
开发语言·unity·c#·游戏引擎
wm104320 分钟前
java web springboot
java·spring boot·后端
smile-yan21 分钟前
Provides transitive vulnerable dependency maven 提示依赖存在漏洞问题的解决方法
java·maven
老马啸西风22 分钟前
NLP 中文拼写检测纠正论文-01-介绍了SIGHAN 2015 包括任务描述,数据准备, 绩效指标和评估结果
java
Earnest~25 分钟前
Maven极简安装&配置-241223
java·maven
四口鲸鱼爱吃盐27 分钟前
Pytorch | 利用AI-FGTM针对CIFAR10上的ResNet分类器进行对抗攻击
人工智能·pytorch·python
皮蛋很白28 分钟前
Maven 环境变量 MAVEN_HOME 和 M2_HOME 区别以及 IDEA 修改 Maven repository 路径全局
java·maven·intellij-idea
青年有志30 分钟前
JavaWeb(一) | 基本概念(web服务器、Tomcat、HTTP、Maven)、Servlet 简介
java·web