|
@@ -0,0 +1,75 @@
|
|
|
+using System.Diagnostics;
|
|
|
+using DataAcquisitionSolution.DTO;
|
|
|
+using DataAcquisitionSolution.Entity;
|
|
|
+using MessagePack;
|
|
|
+using PlcSiemens.Core.Extension;
|
|
|
+using ServiceCenter.Redis;
|
|
|
+
|
|
|
+namespace DataAcquisitionSolution;
|
|
|
+
|
|
|
+/// <summary>
|
|
|
+/// 业务中心
|
|
|
+/// </summary>
|
|
|
+public static class BusinessCenter
|
|
|
+{
|
|
|
+ public static string RedisDataKey = "DataAcquisition";
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 数据采集
|
|
|
+ /// </summary>
|
|
|
+ public static void DataCollectionLoop()
|
|
|
+ {
|
|
|
+ while (true)
|
|
|
+ Do(500, () =>
|
|
|
+ {
|
|
|
+ var dataTime = DateTime.Now;
|
|
|
+ Parallel.ForEach(DataAcquisition.PlcInfos.GroupBy(x => x.PlcInfo.IP), plc =>
|
|
|
+ {
|
|
|
+ var plcInfo = new PlcInfo
|
|
|
+ {
|
|
|
+ Ip = plc.Key,
|
|
|
+ CreateTime = dataTime
|
|
|
+ };
|
|
|
+ var plcDbInfos = new List<PlcDbInfo>();
|
|
|
+ Parallel.ForEach(plc, db =>
|
|
|
+ {
|
|
|
+ var data = db.Accessor?.ReadBytes(db.No, 0, db.Length);
|
|
|
+ plcDbInfos.Add(new PlcDbInfo(db.No, data));
|
|
|
+ });
|
|
|
+ plcInfo.Content = MessagePackSerializer.Serialize(plcDbInfos);
|
|
|
+ RedisHub.Default.RPush(RedisDataKey, plcInfo);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 数据处理
|
|
|
+ /// </summary>
|
|
|
+ public static void DataStorageLoop()
|
|
|
+ {
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 执行事务
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="act"></param>
|
|
|
+ /// <param name="maxTime">最大时间(毫秒)</param>
|
|
|
+ /// <exception cref="Exception"></exception>
|
|
|
+ public static void Do(int maxTime, Action act)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ var sw = new Stopwatch();
|
|
|
+ sw.Start();
|
|
|
+ act(); //执行委托
|
|
|
+ sw.Stop();
|
|
|
+ var time = maxTime - sw.ElapsedMilliseconds.ToInt();
|
|
|
+ if (time > 0) Thread.Sleep(time);
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ Console.WriteLine(ex.Message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|