使用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
中的实时数据理解为模块最近一次上传的实时数据;如果需要最实时的数据,直接调用接口获取。
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
,并且在实时报警中删除该条记录。
实时报警存入关系数据库,历史报警存入时序数据库。实时报警中可以只记录当下正在发生的报警。
报警如何处理?
也就是,有些报警需要推送到负责人(可能是客服,也可能是电工,也可能是某个项目经理),然后进行处理。
不是所有的报警类型都需要推送到人。
报警推送频率
比如有一个开关一直报警,那是在报警发生的当下推送呢?还是说每隔一段时间推送一次呢?还是说晚上的时间不推送呢?还是说让客户自己设置推送的频率和时间段呢?
报警如何解除
有一个后台运行计算,如果没有达到报警触发的条件,就意味着解除。
应用程序判断报警的背景计算放在项目,还是放在开放平台?
判断报警的服务理解成一个作业,可以嵌入到任何的应用程序中。