当前位置: 首页 > news >正文

docker版jxTMS使用指南:使用jxTMS采集数据之二

本文是如何用jxTMS进行数据采集的第二部分,整个系列的文章请查看:docker版jxTMS使用指南:4.4版升级内容

docker版本的使用,请查看:docker版jxTMS使用指南

4.0版jxTMS的说明,请查看:4.0版升级内容

4.2版jxTMS的说明,请查看:4.2版升级内容

设备对数据的处理

设备接收到站点递交的消息后,会依次完成如下的工作:

1、根据配置用相应的策略来解析所接收到的消息

不同的设备有自己独特的编码方式,所以相应的解码工作单独抽离出来由该设备的策略来实现。当然,有的解码工作已经由站点在提取设备标识时就已经完成了,如使用自定义协议包传送数据的站点。

解析策略一般单独编写,然后注册到系统中。代码文件应放到app的相应目录中,并依次在各目录的__init.py__文件中引用。

main.py文件的加载顺序是先import app和module,然后再执行站点的初始化【加载站点和设备】,这就可以在站点加载时正确引用到相应的策略了。

2、触发数据接收事件来对数据做需要的处理

这里所说的处理主要指数据的转换、修正等针对数据本身的处理,如潮位仪收到测得的潮位数据后,要根据潮位仪安装点的标高换算成潮水的实时水位。

在业务上,很多时候我们还需要利用设备数据来启动业务处理。但笔者认为,为了提高系统的稳定性,最好将业务处理与此处所说的数据处理分隔开来,以最大化的降低代码的耦合度。

那么,不在此处启动业务处理,那在什么时候呢?!请参考之前的【本地数据总线】一文,笔者就是基于此种考虑,才增加了数据总线机制。

在需要执行业务处理时,通过向数据总线注册一个兴趣点来抄收设备接收并处理好的数据,然后完成需要的业务操作,从而将业务处理代码从整个设备数据处理流中分离出来,不会对设备的数据处理与保存过程产生任何干扰与影响。

尤其是在业务频繁变动的场景中,此种方案更具稳定性与可靠性。

3、设备数据的保存

接收并处理完毕的设备数据会被保存到数据库中,而这就需要完成两个动作:

  • 根据配置将处理后的设备数据保存到数据库中的哪个数据表中

  • 由于设备数据的采集频率可能会很高,如果数据的短期变化又不太重要,可以必要综合考虑是实时保存所有设备数据,还是周期性保存最新的设备数据

当给出了设备数据的保存间隔【saveDataInterval】参数时,该设备的数据将以saveDataInterval【单位:分钟】为间隔进行保存,如果该参数为0,则实时保存每一个新数据。

此外,由于设备的数据采集频次一般都很高,所以大多数情况下,都需要进行分表。如果需要分表的话,对于启动了jxTMS主系统的主站来说,只要在data文件中相应的数据类定义时指定rename属性即可。

注:如果是不启动jxTMS主系统的从站,如用于现场modbus设备采集,这些数据如果也需要保存到现场的数据库中,并同样需要分表,也很简单,一是【app/data/DieselGenerator.py】中展示的,提供一个_sql_createTable建表语句【通过查询主站所创建的该表的建表语句获得】;二是将此建表语句注册到jxTMS中:

ORM.registerSQL_createTable('DieselGenerator',_sql_createTable,renameType='day')

最后,在main.py中调用:

#启动创建需要分表的调度器
ORM.startRenameTableScheduler()

从站即会同样完成所有注册建表语句时指定了renameType的分表工作。

原则上,我们建议尽可能的使用jxTMS主系统来完成分表工作,原因很简单,风险有点高。python侧来执行分表工作,就意味着,真有需要调整data中的数据类定义的时候,必须同时完成:

  • 修改data文件中的数据类定义,否则java的jxTMS主系统在管理时会出错

  • 修改mysql中该数据库表的定义【新的表会自动更新】

  • 修改python侧的建表语句,并重启python侧的代码

