using Furion.InstantMessaging; using Microsoft.AspNetCore.SignalR; using WCS.Application.Entity; namespace WCS.Application; /// <summary> /// 任务日志集线器 /// </summary> [MapHub("/hubs/Plc")] public class PlcHub : Hub<IPlcHub> { private readonly IHubContext<PlcHub, IPlcHub> _plcHubContext; private readonly SysConfigService _sysConfigService; private readonly SqlSugarRepository<WcsCheckTask> _wcsCheckTaskRep; public PlcHub(IHubContext<PlcHub, IPlcHub> plcHubContext, SysConfigService sysConfigService, SqlSugarRepository<WcsCheckTask> wcsCheckTaskRep) { _plcHubContext = plcHubContext; _sysConfigService = sysConfigService; _wcsCheckTaskRep = wcsCheckTaskRep; } /// <summary> /// 下å‘PLCè¿žæŽ¥çŠ¶æ€ /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task PublicPlcConn(WcsPlc context) { await _plcHubContext.Clients.All.PublicPlcConn(context); } /// <summary> /// 下å‘å·¥ä½çŠ¶æ€ /// </summary> /// <param name="context"></param> /// <returns></returns> //public async Task PublicStationStatus(List<WcsDevice> context) //{ // await _plcHubContext.Clients.All.PublicStationStatus(context); //} /// <summary> /// 䏋呿œåŠ¡çŠ¶æ€ /// </summary> public async Task UpdateService(PLCServiceModel context) { //è¿è¡ŒçŠ¶æ€ if (context.BoRunningState.HasValue) { PLCTaskAction.boRunningState = context.BoRunningState.Value; if (context.BoRunningState.Value) PLCTaskAction.Init(); else PLCTaskAction.Stop(); await _sysConfigService.UpdateConfigValue("sys_RunningState", context.BoRunningState.Value); } //è„±æœºæ¨¡å¼ if (context.BoOffline.HasValue) { PLCTaskAction.boOffline = context.BoOffline.Value; await _sysConfigService.UpdateConfigValue("sys_Offline", context.BoOffline.Value); } //自刷新 if (context.BoRefresh.HasValue) { PLCTaskAction.boRefresh = context.BoRefresh.Value; await _sysConfigService.UpdateConfigValue("sys_Refresh", context.BoRefresh.Value); } //æ¼”ç¤ºæ¨¡å¼ if (context.BoDemo.HasValue) { PLCTaskAction.boDemo = context.BoDemo.Value; if (PLCTaskAction.boDemo) { //判æ–分拣ç 垛有没有绑定任务 var checkTask = await _wcsCheckTaskRep.Context.Queryable<WcsCheckTask>().Where(w => w.Status == "1" && w.RoboatType == PLCTypeEnum.RobotPalletizer).ToListAsync(); if (checkTask.Count > 0) { PLCTaskAction.boDemo = false; await _plcHubContext.Clients.All.UpdateService( new PLCServiceModel() { BoRunningState = PLCTaskAction.boRunningState, BoRefresh = PLCTaskAction.boRefresh, BoOffline = PLCTaskAction.boOffline, BoDemo = PLCTaskAction.boDemo, BoDrumReversal = PLCTaskAction.boDrumReversal, Error = "分拣ç åž›å·²ç»‘å®šä»»åŠ¡ï¼Œä¸æ”¯æŒå¼€å¯æ¼”示模å¼ï¼" }); return; } } //PLC连接 var plcStackeConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == "10.18.51.120"); if (plcStackeConn.Connected) { //写入æµç¨‹å— var ret = plcStackeConn.SetPlcDBValue(PLCDataTypeEnum.Bit, "DB119", "0", PLCTaskAction.boDemo == true ? "1" : "0"); if (ret.IsSucceed) { if (PLCTaskAction.boDemo) { // 写入plc抓箱å“ç§ var rett = plcStackeConn.SetPlcDBValue(PLCDataTypeEnum.Short, "DB111", "0", "1"); if (rett.IsSucceed) { await _sysConfigService.UpdateConfigValue("sys_demo", context.BoDemo.Value); } } else { var rett = plcStackeConn.SetPlcDBValue(PLCDataTypeEnum.Short, "DB111", "0", "0"); if (rett.IsSucceed) { await _sysConfigService.UpdateConfigValue("sys_demo", context.BoDemo.Value); } } } else { PLCTaskAction.boDemo = !PLCTaskAction.boDemo; await _plcHubContext.Clients.All.UpdateService( new PLCServiceModel() { BoRunningState = PLCTaskAction.boRunningState, BoRefresh = PLCTaskAction.boRefresh, BoOffline = PLCTaskAction.boOffline, BoDemo = PLCTaskAction.boDemo, BoDrumReversal = PLCTaskAction.boDrumReversal, BoOutLock=PLCTaskAction.boOutLock, BoEnterLock=PLCTaskAction.boEnterLock, Error = "与PCL交互失败,æ“作失败ï¼" }); return; } } else { PLCTaskAction.boDemo = !PLCTaskAction.boDemo; await _plcHubContext.Clients.All.UpdateService( new PLCServiceModel() { BoRunningState = PLCTaskAction.boRunningState, BoRefresh = PLCTaskAction.boRefresh, BoOffline = PLCTaskAction.boOffline, BoDemo = PLCTaskAction.boDemo, BoDrumReversal = PLCTaskAction.boDrumReversal, BoOutLock = PLCTaskAction.boOutLock, BoEnterLock = PLCTaskAction.boEnterLock, Error = "PCL未连接,æ“作失败ï¼" }); return; } } //滚ç’å转 if (context.BoDrumReversal.HasValue) { PLCTaskAction.boDrumReversal = context.BoDrumReversal.Value; //PLC连接 var plcStackeConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == "10.18.51.120"); if (plcStackeConn.Connected) { //写入æµç¨‹å— var ret = plcStackeConn.SetPlcDBValue(PLCDataTypeEnum.Bit, "DB119", "0.1", PLCTaskAction.boDemo == true ? "1" : "0"); if (ret.IsSucceed) { await _sysConfigService.UpdateConfigValue("sys_DrumReversal", context.BoDrumReversal.Value); } else { PLCTaskAction.boDrumReversal = !PLCTaskAction.boDrumReversal; await _plcHubContext.Clients.All.UpdateService( new PLCServiceModel() { BoRunningState = PLCTaskAction.boRunningState, BoRefresh = PLCTaskAction.boRefresh, BoOffline = PLCTaskAction.boOffline, BoDemo = PLCTaskAction.boDemo, BoDrumReversal = PLCTaskAction.boDrumReversal, BoOutLock=PLCTaskAction.boOutLock, BoEnterLock=PLCTaskAction.boEnterLock, Error = "与PCL交互失败,æ“作失败ï¼" }); return; } } else { PLCTaskAction.boDrumReversal = !PLCTaskAction.boDrumReversal; await _plcHubContext.Clients.All.UpdateService( new PLCServiceModel() { BoRunningState = PLCTaskAction.boRunningState, BoRefresh = PLCTaskAction.boRefresh, BoOffline = PLCTaskAction.boOffline, BoDemo = PLCTaskAction.boDemo, BoDrumReversal = PLCTaskAction.boDrumReversal, BoOutLock = PLCTaskAction.boOutLock, BoEnterLock = PLCTaskAction.boEnterLock, Error = "PCL未连接,æ“作失败ï¼" }); return; } } //出库é”定 if (context.BoOutLock.HasValue) { PLCTaskAction.boOutLock = context.BoOutLock.Value; await _sysConfigService.UpdateConfigValue("sys_BoOutLock", context.BoOutLock.Value); } //入库é”定 if (context.BoEnterLock.HasValue) { PLCTaskAction.boEnterLock = context.BoEnterLock.Value; await _sysConfigService.UpdateConfigValue("sys_BoEnterLock", context.BoEnterLock.Value); } await _plcHubContext.Clients.All.UpdateService(new PLCServiceModel() { BoRunningState = PLCTaskAction.boRunningState, BoRefresh = PLCTaskAction.boRefresh, BoOffline = PLCTaskAction.boOffline, BoDemo = PLCTaskAction.boDemo, BoDrumReversal = PLCTaskAction.boDrumReversal, BoOutLock = PLCTaskAction.boOutLock, BoEnterLock = PLCTaskAction.boEnterLock }); } } public class PLCServiceModel { public bool? BoRunningState { get; set; } public bool? BoOffline { get; set; } public bool? BoRefresh { get; set; } public bool? BoDemo { get; set; } public bool? BoDrumReversal { get; set; } public bool? BoOutLock { get; set; } public bool? BoEnterLock { get; set; } /// <summary> /// é”™è¯¯ä¿¡æ¯ /// </summary> public string Error { get; set; } }