From 6c010905f5e26438ea41a3faa62181975c89c9df Mon Sep 17 00:00:00 2001 From: wxw <Administrator@DESKTOP-5BIMHQ3> Date: 星期二, 10 九月 2024 16:46:10 +0800 Subject: [PATCH] 解决冲突 --- Web/src/views/device/deviceMonitor/signalR.ts | 37 ++++ Admin.NET/WCS.Application/Service/WcsDevice/WcsDeviceService.cs | 95 ++++++++++ Web/src/views/device/deviceMonitor/index.vue | 54 +++++ Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceOutput.cs | 26 ++ Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceInput.cs | 61 ++++++ Web/src/api/wcs/wcsDevice.ts | 8 Web/src/views/device/deviceMonitor/component/setting.vue | 42 ++-- Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs | 196 +++++++++++++++++++++ Admin.NET/WCS.Application/Hub/IPlcDeviceHub.cs | 16 + 9 files changed, 507 insertions(+), 28 deletions(-) diff --git a/Admin.NET/WCS.Application/Hub/IPlcDeviceHub.cs b/Admin.NET/WCS.Application/Hub/IPlcDeviceHub.cs new file mode 100644 index 0000000..3ec5468 --- /dev/null +++ b/Admin.NET/WCS.Application/Hub/IPlcDeviceHub.cs @@ -0,0 +1,16 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WCS.Application; +public interface IPlcDeviceHub +{ + /// <summary> + /// 涓嬪彂璁惧淇℃伅 + /// </summary> + /// <param name="context"></param> + /// <returns></returns> + Task PublicPlcDevice(WcsDeviceOutput context); +} diff --git a/Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs b/Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs new file mode 100644 index 0000000..ff0eeb4 --- /dev/null +++ b/Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs @@ -0,0 +1,196 @@ +锘縰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.Id).FirstOrDefault(); + //璇诲彇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); + } + } + // 姣旇緝涔嬪墠鐨勭姸鎬� + 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 (Exception) + { + + throw; + } + } + }, cts.Token); + } +} diff --git a/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceInput.cs b/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceInput.cs index c998258..a52ca44 100644 --- a/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceInput.cs +++ b/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceInput.cs @@ -232,4 +232,65 @@ /// </summary> [Required(ErrorMessage = "璧峰鐐逛綅涓嶈兘涓虹┖")] public int Pos { get; set; } +} +/// <summary> +/// 鍐欏叆鍙傛暟 +/// </summary> +public class WriteWcsDeviceInput : WcsDeviceBaseInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")] + public long Id { get; set; } + /// <summary> + /// 浠诲姟鍙� + /// </summary> + public string TaskNo { get; set; } + /// <summary> + /// 浠诲姟绫诲瀷 + /// </summary> + public TaskTypeEnum? TaskType { get; set; } + /// <summary> + /// 璧峰宸ヤ綅 + /// </summary> + public string StartLocatNo { get; set; } + /// <summary> + /// 缁撴潫宸ヤ綅 + /// </summary> + public string EndLocatNo { get; set; } + /// <summary> + /// 鎵樼洏鐮� + /// </summary> + public string PalletNo { get; set; } + public string Plc { get; set; } + public string Wcs { get; set; } + /// <summary> + /// 杩炴帴鐘舵�� + /// </summary> + public bool Status { get; set; } = false; + /// <summary> + /// 鏀捐揣鎺� + /// </summary> + public int ReleaseRow { get; set; } + /// <summary> + /// 鏀捐揣鍒� + /// </summary> + public int ReleaseCol { get; set; } + /// <summary> + /// 鏀捐揣灞� + /// </summary> + public int ReleaseStorey { get; set; } + /// <summary> + /// 鍙栬揣鎺� + /// </summary> + public int PickRow { get; set; } + /// <summary> + /// 鍙栬揣鍒� + /// </summary> + public int PickCol { get; set; } + /// <summary> + /// 鍙栬揣灞� + /// </summary> + public int PickStorey { get; set; } } \ No newline at end of file diff --git a/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceOutput.cs b/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceOutput.cs index e7d24d7..d0c4936 100644 --- a/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceOutput.cs +++ b/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceOutput.cs @@ -142,8 +142,30 @@ /// 杩炴帴鐘舵�� /// </summary> public bool Status { get; set; } = false; - - + /// <summary> + /// 鏀捐揣鎺� + /// </summary> + public int ReleaseRow { get; set; } + /// <summary> + /// 鏀捐揣鍒� + /// </summary> + public int ReleaseCol { get; set; } + /// <summary> + /// 鏀捐揣灞� + /// </summary> + public int ReleaseStorey { get; set; } + /// <summary> + /// 鍙栬揣鎺� + /// </summary> + public int PickRow { get; set; } + /// <summary> + /// 鍙栬揣鍒� + /// </summary> + public int PickCol { get; set; } + /// <summary> + /// 鍙栬揣灞� + /// </summary> + public int PickStorey { get; set; } } diff --git a/Admin.NET/WCS.Application/Service/WcsDevice/WcsDeviceService.cs b/Admin.NET/WCS.Application/Service/WcsDevice/WcsDeviceService.cs index 761c8f9..403432f 100644 --- a/Admin.NET/WCS.Application/Service/WcsDevice/WcsDeviceService.cs +++ b/Admin.NET/WCS.Application/Service/WcsDevice/WcsDeviceService.cs @@ -251,6 +251,34 @@ 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 (cachePlc.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); + + } } catch (Exception) { @@ -274,6 +302,69 @@ } return list; + } + + [HttpPost] + [ApiDescriptionSettings(Name = "WriteValue")] + [DisplayName("鍐欏叆鍊�")] + public async Task WriteValue(WriteWcsDeviceInput modDevice) + { + var modPlc = await _wcsDeviceRep.Context.Queryable<WcsPlc>().FirstAsync(s => s.Id == modDevice.PlcId); + if (modPlc == null) + throw Oops.Bah("鎵句笉鍒癙LC淇℃伅"); + PLCUtil modUtil = new PLCUtil(modPlc); + var listPosition = await _wcsDeviceRep.Context.Queryable<WcsPosition>().Where(s => s.DeviceId == modDevice.Id).ToListAsync(); + //(var result, var plc) = modConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos); + //modDevice.Plc = Convert.ToString(plc); + //浠诲姟鍙� + var modPositionTask = listPosition.FirstOrDefault(s => s.Text == "浠诲姟鍙�"); + if (modPositionTask != null) + modUtil.SetPlcDBValue(modPositionTask.PosType, modPositionTask.PlcPos, modDevice.TaskNo); + //浠诲姟绫诲瀷 + var modPositionTaskType = listPosition.FirstOrDefault(s => s.Text == "浠诲姟绫诲瀷"); + if (modPositionTaskType != null) + modUtil.SetPlcDBValue(modPositionTaskType.PosType, modPositionTaskType.PlcPos, modDevice.TaskType.ToString()); + //璧峰宸ヤ綅 + var modPositionStartLocatNo = listPosition.FirstOrDefault(s => s.Text == "璧峰宸ヤ綅"); + if (modPositionStartLocatNo != null) + modUtil.SetPlcDBValue(modPositionStartLocatNo.PosType, modPositionStartLocatNo.PlcPos, modDevice.StartLocatNo.ToString()); + //鐩殑宸ヤ綅 + var modPositionEndLocatNo = listPosition.FirstOrDefault(s => s.Text == "鐩殑宸ヤ綅"); + if (modPositionEndLocatNo != null) + modUtil.SetPlcDBValue(modPositionEndLocatNo.PosType, modPositionEndLocatNo.PlcPos, modDevice.EndLocatNo.ToString()); + //鎵樼洏鐮� + var modPositionPalletNo = listPosition.FirstOrDefault(s => s.Text == "鎵樼洏鐮�"); + if (modPositionPalletNo != null) + modUtil.SetPlcDBValue(modPositionPalletNo.PosType, modPositionPalletNo.PlcPos, modDevice.PalletNo.ToString()); + if (modPlc.Type == PLCTypeEnum.ConveyorLine) + { + //鏀捐揣鎺� + var modPositionReleaseRow = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣鎺�"); + if (modPositionReleaseRow != null) + modUtil.SetPlcDBValue(modPositionReleaseRow.PosType, modPositionReleaseRow.PlcPos, modDevice.ReleaseRow.ToString()); + //鏀捐揣鍒� + var modPositionReleaseCol = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣鍒�"); + if (modPositionReleaseRow != null) + modUtil.SetPlcDBValue(modPositionReleaseCol.PosType, modPositionReleaseCol.PlcPos, modDevice.ReleaseCol.ToString()); + //鏀捐揣灞� + var modPositionReleaseStorey = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣灞�"); + if (modPositionReleaseStorey != null) + modUtil.SetPlcDBValue(modPositionReleaseStorey.PosType, modPositionReleaseStorey.PlcPos, modDevice.ReleaseStorey.ToString()); + //鍙栬揣鎺� + var modPositionPickRow = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣鎺�"); + if (modPositionPickRow != null) + modUtil.SetPlcDBValue(modPositionPickRow.PosType, modPositionPickRow.PlcPos, modDevice.PickRow.ToString()); + //鍙栬揣鍒� + var modPositionPickCol = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣鍒�"); + if (modPositionPickCol != null) + modUtil.SetPlcDBValue(modPositionPickCol.PosType, modPositionPickCol.PlcPos, modDevice.PickCol.ToString()); + //鍙栬揣灞� + var modPositionPickStorey = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣灞�"); + if (modPositionPickStorey != null) + modUtil.SetPlcDBValue(modPositionPickStorey.PosType, modPositionPickStorey.PlcPos, modDevice.PickStorey.ToString()); + + } + modUtil.Close(); } #region 鍒嗘嫞鐮佸灈 @@ -304,8 +395,8 @@ [HttpGet] [ApiDescriptionSettings(Name = "WcsPackStationPlcList")] [DisplayName("鑾峰彇璁惧瀵瑰簲宸ヤ綅鍒楄〃")] - public async Task<List<WcsDeviceTaskOrderDto>> WcsPackStationPlcList([FromQuery]WcsDeviceBaseInput entry) - { + public async Task<List<WcsDeviceTaskOrderDto>> WcsPackStationPlcList([FromQuery] WcsDeviceBaseInput entry) + { return await _wcsDeviceRep.Context.Queryable<WcsDevice>() .LeftJoin<WcsCheckTask>((device, task) => device.StationNum == task.Port) .Where((device, task) => device.PlcId == entry.PlcId) diff --git a/Web/src/api/wcs/wcsDevice.ts b/Web/src/api/wcs/wcsDevice.ts index 4561735..fe7baa5 100644 --- a/Web/src/api/wcs/wcsDevice.ts +++ b/Web/src/api/wcs/wcsDevice.ts @@ -8,6 +8,7 @@ GetWcsPlcPlcIdDropdown = '/api/wcsDevice/WcsPlcPlcIdDropdown', GeneratePos = '/api/wcsDevice/GeneratePos', ListWcsDevice = '/api/wcsDevice/list', + WriteValue = '/api/wcsdevice/writeValue', GetWcsPackPlcList='/api/wcsDevice/WcsPackPlcList', GetWcsPackStationPlcList='/api/wcsDevice/WcsPackStationPlcList', @@ -101,4 +102,11 @@ url: Api.CloseTaskForPLC, method: 'post', data: params, +}); +//鍐欏叆鍊� +export const writeValue = (params?: any) => + request({ + url: Api.WriteValue, + method: 'post', + data: params, }); \ No newline at end of file diff --git a/Web/src/views/device/deviceMonitor/component/setting.vue b/Web/src/views/device/deviceMonitor/component/setting.vue index c663b22..243a15f 100644 --- a/Web/src/views/device/deviceMonitor/component/setting.vue +++ b/Web/src/views/device/deviceMonitor/component/setting.vue @@ -10,7 +10,7 @@ <el-card class="box-card" shadow="hover"> <template #header> <div class="card-header"> - + <div> <span>宸ヤ綅鍙凤細</span> <el-select v-model="stationValue" placeholder="璇烽�夋嫨" filterable value-key="stationNum" @@ -22,7 +22,8 @@ <el-button style="margin-left: 10px;">鑷姩</el-button> </div> <div> - <div :class="['lineStatus', stationValue.status ? 'device-status-0' : 'device-status-1']"></div> + <div :class="['lineStatus', stationValue.status ? 'device-status-0' : 'device-status-1']"> + </div> </div> </div> </template> @@ -49,41 +50,41 @@ <el-input v-model="stationValue.wcs"></el-input> </el-form-item> </el-col> - + <el-col :span="12"> <el-form-item label="鍙栬揣鎺�"> - <el-input ></el-input> + <el-input></el-input> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="鏀捐揣鎺�"> - <el-input ></el-input> + <el-input></el-input> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="鍙栬揣鍒�"> - <el-input ></el-input> + <el-input></el-input> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="鏀捐揣鍒�"> - <el-input ></el-input> + <el-input></el-input> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="鍙栬揣灞�"> - <el-input ></el-input> + <el-input></el-input> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="鏀捐揣灞�"> - <el-input ></el-input> + <el-input></el-input> </el-form-item> </el-col> </el-row> </el-form> <div style="text-align: center;margin: 10px;"> - <el-button class="button" size="large">鍐欏叆鏁版嵁</el-button> + <el-button class="button" size="large" @click="write(stationValue)">鍐欏叆鏁版嵁</el-button> </div> </div> <template #footer> @@ -107,6 +108,8 @@ <script lang="ts" setup> import { ref, defineModel } from 'vue'; +import { writeValue } from '/@/api/wcs/wcsDevice'; +import { ElMessageBox,ElMessage } from 'element-plus'; const listStationsData = defineModel<any>("listStationsData") const stationValue = defineModel<any>("stationValue") @@ -122,7 +125,10 @@ // emit('update:listStationsData', listStationsData.value); // emit('update:stationValue', stationValue); // }; - +const write = async (row: any) => { + await writeValue(row); + ElMessage.success('鍐欏叆鎴愬姛锛�'); +} const isShowDialog = ref(false); const openDialog = async (row: any) => { @@ -181,18 +187,18 @@ } .lineStatus { - right: 0; - height: 20px; - width: 20px; - border-radius: 50%; - background-color: #67C23A; + right: 0; + height: 20px; + width: 20px; + border-radius: 50%; + background-color: #67C23A; } .device-status-0 { - background-color: #67C23A; + background-color: #67C23A; } .device-status-1 { - background-color: red; + background-color: red; } </style> \ No newline at end of file diff --git a/Web/src/views/device/deviceMonitor/index.vue b/Web/src/views/device/deviceMonitor/index.vue index 03e945c..b404ddf 100644 --- a/Web/src/views/device/deviceMonitor/index.vue +++ b/Web/src/views/device/deviceMonitor/index.vue @@ -52,7 +52,6 @@ <div class="lineButtonfix"> <el-form label-position="left" label-width="80px"> <el-form-item> - <el-button>鍐欏叆</el-button> <el-button @click="openDialog">璁剧疆</el-button> </el-form-item> </el-form> @@ -85,6 +84,9 @@ <el-form-item label="鐩殑宸ヤ綅"> <el-input v-model="deviceInfo.endLocatNo"></el-input> </el-form-item> + <el-form-item label="鎵樼洏鐮�"> + <el-input v-model="deviceInfo.palletNo"></el-input> + </el-form-item> <el-form-item label="PLC"> <el-input v-model="deviceInfo.plc"></el-input> </el-form-item> @@ -99,24 +101,47 @@ <div class="otherButtonfix"> <el-form label-position="left"> <el-form-item> - <el-button>鍐欏叆</el-button> + <el-button @click="write(deviceInfo)">鍐欏叆</el-button> </el-form-item> </el-form> </div> </el-card> </div> </el-main> - <setting ref="settingDialogRef" :title="title" v-model:listStationsData="listStationsData" v-model:stationValue="stationValue" /> + <setting ref="settingDialogRef" :title="title" v-model:listStationsData="listStationsData" + v-model:stationValue="stationValue" /> </el-container> </template> <script lang="ts" setup> -import { ref, reactive } from 'vue'; -import { listWcsDevice } from '/@/api/wcs/wcsDevice'; +import { ref, onMounted } from 'vue'; +import { listWcsDevice, writeValue } from '/@/api/wcs/wcsDevice'; import { getDictDataItem as di, getDictDataList as dl } from '/@/utils/dict-utils'; import { listWcsPlc } from '/@/api/wcs/wcsPlc'; - +import { ElMessageBox, ElMessage } from 'element-plus'; import setting from '/@/views/device/deviceMonitor/component/setting.vue' +import { signalR } from './signalR'; +//杩炴帴signalR 鐩戝惉鍙樻洿 +onMounted(async () => { + signalR.off('PublicPlcDevice'); + signalR.on('PublicPlcDevice', (data: any) => { + //todo 闇�瑕佹祴璇� + if (data.type == 0) { + var index = listStackingMachineData.value.findIndex(s => s.id == data.id); + if (index !== -1) { + listStackingMachineData.value.splice(index, 1, data); + } + } + else if (data.type == 1) { + stations.value.forEach(list => { + var index = list.findIndex(s => s.id == data.id); + if (index !== -1) { + list.splice(index, 1, data); + } + }); + } + }); +}); const stations = ref<any>([]); const listStationsData = ref<any>([]); @@ -138,6 +163,10 @@ const openDialog = async () => { settingDialogRef.value.openDialog(stationValue); } +const write = async (row: any) => { + await writeValue(row); + ElMessage.success('鍐欏叆鎴愬姛锛�'); +} // 鏌ヨ鎿嶄綔 const handleQuery = async () => { var listplc = await listWcsPlc({ type: 1 }); @@ -153,6 +182,19 @@ listStationsData.value = stations.value[lineValue.value]; stationValue.value = listStationsData.value[0]; } + else { + listStationsData.value = []; + stationValue.value = { + stationNum: '', + taskNo: '', + taskType: '', + startLocatNo: '', + endLocatNo: '', + plc: '', + wcs: '', + status: false + }; + } title.value = listStationsData.value[0].text; }; diff --git a/Web/src/views/device/deviceMonitor/signalR.ts b/Web/src/views/device/deviceMonitor/signalR.ts new file mode 100644 index 0000000..efcbe5b --- /dev/null +++ b/Web/src/views/device/deviceMonitor/signalR.ts @@ -0,0 +1,37 @@ +import * as SignalR from '@microsoft/signalr'; +import { getToken } from '/@/utils/axios-utils'; + +// 鍒濆鍖朣ignalR瀵硅薄 +const connection = new SignalR.HubConnectionBuilder() + .configureLogging(SignalR.LogLevel.Information) + .withUrl(`${window.__env__.VITE_API_URL}/hubs/PlcDevice?token=${getToken()}`, { transport: SignalR.HttpTransportType.WebSockets, skipNegotiation: true }) + .withAutomaticReconnect({ + nextRetryDelayInMilliseconds: () => { + return 5000; // 姣�5绉掗噸杩炰竴娆� + }, + }) + .build(); + +connection.keepAliveIntervalInMilliseconds = 15 * 1000; // 蹇冭烦妫�娴�15s +connection.serverTimeoutInMilliseconds = 30 * 60 * 1000; // 瓒呮椂鏃堕棿30m + +// 鍚姩杩炴帴 +connection.start().then(() => { + console.log('鍚姩杩炴帴plc'); +}); +// 鏂紑杩炴帴 +connection.onclose(async () => { + console.log('鏂紑杩炴帴plc'); +}); +// 閲嶈繛涓� +connection.onreconnecting(() => { + console.log('鏈嶅姟鍣ㄥ凡鏂嚎plc'); +}); +// 閲嶈繛鎴愬姛 +connection.onreconnected(() => { + console.log('閲嶈繛鎴愬姛plc'); +}); + +// connection.on('PublicPlcConn', () => {}); + +export { connection as signalR }; -- Gitblit v1.8.0