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