DataCollectionSysyem.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. using Newtonsoft.Json;
  2. using PlcSiemens.Core.Extension;
  3. using ServiceCenter.Extensions;
  4. using ServiceCenter.Redis;
  5. using ServiceCenter.SqlSugars;
  6. using SqlSugar;
  7. using System.Collections.Concurrent;
  8. using System.ComponentModel;
  9. using System.Diagnostics;
  10. using System.Text;
  11. using WCS.Core;
  12. using WCS.Entity.Protocol.DataStructure;
  13. using WCS.Entity.Protocol.Station;
  14. using WCS.WorkEngineering.Extensions;
  15. using WCS.WorkEngineering.Worlds;
  16. namespace WCS.WorkEngineering.Systems
  17. {
  18. /// <summary>
  19. /// 数据采集系统
  20. /// </summary>
  21. [BelongTo(typeof(MainWorld))]
  22. [Description("数据采集系统")]
  23. public class DataCollectionSysyem : DeviceSystem<Device<IStation520>>
  24. {
  25. public static DeviceDataPack pack = new DeviceDataPack();
  26. private static object locker = new object();
  27. public DataCollectionSysyem()
  28. {
  29. var gs = Device.All.SelectMany(v => v.Protocols.Select(d => new { DB = $"{d.Value.DBInfo.No}:{d.Value.DBInfo.PLCInfo.IP}", d.Value.Position, TypeStr = d.Key, Dev = v }))
  30. .GroupBy(v => v.DB);
  31. foreach (var g in gs)
  32. {
  33. var min = g.OrderBy(v => v.Position).First();
  34. var max = g.OrderByDescending(v => v.Position).First();
  35. var t = Type.GetType(min.TypeStr);
  36. min.Dev.Protocol(t, this.World);
  37. max.Dev.Protocol(t, this.World);
  38. }
  39. }
  40. /// <summary>
  41. /// 所有设备数据
  42. /// Key 是不同设备所使用的类型 例如DeviceDataCollection<SRMData>
  43. /// value 不同设备的具体数据
  44. /// </summary>
  45. public static ConcurrentDictionary<string, DeviceData> AllDatas = new ConcurrentDictionary<string, DeviceData>();
  46. protected override bool ParallelDo => true;
  47. protected override bool SaveLogsToFile => true;
  48. public override bool Select(Device dev)
  49. {
  50. return dev.Code == "1";
  51. }
  52. public override void Do(Device<IStation520> objDev)
  53. {
  54. var sql = new StringBuilder();
  55. try
  56. {
  57. var sw = new Stopwatch();
  58. sw.Start();
  59. var pack = new DeviceDataPack();
  60. pack.Frame = World.Frame;
  61. sql.Append("INSERT INTO ");
  62. var ps = pack.GetType().GetProperties().OrderBy(x => x.Name);
  63. var db = new SqlSugarHelper().PLC;
  64. var frame = DateTime.Now;
  65. Parallel.ForEach(ps, p =>
  66. {
  67. if (!p.PropertyType.IsArray) return;
  68. var t = p.PropertyType.GetElementType();
  69. if (t.IsGenericType)
  70. {
  71. var entType = t.GetGenericArguments()[0];
  72. var protType = GetProtocolType(entType);
  73. if (protType == null) return;
  74. var devices = Device.All.Where(v => v.HasProtocol(protType));
  75. List<object> arr = new List<object>();
  76. Parallel.ForEach(devices, x =>
  77. {
  78. try
  79. {
  80. var protObj = x.Protocol(protType, World) as ProtocolProxyBase;
  81. if (protObj.Frame < DateTime.Now.AddYears(-24))
  82. {
  83. protObj.Frame = frame;
  84. }
  85. if (protObj.Db.failed)
  86. {
  87. return;
  88. }
  89. var obj = Activator.CreateInstance(t);
  90. t.GetProperty("Code").SetValue(obj, x.Code);
  91. var value = WCS.Core.Extentions.Copy(protObj, entType, protObj.Frame);
  92. t.GetProperty("Data").SetValue(obj, value);
  93. t.GetProperty("Frame").SetValue(obj, protObj.Frame);
  94. entType.GetProperty("Code").SetValue(value, x.Code);
  95. arr.Add(obj);
  96. }
  97. catch
  98. {
  99. }
  100. });
  101. var m = typeof(Enumerable).GetMethod("OfType",
  102. System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
  103. m = m.MakeGenericMethod(t);
  104. var arr2 = m.Invoke(null, new object[] { arr });
  105. m = typeof(Enumerable).GetMethod("ToArray",
  106. System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
  107. m = m.MakeGenericMethod(t);
  108. var arr3 = m.Invoke(null, new object[] { arr2 });
  109. p.SetValue(pack, arr3);
  110. }
  111. });
  112. var sw3 = new Stopwatch();
  113. sw3.Start();
  114. //开始存储设备信息
  115. RedisHub.Monitor.RPush("Packs", pack);
  116. if (RedisHub.Monitor.LLen("Packs") > 50000)
  117. {
  118. RedisHub.Monitor.LTrim("Packs", 5000, -1);
  119. }
  120. #region 存储设备报警信息
  121. List<EquipmentAlarm> equipmentAlarms = new List<EquipmentAlarm>();
  122. equipmentAlarms.AddRange(pack.Robot522.Where(x => x.Data.Alarm != 0).Select(x => new EquipmentAlarm()
  123. {
  124. Code = x.Code,
  125. Msg = x.Data.Alarm.ToString(),
  126. Time = x.Frame
  127. }));
  128. equipmentAlarms.AddRange(pack.SRM537.Where(x => x.Data.Alarm != 0).Select(x => new EquipmentAlarm()
  129. {
  130. Code = x.Code,
  131. Msg = x.Data.Alarm.ToString(),
  132. Time = x.Frame
  133. }));
  134. equipmentAlarms.AddRange(pack.Station523.Where(x => x.Data.Alarm != 0).Select(x => new EquipmentAlarm()
  135. {
  136. Code = x.Code,
  137. Msg = x.Data.Alarm.ToString(),
  138. Time = x.Frame
  139. }));
  140. equipmentAlarms.AddRange(pack.Truss523.Where(x => x.Data.Alarm != 0).Select(x => new EquipmentAlarm()
  141. {
  142. Code = x.Code,
  143. Msg = x.Data.Alarm.ToString(),
  144. Time = x.Frame
  145. }));
  146. RedisHub.Default.Set(nameof(EquipmentAlarm), JsonConvert.SerializeObject(equipmentAlarms));
  147. #endregion 存储设备报警信息
  148. #region 存储设备状态信息
  149. List<EquipmentStatus> equipmentStatus = new List<EquipmentStatus>();
  150. equipmentStatus.AddRange(pack.RGV521.Where(x => x.Data.WorkMode != 0).Select(x => new EquipmentStatus()
  151. {
  152. Code = x.Code,
  153. con = x.Data.WorkMode.GetDescription(),
  154. Status = x.Data.WorkMode.ToInt(),
  155. Time = x.Frame
  156. }));
  157. equipmentStatus.AddRange(pack.Robot521.Where(x => x.Data.RobotMode != 0).Select(x => new EquipmentStatus()
  158. {
  159. Code = x.Code,
  160. con = x.Data.RobotMode.GetDescription(),
  161. Status = x.Data.RobotMode.ToInt(),
  162. Time = x.Frame
  163. }));
  164. equipmentStatus.AddRange(pack.SRM521.Where(x => x.Data.AutoStatus != 0).Select(x => new EquipmentStatus()
  165. {
  166. Code = x.Code,
  167. con = x.Data.AutoStatus.GetDescription(),
  168. Status = x.Data.AutoStatus.ToInt(),
  169. Time = x.Frame
  170. }));
  171. equipmentStatus.AddRange(pack.Station521.Where(x => x.Data.Mode != 0).Select(x => new EquipmentStatus()
  172. {
  173. Code = x.Code,
  174. con = x.Data.Mode.GetDescription(),
  175. Status = x.Data.Mode.ToInt(),
  176. Time = x.Frame
  177. }));
  178. equipmentStatus.AddRange(pack.Truss521.Where(x => x.Data.Status != 0).Select(x => new EquipmentStatus()
  179. {
  180. Code = x.Code,
  181. con = x.Data.Status.GetDescription(),
  182. Status = x.Data.Status.ToInt(),
  183. Time = x.Frame
  184. }));
  185. RedisHub.Default.Set(nameof(EquipmentStatus), JsonConvert.SerializeObject(equipmentStatus));
  186. #endregion 存储设备状态信息
  187. sw3.Stop();
  188. World.Log($"redis存储耗时:{sw3.ElapsedMilliseconds}");
  189. var sw4 = new Stopwatch();
  190. sw4.Start();
  191. if (pack.BCR80.Any()) db.Insertable(pack.BCR80.Select(x => x.Data).ToList()).ExecuteCommand();
  192. if (pack.BCR81.Any()) db.Insertable(pack.BCR81.Select(x => x.Data).ToList()).ExecuteCommand();
  193. if (pack.BCR83.Any()) db.Insertable(pack.BCR83.Select(x => x.Data).ToList()).ExecuteCommand();
  194. if (pack.RGV520.Any()) db.Insertable(pack.RGV520.Select(x => x.Data).ToList()).ExecuteCommand();
  195. if (pack.RGV521.Any()) db.Insertable(pack.RGV521.Select(x => x.Data).ToList()).ExecuteCommand();
  196. if (pack.Robot520.Any()) db.Insertable(pack.Robot520.Select(x => x.Data).ToList()).ExecuteCommand();
  197. if (pack.Robot521.Any()) db.Insertable(pack.Robot521.Select(x => x.Data).ToList()).ExecuteCommand();
  198. if (pack.Robot522.Any()) db.Insertable(pack.Robot522.Select(x => x.Data).ToList()).ExecuteCommand();
  199. if (pack.Robot530.Any()) db.Insertable(pack.Robot530.Select(x => x.Data).ToList()).ExecuteCommand();
  200. if (pack.Robot531.Any()) db.Insertable(pack.Robot531.Select(x => x.Data).ToList()).ExecuteCommand();
  201. if (pack.SRM520.Any()) db.Insertable(pack.SRM520.Select(x => x.Data).ToList()).ExecuteCommand();
  202. if (pack.SRM521.Any()) db.Insertable(pack.SRM521.Select(x => x.Data).ToList()).ExecuteCommand();
  203. if (pack.SRM537.Any()) db.Insertable(pack.SRM537.Select(x => x.Data).ToList()).ExecuteCommand();
  204. if (pack.Station520.Any()) db.Insertable(pack.Station520.Select(x => x.Data).ToList()).ExecuteCommand();
  205. if (pack.Station521.Any()) db.Insertable(pack.Station521.Select(x => x.Data).ToList()).ExecuteCommand();
  206. if (pack.Station523.Any()) db.Insertable(pack.Station523.Select(x => x.Data).ToList()).ExecuteCommand();
  207. if (pack.Station524.Any()) db.Insertable(pack.Station524.Select(x => x.Data).ToList()).ExecuteCommand();
  208. if (pack.Station525.Any()) db.Insertable(pack.Station525.Select(x => x.Data).ToList()).ExecuteCommand();
  209. if (pack.Station90.Any()) db.Insertable(pack.Station90.Select(x => x.Data).ToList()).ExecuteCommand();
  210. if (pack.Station91.Any()) db.Insertable(pack.Station91.Select(x => x.Data).ToList()).ExecuteCommand();
  211. if (pack.Truss520.Any()) db.Insertable(pack.Truss520.Select(x => x.Data).ToList()).ExecuteCommand();
  212. if (pack.Truss521.Any()) db.Insertable(pack.Truss521.Select(x => x.Data).ToList()).ExecuteCommand();
  213. if (pack.Truss523.Any()) db.Insertable(pack.Truss523.Select(x => x.Data).ToList()).ExecuteCommand();
  214. if (pack.Truss530.Any()) db.Insertable(pack.Truss530.Select(x => x.Data).ToList()).ExecuteCommand();
  215. if (pack.Truss531.Any()) db.Insertable(pack.Truss531.Select(x => x.Data).ToList()).ExecuteCommand();
  216. sw4.Stop();
  217. World.Log($"执行SQL耗时:{sw4.ElapsedMilliseconds}");
  218. sw.Stop();
  219. World.Log($"数据采集耗时:{sw.ElapsedMilliseconds}");
  220. }
  221. catch (Exception e)
  222. {
  223. World.Log($"错误内容:{e.Message}");
  224. }
  225. }
  226. public void Set(StringBuilder sql, string cSql)
  227. {
  228. lock (locker)
  229. {
  230. sql.Append(cSql);
  231. }
  232. }
  233. private Type GetProtocolType(Type source)
  234. {
  235. var t = source.GetInterfaces().FirstOrDefault(v => v.GetInterfaces().Any(d => d.Name == "IProtocol"));
  236. var t1 = source.GetInterfaces().FirstOrDefault(v => v.GetInterfaces().Any(d => d.Name == "IProtocol"));
  237. return t;
  238. }
  239. private object AppendLock = new object();
  240. public StringBuilder Append(StringBuilder sql, string value)
  241. {
  242. lock (AppendLock)
  243. {
  244. return sql.Append(value);
  245. }
  246. }
  247. public string GetString(string value)
  248. {
  249. return value.Replace("INSERT INTO ", "")
  250. .Replace(",N'", ",'")
  251. .Replace("\0", "")
  252. .Replace("wcs_", "")
  253. .Replace("(N'", "('") + "\r";
  254. }
  255. }
  256. /// <summary>
  257. /// 设备报警
  258. /// </summary>
  259. public class EquipmentAlarm
  260. {
  261. /// <summary>
  262. /// 设备号
  263. /// </summary>
  264. public string Code { get; set; }
  265. /// <summary>
  266. /// 内容
  267. /// </summary>
  268. public string Msg { get; set; }
  269. /// <summary>
  270. /// 时间
  271. /// </summary>
  272. public DateTime Time { get; set; }
  273. }
  274. /// <summary>
  275. /// 设备状态信息
  276. /// </summary>
  277. public class EquipmentStatus
  278. {
  279. /// <summary>
  280. /// 设备号
  281. /// </summary>
  282. public string Code { get; set; }
  283. /// <summary>
  284. /// 内容
  285. /// </summary>
  286. public string con { get; set; }
  287. /// <summary>
  288. /// 内容
  289. /// </summary>
  290. public int Status { get; set; }
  291. /// <summary>
  292. /// 时间
  293. /// </summary>
  294. public DateTime Time { get; set; }
  295. }
  296. /// <summary>
  297. ///
  298. /// </summary>
  299. /// <typeparam name="T"></typeparam>
  300. public class Quest<T>
  301. {
  302. public T Data { get; set; }
  303. }
  304. }