using Furion.InstantMessaging; using Microsoft.AspNetCore.SignalR; using WCS.Application.Entity; namespace WCS.Application; /// /// 任务日志集线器 /// [MapHub("/hubs/Plc")] public class PlcHub : Hub { private readonly IHubContext _plcHubContext; private readonly SysConfigService _sysConfigService; private readonly SqlSugarRepository _wcsCheckTaskRep; public PlcHub(IHubContext plcHubContext, SysConfigService sysConfigService, SqlSugarRepository wcsCheckTaskRep) { _plcHubContext = plcHubContext; _sysConfigService = sysConfigService; _wcsCheckTaskRep = wcsCheckTaskRep; } /// /// 下发PLC连接状态 /// /// /// public async Task PublicPlcConn(WcsPlc context) { await _plcHubContext.Clients.All.PublicPlcConn(context); } /// /// 下发工位状态 /// /// /// //public async Task PublicStationStatus(List context) //{ // await _plcHubContext.Clients.All.PublicStationStatus(context); //} /// /// 下发服务状态 /// 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().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; } /// /// 错误信息 /// public string Error { get; set; } }