前两者都比较简单,尤其是mysql比较熟悉的情况下;但后者,必须进行相关的全业务测试,尤其是还需要重启服务器,所以风险高了很多。

分表数据的查询,可以利用前面文章中讲解过的query对象【参考:数据查询】,非常的简便。

4、站点综合

一般情况下,站点都是管理方面的作用大于数据处理方面的作用,如开通、停运、对设备的管理/配置等。但有时也确实需要站点综合下属所有设备的数据以提供业务上的支撑。

如,配电系统的告警处理,管理方关心的是母线电压、储电系统的SOC等配电系统的综合性健康指标。但这些指标却是分别采集自下属的各个设备的某几个数据点。

这种情况下,以站点来统一过滤并综合这些关键指标就是必然的选择了。

因此,站点在接收并提取出设备信息后,调用distribute函数来将接收到的数据分发给相应的设备:

def distribute(self, d, data):

其使用一般是在站点的receive中,如site_multiDev_push类型的站点:

def receive(self, bsMsg):s = str(bsMsg,"utf8")js = json.loads(s)dn = js.get('dn')if not dn is None:d = self.getDev(dn)if not d is None:self.distribute(d,js)

distribute在向下属设备分发数据后,会将设备回传的数据回传给站点内部的receiveData函数,以完成站点的数据综合处理框架。该框架完成:

  • 设备对站点的通知,目前主要是跟踪状态改变以完成相应的告警处理

  • 站点触发onReceive事件来对设备回送的数据进行必要的综合

  • 如果必要【重载newOrmData函数并返回站点数据对象】,保存【实时或周期性】站点综合后的数据

5、数据联动

数据处理完毕,设备会通过数据总线发送自己接收并处理完毕的数据,所有对该设备的数据感兴趣者,都可以注册到数据总线上,接收到此新收数据事件并执行自己的处理。

前文说过,jxTMS以此种方式实现数据处理与业务处理的隔离,以提供更好的灵活性、弹性。比如,不停机重启的动态升级业务功能。

所以,使用jxTMS时应尽可能的将数据方面的处理与业务方面的处理区分出来,在设备与站点的onReceive事件【需要的话】中只完成数据转换、调整、综合、加工等工作。和业务相关的处理则通过监听数据总线的方式放到另外的代码模块中完成。

这种方式虽然看起来比较繁琐,而且效率有些低,但由于充分的隔离了数据处理与业务处理,所以业务的变动不会干扰到数据处理框架的正常工作,使得不管什么样情况下,总能稳定而可靠的接收、处理并保存正确的数据。

目前,数据总线还只是本地的数据总线,有需要的话,数据总线可以基于MQ实现异机联动,就如jxTMS的java侧管控平台那样,从而进一步的提高数据处理的稳定性与可靠性。

6、告警

目前主要是针对超时未接收到设备数据发出告警。

现版本是将告警放到了设备处,考虑到收不到数据一是设备故障、二是线路故障,所以新版本会将告警收到站点处进行,以兼顾这二者。

新版本的故障告警机制是:

  • 某站点处于正常状态时【刚开机或当下属所有设备都正常工作时】第一次收到失联,则发送故障告警

  • 当出现失联后,每半个小时发送一次当前的故障综述,即当前失联设备的列表与第一次故障的时间点

  • 当所有失联设备都恢复正常后,发送一个全站恢复的通知

目前,jxTMS只有一个默认的钉钉告警策略,但如果服务器网络中断,则依然无法发出告警,所以如果对告警非常敏感,还应增加一个网络之外的告警通道或机制。

参考资料:

jxTMS设计思想

jxTMS编程手册

下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:

如何用jxTMS开发一个功能

下面的系列文章讲述了jxTMS的一些基本开发能力:

jxTMS的HelloWorld

相关文章:

docker版jxTMS使用指南:使用jxTMS采集数据之二

