数据采集.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. using FreeRedis;
  2. using ServiceCenter.Extensions;
  3. using System.ComponentModel;
  4. using System.Diagnostics;
  5. using WCS.Core;
  6. using WCS.Entity.Protocol.DataStructure;
  7. using WCS.WorkEngineering.Worlds;
  8. namespace WCS.WorkEngineering.Systems
  9. {
  10. [BelongTo(typeof(DataCollectionWorld))]
  11. [Description("数据采集系统")]
  12. public class 数据采集 : SystemBase
  13. {
  14. private RedisClient Redis = new RedisClient("");
  15. public 数据采集()
  16. {
  17. 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 }))
  18. .GroupBy(v => v.DB);
  19. foreach (var g in gs.Where(x => !x.Key.Contains("10.30.37.211")))
  20. {
  21. var min = g.OrderBy(v => v.Position).First();
  22. var max = g.OrderByDescending(v => v.Position).First();
  23. var t = Type.GetType(min.TypeStr);
  24. min.Dev.Protocol(t, this.World);
  25. max.Dev.Protocol(t, this.World);
  26. }
  27. }
  28. public override List<object> GetObjects()
  29. {
  30. return new List<object>();
  31. }
  32. public override void Update(List<WorkTimes> list)
  33. {
  34. var sw = new Stopwatch();
  35. sw.Start();
  36. var pack = new DeviceDataPack();
  37. pack.Frame = DateTime.Now;
  38. var ps = pack.GetType().GetProperties();
  39. foreach (var p in ps)
  40. {
  41. if (!p.PropertyType.IsArray)
  42. continue;
  43. var dev = p.PropertyType.GetElementType();
  44. if (dev.GetInterfaces().Any(v => v.GetInterfaces().Any(d => d.Name == "IProtocol")))
  45. {
  46. var t = p.PropertyType.GetElementType();
  47. var protType = GetProtocolType(t);
  48. var arr = Device.All.Where(v => v.HasProtocol(protType))
  49. .Select(v =>
  50. {
  51. try
  52. {
  53. var obj = Activator.CreateInstance(t);
  54. t.GetProperty("Code").SetValue(obj, v.Code);
  55. var value = v.Protocol(protType, World).Copy(t);
  56. //t.GetProperty("Data").SetValue(obj, value);
  57. return obj;
  58. }
  59. catch (Exception ex)
  60. {
  61. return null;
  62. }
  63. }).Where(v => v != null).ToArray();
  64. var m = typeof(Enumerable).GetMethod("OfType", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
  65. m = m.MakeGenericMethod(t);
  66. var arr2 = m.Invoke(null, new object[] { arr });
  67. m = typeof(Enumerable).GetMethod("ToArray", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
  68. m = m.MakeGenericMethod(t);
  69. var arr3 = m.Invoke(null, new object[] { arr2 });
  70. p.SetValue(pack, arr3);
  71. }
  72. }
  73. Redis.RPush("Packs", pack);
  74. if (Redis.LLen("Packs") > 50000)
  75. {
  76. Redis.LTrim("Packs", 5000, -1);
  77. }
  78. sw.Stop();
  79. list.Add(new WorkTimes { Total = sw.ElapsedMilliseconds, Key = "采集数据" });
  80. //var sw = new Stopwatch();
  81. //sw.Start();
  82. //var pack = new DeviceDataPack();
  83. //pack.Frame = DateTime.Now;
  84. //var ps = pack.GetType().GetProperties();
  85. //foreach (var p in ps)
  86. //{
  87. // if (!p.PropertyType.IsClass) continue;
  88. // var packAct = Activator.CreateInstance(p.PropertyType);
  89. // var prs = p.PropertyType.GetProperties();
  90. // foreach (var pr in prs)
  91. // {
  92. // if (!pr.PropertyType.IsArray) continue;
  93. // var yt = pr.PropertyType.GetElementType();
  94. // if (yt.IsClass)
  95. // {
  96. // var pros = yt.GetProperties();
  97. // //var entType = yt.GetGenericArguments()[0];
  98. // //var protType = GetProtocolType(entType);
  99. // var dataAct = Activator.CreateInstance(yt);
  100. // Parallel.ForEach(pros, pro =>
  101. // {
  102. // try
  103. // {
  104. // if (pro.PropertyType != typeof(DateTime))
  105. // {
  106. // if (pro.PropertyType != typeof(string))
  107. // {
  108. // var protType = GetProtocolType(pro.PropertyType);
  109. // var dev = Device.All
  110. // .Where(v => v.HasProtocol(protType)).Select(v =>
  111. // {
  112. // try
  113. // {
  114. // var obj = Activator.CreateInstance(pro.PropertyType);
  115. // pro.PropertyType.GetProperty("Code").SetValue(obj, v.Code);
  116. // var a = v.Protocol(protType, World);
  117. // var value = v.Protocol(protType, World).Copy(pro.PropertyType);
  118. // pro.SetValue(obj, value);
  119. // return obj;
  120. // }
  121. // catch (Exception ex)
  122. // {
  123. // return null;
  124. // }
  125. // }).FirstOrDefault(v => v != null);
  126. // if (dev != null)
  127. // {
  128. // pro.SetValue(dataAct, dev);
  129. // }
  130. // }
  131. // else
  132. // {
  133. // }
  134. // }
  135. // }
  136. // catch (Exception e)
  137. // {
  138. // Console.WriteLine(e);
  139. // }
  140. // });
  141. // var a = 1;
  142. // //var m = typeof(Enumerable).GetMethod("OfType", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
  143. // //m = m.MakeGenericMethod(yt);
  144. // //var arr2 = m.Invoke(null, new object[] { datasAct });
  145. // //m = typeof(Enumerable).GetMethod("ToArray", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
  146. // //m = m.MakeGenericMethod(yt);
  147. // //var arr3 = m.Invoke(null, new object[] { arr2 });
  148. // //p.SetValue(pack, arr3);
  149. // //var entType = yt.GetGenericArguments()[0];
  150. // //var protType = GetProtocolType(entType);
  151. // //var arr = Device.All.Where(v => v.HasProtocol(protType))
  152. // // .Select(v =>
  153. // // {
  154. // // try
  155. // // {
  156. // // var obj = Activator.CreateInstance(yt);
  157. // // yt.GetProperty("Code").SetValue(obj, v.Code);
  158. // // //var value = v.Protocol(protType, World).Copy(entType);
  159. // // //t.GetProperty("Data").SetValue(obj, value);
  160. // // return obj;
  161. // // }
  162. // // catch (Exception ex)
  163. // // {
  164. // // return null;
  165. // // }
  166. // // }).Where(v => v != null).ToArray();
  167. // //var m = typeof(Enumerable).GetMethod("OfType", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
  168. // //m = m.MakeGenericMethod(yt);
  169. // //var arr2 = m.Invoke(null, new object[] { arr });
  170. // //m = typeof(Enumerable).GetMethod("ToArray", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
  171. // //m = m.MakeGenericMethod(yt);
  172. // //var arr3 = m.Invoke(null, new object[] { arr2 });
  173. // //p.SetValue(pack, arr3);
  174. // }
  175. // }
  176. // //var t = p.PropertyType.GetElementType();
  177. // //if (t.IsGenericType)
  178. // //{
  179. // // var entType = t.GetGenericArguments()[0];
  180. // // var protType = GetProtocolType(entType);
  181. // // var arr = Device.All.Where(v => v.HasProtocol(protType))
  182. // // .Select(v =>
  183. // // {
  184. // // try
  185. // // {
  186. // // var obj = Activator.CreateInstance(t);
  187. // // t.GetProperty("Code").SetValue(obj, v.Code);
  188. // // //var value = v.Protocol(protType, World).Copy(entType);
  189. // // //t.GetProperty("Data").SetValue(obj, value);
  190. // // return obj;
  191. // // }
  192. // // catch (Exception ex)
  193. // // {
  194. // // return null;
  195. // // }
  196. // // }).Where(v => v != null).ToArray();
  197. // // var m = typeof(Enumerable).GetMethod("OfType", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
  198. // // m = m.MakeGenericMethod(t);
  199. // // var arr2 = m.Invoke(null, new object[] { arr });
  200. // // m = typeof(Enumerable).GetMethod("ToArray", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
  201. // // m = m.MakeGenericMethod(t);
  202. // // var arr3 = m.Invoke(null, new object[] { arr2 });
  203. // // p.SetValue(pack, arr3);
  204. // //}
  205. //}
  206. ////Redis.RPush("Packs", pack);
  207. ////if (Redis.LLen("Packs") > 50000)
  208. ////{
  209. //// Redis.LTrim("Packs", 5000, -1);
  210. ////}
  211. //sw.Stop();
  212. //list.Add(new WorkTimes { Total = sw.ElapsedMilliseconds, Key = "采集数据" });
  213. }
  214. private Type GetProtocolType(Type source)
  215. {
  216. var t = source.GetInterfaces().FirstOrDefault(v => v.GetInterfaces().Any(d => d.Name == "IProtocol"));
  217. return t;
  218. }
  219. }
  220. }