From 5999e9c77ee30a7090ed7f6cdd07d82fe9a4015b Mon Sep 17 00:00:00 2001 From: bklLiudl <673013083@qq.com> Date: 星期三, 11 九月 2024 08:44:06 +0800 Subject: [PATCH] Merge branch 'master' into liudl --- Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs | 206 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 206 insertions(+), 0 deletions(-) diff --git a/Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs b/Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs new file mode 100644 index 0000000..7a8ff9c --- /dev/null +++ b/Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs @@ -0,0 +1,206 @@ +锘縰sing Admin.NET.Core.Service; +using DocumentFormat.OpenXml.Office2010.ExcelAc; +using Furion.InstantMessaging; +using Microsoft.AspNetCore.SignalR; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WCS.Application; + +/// <summary> +/// 浠诲姟鏃ュ織闆嗙嚎鍣� +/// </summary> +[MapHub("/hubs/PlcDevice")] +public class PlcDeviceHub : Hub<IPlcDeviceHub> +{ + private static readonly IHubContext<PlcDeviceHub, IPlcDeviceHub> _plcDeviceHubContext = App.GetService<IHubContext<PlcDeviceHub, IPlcDeviceHub>>(); + private static readonly SysCacheService _sysCacheService = App.GetRequiredService<SysCacheService>(); + private static bool boRunningState = false; + private static CancellationTokenSource cts;//鍙栨秷绾跨▼鏍囪瘑 + private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId); + public PlcDeviceHub() + { + } + + /// <summary> + /// 杩炴帴 + /// </summary> + /// <returns></returns> + public override async Task OnConnectedAsync() + { + var httpContext = Context.GetHttpContext(); + var userId = (httpContext.User.FindFirst(ClaimConst.UserId)?.Value).ToLong(); + _sysCacheService.Set("PlcDeviceHub:" + Context.ConnectionId, userId); + if (!boRunningState) + { + //寮�鍚鍙栨湇鍔$嚎绋� + boRunningState = true; + cts = new CancellationTokenSource();//鍙栨秷绾跨▼鏍囪瘑 + StartRead(); + } + await base.OnConnectedAsync(); + } + + /// <summary> + /// 鏂紑 + /// </summary> + /// <param name="exception"></param> + /// <returns></returns> + public override async Task OnDisconnectedAsync(Exception exception) + { + _sysCacheService.Remove("PlcDeviceHub:" + Context.ConnectionId); + //濡傛灉娌℃湁杩炴帴浜� 灏卞叧闂嚎绋嬩笉璇讳簡 + if (_sysCacheService.GetKeysByPrefixKey("PlcDeviceHub").Count == 0) + { + cts.Cancel(); + boRunningState = false; + } + await base.OnDisconnectedAsync(exception); + } + + /// <summary> + /// 寮�鍚鍙杙lc绾跨▼ + /// </summary> + public static void StartRead() + { + Task.Run(() => + { + // 鐢ㄤ簬淇濆瓨姣忎釜璁惧鐨勫垵濮嬬姸鎬� + var initialStates = new Dictionary<long, WcsDeviceOutput>(); + + var listPlc = _db.Queryable<WcsPlc>().Where(s => s.Type == PLCTypeEnum.StackingMachine || s.Type == PLCTypeEnum.ConveyorLine).ToList(); + var listPlcId = listPlc.Select(s => s.Id).ToList(); + var listPlcDevice = _db.Queryable<WcsDevice>().Where(s => s.DeviceType == DeviceTypeEnum.Business && listPlcId.Contains(s.PlcId)).Select<WcsDeviceOutput>().ToList(); + var listPlcDeviceId = listPlcDevice.Select(s => s.Id).ToList(); + var listPlcStation = _db.Queryable<WcsPosition>().Where(s => listPlcDeviceId.Contains(s.DeviceId)).ToList(); + while (true) + { + try + { + //鑾峰彇璺烘満鐨勭姸鎬� + foreach (var modDevice in listPlcDevice) + { + //鍙栨秷绾跨▼ + if (cts.Token.IsCancellationRequested) + { + throw new OperationCanceledException(); + } + var modPlc = listPlc.Where(s => s.Id == modDevice.PlcId).FirstOrDefault(); + modDevice.Type = modPlc.Type; + //璇诲彇plc鐨勫�� + var modConn = PLCTaskAction.listPlcConn.FirstOrDefault(s => s != null && s.PlcId == modDevice.PlcId); + if (modConn == null) + { + modDevice.Status = false; + continue; + } + else + { + modDevice.Status = modConn.Connected; + } + if (modConn.Connected) + { + var listPosition = listPlcStation.Where(s => s.DeviceId == modDevice.Id).ToList(); + (var result, var plc) = modConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos); + modDevice.Plc = Convert.ToString(plc); + (result, var wcs) = modConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos); + modDevice.Wcs = Convert.ToString(wcs); + //浠诲姟鍙� + var modPositionTask = listPosition.FirstOrDefault(s => s.Text == "浠诲姟鍙�"); + (result, var taskNo) = modConn.GetPlcDBValue(modPositionTask.PosType, modDevice.DbNumber, modPositionTask.PlcPos, modPositionTask.StringLength); + modDevice.TaskNo = Convert.ToString(taskNo); + //浠诲姟绫诲瀷 + var modPositionTaskType = listPosition.FirstOrDefault(s => s.Text == "浠诲姟绫诲瀷"); + (result, var taskType) = modConn.GetPlcDBValue(modPositionTaskType.PosType, modDevice.DbNumber, modPositionTaskType.PlcPos); + modDevice.TaskType = (TaskTypeEnum)Convert.ToInt32(taskType); + //璧峰宸ヤ綅 + var modPositionStartLocatNo = listPosition.FirstOrDefault(s => s.Text == "璧峰宸ヤ綅"); + (result, var startLocatNo) = modConn.GetPlcDBValue(modPositionStartLocatNo.PosType, modDevice.DbNumber, modPositionStartLocatNo.PlcPos); + modDevice.StartLocatNo = Convert.ToString(startLocatNo); + //鐩殑宸ヤ綅 + var modPositionEndLocatNo = listPosition.FirstOrDefault(s => s.Text == "鐩殑宸ヤ綅"); + (result, var endLocatNo) = modConn.GetPlcDBValue(modPositionEndLocatNo.PosType, modDevice.DbNumber, modPositionEndLocatNo.PlcPos); + modDevice.EndLocatNo = Convert.ToString(endLocatNo); + //鎵樼洏鐮� + var modPositionPalletNo = listPosition.FirstOrDefault(s => s.Text == "鎵樼洏鐮�"); + (result, var palletNo) = modConn.GetPlcDBValue(modPositionPalletNo.PosType, modDevice.DbNumber, modPositionPalletNo.PlcPos, modPositionPalletNo.StringLength); + modDevice.PalletNo = Convert.ToString(palletNo); + if (modPlc.Type == PLCTypeEnum.ConveyorLine) + { + //鏀捐揣鎺� + var modPositionReleaseRow = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣鎺�"); + (result, var releaseRow) = modConn.GetPlcDBValue(modPositionReleaseRow.PosType, modDevice.DbNumber, modPositionReleaseRow.PlcPos); + modDevice.ReleaseRow = Convert.ToInt32(releaseRow); + //鏀捐揣鍒� + var modPositionReleaseCol = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣鍒�"); + (result, var releaseCol) = modConn.GetPlcDBValue(modPositionReleaseCol.PosType, modDevice.DbNumber, modPositionReleaseCol.PlcPos); + modDevice.ReleaseCol = Convert.ToInt32(releaseCol); + //鏀捐揣灞� + var modPositionReleaseStorey = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣灞�"); + (result, var releaseStorey) = modConn.GetPlcDBValue(modPositionReleaseStorey.PosType, modDevice.DbNumber, modPositionReleaseStorey.PlcPos); + modDevice.ReleaseStorey = Convert.ToInt32(releaseStorey); + //鍙栬揣鎺� + var modPositionPickRow = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣鎺�"); + (result, var pickRow) = modConn.GetPlcDBValue(modPositionPickRow.PosType, modDevice.DbNumber, modPositionPickRow.PlcPos); + modDevice.PickRow = Convert.ToInt32(pickRow); + //鍙栬揣鍒� + var modPositionPickCol = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣鍒�"); + (result, var pickCol) = modConn.GetPlcDBValue(modPositionPickCol.PosType, modDevice.DbNumber, modPositionPickCol.PlcPos); + modDevice.PickCol = Convert.ToInt32(pickCol); + //鍙栬揣灞� + var modPositionPickStorey = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣灞�"); + (result, var pickStorey) = modConn.GetPlcDBValue(modPositionPickStorey.PosType, modDevice.DbNumber, modPositionPickStorey.PlcPos); + modDevice.PickStorey = Convert.ToInt32(pickStorey); + } + } + //else + //{ + // //娴嬭瘯 + // modDevice.TaskNo = "TK00001"; + // modDevice.TaskType = TaskTypeEnum.In; + // modDevice.Wcs = new Random().Next(1000).ToString(); + // modDevice.Plc = new Random().Next(1000).ToString(); + // modDevice.Status = true; + //} + // 姣旇緝涔嬪墠鐨勭姸鎬� + if (initialStates.TryGetValue(modDevice.Id, out var initialState)) + { + if (modDevice.Status != initialState.Status || + modDevice.Plc != initialState.Plc || + modDevice.Wcs != initialState.Wcs || + modDevice.TaskNo != initialState.TaskNo || + modDevice.TaskType != initialState.TaskType || + modDevice.StartLocatNo != initialState.StartLocatNo || + modDevice.EndLocatNo != initialState.EndLocatNo || + modDevice.PalletNo != initialState.PalletNo || + (modPlc.Type == PLCTypeEnum.ConveyorLine && + (modDevice.ReleaseRow != initialState.ReleaseRow || + modDevice.ReleaseCol != initialState.ReleaseCol || + modDevice.ReleaseStorey != initialState.ReleaseStorey || + modDevice.PickRow != initialState.PickRow || + modDevice.PickCol != initialState.PickCol || + modDevice.PickStorey != initialState.PickStorey))) + { + // 閫氱煡鐢ㄦ埛鍙樻洿 + _plcDeviceHubContext.Clients.All.PublicPlcDevice(modDevice); + } + } + initialStates[modDevice.Id] = modDevice.Adapt<WcsDeviceOutput>(); + } + Thread.Sleep(2000); + } + catch (OperationCanceledException) + { + break; + } + catch (Exception) + { + + } + } + }, cts.Token); + } +} -- Gitblit v1.8.0