鼎鼎知识库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

数据问题的基本面.md 10KB

存储过程的使用

使用EF结合存储过程。用EF生成数据库、数据库迁移,查询用存储过程。更新、添加、删除之类的用EF

升级

  • 将来有一个注册中心可以进行远程发布

实时数据

使用场景包括:

  • 当对开关进行合闸分断后,需要根据实时数据来判断是否操作成功
  • 当对报警进行判断的时候,需要根据实时数据来判断报警是否解除

实时数据从哪里来?

每一个模块(通讯模块)可以指定服务器IP,实际上是指向到服务器上的一个API接口,然后在接口里对实时数据进行处理。比如说,指向到47.103.61.198:5008/ebx-bishop/data/carry

实时数据到哪里去?

  • 最新的实时数据进入了Redis缓存

关于键和命名空间

OpenAPI_Test:187ED53159E4,macss 就是缓存的键。其中OpenAPI_Test可以理解为是命名空间,而且是可以多级的,比如:OpenAPI_Test:Test2

实时数据长啥样?

{
  "serverinfo": {
    "port": "12345",
    "hardware": "T25",
    "execleakcheck": "false",
    "mac": "187ED53159E4", //模块号,是唯一的
    "loginid": "187ED53159E4",
    "gate": "",
    "ip": "192.168.8.151",
    "version": "2.52",
    "loginpwd": "7a57a5a743894ae4",
    "ssidpwd": "2803f88db851c67a",
    "ssid": "DDINGW",
    "timezoneId": "Asia/Shanghai",
    "server": "http://47.103.61.198:5008/snd",
    "datetime": "2021-02-25 02:10:00", //上传时间,会根据这个字段判断是否离线
    "leakcheckdate": "3,13,33",
    "lastleakcheckdate": "2017-01-01 10:00:00"
  },
  "distributbox": {
    "Breakers": { //开关
      "1": {//线路地址1
        "version": "0.72",
        "title": "总路",
        "model": "JZK2L100-BL6523",
        "Alarm": 0,
        "EnableNetCtrl": true,//是否可以通过软件控制线路,比如线下某个电工手动把分断了,那么这里的EnableNetCtrl=false,这时候,如果软件界面上需要合闸,需要判断EnableNetCtrl这个字段值,如果是EnableNetCtrl=false情况下不运行进行合闸,避免导致电工的生命安全,需要自己写逻辑判断
        "MXDW": 0.0,//门限低温,当温度低于这里的设置,模块会主动推送报警,服务端来接收,门限值常见会提供接口进行修改
        "MXGG": 7040.0,//门限过功,门限值常见会提供接口进行修改
        "MXGL": 48.00,//门限过流,门限值常见会提供接口进行修改
        "MXGW": 90.0,//门限过温,门限值常见会提供接口进行修改
        "MXGY": 260.0,//门限过压,门限值常见会提供接口进行修改
        "MXLD": 30.0,//门限漏电,门限值常见会提供接口进行修改
        "MXQY": 100.0,//门限欠压,门限值常见会提供接口进行修改
        "OpenClose": true,//开关的合闸分断状态,true表示当前合闸状态
        "addr": 1,//线路地址
        "power": 51.3,//上一个小时的电量,单位是瓦W
        "specification": "32",//线路规格
        "control": 1,//线路是否可控,如果是0的话,线路无法合闸分断,在实践中再去体会
        "visibility": 1,//线路是否可见
        "totalChannelId": -1,//是否是总路,本开关线路是被接入到哪个开关线路下(-1 - 进线直连,即本开关未被接入到其它开关;其它 - 本开关线路被接入到另一个开关线路,此值为本开关所接入的开关线路的地址编号),需要实际施工的时候区分连接方式
        "lineType": "220",//线路类型,220表示接的220V的电压;380表示接入的是380V的三相电压
        "A_A": 0.13,//三相情况下的A相电流,在lineTYpe=220的情况下,就是线路电流
        "A_T": 27.5,//线温
        "A_V": 232.0,//电压
        "A_WP": 25.0,//功率
        "A_LD": 0.0,//漏电
        "A_PF": 0.0,//功率因素
        "G_A": 0.0,//平均电流
        "G_T": 0.0,
        "G_V": 0.0,
        "G_WP": 0.0,
        "G_LD": 0.0,
        "G_PF": 0.0,
        "B_A": 0.0,//B相
        "B_T": 0.0,
        "B_V": 0.0,
        "B_WP": 0.0,
        "B_PF": 0.0,
        "C_A": 0.0,//相
        "C_T": 0.0,
        "C_V": 0.0,
        "C_WP": 0.0,
        "C_PF": 0.0,
        "N_A": 0.0,//零线电流
        "N_T": 0.0//零线线温
      },
      "2": {
        "version": "0.72",
        "title": "线路1",
        "model": "JZK2L100-BL6523",
        "Alarm": 0,
        "EnableNetCtrl": true,
        "MXDW": 0.0,
        "MXGG": 7040.0,
        "MXGL": 48.00,
        "MXGW": 90.0,
        "MXGY": 260.0,
        "MXLD": 100.0,
        "MXQY": 100.0,
        "OpenClose": true,
        "addr": 2,
        "power": 4.7,
        "specification": "32",
        "control": 1,
        "visibility": 1,
        "totalChannelId": 1,
        "lineType": "220",
        "A_A": 0.00,
        "A_T": 26.4,
        "A_V": 234.0,
        "A_WP": 0.0,
        "A_LD": 0.0,
        "A_PF": 0.0,
        "G_A": 0.0,
        "G_T": 0.0,
        "G_V": 0.0,
        "G_WP": 0.0,
        "G_LD": 0.0,
        "G_PF": 0.0,
        "B_A": 0.0,
        "B_T": 0.0,
        "B_V": 0.0,
        "B_WP": 0.0,
        "B_PF": 0.0,
        "C_A": 0.0,
        "C_T": 0.0,
        "C_V": 0.0,
        "C_WP": 0.0,
        "C_PF": 0.0,
        "N_A": 0.0,
        "N_T": 0.0
      },
      "3": {
        "version": "0.72",
        "title": "线路2",
        "model": "JZK2L100-BL6523",
        "Alarm": 0,
        "EnableNetCtrl": true,
        "MXDW": 0.0,
        "MXGG": 7040.0,
        "MXGL": 48.00,
        "MXGW": 90.0,
        "MXGY": 260.0,
        "MXLD": 30.0,
        "MXQY": 100.0,
        "OpenClose": true,
        "addr": 3,
        "power": 40.6,
        "specification": "32",
        "control": 1,
        "visibility": 1,
        "totalChannelId": 1,
        "lineType": "220",
        "A_A": 0.11,
        "A_T": 28.2,
        "A_V": 235.0,
        "A_WP": 22.0,
        "A_LD": 0.0,
        "A_PF": 0.0,
        "G_A": 0.0,
        "G_T": 0.0,
        "G_V": 0.0,
        "G_WP": 0.0,
        "G_LD": 0.0,
        "G_PF": 0.0,
        "B_A": 0.0,
        "B_T": 0.0,
        "B_V": 0.0,
        "B_WP": 0.0,
        "B_PF": 0.0,
        "C_A": 0.0,
        "C_T": 0.0,
        "C_V": 0.0,
        "C_WP": 0.0,
        "C_PF": 0.0,
        "N_A": 0.0,
        "N_T": 0.0
      }
    },
    "Change": null
  }
}

