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