DataCollectionSysyem.cs 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116
  1. using Microsoft.AspNetCore.DataProtection.KeyManagement;
  2. using ServiceCenter.Extensions;
  3. using ServiceCenter.SqlSugars;
  4. using SqlSugar;
  5. using System.Collections.Concurrent;
  6. using System.ComponentModel;
  7. using System.Data;
  8. using System.Reflection;
  9. using System.Text;
  10. using PlcSiemens.Core.Extension;
  11. using WCS.Core;
  12. using WCS.Entity.Protocol.DataStructure;
  13. using WCS.Entity.Protocol.HUB;
  14. using WCS.Entity.Protocol.Protocol.Robot;
  15. using WCS.Entity.Protocol.RGV;
  16. using WCS.Entity.Protocol.Robot;
  17. using WCS.Entity.Protocol.SRM;
  18. using WCS.Entity.Protocol.Station;
  19. using WCS.Entity.Protocol.Truss;
  20. using WCS.WorkEngineering.Worlds;
  21. namespace WCS.WorkEngineering.Systems
  22. {
  23. /// <summary>
  24. /// 数据采集系统
  25. /// </summary>
  26. [BelongTo(typeof(MainWorld))]
  27. [Description("数据采集系统")]
  28. public class DataCollectionSysyem : DeviceSystem<Device<IStation520>>
  29. {
  30. public static DeviceDataPack pack = new DeviceDataPack();
  31. private static object locker = new object();
  32. public DataCollectionSysyem()
  33. {
  34. }
  35. /// <summary>
  36. /// 所有设备数据
  37. /// Key 是不同设备所使用的类型 例如DeviceDataCollection<SRMData>
  38. /// value 不同设备的具体数据
  39. /// </summary>
  40. public static ConcurrentDictionary<string, DeviceData> AllDatas = new ConcurrentDictionary<string, DeviceData>();
  41. protected override bool ParallelDo => true;
  42. protected override bool SaveLogsToFile => true;
  43. public override bool Select(Device dev)
  44. {
  45. return dev.Code == "1";
  46. }
  47. public override void Do(Device<IStation520> objDev)
  48. {
  49. //通过数据条数处理
  50. var db = new SqlSugarHelper().PLC;
  51. //ExRobotRunInfo(db);
  52. ExRobotAlarmInfo(db);
  53. ExSrmAlarmInfo(db);
  54. ExRgvAlarmInfo(db);
  55. //Parallel.ForEach(robot522, infos =>
  56. //{
  57. // var start = infos.OrderBy(x => x.Frame).First();
  58. // var end = infos.OrderByDescending(x => x.Frame).First();
  59. // if (db.Queryable<DevAlarmInfo>().Any(x => x.Frame == end.Frame)) return;
  60. // List<DevAlarmInfo> runInfos = new List<DevAlarmInfo>();
  61. // foreach (var info in infos)
  62. // {
  63. // if (info.Frame == start.Frame)
  64. // {
  65. // runInfos.Add(new DevAlarmInfo()
  66. // {
  67. // Frame = info.Frame,
  68. // Code = info.Code,
  69. // Alarm = info.Alarm.ToString(),
  70. // StartTime = startTime,
  71. // EndTime = info.Frame,
  72. // Duration = Convert.ToInt64((info.Frame - startTime).Milliseconds)
  73. // });
  74. // }
  75. // else if (info.Frame == end.Frame)
  76. // {
  77. // runInfos.Add(new DevAlarmInfo()
  78. // {
  79. // Frame = info.Frame,
  80. // Code = info.Code,
  81. // Alarm = info.Alarm.ToString(),
  82. // StartTime = info.Frame,
  83. // EndTime = endTime,
  84. // Duration = Convert.ToInt64((endTime - info.Frame).Milliseconds)
  85. // });
  86. // }
  87. // else
  88. // {
  89. // if (start.Alarm != info.Alarm)
  90. // {
  91. // runInfos.Add(new DevAlarmInfo()
  92. // {
  93. // Frame = info.Frame,
  94. // Code = info.Code,
  95. // Alarm = info.Alarm.ToString(),
  96. // StartTime = start.Frame,
  97. // EndTime = info.Frame,
  98. // Duration = Convert.ToInt64((info.Frame - start.Frame).Milliseconds)
  99. // });
  100. // start = info;
  101. // }
  102. // }
  103. // }
  104. // db.Insertable(runInfos).ExecuteCommand();
  105. // });
  106. }
  107. #region 设备运行信息收集
  108. /// <summary>
  109. /// 机械臂
  110. /// </summary>
  111. /// <param name="db"></param>
  112. public void ExRobotRunInfo(SqlSugarScopeProvider db)
  113. {
  114. var startTime = DateTime.Now;
  115. var endTime = DateTime.Now;
  116. IEnumerable<IGrouping<string, WCS_Robot521>> robot521 = new List<IGrouping<string, WCS_Robot521>>();
  117. //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
  118. if (db.Queryable<DevRunInfo>().Any(x => x.Type == DevType.Robot))
  119. {
  120. //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
  121. var runInfo = db.Queryable<DevRunInfo>().Where(x => x.Type == DevType.Robot).OrderByDescending(x => x.Frame).First();
  122. startTime = runInfo.Frame.AddDays(+1).Date;//后一天的初始时间
  123. endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
  124. }
  125. else
  126. {
  127. if (!db.Queryable<WCS_Robot521>().Any()) return;
  128. startTime = db.Queryable<WCS_Robot521>().OrderBy(x => x.Frame).First().Frame.Date;
  129. endTime = startTime.AddDays(+1).AddMilliseconds(-1);
  130. }
  131. if (endTime > DateTime.Now.AddHours(1)) return; //一次处理24小时的数据
  132. if (db.Queryable<DevRunInfo>().Any(x => x.EndTime == endTime && x.Type == DevType.Robot)) return;
  133. robot521 = db.Queryable<WCS_Robot521>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
  134. if (!robot521.Any())
  135. {
  136. db.Insertable(new DevRunInfo()
  137. {
  138. Frame = endTime,
  139. Code = "当前时段无有效数据",
  140. RunMode = "当前时段无有效数据",
  141. RunStatus = "当前时段无有效数据",
  142. StartTime = startTime,
  143. EndTime = endTime,
  144. Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
  145. Type = DevType.Robot
  146. }).ExecuteCommand();
  147. }
  148. Parallel.ForEach(robot521, infos =>
  149. {
  150. // 获取第一条数据与最后一条数据
  151. var start = infos.OrderBy(x => x.Frame).First();
  152. var end = infos.OrderByDescending(x => x.Frame).First();
  153. //通过是否有最后一条数据来确定当前数据是否有分析存储过
  154. if (db.Queryable<DevRunInfo>().Any(x => x.Code == infos.Key && x.EndTime == end.Frame)) return;
  155. //获取前一天最后的一条数据
  156. var yesterEnd = db.Queryable<DevRunInfo>().Where(x => x.Code == infos.Key && x.Frame < endTime).OrderByDescending(x => x.Frame).First();
  157. List<DevRunInfo> runInfos = new List<DevRunInfo>();
  158. foreach (var info in infos.OrderBy(x => x.Frame))
  159. {
  160. if (info.Frame == start.Frame) //当天的第一条数据
  161. {
  162. if (yesterEnd == null) //如果没有前一天的最后一条数据,就有用当天的第一条数据状态做计算
  163. {
  164. runInfos.Add(new DevRunInfo()
  165. {
  166. Frame = info.Frame,
  167. Code = info.Code,
  168. RunMode = info.RobotMode.GetDescription(),
  169. RunStatus = info.RunStatus.GetDescription(),
  170. StartTime = startTime,
  171. EndTime = info.Frame,
  172. Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
  173. Type = DevType.Robot
  174. });
  175. }
  176. else //如果有就用前一天的最后一条数据做计算
  177. {
  178. runInfos.Add(new DevRunInfo()
  179. {
  180. Frame = info.Frame,
  181. Code = info.Code,
  182. RunMode = yesterEnd.RunMode,
  183. RunStatus = yesterEnd.RunStatus,
  184. StartTime = startTime,
  185. EndTime = info.Frame,
  186. Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
  187. Type = DevType.Robot
  188. });
  189. }
  190. }
  191. else if (info.Frame == end.Frame) //当天的最后一条数据
  192. {
  193. runInfos.Add(new DevRunInfo()
  194. {
  195. Frame = info.Frame,
  196. Code = info.Code,
  197. RunMode = info.RobotMode.GetDescription(),
  198. RunStatus = info.RunStatus.GetDescription(),
  199. StartTime = info.Frame,
  200. EndTime = endTime,
  201. Duration = Convert.ToInt64((endTime - info.Frame).TotalMilliseconds),
  202. Type = DevType.Robot
  203. });
  204. }
  205. else //中间数据
  206. {
  207. if (start.RobotMode == info.RobotMode && start.RunStatus == info.RunStatus) continue;
  208. runInfos.Add(new DevRunInfo()
  209. {
  210. Frame = info.Frame,
  211. Code = info.Code,
  212. RunMode = start.RobotMode.GetDescription(),
  213. RunStatus = start.RunStatus.GetDescription(),
  214. StartTime = start.Frame,
  215. EndTime = info.Frame,
  216. Duration = Convert.ToInt64((info.Frame - start.Frame).TotalMilliseconds),
  217. Type = DevType.Robot
  218. });
  219. start = info;
  220. }
  221. }
  222. var sql = db.Insertable(runInfos).ToSqlString();
  223. db.Ado.ExecuteCommand(GetString(sql));
  224. });
  225. }
  226. /// <summary>
  227. /// 堆垛机
  228. /// </summary>
  229. /// <param name="db"></param>
  230. public void ExSrmRunInfo(SqlSugarScopeProvider db)
  231. {
  232. var startTime = DateTime.Now;
  233. var endTime = DateTime.Now;
  234. IEnumerable<IGrouping<string, WCS_SRM521>> srm521 = new List<IGrouping<string, WCS_SRM521>>();
  235. //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
  236. if (db.Queryable<DevRunInfo>().Any(x => x.Type == DevType.SRM))
  237. {
  238. //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
  239. var runInfo = db.Queryable<DevRunInfo>().Where(x => x.Type == DevType.SRM).OrderByDescending(x => x.Frame).First();
  240. startTime = runInfo.Frame.AddDays(+1).Date;//后一天的初始时间
  241. endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
  242. }
  243. else
  244. {
  245. if (!db.Queryable<WCS_SRM521>().Any()) return;
  246. startTime = db.Queryable<WCS_SRM521>().OrderBy(x => x.Frame).First().Frame.Date;
  247. endTime = startTime.AddDays(+1).AddMilliseconds(-1);
  248. }
  249. if (endTime > DateTime.Now.AddHours(1)) return; //一次处理24小时的数据
  250. if (db.Queryable<DevRunInfo>().Any(x => x.EndTime == endTime && x.Type == DevType.SRM)) return;
  251. srm521 = db.Queryable<WCS_SRM521>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
  252. if (!srm521.Any())
  253. {
  254. db.Insertable(new DevRunInfo()
  255. {
  256. Frame = endTime,
  257. Code = "当前时段无有效数据",
  258. RunMode = "当前时段无有效数据",
  259. RunStatus = "当前时段无有效数据",
  260. StartTime = startTime,
  261. EndTime = endTime,
  262. Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
  263. Type = DevType.SRM
  264. }).ExecuteCommand();
  265. }
  266. Parallel.ForEach(srm521, infos =>
  267. {
  268. // 获取第一条数据与最后一条数据
  269. var start = infos.OrderBy(x => x.Frame).First();
  270. var end = infos.OrderByDescending(x => x.Frame).First();
  271. //通过是否有最后一条数据来确定当前数据是否有分析存储过
  272. if (db.Queryable<DevRunInfo>().Any(x => x.Code == infos.Key && x.EndTime == end.Frame)) return;
  273. //获取前一天最后的一条数据
  274. var yesterEnd = db.Queryable<DevRunInfo>().Where(x => x.Code == infos.Key && x.Frame < endTime).OrderByDescending(x => x.Frame).First();
  275. List<DevRunInfo> runInfos = new List<DevRunInfo>();
  276. foreach (var info in infos.OrderBy(x => x.Frame))
  277. {
  278. if (info.Frame == start.Frame) //当天的第一条数据
  279. {
  280. if (yesterEnd == null) //如果没有前一天的最后一条数据,就有用当天的第一条数据状态做计算
  281. {
  282. runInfos.Add(new DevRunInfo()
  283. {
  284. Frame = info.Frame,
  285. Code = info.Code,
  286. RunMode = info.AutoStatus.GetDescription(),
  287. RunStatus = info.RunStatus.GetDescription(),
  288. StartTime = startTime,
  289. EndTime = info.Frame,
  290. Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
  291. Type = DevType.SRM
  292. });
  293. }
  294. else //如果有就用前一天的最后一条数据做计算
  295. {
  296. runInfos.Add(new DevRunInfo()
  297. {
  298. Frame = info.Frame,
  299. Code = info.Code,
  300. RunMode = yesterEnd.RunMode,
  301. RunStatus = yesterEnd.RunStatus,
  302. StartTime = startTime,
  303. EndTime = info.Frame,
  304. Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
  305. Type = DevType.SRM
  306. });
  307. }
  308. }
  309. else if (info.Frame == end.Frame) //当天的最后一条数据
  310. {
  311. runInfos.Add(new DevRunInfo()
  312. {
  313. Frame = info.Frame,
  314. Code = info.Code,
  315. RunMode = info.AutoStatus.GetDescription(),
  316. RunStatus = info.RunStatus.GetDescription(),
  317. StartTime = info.Frame,
  318. EndTime = endTime,
  319. Duration = Convert.ToInt64((endTime - info.Frame).TotalMilliseconds),
  320. Type = DevType.SRM
  321. });
  322. }
  323. else //中间数据
  324. {
  325. if (start.AutoStatus == info.AutoStatus && start.RunStatus == info.RunStatus) continue;
  326. runInfos.Add(new DevRunInfo()
  327. {
  328. Frame = info.Frame,
  329. Code = info.Code,
  330. RunMode = start.AutoStatus.GetDescription(),
  331. RunStatus = start.RunStatus.GetDescription(),
  332. StartTime = start.Frame,
  333. EndTime = info.Frame,
  334. Duration = Convert.ToInt64((info.Frame - start.Frame).TotalMilliseconds),
  335. Type = DevType.SRM
  336. });
  337. start = info;
  338. }
  339. }
  340. var sql = db.Insertable(runInfos).ToSqlString();
  341. db.Ado.ExecuteCommand(GetString(sql));
  342. });
  343. }
  344. /// <summary>
  345. /// rgv
  346. /// </summary>
  347. /// <param name="db"></param>
  348. public void ExRgvRunInfo(SqlSugarScopeProvider db)
  349. {
  350. var startTime = DateTime.Now;
  351. var endTime = DateTime.Now;
  352. IEnumerable<IGrouping<string, WCS_RGV521>> rgv521 = new List<IGrouping<string, WCS_RGV521>>();
  353. //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
  354. if (db.Queryable<DevRunInfo>().Any(x => x.Type == DevType.RGV))
  355. {
  356. //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
  357. var runInfo = db.Queryable<DevRunInfo>().Where(x => x.Type == DevType.RGV).OrderByDescending(x => x.Frame).First();
  358. startTime = runInfo.Frame.AddDays(+1).Date;//后一天的初始时间
  359. endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
  360. }
  361. else
  362. {
  363. if (!db.Queryable<WCS_RGV521>().Any()) return;
  364. startTime = db.Queryable<WCS_RGV521>().OrderBy(x => x.Frame).First().Frame.Date;
  365. endTime = startTime.AddDays(+1).AddMilliseconds(-1);
  366. }
  367. if (endTime > DateTime.Now.AddHours(1)) return; //一次处理24小时的数据
  368. if (db.Queryable<DevRunInfo>().Any(x => x.EndTime == endTime && x.Type == DevType.RGV)) return;
  369. rgv521 = db.Queryable<WCS_RGV521>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
  370. if (!rgv521.Any())
  371. {
  372. db.Insertable(new DevRunInfo()
  373. {
  374. Frame = endTime,
  375. Code = "当前时段无有效数据",
  376. RunMode = "当前时段无有效数据",
  377. RunStatus = "当前时段无有效数据",
  378. StartTime = startTime,
  379. EndTime = endTime,
  380. Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
  381. Type = DevType.RGV
  382. }).ExecuteCommand();
  383. }
  384. Parallel.ForEach(rgv521, infos =>
  385. {
  386. // 获取第一条数据与最后一条数据
  387. var start = infos.OrderBy(x => x.Frame).First();
  388. var end = infos.OrderByDescending(x => x.Frame).First();
  389. //通过是否有最后一条数据来确定当前数据是否有分析存储过
  390. if (db.Queryable<DevRunInfo>().Any(x => x.Code == infos.Key && x.EndTime == end.Frame)) return;
  391. //获取前一天最后的一条数据
  392. var yesterEnd = db.Queryable<DevRunInfo>().Where(x => x.Code == infos.Key && x.Frame < endTime).OrderByDescending(x => x.Frame).First();
  393. List<DevRunInfo> runInfos = new List<DevRunInfo>();
  394. foreach (var info in infos.OrderBy(x => x.Frame))
  395. {
  396. if (info.Frame == start.Frame) //当天的第一条数据
  397. {
  398. if (yesterEnd == null) //如果没有前一天的最后一条数据,就有用当天的第一条数据状态做计算
  399. {
  400. runInfos.Add(new DevRunInfo()
  401. {
  402. Frame = info.Frame,
  403. Code = info.Code,
  404. RunMode = info.WorkMode.GetDescription(),
  405. RunStatus = info.SystemStatus.GetDescription(),
  406. StartTime = startTime,
  407. EndTime = info.Frame,
  408. Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
  409. Type = DevType.RGV
  410. });
  411. }
  412. else //如果有就用前一天的最后一条数据做计算
  413. {
  414. runInfos.Add(new DevRunInfo()
  415. {
  416. Frame = info.Frame,
  417. Code = info.Code,
  418. RunMode = yesterEnd.RunMode,
  419. RunStatus = yesterEnd.RunStatus,
  420. StartTime = startTime,
  421. EndTime = info.Frame,
  422. Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
  423. Type = DevType.RGV
  424. });
  425. }
  426. }
  427. else if (info.Frame == end.Frame) //当天的最后一条数据
  428. {
  429. runInfos.Add(new DevRunInfo()
  430. {
  431. Frame = info.Frame,
  432. Code = info.Code,
  433. RunMode = info.WorkMode.GetDescription(),
  434. RunStatus = info.SystemStatus.GetDescription(),
  435. StartTime = info.Frame,
  436. EndTime = endTime,
  437. Duration = Convert.ToInt64((endTime - info.Frame).TotalMilliseconds),
  438. Type = DevType.RGV
  439. });
  440. }
  441. else //中间数据
  442. {
  443. if (start.WorkMode == info.WorkMode && start.SystemStatus == info.SystemStatus) continue;
  444. runInfos.Add(new DevRunInfo()
  445. {
  446. Frame = info.Frame,
  447. Code = info.Code,
  448. RunMode = start.WorkMode.GetDescription(),
  449. RunStatus = start.SystemStatus.GetDescription(),
  450. StartTime = start.Frame,
  451. EndTime = info.Frame,
  452. Duration = Convert.ToInt64((info.Frame - start.Frame).TotalMilliseconds),
  453. Type = DevType.Robot
  454. });
  455. start = info;
  456. }
  457. }
  458. var sql = db.Insertable(runInfos).ToSqlString();
  459. db.Ado.ExecuteCommand(GetString(sql));
  460. });
  461. }
  462. /// <summary>
  463. /// 桁架
  464. /// </summary>
  465. /// <param name="db"></param>
  466. public void ExTrussRunInfo(SqlSugarScopeProvider db)
  467. {
  468. var startTime = DateTime.Now;
  469. var endTime = DateTime.Now;
  470. IEnumerable<IGrouping<string, WCS_Truss521>> truss521 = new List<IGrouping<string, WCS_Truss521>>();
  471. //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
  472. if (db.Queryable<DevRunInfo>().Any(x => x.Type == DevType.Truss))
  473. {
  474. //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
  475. var runInfo = db.Queryable<DevRunInfo>().Where(x => x.Type == DevType.Truss).OrderByDescending(x => x.Frame).First();
  476. startTime = runInfo.Frame.AddDays(+1).Date;//后一天的初始时间
  477. endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
  478. }
  479. else
  480. {
  481. if (!db.Queryable<WCS_Truss521>().Any()) return;
  482. startTime = db.Queryable<WCS_Truss521>().OrderBy(x => x.Frame).First().Frame.Date;
  483. endTime = startTime.AddDays(+1).AddMilliseconds(-1);
  484. }
  485. if (endTime > DateTime.Now.AddHours(1)) return; //一次处理24小时的数据
  486. if (db.Queryable<DevRunInfo>().Any(x => x.EndTime == endTime && x.Type == DevType.Truss)) return;
  487. truss521 = db.Queryable<WCS_Truss521>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
  488. if (!truss521.Any())
  489. {
  490. db.Insertable(new DevRunInfo()
  491. {
  492. Frame = endTime,
  493. Code = "当前时段无有效数据",
  494. RunMode = "当前时段无有效数据",
  495. RunStatus = "当前时段无有效数据",
  496. StartTime = startTime,
  497. EndTime = endTime,
  498. Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
  499. Type = DevType.Truss
  500. }).ExecuteCommand();
  501. }
  502. Parallel.ForEach(truss521, infos =>
  503. {
  504. // 获取第一条数据与最后一条数据
  505. var start = infos.OrderBy(x => x.Frame).First();
  506. var end = infos.OrderByDescending(x => x.Frame).First();
  507. //通过是否有最后一条数据来确定当前数据是否有分析存储过
  508. if (db.Queryable<DevRunInfo>().Any(x => x.Code == infos.Key && x.EndTime == end.Frame)) return;
  509. //获取前一天最后的一条数据
  510. var yesterEnd = db.Queryable<DevRunInfo>().Where(x => x.Code == infos.Key && x.Frame < endTime).OrderByDescending(x => x.Frame).First();
  511. List<DevRunInfo> runInfos = new List<DevRunInfo>();
  512. foreach (var info in infos.OrderBy(x => x.Frame))
  513. {
  514. if (info.Frame == start.Frame) //当天的第一条数据
  515. {
  516. if (yesterEnd == null) //如果没有前一天的最后一条数据,就有用当天的第一条数据状态做计算
  517. {
  518. runInfos.Add(new DevRunInfo()
  519. {
  520. Frame = info.Frame,
  521. Code = info.Code,
  522. RunMode = info.Status.GetDescription(),
  523. StartTime = startTime,
  524. EndTime = info.Frame,
  525. Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
  526. Type = DevType.Truss
  527. });
  528. }
  529. else //如果有就用前一天的最后一条数据做计算
  530. {
  531. runInfos.Add(new DevRunInfo()
  532. {
  533. Frame = info.Frame,
  534. Code = info.Code,
  535. RunMode = yesterEnd.RunMode,
  536. RunStatus = yesterEnd.RunStatus,
  537. StartTime = startTime,
  538. EndTime = info.Frame,
  539. Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
  540. Type = DevType.Robot
  541. });
  542. }
  543. }
  544. else if (info.Frame == end.Frame) //当天的最后一条数据
  545. {
  546. runInfos.Add(new DevRunInfo()
  547. {
  548. Frame = info.Frame,
  549. Code = info.Code,
  550. RunMode = info.Status.GetDescription(),
  551. StartTime = info.Frame,
  552. EndTime = endTime,
  553. Duration = Convert.ToInt64((endTime - info.Frame).TotalMilliseconds),
  554. Type = DevType.Truss
  555. });
  556. }
  557. else //中间数据
  558. {
  559. if (start.Status == info.Status) continue;
  560. runInfos.Add(new DevRunInfo()
  561. {
  562. Frame = info.Frame,
  563. Code = info.Code,
  564. RunMode = start.Status.GetDescription(),
  565. StartTime = start.Frame,
  566. EndTime = info.Frame,
  567. Duration = Convert.ToInt64((info.Frame - start.Frame).TotalMilliseconds),
  568. Type = DevType.Truss
  569. });
  570. start = info;
  571. }
  572. }
  573. var sql = db.Insertable(runInfos).ToSqlString();
  574. db.Ado.ExecuteCommand(GetString(sql));
  575. });
  576. }
  577. #endregion 设备运行信息收集
  578. #region 异常报警信息
  579. /// <summary>
  580. /// 机械臂
  581. /// </summary>
  582. /// <param name="db"></param>
  583. public void ExRobotAlarmInfo(SqlSugarScopeProvider db)
  584. {
  585. var startTime = DateTime.Now;
  586. var endTime = DateTime.Now;
  587. IEnumerable<IGrouping<string, QuestDb_Robot522>> robot522 = new List<IGrouping<string, QuestDb_Robot522>>();
  588. //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
  589. if (db.Queryable<DevAlarmInfo>().Any(x => x.Type == DevType.Robot))
  590. {
  591. //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
  592. var alarmInfo = db.Queryable<DevAlarmInfo>().Where(x => x.Type == DevType.Robot).OrderByDescending(x => x.Frame).First();
  593. startTime = alarmInfo.Frame.AddDays(+1).Date;//后一天的初始时间
  594. endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
  595. }
  596. else
  597. {
  598. if (!db.Queryable<QuestDb_Robot522>().Any()) return;
  599. startTime = db.Queryable<QuestDb_Robot522>().OrderBy(x => x.Frame).First().Frame.Date;
  600. endTime = startTime.AddDays(+1).AddMilliseconds(-1);
  601. }
  602. if (endTime > DateTime.Now.AddHours(1)) return; //一次处理24小时的数据
  603. if (db.Queryable<DevAlarmInfo>().Any(x => x.EndTime == endTime && x.Type == DevType.Robot)) return;
  604. robot522 = db.Queryable<QuestDb_Robot522>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
  605. if (!robot522.Any())
  606. {
  607. db.Insertable(new DevAlarmInfo()
  608. {
  609. Frame = endTime,
  610. Code = "当前时段无有效数据",
  611. Alarm = "当前时段无有效数据",
  612. StartTime = startTime,
  613. EndTime = endTime,
  614. Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
  615. Type = DevType.Robot
  616. }).ExecuteCommand();
  617. }
  618. Parallel.ForEach(robot522, infos =>
  619. {
  620. // 获取第一条数据与最后一条数据
  621. var start = infos.OrderBy(x => x.Frame).First();
  622. var end = infos.OrderByDescending(x => x.Frame).First();
  623. //通过是否有最后一条数据来确定当前数据是否有分析存储过
  624. if (db.Queryable<DevAlarmInfo>().Any(x => x.Code == infos.Key && x.EndTime == end.Frame)) return;
  625. //获取前一天最后的一条数据
  626. var yesterEnd = db.Queryable<DevAlarmInfo>().Where(x => x.Code == infos.Key && x.Frame < endTime).OrderByDescending(x => x.Frame).First();
  627. List<DevAlarmInfo> runInfos = new List<DevAlarmInfo>();//需要保存的数据
  628. var alarmList = new List<EquipmentAlarm>();//未结束的报警信息
  629. foreach (var info in infos.OrderBy(x => x.Frame))
  630. {
  631. if (info.Frame == end.Frame) //最后一条数据
  632. {
  633. if (info.Alarm != "无")
  634. {
  635. //先判断是否有没有记录的报警信息
  636. var alarmMsg = Convert.ToString(info.Alarm).Split(",").Select(x => x.Split(",")).SelectMany(x => x).ToList();
  637. var msgList = alarmList.Select(x => x.Msg);
  638. //将未记录的报警信息增加到缓存中
  639. alarmList.AddRange(alarmMsg.Where(msg => !msgList.Contains(msg)).Select(msg => new EquipmentAlarm() { Time = info.Frame, Msg = msg }));
  640. }
  641. if (!alarmList.Any()) continue;
  642. runInfos.AddRange(alarmList.Select(alarm => new DevAlarmInfo()
  643. {
  644. Frame = alarm.Time,
  645. Code = info.Code,
  646. Alarm = alarm.Msg,
  647. StartTime = alarm.Time,
  648. EndTime = endTime,
  649. Duration = Convert.ToInt64((endTime - alarm.Time).TotalMilliseconds),
  650. Type = DevType.Robot
  651. }));
  652. }
  653. else
  654. {
  655. if (info.Alarm == "无" && alarmList.Any()) //代表报警全部清空了
  656. {
  657. runInfos.AddRange(alarmList.Select(alarm => new DevAlarmInfo()
  658. {
  659. Frame = alarm.Time,
  660. Code = info.Code,
  661. Alarm = alarm.Msg,
  662. StartTime = alarm.Time,
  663. EndTime = info.Frame,
  664. Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
  665. Type = DevType.Robot
  666. }));
  667. alarmList = new List<EquipmentAlarm>(); //清空现有报警信息
  668. }
  669. else if (info.Alarm != "无")
  670. {
  671. var alarmMsg = Convert.ToString(info.Alarm).Split(",").Select(x => x.Split(",")).SelectMany(x => x).ToList();
  672. var msgList = alarmList.Select(x => x.Msg);
  673. //将未记录的报警信息增加到缓存中
  674. alarmList.AddRange(alarmMsg.Where(msg => !msgList.Contains(msg)).Select(msg => new EquipmentAlarm() { Time = info.Frame, Msg = msg }));
  675. var treatedAlarm = new List<string>();
  676. //将已记录,但当前信息中没有的报警结束
  677. foreach (var alarm in alarmList.Where(x => !alarmMsg.Contains(x.Msg)))
  678. {
  679. runInfos.Add(new DevAlarmInfo()
  680. {
  681. Frame = alarm.Time,
  682. Code = info.Code,
  683. Alarm = alarm.Msg,
  684. StartTime = alarm.Time,
  685. EndTime = info.Frame,
  686. Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
  687. Type = DevType.Robot
  688. });
  689. treatedAlarm.Add(alarm.Msg);
  690. }
  691. alarmList = alarmList.Where(x => !treatedAlarm.Contains(x.Msg)).ToList();
  692. }
  693. }
  694. }
  695. if (runInfos.Any())
  696. {
  697. var sql = db.Insertable(runInfos).ToSqlString();
  698. db.Ado.ExecuteCommand(GetString(sql));
  699. }
  700. else
  701. {
  702. db.Insertable(new DevAlarmInfo()
  703. {
  704. Frame = endTime,
  705. Code = infos.Key,
  706. Alarm = "当前时段无有效数据",
  707. StartTime = startTime,
  708. EndTime = endTime,
  709. Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
  710. Type = DevType.Robot
  711. }).ExecuteCommand();
  712. }
  713. });
  714. }
  715. /// <summary>
  716. /// 堆垛机
  717. /// </summary>
  718. /// <param name="db"></param>
  719. public void ExSrmAlarmInfo(SqlSugarScopeProvider db)
  720. {
  721. var startTime = DateTime.Now;
  722. var endTime = DateTime.Now;
  723. IEnumerable<IGrouping<string, QuestDb_SRM523>> srm523 = new List<IGrouping<string, QuestDb_SRM523>>();
  724. //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
  725. if (db.Queryable<DevAlarmInfo>().Any(x => x.Type == DevType.SRM))
  726. {
  727. //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
  728. var alarmInfo = db.Queryable<DevAlarmInfo>().Where(x => x.Type == DevType.SRM).OrderByDescending(x => x.Frame).First();
  729. startTime = alarmInfo.Frame.AddDays(+1).Date;//后一天的初始时间
  730. endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
  731. }
  732. else
  733. {
  734. if (!db.Queryable<QuestDb_SRM523>().Any()) return;
  735. startTime = db.Queryable<QuestDb_SRM523>().OrderBy(x => x.Frame).First().Frame.Date;
  736. endTime = startTime.AddDays(+1).AddMilliseconds(-1);
  737. }
  738. if (endTime > DateTime.Now.AddHours(1)) return; //一次处理24小时的数据
  739. if (db.Queryable<DevAlarmInfo>().Any(x => x.EndTime == endTime && x.Type == DevType.SRM)) return;
  740. srm523 = db.Queryable<QuestDb_SRM523>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
  741. if (!srm523.Any())
  742. {
  743. db.Insertable(new DevAlarmInfo()
  744. {
  745. Frame = endTime,
  746. Code = "当前时段无有效数据",
  747. Alarm = "当前时段无有效数据",
  748. StartTime = startTime,
  749. EndTime = endTime,
  750. Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
  751. Type = DevType.SRM
  752. }).ExecuteCommand();
  753. }
  754. Parallel.ForEach(srm523, infos =>
  755. {
  756. // 获取第一条数据与最后一条数据
  757. var start = infos.OrderBy(x => x.Frame).First();
  758. var end = infos.OrderByDescending(x => x.Frame).First();
  759. //通过是否有最后一条数据来确定当前数据是否有分析存储过
  760. if (db.Queryable<DevAlarmInfo>().Any(x => x.Code == infos.Key && x.EndTime == end.Frame)) return;
  761. //获取前一天最后的一条数据
  762. var yesterEnd = db.Queryable<DevAlarmInfo>().Where(x => x.Code == infos.Key && x.Frame < endTime).OrderByDescending(x => x.Frame).First();
  763. List<DevAlarmInfo> runInfos = new List<DevAlarmInfo>();//需要保存的数据
  764. var alarmList = new List<EquipmentAlarm>();//未结束的报警信息
  765. foreach (var info in infos.OrderBy(x => x.Frame))
  766. {
  767. if (info.Frame == end.Frame) //最后一条数据
  768. {
  769. if (info.Alarm != "无,无")
  770. {
  771. //先判断是否有没有记录的报警信息
  772. var alarmMsg = Convert.ToString(info.Alarm).Split(",").Select(x => x.Split(",")).SelectMany(x => x).Where(x => x != "无").ToList();
  773. var msgList = alarmList.Select(x => x.Msg);
  774. //将未记录的报警信息增加到缓存中
  775. alarmList.AddRange(alarmMsg.Where(msg => !msgList.Contains(msg)).Select(msg => new EquipmentAlarm() { Time = info.Frame, Msg = msg }));
  776. }
  777. if (!alarmList.Any()) continue;
  778. runInfos.AddRange(alarmList.Select(alarm => new DevAlarmInfo()
  779. {
  780. Frame = alarm.Time,
  781. Code = info.Code,
  782. Alarm = alarm.Msg,
  783. StartTime = alarm.Time,
  784. EndTime = endTime,
  785. Duration = Convert.ToInt64((endTime - alarm.Time).TotalMilliseconds),
  786. Type = DevType.SRM
  787. }));
  788. }
  789. else
  790. {
  791. if (info.Alarm == "无,无" && alarmList.Any()) //代表报警全部清空了
  792. {
  793. runInfos.AddRange(alarmList.Select(alarm => new DevAlarmInfo()
  794. {
  795. Frame = alarm.Time,
  796. Code = info.Code,
  797. Alarm = alarm.Msg,
  798. StartTime = alarm.Time,
  799. EndTime = info.Frame,
  800. Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
  801. Type = DevType.SRM
  802. }));
  803. alarmList = new List<EquipmentAlarm>(); //清空现有报警信息
  804. }
  805. else if (info.Alarm != "无,无")
  806. {
  807. var alarmMsg = Convert.ToString(info.Alarm).Split(",").Select(x => x.Split(",")).SelectMany(x => x).Where(x => x != "无").ToList();
  808. var msgList = alarmList.Select(x => x.Msg);
  809. //将未记录的报警信息增加到缓存中
  810. alarmList.AddRange(alarmMsg.Where(msg => !msgList.Contains(msg)).Select(msg => new EquipmentAlarm() { Time = info.Frame, Msg = msg }));
  811. var treatedAlarm = new List<string>();
  812. //将已记录,但当前信息中没有的报警结束
  813. foreach (var alarm in alarmList.Where(x => !alarmMsg.Contains(x.Msg)))
  814. {
  815. runInfos.Add(new DevAlarmInfo()
  816. {
  817. Frame = alarm.Time,
  818. Code = info.Code,
  819. Alarm = alarm.Msg,
  820. StartTime = alarm.Time,
  821. EndTime = info.Frame,
  822. Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
  823. Type = DevType.SRM
  824. });
  825. treatedAlarm.Add(alarm.Msg);
  826. }
  827. alarmList = alarmList.Where(x => !treatedAlarm.Contains(x.Msg)).ToList();
  828. }
  829. }
  830. }
  831. if (runInfos.Any())
  832. {
  833. var sql = db.Insertable(runInfos).ToSqlString();
  834. db.Ado.ExecuteCommand(GetString(sql));
  835. }
  836. else
  837. {
  838. db.Insertable(new DevAlarmInfo()
  839. {
  840. Frame = endTime,
  841. Code = infos.Key,
  842. Alarm = "当前时段无有效数据",
  843. StartTime = startTime,
  844. EndTime = endTime,
  845. Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
  846. Type = DevType.SRM
  847. }).ExecuteCommand();
  848. }
  849. });
  850. }
  851. /// <summary>
  852. /// rgv
  853. /// </summary>
  854. /// <param name="db"></param>
  855. public void ExRgvAlarmInfo(SqlSugarScopeProvider db)
  856. {
  857. var startTime = DateTime.Now;
  858. var endTime = DateTime.Now;
  859. IEnumerable<IGrouping<string, QuestDb_RGV523>> rgv523 = new List<IGrouping<string, QuestDb_RGV523>>();
  860. //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
  861. if (db.Queryable<DevAlarmInfo>().Any(x => x.Type == DevType.RGV))
  862. {
  863. //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
  864. var alarmInfo = db.Queryable<DevAlarmInfo>().Where(x => x.Type == DevType.RGV).OrderByDescending(x => x.Frame).First();
  865. startTime = alarmInfo.Frame.AddDays(+1).Date;//后一天的初始时间
  866. endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
  867. }
  868. else
  869. {
  870. if (!db.Queryable<QuestDb_RGV523>().Any()) return;
  871. startTime = db.Queryable<QuestDb_RGV523>().OrderBy(x => x.Frame).First().Frame.Date;
  872. endTime = startTime.AddDays(+1).AddMilliseconds(-1);
  873. }
  874. if (endTime > DateTime.Now.AddHours(1)) return; //一次处理24小时的数据
  875. if (db.Queryable<DevAlarmInfo>().Any(x => x.EndTime == endTime && x.Type == DevType.RGV)) return;
  876. rgv523 = db.Queryable<QuestDb_RGV523>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
  877. if (!rgv523.Any())
  878. {
  879. db.Insertable(new DevAlarmInfo()
  880. {
  881. Frame = endTime,
  882. Code = "当前时段无有效数据",
  883. Alarm = "当前时段无有效数据",
  884. StartTime = startTime,
  885. EndTime = endTime,
  886. Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
  887. Type = DevType.RGV
  888. }).ExecuteCommand();
  889. }
  890. Parallel.ForEach(rgv523/*.Where(x => x.Key == "RGV4")*/, infos =>
  891. {
  892. // 获取第一条数据与最后一条数据
  893. var start = infos.OrderBy(x => x.Frame).First();
  894. var end = infos.OrderByDescending(x => x.Frame).First();
  895. //通过是否有最后一条数据来确定当前数据是否有分析存储过
  896. if (db.Queryable<DevAlarmInfo>().Any(x => x.Code == infos.Key && x.EndTime == end.Frame)) return;
  897. //获取前一天最后的一条数据
  898. var yesterEnd = db.Queryable<DevAlarmInfo>().Where(x => x.Code == infos.Key && x.Frame < endTime).OrderByDescending(x => x.Frame).First();
  899. List<DevAlarmInfo> runInfos = new List<DevAlarmInfo>();//需要保存的数据
  900. var alarmList = new List<EquipmentAlarm>();//未结束的报警信息
  901. foreach (var info in infos.OrderBy(x => x.Frame))
  902. {
  903. if (info.Frame == end.Frame) //最后一条数据
  904. {
  905. if (info.Alarm != "无")
  906. {
  907. //先判断是否有没有记录的报警信息
  908. var alarmMsg = Convert.ToString(info.Alarm).Split(",").Select(x => x.Split(",")).SelectMany(x => x).ToList();
  909. var msgList = alarmList.Select(x => x.Msg);
  910. //将未记录的报警信息增加到缓存中
  911. alarmList.AddRange(alarmMsg.Where(msg => !msgList.Contains(msg)).Select(msg => new EquipmentAlarm() { Time = info.Frame, Msg = msg }));
  912. }
  913. if (!alarmList.Any()) continue;
  914. runInfos.AddRange(alarmList.Select(alarm => new DevAlarmInfo()
  915. {
  916. Frame = alarm.Time,
  917. Code = info.Code,
  918. Alarm = alarm.Msg,
  919. StartTime = alarm.Time,
  920. EndTime = endTime,
  921. Duration = Convert.ToInt64((endTime - alarm.Time).TotalMilliseconds),
  922. Type = DevType.RGV
  923. }));
  924. }
  925. else
  926. {
  927. if (info.Alarm == "无" && alarmList.Any()) //代表报警全部清空了
  928. {
  929. runInfos.AddRange(alarmList.Select(alarm => new DevAlarmInfo()
  930. {
  931. Frame = alarm.Time,
  932. Code = info.Code,
  933. Alarm = alarm.Msg,
  934. StartTime = alarm.Time,
  935. EndTime = info.Frame,
  936. Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
  937. Type = DevType.RGV
  938. }));
  939. alarmList = new List<EquipmentAlarm>(); //清空现有报警信息
  940. }
  941. else if (info.Alarm != "无")
  942. {
  943. var alarmMsg = Convert.ToString(info.Alarm).Split(",").Select(x => x.Split(",")).SelectMany(x => x).ToList();
  944. var msgList = alarmList.Select(x => x.Msg);
  945. //将未记录的报警信息增加到缓存中
  946. alarmList.AddRange(alarmMsg.Where(msg => !msgList.Contains(msg)).Select(msg => new EquipmentAlarm() { Time = info.Frame, Msg = msg }));
  947. var treatedAlarm = new List<string>();
  948. //将已记录,但当前信息中没有的报警结束
  949. foreach (var alarm in alarmList.Where(x => !alarmMsg.Contains(x.Msg)))
  950. {
  951. runInfos.Add(new DevAlarmInfo()
  952. {
  953. Frame = alarm.Time,
  954. Code = info.Code,
  955. Alarm = alarm.Msg,
  956. StartTime = alarm.Time,
  957. EndTime = info.Frame,
  958. Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
  959. Type = DevType.RGV
  960. });
  961. treatedAlarm.Add(alarm.Msg);
  962. }
  963. alarmList = alarmList.Where(x => !treatedAlarm.Contains(x.Msg)).ToList();
  964. }
  965. }
  966. }
  967. if (runInfos.Any())
  968. {
  969. db.Insertable(runInfos).ExecuteCommand();
  970. }
  971. else
  972. {
  973. db.Insertable(new DevAlarmInfo()
  974. {
  975. Frame = endTime,
  976. Code = infos.Key,
  977. Alarm = "当前时段无有效数据",
  978. StartTime = startTime,
  979. EndTime = endTime,
  980. Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
  981. Type = DevType.RGV
  982. }).ExecuteCommand();
  983. }
  984. });
  985. }
  986. #endregion 异常报警信息
  987. public string GetString(string value)
  988. {
  989. return value.Replace(",N'", ",'")
  990. .Replace("\0", "")
  991. .Replace("(N'", "('") + "\r";
  992. }
  993. }
  994. /// <summary>
  995. /// 设备报警
  996. /// </summary>
  997. public class EquipmentAlarm
  998. {
  999. /// <summary>
  1000. /// 内容
  1001. /// </summary>
  1002. public string Msg { get; set; }
  1003. /// <summary>
  1004. /// 时间
  1005. /// </summary>
  1006. public DateTime Time { get; set; }
  1007. }
  1008. /// <summary>
  1009. /// 设备状态信息
  1010. /// </summary>
  1011. public class EquipmentStatus
  1012. {
  1013. /// <summary>
  1014. /// 设备号
  1015. /// </summary>
  1016. public string Code { get; set; }
  1017. /// <summary>
  1018. /// 内容
  1019. /// </summary>
  1020. public string con { get; set; }
  1021. /// <summary>
  1022. /// 内容
  1023. /// </summary>
  1024. public int Status { get; set; }
  1025. /// <summary>
  1026. /// 时间
  1027. /// </summary>
  1028. public DateTime Time { get; set; }
  1029. }
  1030. /// <summary>
  1031. ///
  1032. /// </summary>
  1033. /// <typeparam name="T"></typeparam>
  1034. public class Quest<T>
  1035. {
  1036. public T Data { get; set; }
  1037. }
  1038. public class KeyValue
  1039. {
  1040. public string key { get; set; }
  1041. public string value { get; set; }
  1042. }
  1043. }