wxw
2024-09-26 70cdea5f6e57d1ebc29c25ef60f311fadca6ab21
Admin.NET/WCS.Application/Hub/PlcHub.cs
@@ -1,5 +1,6 @@
using Furion.InstantMessaging;
using Microsoft.AspNetCore.SignalR;
using WCS.Application.Entity;
namespace WCS.Application;
@@ -10,10 +11,13 @@
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连接状态
@@ -34,4 +38,186 @@
    //{
    //    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,
                           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,
                       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,
                           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,
                       Error = "PCL未连接,操作失败!"
                   });
                return;
            }
        }
        await _plcHubContext.Clients.All.UpdateService(new PLCServiceModel() { BoRunningState = PLCTaskAction.boRunningState, BoRefresh = PLCTaskAction.boRefresh, BoOffline = PLCTaskAction.boOffline, BoDemo = PLCTaskAction.boDemo, BoDrumReversal = PLCTaskAction.boDrumReversal });
    }
}
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; }
    /// <summary>
    /// 错误信息
    /// </summary>
    public string Error { get; set; }
}