RobotAnalysis.cs 9.86 KB
using HHECS.RobotTool.Common.Communications;
using HHECS.RobotTool.Common.Enums;
using HHECS.RobotTool.Common.Utils;
using HHECS.RobotTool.DataAccess;
using HHECS.RobotTool.Dto;
using HHECS.RobotTool.Model;
using Microsoft.EntityFrameworkCore;

namespace HHECS.RobotTool.Services.Analysis
{
    public class RobotAnalysis : IAnalysis
    {
        private readonly IDbContextFactory<DataContext> _dbContextFactory;
        private readonly GrooveService _grooveService;
        private readonly SystemLog log = SystemLog.Instance;
        public RobotAnalysis(IDbContextFactory<DataContext> dbContextFactory, GrooveService grooveService)
        {
            _dbContextFactory = dbContextFactory;
            _grooveService = grooveService;
        }

        /// <summary>
        /// 处理方法
        /// </summary>
        /// <param name="communication"></param>
        /// <param name="equipments"></param>
        /// <remarks>Fanuc机器人不支持float类型,所有读取到的int16类型数据除以100才是最终的float数值</remarks>
        public void Execute(ICommunication communication, IEnumerable<Equipment> equipments)
        {
            try
            {
                foreach (var item in equipments)
                {
                    var codes = Enum.GetNames<RobotProp2>();
                    if (!item.EquipmentProperties.All(x => codes.Contains(x.Code)))
                    {
                        //属性数据不全,则跳过
                        continue;
                    }

                    //请求状态
                    _ = bool.TryParse(item[RobotProp2.Date_Send.ToString()].Value, out var requestStatus);
                    //回复状态
                    _ = bool.TryParse(item[RobotProp2.Ack_Send.ToString()].Value, out var ackStatus);

                    //机器人请求,软件未回复
                    if (requestStatus && !ackStatus)
                    {
                        _ = int.TryParse(item[RobotProp2.GrooveWidth.ToString()].Value, out var grooveWidth);
                        _ = int.TryParse(item[RobotProp2.GrooveDepth.ToString()].Value, out var grooveDepth);
                        var inputParament = new InputParameter
                        {
                            GrooveWidth = grooveWidth / 100d,
                            GrooveDepth = grooveDepth / 100d,
                            WeldingWire = 1.2,
                            ReservedGapForGroove = 0,
                            SizeOfTheBluntEdgeOfTheGroove = 2,
                            WeldLength = 1000,
                            AdditionalWidthRequiredOnOneSideAfterCovering = 1.5,
                            WeldReinforcementRequiredAfterCovering = 2,
                        };

                        var (output, technologys) = _grooveService.GetExcelData(inputParament);

                        var propCodes = new List<RobotProp2>
                        {
                            RobotProp2.Weld_Num,
                            RobotProp2.Speed_1,
                            RobotProp2.Freq_1,
                            RobotProp2.Swing_1,
                            RobotProp2.Stay_1,
                            RobotProp2.Speed_2,
                            RobotProp2.Freq_2,
                            RobotProp2.Swing_2,
                            RobotProp2.Stay_2,
                            RobotProp2.Speed_3,
                            RobotProp2.Freq_3,
                            RobotProp2.Swing_3,
                            RobotProp2.Stay_3,
                            RobotProp2.Speed_4,
                            RobotProp2.Freq_4,
                            RobotProp2.Swing_4,
                            RobotProp2.Stay_4,
                            RobotProp2.Speed_5,
                            RobotProp2.Freq_5,
                            RobotProp2.Swing_5,
                            RobotProp2.Stay_5,
                            RobotProp2.Speed_6,
                            RobotProp2.Freq_6,
                            RobotProp2.Swing_6,
                            RobotProp2.Stay_6,
                            RobotProp2.Ack_Send,
                        };

                        //写入模板
                        var temps = propCodes.Select(x => item[$"{x}"]).ToList();

                        //赋值
                        var props = temps.Select(x => new EquipmentProperty
                        {
                            Id = x.Id,
                            Code = x.Code,
                            Name = x.Name,
                            EquipmentId = x.EquipmentId,
                            DataAddress = x.DataAddress,
                            DataType = x.DataType,
                            Value = SetAckValue(x.Code, output, technologys),
                            CreateTime = x.CreateTime,
                        });

                        communication.Write(props);
                    }
                    //机器人请求,软件已回复
                    else if (requestStatus && ackStatus)
                    {
                        log.LogWarning($"已处理设备[{communication.IpAddress}]请求,待设备清除请求信号!");
                    }
                    //机器人无请求,ack为True,则清除回复状态
                    else if (!requestStatus && ackStatus)
                    {
                        var ackProp = item[RobotProp2.Ack_Send.ToString()];
                        var prop = new EquipmentProperty
                        {
                            Id = ackProp.Id,
                            DataAddress = ackProp.DataAddress,
                            DataType = ackProp.DataType,
                            Value = bool.FalseString
                        };
                        communication.Write(prop);
                    }
                }
            }
            catch (Exception ex)
            {
                log.LogError($"{nameof(RobotAnalysis)}线程出现异常.{ex.Message}");
            }
        }

