|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- # 存储过程的使用
-
- 使用`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`,并且在实时报警中删除该条记录。
-
-
-
- 实时报警存入关系数据库,历史报警存入时序数据库。实时报警中可以只记录当下正在发生的报警。
-
-
-
- > 报警如何处理?
-
- - 有些项目不处理,不关心,比如商场只关心到点开或关
- - 有些项目非常关心,比如涉及到电量统计,一旦开关或模块不正常,会影响到电量的统计,或者有关安全的,这时候需要把实时报警上报。
-
-
-
- 也就是,有些报警需要推送到负责人(可能是客服,也可能是电工,也可能是某个项目经理),然后进行处理。
-
-
-
- 不是所有的报警类型都需要推送到人。
-
-
-
- > 报警推送频率
-
- 比如有一个开关一直报警,那是在报警发生的当下推送呢?还是说每隔一段时间推送一次呢?还是说晚上的时间不推送呢?还是说让客户自己设置推送的频率和时间段呢?
-
-
-
- > 报警如何解除
-
-
-
- 有一个后台运行计算,如果没有达到报警触发的条件,就意味着解除。
-
-
-
- > 应用程序判断报警的背景计算放在项目,还是放在开放平台?
-
-
-
- 判断报警的服务理解成一个作业,可以嵌入到任何的应用程序中。
-
-
-
- # 数据模拟器
-
-
-
- - 确定模拟哪些数据:实时数据、电量数据、报警数据、开关、模块
- - 模拟程序
- - 有些模拟到关系数据库,有些模拟到时序数据库
|