| | |
| | | using Furion.InstantMessaging; |
| | | using Microsoft.AspNetCore.SignalR; |
| | | using WCS.Application.Entity; |
| | | |
| | | namespace WCS.Application; |
| | | |
| | | /// <summary> |
| | | /// PLC集线器 |
| | | /// 任务日志集线器 |
| | | /// </summary> |
| | | [MapHub("/hubs/Plc")] |
| | | public class PlcHub : Hub<IPlcHub> |
| | | { |
| | | private readonly IHubContext<PlcHub, IPlcHub> _plcHubContext; |
| | | |
| | | public PlcHub(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); |
| | | //} |
| | | public async Task PublicPlcConn(WcsPlc context) |
| | | { |
| | | await _plcHubContext.Clients.All.PublicPlcConn(context); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 下发工位状态 |
| | |
| | | //} |
| | | |
| | | /// <summary> |
| | | /// 下发报警信息 |
| | | /// 下发服务状态 |
| | | /// </summary> |
| | | /// <param name="context"></param> |
| | | /// <returns></returns> |
| | | //public async Task PublicAlarm(WcsAlarmInfoOutput context) |
| | | //{ |
| | | // await _plcHubContext.Clients.All.PublicAlarm(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<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; } |
| | | } |