数据采集.cs 12 KB

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