| | |
| | | using Admin.NET.Core.Service; |
| | | using Furion.Logging; |
| | | |
| | | namespace WCS.Application; |
| | | public static class PLCTaskAction |
| | |
| | | |
| | | private static List<WcsPlc> listPlc; |
| | | private static List<WcsDevice> listPlcDevice; |
| | | private static List<WcsStation> listPlcStation; |
| | | private static List<WcsPosition> listPlcStation; |
| | | |
| | | private static List<PLCUtil> listPlcUtil = new List<PLCUtil>(); |
| | | private static CancellationTokenSource cts = new CancellationTokenSource();//取消线程标识 |
| | | private static CancellationTokenSource cts;//取消线程标识 |
| | | |
| | | public static event EventHandler DeviceValueChangeEvent; |
| | | static PLCTaskAction() |
| | |
| | | |
| | | listPlc = _db.Queryable<WcsPlc>().ToList(); |
| | | listPlcDevice = _db.Queryable<WcsDevice>().ToList(); |
| | | listPlcStation = _db.Queryable<WcsStation>().ToList(); |
| | | listPlcStation = _db.Queryable<WcsPosition>().ToList(); |
| | | } |
| | | /// <summary> |
| | | /// 初始化PLC连接 |
| | |
| | | cts.Cancel(); |
| | | listPlc = _db.Queryable<WcsPlc>().ToList(); |
| | | listPlcDevice = _db.Queryable<WcsDevice>().ToList(); |
| | | listPlcStation = _db.Queryable<WcsStation>().ToList(); |
| | | listPlcStation = _db.Queryable<WcsPosition>().ToList(); |
| | | //等待几秒钟,把已有线程取消掉再连接 |
| | | Thread.Sleep(5000); |
| | | foreach (var modPlcUtil in listPlcUtil) |
| | |
| | | } |
| | | var listDevice = listPlcDevice.Where(s => s.PlcId == _modplc.Id).ToList(); |
| | | //循环读设备 |
| | | foreach (var modDevice in listDevice) |
| | | foreach (var modDevice in listDevice.Where(s => s.Level == DeviceLevelEnum.DB)) |
| | | { |
| | | var b = modPlcUtil.Connected(); |
| | | var (result, value) = modPlcUtil.GetPlcDBValue(modDevice.PosType.Value, modDevice.DbNumber, modDevice.PlcPos); |
| | | var c = modPlcUtil.Connected(); |
| | | var (result, value) = modPlcUtil.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos); |
| | | if (result.IsSucceed) |
| | | { |
| | | if (value != 0) |
| | | { |
| | | var dto = modDevice.Adapt<WcsDeviceDto>(); |
| | | dto.Value = value; |
| | | dto.Type = _modplc.Type; |
| | | dto.PLCUtil = modPlcUtil; |
| | | dto.listStation = listPlcStation.Where(s => s.DeviceId == modDevice.Id).ToList(); |
| | | //这里触发值变更事件 |
| | | DeviceValueChangeEvent?.Invoke(dto, EventArgs.Empty); |
| | | } |
| | | //无流程跳出 |
| | | if (value == 0) |
| | | continue; |
| | | var dto = modDevice.Adapt<WcsDeviceDto>(); |
| | | dto.Value = value; |
| | | dto.Type = _modplc.Type; |
| | | dto.PLCUtil = modPlcUtil; |
| | | dto.listStation = listPlcStation.Where(s => s.DeviceId == modDevice.Id).ToList(); |
| | | dto.listDevice = listDevice.Where(s => s.StationNum == modDevice.StationNum).ToList(); |
| | | //这里触发值变更事件 |
| | | DeviceValueChangeEvent?.Invoke(dto, EventArgs.Empty); |
| | | } |
| | | else |
| | | { |
| | | //删除当前连接 下一次循环重新连接 |
| | | Console.WriteLine("连接断开..."); |
| | | modPlcUtil.Close(); |
| | | listPlcUtil.Remove(modPlcUtil); |
| | | } |
| | | } |
| | | |
| | | Thread.Sleep(100); |
| | | Thread.Sleep(3000); |
| | | } |
| | | catch (OperationCanceledException) |
| | | { |
| | | Console.WriteLine("中止线程"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | |
| | | Log.Error(ex.Message, ex); |
| | | } |
| | | } |
| | | }, cts.Token); |