KukaPLCDataAnalysis.cs
6.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using DataAcquisitionServer.Common.Communications;
using DataAcquisitionServer.Common.Enums;
using DataAcquisitionServer.Common.Utils;
using DataAcquisitionServer.DataAccess;
using DataAcquisitionServer.Models;
using Microsoft.EntityFrameworkCore;
namespace DataAcquisitionServer.Services.DataAnalysis
{
public class KukaPLCDataAnalysis(IDbContextFactory<DataContext> dbContextFactory) : IDataAnalysis
{
private readonly IDbContextFactory<DataContext> dbContextFactory = dbContextFactory;
private readonly SystemLog log = SystemLog.Instance;
public void Analysis(IEnumerable<ICommunication> communications, IEnumerable<Equipment> equipments)
{
using var context = dbContextFactory.CreateDbContext();
try
{
var kukaPlcEquipments = equipments.Where(x => x.EquipmentType == EquipmentTypeConst.SiemensPLC && x.EquipmentProperties.Any()).ToList();
foreach (var item in kukaPlcEquipments)
{
if (item.EquipmentProperties.Any(x => x.UpdateTime < DateTime.Now.AddSeconds(-30)))
{
//数据更新时间超过10秒则过期
continue;
}
if (item.Code == EquipmentConst.KukaPLC_1.ToString())
{
var electricityProperty = item[KukaPLCProps.Electricity.ToString()];
var p_KW_Property = item[KukaPLCProps.P_KW.ToString()];
var gasFlowProperty = item[KukaPLCProps.Gas_Flow.ToString()];
//用电量[累计值]
_ = float.TryParse(electricityProperty.Value, out var electricityValue);
//有功功率[实时数据]
_ = float.TryParse(p_KW_Property.Value, out var p_KW_Value);
//气体流量[实时数据]
_ = float.TryParse(gasFlowProperty.Value, out var gasFlow);
if (electricityValue > 0)
{
var oldelectricityRecord = context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == item.Code && x.EquipmentPropertyCode == electricityProperty.Code).OrderByDescending(x => x.CreateTime).Select(x => x.Value).AsNoTracking().FirstOrDefault();
if (oldelectricityRecord != electricityValue.ToString())
{
context.EquipmentPropertyRecords.Add(new EquipmentPropertyRecord
{
EquipmentCode = item.Code,
EquipmentName = item.Name,
EquipmentPropertyCode = electricityProperty.Code,
EquipmentPropertyName = electricityProperty.Name,
Value = electricityValue.ToString(),
IsEnd = true,
CreateTime = DateTime.Now,
UpdateTime = DateTime.Now,
});
context.SaveChanges();
}
}
if (p_KW_Value > 0)
{
context.EquipmentPropertyRecords.Add(new EquipmentPropertyRecord
{
EquipmentCode = item.Code,
EquipmentName = item.Name,
EquipmentPropertyCode = p_KW_Property.Code,
EquipmentPropertyName = p_KW_Property.Name,
Value = p_KW_Value.ToString(),
IsEnd = true,
CreateTime = DateTime.Now,
UpdateTime = DateTime.Now,
});
}
if (gasFlow > 0)
{
context.EquipmentPropertyRecords.Add(new EquipmentPropertyRecord
{
EquipmentCode = item.Code,
EquipmentName = item.Name,
EquipmentPropertyCode = gasFlowProperty.Code,
EquipmentPropertyName = gasFlowProperty.Name,
Value = gasFlow.ToString(),
IsEnd = true,
CreateTime = DateTime.Now,
UpdateTime = DateTime.Now,
});
context.SaveChanges();
}
//写入数据
var weld_Day_EquipmentProperty = item[KukaPLCProps.Weld_statistics_Day.ToString()];
var weld_Month_EquipmentProperty = item[KukaPLCProps.Weld_statistics_Month.ToString()];
var communication = communications.Where(x => x.CommunicationId == item.CommunicationId).FirstOrDefault();
if (communication != null)
{
var equipmentCodes = equipments.Where(x => x.Area == item.Area).Select(x => x.Code).ToList();
var monthStartTime = DateTime.Now.AddDays(1 - DateTime.Now.Day).Date;
var todayValue = context.EquipmentPropertyRecords.Where(x => equipmentCodes.Contains(x.EquipmentCode) && x.EquipmentPropertyCode == KukaProps.Weld_Speed.ToString() && x.CreateTime > DateTime.Today).Select(x => x.Value).AsEnumerable().Sum(float.Parse);
var monthValue = context.EquipmentPropertyRecords.Where(x => equipmentCodes.Contains(x.EquipmentCode) && x.EquipmentPropertyCode == KukaProps.Weld_Speed.ToString() && x.CreateTime > monthStartTime).Select(x => x.Value).AsEnumerable().Sum(float.Parse);
weld_Day_EquipmentProperty.Value = todayValue.ToString();
weld_Month_EquipmentProperty.Value = monthValue.ToString();
Task.Run(() =>
{
var properties = new List<EquipmentProperty>
{
weld_Day_EquipmentProperty,
weld_Month_EquipmentProperty
};
communication.Write(properties);
});
}
}
}
}
catch (Exception ex)
{
log.LogError($"[{nameof(KukaPLCDataAnalysis)}]数据解析出现异常:{ex.Message}");
}
}
}
}