本文是如何用jxTMS进行数据采集的第二部分,整个系列的文章请查看:docker版jxTMS使用指南:4.4版升级内容 docker版本的使用,请查看:docker版jxTMS使用指南 4.0版jxTMS的说明,请查看:4.0版升级内…...

系列六、Springboot操作RocketMQ

一、同步消息 1.1、发送&接收简单消息 1.1.1、发送简单消息 /*** 测试发送简单消息*/ Test public void sendSimpleMessage() {SendResult result rocketMQTemplate.syncSend("BOOT_TOPIC_SIMPLE", "我是一个简单消息");// 往[BOOT_TOPIC_SIMPLE]主…...

【jupyter异常错误】Kernel started:No module named ipykernel_launcher

尝试过的方案 pip install ipykernel 执行之后提示已经安装,但是执行代码依然报错 解决方案 python -m pip install ipykernel -U --force-reinstall 相当于是强制重新安装 安装成功后没有报错 注:根本原因应该是原来安装的包存在问题,虽然检测出来已经存在&#xf…...

使用langchain与你自己的数据对话(五):聊天机器人

之前我已经完成了使用langchain与你自己的数据对话的前四篇博客,还没有阅读这四篇博客的朋友可以先阅读一下: 使用langchain与你自己的数据对话(一):文档加载与切割使用langchain与你自己的数据对话(二):向量存储与嵌入使用langc…...

爬虫与搜索引擎优化:通过Python爬虫提升网站搜索排名

作为一名专业的爬虫程序员,我深知网站的搜索排名对于业务的重要性。在如今竞争激烈的网络世界中,如何让自己的网站在搜索引擎结果中脱颖而出,成为关键。今天,和大家分享一些关于如何通过Python爬虫来提升网站的搜索排名的技巧和实…...

2024软考系统架构设计师论文写作要点

一、写作注意事项 系统架构设计师的论文题目对于考生来说,是相对较难的题目。一方面,考生需要掌握论文题目中的系统架构设计的专业知识;另一方面,论文的撰写需要结合考生自身的项目经历。因此,如何将自己的项目经历和专业知识有机…...

【Maven】依赖范围、依赖传递、依赖排除、依赖原则、依赖继承

【Maven】依赖范围、依赖传递、依赖排除、依赖原则、依赖继承 依赖范围 依赖传递 依赖排除 依赖原则 依赖继承 依赖范围 在Maven中,依赖范围(Dependency Scope)用于控制依赖项在编译、测试和运行时的可见性和可用性。通过指定适当的依赖…...

数组slice、splice字符串substr、split

一、定义 这篇文章主要对数组操作的两种方法进行介绍和使用,包括:slice、splice。对字符串操作的两种方法进行介绍和使用,包括:substr、split (一)、数组 slice:可以操作的数据类型有:数组字符串 splice:数组 操作数组…...

程序漏洞:安全威胁的隐患

在当今数字化时代,计算机程序是现代社会的核心基石。然而,随着技术的进步,程序漏洞也成为了一个不可忽视的问题。程序漏洞可能导致数据泄露、系统崩溃、恶意攻击和经济损失等一系列问题。本文将深入探讨程序漏洞的定义、分类、影响和预防措施…...

0基础学C#笔记09:希尔排序法

文章目录 前言一、希尔排序的思想二、使用步骤总结 前言 希尔排序可以说是插入排序的一种变种。无论是插入排序还是冒泡排序,如果数组的最大值刚好是在第一位,要将它挪到正确的位置就需要 n - 1 次移动。也就是说,原数组的一个元素如果距离它…...

DOCKER的容器

1. 什么是Container(容器) 要有Container首先要有Image,也就是说Container是通过image创建的。 Container是在原先的Image之上新加的一层,称作Container layer,这一层是可读可写的(Image是只读的&#xff0…...

跳跃游戏——力扣55

文章目录 题目描述解法一 贪心题目描述 解法一 贪心 bool canJump(vector<int>& nums){int n=nums....

将本地项目上传至gitee的详细步骤

将本地项目上传至gitee的详细步骤 1.在gitee上创建以自己项目名称命名的空项目2.进入想上传的项目的文件夹&#xff0c;然后右键点击3. 初始化本地环境&#xff0c;把该项目变成可被git管理的仓库4.添加该项目下的所有文件5.使用如下命令将文件添加到仓库中去6.将本地代码库与远…...

iOS开发-导航栏UINavigationBar隐藏底部线及透明度

iOS 导航栏UINavigationBar隐藏底部线及透明度 苹果官方给出的解释&#xff1a; 如果你不调用方法设置一张背景图片的话&#xff0c;那就给你默认一张&#xff0c;然后同时还有一张阴影图片被默认设置上去&#xff0c;这就是导航栏上1px黑线的由来。 解决办法&#xff1a; 方…...

题目:2520.统计能整除数字的位数

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;2520. 统计能整除数字的位数 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 逐位判断即可。 解题代码&#xff1a; class Solution {public int countDigits(int num) {int res0;int ori…...

matplotlib 笔记 注释annotate

在图中的特定位置添加文本注释、箭头和连接线&#xff0c;以便更清晰地解释图形中的数据或信息 主要参数 text文本内容xy箭头指向的目标点的坐标xytext注释文本的坐标arrowprops 一个字典&#xff0c;指定注释箭头的属性&#xff0c;如颜色、箭头样式等 没有arrowprops的时候…...

Windows 无法安装到这个硬盘。选中的磁盘具有MBR分区。在EFI系统上,Windows只能安装到GPT磁盘

Windows无法安装到这个磁盘,选中的磁盘具有MBR分区表的解决方法 - 知乎 (zhihu.com) Windows无法安装到这个磁盘 选中的磁盘具有MBR分区表 - 知乎 (zhihu.com) 选中的磁盘具有MBR分区表&#xff0c;在EFI系统上&#xff0c;windows只能安装到GPT磁盘_选中的磁盘具有mbr分区表…...

学C的第三十三天【C语言文件操作】

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第三十二天【动态内存管理】_高高的胖子的博客-CSDN博客 1 . 为什么要使用文件 以前面写的通讯录为例&#xff0c;当通讯录运行起来的时候&#xff0c;可以给通讯录中增加、删…...

线性表的基本操作及在顺序存储及链式存储的实现

目录 线性表的基本操作&#xff1a;线性表的在顺序存储上的实现 线性表的基本操作&#xff1a; 一个数据结构的基本操作是指其最核心、最基本的操作。其他较复杂的操作可通过其基本操作来实现。线性表的主要操作如下 - InitList(&L):初始化表。构造一个空的线性表- Length…...

合宙Air724UG LuatOS-Air script lib API--nvm

nvm Table of Contents nvm nvm.init(defaultCfgFile, burnSave) nvm.set(k, v, r, s) nvm.sett(k, kk, v, r, s) nvm.flush() nvm.get(k) nvm.gett(k, kk) nvm.restore() nvm.remove() nvm 模块功能&#xff1a;参数管理 nvm.init(defaultCfgFile, burnSave) 初始化参数存储管…...

把 Predefined Field Enabling 接进 RAP 业务对象里,给你的 SaaS 应用留出真正可控的客户扩展位

很多做 ABAP Cloud 的同学,做到 RAP 业务对象这一层时,会把可扩展性理解成两条路,一条是开发者自己预留字段,一条是交给 Key User 在运行期做字段配置。真正有意思的地方,其实在两条路的交汇点上,开发者先把边界、元数据、校验规则和发布契约搭好,客户再在自己的租户里把…...

MemPalace:构建最强 AI 记忆系统实战指南

&#x1f44b; 你好&#xff0c;我是专注于 AI 工程化落地的技术博主。本文适合正在构建长期记忆型 LLM 应用、苦恼于上下文丢失的开发者阅读。为了验证 MemPalace 的实际效能&#xff0c;我耗时 3 天进行了深度部署与压力测试。本文承诺不翻译文档&#xff0c;只分享经过验证的…...

什么是电商CRM系统?从入门到精通,全面解析其定义与功能模块

在电商行业竞争日益激烈的今天&#xff0c;如何高效管理客户关系、提升用户价值已成为品牌增长的关键。本文将带您全面了解电商CRM系统&#xff0c;从基础概念到功能模块&#xff0c;再到行业解决方案&#xff0c;助您掌握这一提升业绩的利器。一、电商CRM&#xff1a;数字化时…...

芯片制造中的3-sigma到底有多重要?从良率到可靠性全解析

芯片制造中的3-sigma到底有多重要&#xff1f;从良率到可靠性全解析 在半导体行业&#xff0c;每一片晶圆都承载着数以亿计的晶体管&#xff0c;而每个晶体管的性能波动都可能影响最终产品的良率和可靠性。想象一下&#xff0c;当你在使用智能手机时&#xff0c;是否曾思考过为…...

嵌入式飞控信号滤波:SMA/EMA/互补滤波与卡尔曼简化实现

1. NexgenFilter 库概述&#xff1a;面向嵌入式飞行控制的轻量级信号处理工具集NexgenFilter 是专为 Nexgen Magpie 无人机飞控系统设计的一套高性能、低开销数字滤波与噪声生成库。它并非通用 DSP 库&#xff0c;而是深度嵌入在实时性严苛、资源受限的 MCU&#xff08;如 STM3…...

紧急预警:2025年起欧盟UNECE R155强制要求车载C#代码具备可追溯性!3天内完成全链路TraceID植入的终极脚手架

第一章&#xff1a;UNECE R155合规性对车载C#中控系统的核心影响UNECE R155法规要求汽车制造商及关键零部件供应商建立并持续运行功能安全与网络安全管理体系&#xff08;CSMS&#xff09;&#xff0c;这对基于.NET Framework/.NET 6构建的C#车载中控系统提出了结构性约束。中控…...

从零搭建QT(C++)开发环境到实战部署YOLOV5模型

1. 环境准备&#xff1a;从零搭建QT开发环境 第一次接触QT开发的朋友可能会被各种安装选项搞懵&#xff0c;我刚开始配置环境时也踩过不少坑。这里分享一个经过验证的安装方案&#xff0c;适用于大多数Linux系统&#xff08;以Ubuntu为例&#xff09;。 首先需要安装基础编译工…...

ESP32S3 驱动MAX98357 I2S 音频播放:从SD卡解码MP3到实时输出的全链路解析

1. ESP32S3与MAX98357音频系统架构解析 把ESP32S3和MAX98357比作一支配合默契的乐队&#xff0c;前者是指挥家兼作曲家&#xff0c;后者则是实力派主唱。ESP32S3通过I2S协议将数字乐谱传递给MAX98357&#xff0c;这位"主唱"就能把数字符号转化为动人的旋律。这套组合…...

离线知识问答:OpenClaw本地部署百川2-13B-4bits量化模型+私有文档库

离线知识问答&#xff1a;OpenClaw本地部署百川2-13B-4bits量化模型私有文档库 1. 为什么选择本地化知识问答方案 去年我在处理公司内部技术文档时遇到一个典型痛点&#xff1a;每次查询API规范或架构设计文档&#xff0c;要么需要翻找十几层文件夹&#xff0c;要么得在公共知…...

末九网安保研华五CS:一个‘零科研’选手的夏令营海投与面试逆袭全记录

末九网安保研华五CS&#xff1a;零科研背景的逆袭实战手册 站在末流985网安专业第三名的位置&#xff0c;手握几项"水赛"国奖和一段无成果的国创经历&#xff0c;我的保研简历在众多华五申请者中显得单薄得可怜。当同届同学炫耀着顶会论文和ACM奖牌时&#xff0c;我却…...