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; }
|
}
|