KukaPLCDataAnalysis.cs 6.84 KB
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}");
            }
        }
    }
}