总之,Redis中的实时数据理解为模块最近一次上传的实时数据;如果需要最实时的数据,直接调用接口获取。

  • 最近60分钟的数据进入MySQL数据库

Redis只能记录最近的一条记录,但是,在一些场景下需要最近比如60分钟的数据。举例来说,在负荷报表中希望看到最近60分钟的负荷情况。这时,需要把最近60分钟的数据保存到MySQL数据库。

  • 每一次的上传数据进入时序数据库

实时数据的上传频率问题

默认情况下模块每10分钟上传一次数据。如果想让模块以最快的频率上传数据,需要给模块发一条指令(有时需要同时发2条指令,第一条指令让模块保持登录态,另一条指令设置实时数据的上传频率)。而这条执行的生效时长是5分钟。

电量数据

原理

模块每小时、每天、每月的开头会向服务器发送电量数据。服务器会把电量数据保存到时序数据库。

UDP协议中可以查询获取过去一个月的电量历史数据。在HTTP中主动查模块的电量数据暂时不确定。

目前存在的问题

电量数据会重复传或者漏传。

实时调度平台

目前采用大石头AntJob组件。

  • 应用程序
  • 作业

报警机制

报警策略

报警策略名称:总部默认报警策略

过压报警: 是否启用,阈值=230V
过压预警:是否启用
		蓝色预警:阈值=222V
		黄色预警:阈值=225V   
		橙色预警:阈值=228V  
手动分断报警:是否启用
离线报警:是否启用,阈值=10分钟

报警如何产生的?

  • 达到模块内部的报警条件触发报警,模块向服务器发送报警
  • 达到某种报警策略的报警触发条件进而报警,也就是在应用程序层面判断并记录

报警和项目如何关联?

在总部运营后台,关联报警策略和项目。而且,一个项目可以有多个报警策略。

报警存入哪里?

报警分为实时报警和历史报警。实时报警就是当下所有开关的报警;历史报警是发生在过去,报警已经解除的哪些报警。比如,开关A,在8:10程序判断出现手动分断报警,那么在实时报警中添加一条记录。接着,在9:10程序判断开关A已经正常,就在历史报警中添加一条记录,这条记录的报警开始时间是8:10,结束时间是9:10,并且在实时报警中删除该条记录。

实时报警存入关系数据库,历史报警存入时序数据库。实时报警中可以只记录当下正在发生的报警。

报警如何处理?

  • 有些项目不处理,不关心,比如商场只关心到点开或关
  • 有些项目非常关心,比如涉及到电量统计,一旦开关或模块不正常,会影响到电量的统计,或者有关安全的,这时候需要把实时报警上报。

也就是,有些报警需要推送到负责人(可能是客服,也可能是电工,也可能是某个项目经理),然后进行处理。

不是所有的报警类型都需要推送到人。

报警推送频率

比如有一个开关一直报警,那是在报警发生的当下推送呢?还是说每隔一段时间推送一次呢?还是说晚上的时间不推送呢?还是说让客户自己设置推送的频率和时间段呢?

报警如何解除

有一个后台运行计算,如果没有达到报警触发的条件,就意味着解除。

应用程序判断报警的背景计算放在项目,还是放在开放平台?

判断报警的服务理解成一个作业,可以嵌入到任何的应用程序中。

数据模拟器

  • 确定模拟哪些数据:实时数据、电量数据、报警数据、开关、模块
  • 模拟程序
  • 有些模拟到关系数据库,有些模拟到时序数据库