        private static string SetAckValue(string code, OutputParameter output, List<Technology> technologys)
        {
            _ = Enum.TryParse<RobotProp2>(code, out var codeType);
            var result = codeType switch
            {
                //RobotProp2.Date_Send => throw new NotImplementedException(),
                //RobotProp2.GrooveWidth => throw new NotImplementedException(),
                //RobotProp2.GrooveDepth => throw new NotImplementedException(),

                RobotProp2.Weld_Num => Convert.ToInt16(output.Weld_Num).ToString(),
                RobotProp2.Speed_1 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 1)?.WeldingSpeed ?? 0) * 100)}",
                RobotProp2.Freq_1 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 1)?.SwingFrequency ?? 0) * 100)}",
                RobotProp2.Swing_1 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 1)?.Amplitude ?? 0) * 100)}",
                RobotProp2.Stay_1 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 1)?.LeftAndRightDwellTime ?? 0) * 100)}",

                RobotProp2.Speed_2 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 2)?.WeldingSpeed ?? 0) * 100)}",
                RobotProp2.Freq_2 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 2)?.SwingFrequency ?? 0) * 100)}",
                RobotProp2.Swing_2 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 2)?.Amplitude ?? 0) * 100)}",
                RobotProp2.Stay_2 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 2)?.LeftAndRightDwellTime ?? 0) * 100)}",

                RobotProp2.Speed_3 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 3)?.WeldingSpeed ?? 0) * 100)}",
                RobotProp2.Freq_3 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 3)?.SwingFrequency ?? 0) * 100)}",
                RobotProp2.Swing_3 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 3)?.Amplitude ?? 0) * 100)}",
                RobotProp2.Stay_3 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 3)?.LeftAndRightDwellTime ?? 0) * 100)}",

                RobotProp2.Speed_4 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 4)?.WeldingSpeed ?? 0) * 100)}",
                RobotProp2.Freq_4 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 4)?.SwingFrequency ?? 0) * 100)}",
                RobotProp2.Swing_4 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 4)?.Amplitude ?? 0) * 100)}",
                RobotProp2.Stay_4 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 4)?.LeftAndRightDwellTime ?? 0) * 100)}",

                RobotProp2.Speed_5 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 5)?.WeldingSpeed ?? 0) * 100)}",
                RobotProp2.Freq_5 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 5)?.SwingFrequency ?? 0) * 100)}",
                RobotProp2.Swing_5 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 5)?.Amplitude ?? 0) * 100)}",
                RobotProp2.Stay_5 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 5)?.LeftAndRightDwellTime ?? 0) * 100)}",

                RobotProp2.Speed_6 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 6)?.WeldingSpeed ?? 0) * 100)}",
                RobotProp2.Freq_6 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 6)?.SwingFrequency ?? 0) * 100)}",
                RobotProp2.Swing_6 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 6)?.Amplitude ?? 0) * 100)}",
                RobotProp2.Stay_6 => $"{Convert.ToInt16((technologys.FirstOrDefault(x => x.Layer == 6)?.LeftAndRightDwellTime ?? 0) * 100)}",
                RobotProp2.Ack_Send => bool.TrueString,
                _ => string.Empty,
            };
            return $"{result}";
        }
    }
}