RobotBackgroundService.cs 1.6 KB
namespace AutomaticGrooveCalculationTool.Services
{
    public class RobotBackgroundService : BackgroundService
    {
        private readonly ILogger<RobotBackgroundService> _logger;
        private readonly SiemensPLCService _siemensPLC;

        public RobotBackgroundService(ILogger<RobotBackgroundService> logger, SiemensPLCService siemensPLC)
        {
            _logger = logger;
            _siemensPLC = siemensPLC;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                foreach (var item in _siemensPLC.Equipments.GroupBy(x => x.IP))
                {
                    var plcIP = item.Key;
                    try
                    {
                        var plc = _siemensPLC.Plcs.First(x => x.IP == plcIP);
                        if (!plc.IsConnected)
                        {
                            await plc.OpenAsync(stoppingToken);
                        }
                        if (!plc.IsConnected)
                        {
                            _logger.LogWarning($"PLC[{plcIP}]连接失败");
                            continue;
                        }
                        _siemensPLC.Read(item.SelectMany(x => x.EquipmentProps));
                    }
                    catch (Exception ex)
                    {
                        _logger.LogError($"设备{item.Key}执行线程出现异常,{ex.Message}");
                    }
                }
                await Task.Delay(500, stoppingToken);
            }
        }
    }
}