首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >电网开发人员必会的电网 104 规约解析(Java版本)

电网开发人员必会的电网 104 规约解析(Java版本)

原创
作者头像
全干程序员demo
发布2025-05-14 09:33:05
发布2025-05-14 09:33:05
6580
举报
文章被收录于专栏:技术热文技术热文

电网开发人员必会的电网 104 规约解析(Java版本)

一、引言

在电力系统中,通信规约起着至关重要的作用,它确保了不同设备之间能够准确地交换数据。IEC 60870 - 5 - 104(简称 104 规约)是一种广泛应用于电网自动化领域的通信规约。本文将详细介绍如何使用 Java 语言实现电网 104 规约的解析,旨在为电力系统自动化领域的开发人员提供一种可行的解决方案。

主要因为最近需要通过104去获取一些点表数据,所以才整理出这些内容

二、104 规约简介

104 规约是一种基于 TCP/IP 网络的通信规约,它在 IEC 60870 - 5 - 101 规约的基础上进行了扩展,以适应网络环境。以下是 104 规约的一些关键特点:

  • 分层结构:104 规约采用了分层结构,包括应用层、传输层和网络层。应用层负责处理具体的数据交换,传输层确保数据的可靠传输,网络层则负责数据在网络中的传输。
  • APDU(应用协议数据单元):104 规约的数据传输以 APDU 为基本单位。APDU 包括控制域、类型标识、可变结构限定词、传送原因、应用服务数据单元公共地址、信息体地址和信息体等部分。
  • 帧格式:104 规约的帧格式包括启动字符、长度字段、控制域、应用服务数据单元等部分。每种类型的帧都有其特定的格式和用途。

三、Java 实现 104 规约解析的步骤

(一)环境搭建

  1. 开发环境:使用 Java 开发工具(如 IntelliJ IDEA 或 Eclipse)创建一个新的 Java 项目。
  2. 依赖库:引入网络通信相关的库,如 Netty 框架,用于处理 TCP/IP 通信。Netty 是一个高性能的网络编程框架,它提供了丰富的 API 来简化网络编程的复杂性。

(二)建立 TCP 连接

  1. 服务器端:创建一个 TCP 服务器,监听指定的端口(通常是 2404 端口)。服务器端需要能够接收客户端的连接请求,并建立连接。
代码语言:java
复制
    import io.netty.bootstrap.ServerBootstrap;
    import io.netty.channel.*;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.SocketChannel;
    import io.netty.channel.socket.nio.NioServerSocketChannel;

    public class IEC104Server {
        private int port;

        public IEC104Server(int port) {
            this.port = port;
        }

        public void run() throws Exception {
            EventLoopGroup bossGroup = new NioEventLoopGroup();
            EventLoopGroup workerGroup = new NioEventLoopGroup();
            try {
                ServerBootstrap b = new ServerBootstrap();
                b.group(bossGroup, workerGroup)
                        .channel(NioServerSocketChannel.class)
                        .childHandler(new IEC104ServerInitializer());

                ChannelFuture f = b.bind(port).sync();
                f.channel().closeFuture().sync();
            } finally {
                bossGroup.shutdownGracefully();
                workerGroup.shutdownGracefully();
            }
        }

        public static void main(String[] args) throws Exception {
            int port = 2404;
            new IEC104Server(port).run();
        }
    }
  1. 客户端:创建一个 TCP 客户端,连接到服务器端。客户端需要能够发送和接收数据。
代码语言:java
复制
    import io.netty.bootstrap.Bootstrap;
    import io.netty.channel.*;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.SocketChannel;
    import io.netty.channel.socket.nio.NioSocketChannel;

    public class IEC104Client {
        private final String host;
        private final int port;

        public IEC104Client(String host, int port) {
            this.host = host;
            this.port = port;
        }

        public void run() throws Exception {
            EventLoopGroup group = new NioEventLoopGroup();
            try {
                Bootstrap b = new Bootstrap();
                b.group(group)
                        .channel(NioSocketChannel.class)
                        .handler(new IEC104ClientInitializer());

                ChannelFuture f = b.connect(host, port).sync();
                f.channel().closeFuture().sync();
            } finally {
                group.shutdownGracefully();
            }
        }

        public static void main(String[] args) throws Exception {
            String host = "127.0.0.1";
            int port = 2404;
            new IEC104Client(host, port).run();
        }
    }

(三)数据帧解析

  1. 帧格式识别:根据 104 规约的帧格式,解析接收到的数据帧。首先需要识别帧的起始字节(0x68),然后根据长度字段确定帧的长度。
代码语言:java
复制
    public class FrameParser {
        public static boolean isFrameStart(byte b) {
            return b == 0x68;
        }

        public static int getFrameLength(byte[] data, int offset) {
            if (data.length < offset + 2) {
                return -1; // 数据不足
            }
            return data[offset + 1] & 0xFF;
        }
    }
  1. APDU 解析:解析帧中的 APDU 部分,提取控制域、类型标识、可变结构限定词等信息。
代码语言:java
复制
    public class APDUParser {
        public static byte[] parseControlField(byte[] data, int offset) {
            if (data.length < offset + 2) {
                return null; // 数据不足
            }
            return Arrays.copyOfRange(data, offset, offset + 2);
        }

        public static byte parseTypeIdentifier(byte[] data, int offset) {
            if (data.length < offset + 1) {
                return -1; // 数据不足
            }
            return data[offset];
        }

        public static byte parseVariableStructureQualifier(byte[] data, int offset) {
            if (data.length < offset + 1) {
                return -1; // 数据不足
            }
            return data[offset];
        }
    }

(四)数据处理

  1. 数据存储:将解析后的数据存储到合适的数据结构中,例如数据库或内存中的数据结构。根据数据类型和用途,可以将数据存储为实时数据、历史数据等。
  2. 数据转发:如果需要,可以将解析后的数据转发到其他系统或设备。例如,将数据发送到监控系统或数据处理中心。

四、测试与验证

  1. 测试环境搭建:搭建一个测试环境,包括服务器端和客户端。可以使用模拟设备或实际设备进行测试。
  2. 功能测试:对实现的 104 规约解析功能进行测试,包括帧格式识别、APDU 解析、数据存储和转发等功能。确保所有功能都能正常工作。
  3. 性能测试:对系统的性能进行测试,包括数据传输速度、解析速度和系统稳定性等。根据测试结果进行优化。

五、总结

本文介绍了如何使用 Java 实现电网 104 规约的解析。通过建立 TCP 连接、解析数据帧和处理数据,我们可以实现对 104 规约数据的有效解析和处理。在实际应用中,还需要根据具体需求进行进一步的开发和优化。希望本文能够为电力系统自动化领域的开发人员提供一定的参考和帮助。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 电网开发人员必会的电网 104 规约解析(Java版本)
    • 一、引言
    • 二、104 规约简介
    • 三、Java 实现 104 规约解析的步骤
      • (一)环境搭建
      • (二)建立 TCP 连接
      • (三)数据帧解析
      • (四)数据处理
    • 四、测试与验证
    • 五、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档