电力通信规约-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运用到实际场景中。
相关文章:
电力通信规约-104实战
电力通信规约-104实战 概述 104规约在广泛应用于电力系统远动过程中,主要用来进行数据传输和转发,本文将结合实际开发实例来讲解104规约的真实使用情况。 实例讲解 因为个人技术栈是Java,所以本篇将采用Java实例来进行讲解。首先我们搭建一…...
什么是事务
在数据库管理系统中,事务(Transaction)是执行一系列操作的最小工作单元,这些操作要么全部成功,要么全部失败。为了确保数据的一致性和完整性,事务被设计为具备四大特性,即原子性(Ato…...
数据结构:双向循坏链表
目录 1.1双向循环链表的结构 2.双向链表功能的实现 2.1初始化链表 2.2销毁链表 2.3创建结点 2.4打印链表 2.5链表查找 2.6链表在pos的前面进行插入 2.7链表删除pos位置的节点 2.8链表的头插,头删 ,尾插,尾删 1.1双向循环链表的结构 …...
3.1、SDH的5种标准容器
1、定义与作用 在 SDH(同步数字体系)中,标准容器(C)是一种用来装载各种速率的 PDH(准同步数字系列)信号的信息结构。它的主要作用是进行速率适配,使不同速率的 PDH 信号能够在 SDH 的…...
Jenkins介绍
Jenkins 是一款流行的开源自动化服务器,在软件开发和持续集成 / 持续交付(CI/CD)流程中发挥着关键作用。 一、主要功能 1.持续集成(CI) (1).自动构建:Jenkins 可以配置为监听代码仓…...
5G学习笔记之Non-Public Network
目录 0. NPN系列 1. 概述 2. SNPN 2.1 SNPN概述 2.2 SNPN架构 2.3 SNPN部署 2.3.1 完全独立 2.3.2 共享PLMN基站 2.3.3 共享PLMN基站和PLMN频谱 3. PNI-NPN 3.1 PNI-NPN概述 3.2 PNI-NPN部署 3.2.1 UPF独立 3.2.2 完全共享 0. NPN系列 1. NPN概述 2. NPN R18 3. 【SNPN系列】S…...
网页生成鸿蒙App
如何网页生成鸿蒙App 纯鸿蒙发布后,鸿蒙App需求上升。如何快速生成鸿蒙App。变色龙云(http://www.appbsl.cn)推出了鸿蒙App打包服务。可以在线自动打包鸿蒙App。 第一步 创建应用 输入网站网址,上传图标。 第二步 生成鸿蒙证书 打开华为开发者管理中…...
JavaWeb通过Web查询数据库内容:(pfour_webquerymysql)
JavaWeb通过Web查询数据库内容: 数据库: 自行建库建表,主键 id 后端: 新建项目模块选择模块,添加依赖创建配置文件: db.propertiesJava类: query查询 前端: Web添加创建query.html…...
将java项目部署到linux
命令解析 Dockerfile: Dockerfile 是一个文本文件,包含了所有必要的指令来组装(build)一个 Docker 镜像。 docker build: 根据 Dockerfile 或标准指令来构建一个新的镜像。 docker save: 将本地镜像保存为一个 tar 文件。 docker load: 从…...
moviepy将图片序列制作成视频并加载字幕 - python 实现
DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…...
ROS1入门教程5:简单行为处理
一、新建项目 # 创建工作空间 mkdir -p demo5/src && cd demo5# 初始化工作空间 catkin_make# 创建功能包 cd src catkin_create_pkg demo roscpp actionlib_msgs message_generation tf 二、创建行为 # 创建行为目录 mkdir action && cd action# 创建行为文…...
Vue:实现输入框不能输负数功能
1、使用v-model指令 <input type"number" v-model"value" min"0" input"checkInput"> checkInput() {this.value Math.max(0, parseInt(this.value)); } 2、使用计算属性 <template><div><input type"…...
管理系统、微信小程序类源码文档-哔哩哔哩教程同步
文章目录 前言通用表基于JavaSpringBootVue前后端分离手机销售商城系统设计实现:基于JavaSpringBootVueuniapp实现大学生校园兼职微信小程序更新中。。。评论区打出你的题目 🌈你好呀!我是 山顶风景独好 🎈欢迎踏入我的博客世界,能…...
AOP切点表达式之方法表达式execution
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
clickhouse-题库
1、clickhouse介绍以及架构 clickhouse一个分布式列式存储数据库,主要用于在线分析查询 2、列式存储和行式存储有什么区别? 行式存储: 1)、数据是按行存储的 2)、没有建立索引的查询消耗很大的IO 3)、建…...
在 Sanic 应用中使用内存缓存管理 IP 黑名单
[外链图片转存中…(img-Pm0K9mzd-1734859380698)] 在现代 web 应用中,保护 API 接口免受恶意请求的攻击至关重要。IP 黑名单是一种常见的安全措施,可以有效阻止某些 IP 地址的访问。本文将介绍如何在 Python 的 Sanic 框架中实现 IP 黑名单功能…...
可翻折的CPCI导冷板卡插拔机构
本技术涉及一种cpci板卡模块拔插,尤其涉及一种可翻折的cpci导冷板卡插拔机构。 背景技术: 1、cpci(compactpci)导冷板卡是一种基于compactpci计算机总线标准的卡式电子模块,它在标准的cpci架构之上增加了导热板来提高散热能力,常…...
面试题整理9----谈谈对k8s的理解2
面试题整理9----谈谈对k8s的理解2 1. Service 资源1.1 ServiceClusterIPNodePortLoadBalancerIngressExternalName 1.2 Endpoints1.3 Ingress1.4 EndpointSlice1.5 IngressClass 2. 配置和存储资源2.1 ConfigMap2.2 Secret2.3 PersistentVolume2.4 PersistentVolumeClaim2.5 St…...
12个城市人文扫街、旅拍、人像风光摄影后期Lightroom调色预设
12个城市人文扫街、旅拍、人像风光摄影后期Lightroom调色预设 12 个专为城市场景设计的专业 Adobe Lightroom 预设。只需单击一下,即可通过一致、专业的基础简化您的编辑流程。 Lightroom & Lightroom Classic,桌面和移动兼容包括 12 张由 pat_kay…...
无人设备遥控器之数传功率篇
一、数传功率的基本概念 数传功率是指遥控器发射端在传输数据时所使用的功率。这个功率值直接影响了数据传输的距离和信号强度。一般来说,数传功率越大,遥控器与无人设备之间的通信距离就越远,信号强度也相应增强。 二、数传功率的调节与选择…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
