鼎鼎知识库
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

3 年之前
3 年之前
3 年之前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. # 存储过程的使用
  2. 使用`EF`结合存储过程。用`EF`生成数据库、数据库迁移,查询用存储过程。更新、添加、删除之类的用`EF`。
  3. # 升级
  4. - 将来有一个注册中心可以进行远程发布
  5. # 实时数据
  6. > 使用场景包括:
  7. - 当对开关进行合闸分断后,需要根据实时数据来判断是否操作成功
  8. - 当对报警进行判断的时候,需要根据实时数据来判断报警是否解除
  9. > 实时数据从哪里来?
  10. 每一个模块(通讯模块)可以指定服务器`IP`,实际上是指向到服务器上的一个`API`接口,然后在接口里对实时数据进行处理。比如说,指向到`47.103.61.198:5008/ebx-bishop/data/carry`。
  11. > 实时数据到哪里去?
  12. - 最新的实时数据进入了`Redis`缓存
  13. 关于键和命名空间
  14. ```
  15. OpenAPI_Test:187ED53159E4,macss 就是缓存的键。其中OpenAPI_Test可以理解为是命名空间,而且是可以多级的,比如:OpenAPI_Test:Test2
  16. ```
  17. 实时数据长啥样?
  18. ```
  19. {
  20. "serverinfo": {
  21. "port": "12345",
  22. "hardware": "T25",
  23. "execleakcheck": "false",
  24. "mac": "187ED53159E4", //模块号,是唯一的
  25. "loginid": "187ED53159E4",
  26. "gate": "",
  27. "ip": "192.168.8.151",
  28. "version": "2.52",
  29. "loginpwd": "7a57a5a743894ae4",
  30. "ssidpwd": "2803f88db851c67a",
  31. "ssid": "DDINGW",
  32. "timezoneId": "Asia/Shanghai",
  33. "server": "http://47.103.61.198:5008/snd",
  34. "datetime": "2021-02-25 02:10:00", //上传时间,会根据这个字段判断是否离线
  35. "leakcheckdate": "3,13,33",
  36. "lastleakcheckdate": "2017-01-01 10:00:00"
  37. },
  38. "distributbox": {
  39. "Breakers": { //开关
  40. "1": {//线路地址1
  41. "version": "0.72",
  42. "title": "总路",
  43. "model": "JZK2L100-BL6523",
  44. "Alarm": 0,
  45. "EnableNetCtrl": true,//是否可以通过软件控制线路,比如线下某个电工手动把分断了,那么这里的EnableNetCtrl=false,这时候,如果软件界面上需要合闸,需要判断EnableNetCtrl这个字段值,如果是EnableNetCtrl=false情况下不运行进行合闸,避免导致电工的生命安全,需要自己写逻辑判断
  46. "MXDW": 0.0,//门限低温,当温度低于这里的设置,模块会主动推送报警,服务端来接收,门限值常见会提供接口进行修改
  47. "MXGG": 7040.0,//门限过功,门限值常见会提供接口进行修改
  48. "MXGL": 48.00,//门限过流,门限值常见会提供接口进行修改
  49. "MXGW": 90.0,//门限过温,门限值常见会提供接口进行修改
  50. "MXGY": 260.0,//门限过压,门限值常见会提供接口进行修改
  51. "MXLD": 30.0,//门限漏电,门限值常见会提供接口进行修改
  52. "MXQY": 100.0,//门限欠压,门限值常见会提供接口进行修改
  53. "OpenClose": true,//开关的合闸分断状态,true表示当前合闸状态
  54. "addr": 1,//线路地址
  55. "power": 51.3,//上一个小时的电量,单位是瓦W
  56. "specification": "32",//线路规格
  57. "control": 1,//线路是否可控,如果是0的话,线路无法合闸分断,在实践中再去体会
  58. "visibility": 1,//线路是否可见
  59. "totalChannelId": -1,//是否是总路,本开关线路是被接入到哪个开关线路下(-1 - 进线直连,即本开关未被接入到其它开关;其它 - 本开关线路被接入到另一个开关线路,此值为本开关所接入的开关线路的地址编号),需要实际施工的时候区分连接方式
  60. "lineType": "220",//线路类型,220表示接的220V的电压;380表示接入的是380V的三相电压
  61. "A_A": 0.13,//三相情况下的A相电流,在lineTYpe=220的情况下,就是线路电流
  62. "A_T": 27.5,//线温
  63. "A_V": 232.0,//电压
  64. "A_WP": 25.0,//功率
  65. "A_LD": 0.0,//漏电
  66. "A_PF": 0.0,//功率因素
  67. "G_A": 0.0,//平均电流
  68. "G_T": 0.0,
  69. "G_V": 0.0,
  70. "G_WP": 0.0,
  71. "G_LD": 0.0,
  72. "G_PF": 0.0,
  73. "B_A": 0.0,//B相
  74. "B_T": 0.0,
  75. "B_V": 0.0,
  76. "B_WP": 0.0,
  77. "B_PF": 0.0,
  78. "C_A": 0.0,//相
  79. "C_T": 0.0,
  80. "C_V": 0.0,
  81. "C_WP": 0.0,
  82. "C_PF": 0.0,
  83. "N_A": 0.0,//零线电流
  84. "N_T": 0.0//零线线温
  85. },
  86. "2": {
  87. "version": "0.72",
  88. "title": "线路1",
  89. "model": "JZK2L100-BL6523",
  90. "Alarm": 0,
  91. "EnableNetCtrl": true,
  92. "MXDW": 0.0,
  93. "MXGG": 7040.0,
  94. "MXGL": 48.00,
  95. "MXGW": 90.0,
  96. "MXGY": 260.0,
  97. "MXLD": 100.0,
  98. "MXQY": 100.0,
  99. "OpenClose": true,
  100. "addr": 2,
  101. "power": 4.7,
  102. "specification": "32",
  103. "control": 1,
  104. "visibility": 1,
  105. "totalChannelId": 1,
  106. "lineType": "220",
  107. "A_A": 0.00,
  108. "A_T": 26.4,
  109. "A_V": 234.0,
  110. "A_WP": 0.0,
  111. "A_LD": 0.0,
  112. "A_PF": 0.0,
  113. "G_A": 0.0,
  114. "G_T": 0.0,
  115. "G_V": 0.0,
  116. "G_WP": 0.0,
  117. "G_LD": 0.0,
  118. "G_PF": 0.0,
  119. "B_A": 0.0,
  120. "B_T": 0.0,
  121. "B_V": 0.0,
  122. "B_WP": 0.0,
  123. "B_PF": 0.0,
  124. "C_A": 0.0,
  125. "C_T": 0.0,
  126. "C_V": 0.0,
  127. "C_WP": 0.0,
  128. "C_PF": 0.0,
  129. "N_A": 0.0,
  130. "N_T": 0.0
  131. },
  132. "3": {
  133. "version": "0.72",
  134. "title": "线路2",
  135. "model": "JZK2L100-BL6523",
  136. "Alarm": 0,
  137. "EnableNetCtrl": true,
  138. "MXDW": 0.0,
  139. "MXGG": 7040.0,
  140. "MXGL": 48.00,
  141. "MXGW": 90.0,
  142. "MXGY": 260.0,
  143. "MXLD": 30.0,
  144. "MXQY": 100.0,
  145. "OpenClose": true,
  146. "addr": 3,
  147. "power": 40.6,
  148. "specification": "32",
  149. "control": 1,
  150. "visibility": 1,
  151. "totalChannelId": 1,
  152. "lineType": "220",
  153. "A_A": 0.11,
  154. "A_T": 28.2,
  155. "A_V": 235.0,
  156. "A_WP": 22.0,
  157. "A_LD": 0.0,
  158. "A_PF": 0.0,
  159. "G_A": 0.0,
  160. "G_T": 0.0,
  161. "G_V": 0.0,
  162. "G_WP": 0.0,
  163. "G_LD": 0.0,
  164. "G_PF": 0.0,
  165. "B_A": 0.0,
  166. "B_T": 0.0,
  167. "B_V": 0.0,
  168. "B_WP": 0.0,
  169. "B_PF": 0.0,
  170. "C_A": 0.0,
  171. "C_T": 0.0,
  172. "C_V": 0.0,
  173. "C_WP": 0.0,
  174. "C_PF": 0.0,
  175. "N_A": 0.0,
  176. "N_T": 0.0
  177. }
  178. },
  179. "Change": null
  180. }
  181. }
  182. ```
  183. 总之,`Redis`中的实时数据理解为模块最近一次上传的实时数据;如果需要最实时的数据,直接调用接口获取。
  184. - 最近60分钟的数据进入`MySQL`数据库
  185. `Redis`只能记录最近的一条记录,但是,在一些场景下需要最近比如60分钟的数据。举例来说,在负荷报表中希望看到最近60分钟的负荷情况。这时,需要把最近60分钟的数据保存到`MySQL`数据库。
  186. - 每一次的上传数据进入时序数据库
  187. > 实时数据的上传频率问题
  188. 默认情况下模块每10分钟上传一次数据。如果想让模块以最快的频率上传数据,需要给模块发一条指令(有时需要同时发2条指令,第一条指令让模块保持登录态,另一条指令设置实时数据的上传频率)。而这条执行的生效时长是5分钟。
  189. # 电量数据
  190. > 原理
  191. 模块每小时、每天、每月的开头会向服务器发送电量数据。服务器会把电量数据保存到时序数据库。
  192. 在`UDP`协议中可以查询获取过去一个月的电量历史数据。在`HTTP`中主动查模块的电量数据暂时不确定。
  193. > 目前存在的问题
  194. 电量数据会重复传或者漏传。
  195. # 实时调度平台
  196. 目前采用`大石头`的`AntJob`组件。
  197. - 应用程序
  198. - 作业
  199. # 报警机制
  200. > 报警策略
  201. ```
  202. 报警策略名称:总部默认报警策略
  203. 过压报警: 是否启用,阈值=230V
  204. 过压预警:是否启用
  205. 蓝色预警:阈值=222V
  206. 黄色预警:阈值=225V
  207. 橙色预警:阈值=228V
  208. 手动分断报警:是否启用
  209. 离线报警:是否启用,阈值=10分钟
  210. ```
  211. > 报警如何产生的?
  212. - 达到模块内部的报警条件触发报警,模块向服务器发送报警
  213. - 达到某种报警策略的报警触发条件进而报警,也就是在应用程序层面判断并记录
  214. > 报警和项目如何关联?
  215. 在总部运营后台,关联报警策略和项目。而且,一个项目可以有多个报警策略。
  216. > 报警存入哪里?
  217. 报警分为实时报警和历史报警。实时报警就是当下所有开关的报警;历史报警是发生在过去,报警已经解除的哪些报警。比如,开关A,在`8:10`程序判断出现手动分断报警,那么在实时报警中添加一条记录。接着,在`9:10`程序判断开关A已经正常,就在历史报警中添加一条记录,这条记录的报警开始时间是`8:10`,结束时间是`9:10`,并且在实时报警中删除该条记录。
  218. 实时报警存入关系数据库,历史报警存入时序数据库。实时报警中可以只记录当下正在发生的报警。
  219. > 报警如何处理?
  220. - 有些项目不处理,不关心,比如商场只关心到点开或关
  221. - 有些项目非常关心,比如涉及到电量统计,一旦开关或模块不正常,会影响到电量的统计,或者有关安全的,这时候需要把实时报警上报。
  222. 也就是,有些报警需要推送到负责人(可能是客服,也可能是电工,也可能是某个项目经理),然后进行处理。
  223. 不是所有的报警类型都需要推送到人。
  224. > 报警推送频率
  225. 比如有一个开关一直报警,那是在报警发生的当下推送呢?还是说每隔一段时间推送一次呢?还是说晚上的时间不推送呢?还是说让客户自己设置推送的频率和时间段呢?
  226. > 报警如何解除
  227. 有一个后台运行计算,如果没有达到报警触发的条件,就意味着解除。
  228. > 应用程序判断报警的背景计算放在项目,还是放在开放平台?
  229. 判断报警的服务理解成一个作业,可以嵌入到任何的应用程序中。
  230. # 数据模拟器
  231. - 确定模拟哪些数据:实时数据、电量数据、报警数据、开关、模块
  232. - 模拟程序
  233. - 有些模拟到关系数据库,有些模拟到时序数据库