using Dm.filter; using DocumentFormat.OpenXml.Bibliography; using DocumentFormat.OpenXml.Drawing.Charts; using Elastic.Clients.Elasticsearch.Tasks; using Furion.Logging; using IoTClient; using Microsoft.AspNetCore.SignalR; using Qiniu.Storage; using RazorEngine.Compilation.ImpromptuInterface.Dynamic; using SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global.Models; using System; using System.Data; using System.Reflection.Emit; using WCS.Application.Entity; using WCS.Application.Util; using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinExpressIntracityUpdateStoreRequest.Types; using static SKIT.FlurlHttpClient.Wechat.Api.Models.NontaxInsertBillRequest.Types.CardExtra.Types.BillCard.Types; namespace WCS.Application; public static class PLCService { private static readonly object OLock = new object(); private static readonly object RuKuLock = new object(); private static readonly object OutLock = new object(); private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId); private static decimal weight94 = 0; private static decimal weight160 = 0; private static decimal weight155 = 0; private static decimal weight152 = 0; private static decimal weight153 = 0; public static void OnChangeEvent(object sender, EventArgs e) { try { var mod = sender as WcsDeviceDto; Console.WriteLine("PLC值为" + mod.Value); switch (mod.Type) { case PLCTypeEnum.StackingMachine: StackingMachine(mod); // 跺机 break; case PLCTypeEnum.ConveyorLine: ConveyorLine(mod); // 托盘输é€çº¿ break; case PLCTypeEnum.AGV: AGV(mod); // AGV调度 break; case PLCTypeEnum.BoxConveyorLine: BoxConveyorLine(mod); // ç 垛机器人 break; case PLCTypeEnum.StackingRobot: PalletMachine(mod); break; default: break; } } catch (Exception ex) { Log.Error(ex.Message, ex); } } /// <summary> /// è·ºæœºä¸šåŠ¡å¤„ç† /// </summary> /// <param name="modDevice"></param> private static void StackingMachine(WcsDeviceDto modDevice) { var plcConn = modDevice.PLCUtil; string ledText = ""; switch (modDevice.Value.ToString()) { case "820": // 跺机空闲,获å–出库任务ã€ç§»åº“任务 { // 获å–ä»»åŠ¡ä¿¡æ¯ var modTask = _db.Queryable<WcsTask>().OrderBy(m => m.Levels, OrderByType.Asc).OrderBy(m => m.CreateTime, OrderByType.Asc) .First(s => s.Status == TaskStatusEnum.Wait && (s.TaskType == TaskTypeEnum.Out || s.TaskType == TaskTypeEnum.Move) && s.StartRoadway == modDevice.StationNum); if (modTask == null) { break; } //判æ–出库é”å®šæ˜¯å¦æ‰“å¼€ if (PLCTaskAction.boOutLock) { break;//出库é”å®šæ‰“å¼€åˆ™ä¸æ‰§è¡Œå‡ºåº“任务 } PlcTaskInfo taskInfo = new PlcTaskInfo(); if (modTask.TaskType == TaskTypeEnum.Move) { // ç§»åº“ç›®æ ‡åœ°å€ taskInfo = PLCCommon.GetEndPai(modTask.EndLocate.Substring(1, 2), modTask.EndLocate.Substring(2, 2), modTask.EndLocate.Substring(0, 2), modTask.EndLocate.Substring(4, 2), modTask.EndLocate.Substring(6, 2)); } else { // æ ¹æ®ç›®æ ‡åœ°å€å’Œå··é“获å–出库å£å¯¹åº”的放货工ä½å¯¹åº”的排列层 taskInfo = PLCCommon.GetCTaskInfo(modTask.EndLocate, ((int)modTask.TaskType).ToString(), modTask.StartRoadway, modTask.EndRoadway); // ç›®æ ‡å·¥ä½ä¸ä¸ºnullï¼Œéœ€å…ˆåˆ¤æ–æ”¾è´§å·¥ä½æ˜¯å¦ç©ºé—² if (!string.IsNullOrEmpty(taskInfo.EndStation)) { #region è·¨è·ºæœºä»»åŠ¡å¤„ç† ########### // 判æ–ç›®æ ‡ä½ç½®æ˜¯å¦æ˜¯è·¨è·ºæœºå‡ºåº“å·¥ä½ if (modTask.EndLocate == "266")// && modTask.StartRoadway != "R05" { // 判æ–å…¥åº“å·¥ä½æ˜¯å¦å˜åœ¨æœªå®Œæˆçš„入库任务 var modInTask = _db.Queryable<WcsTask>().OrderBy(m => m.Levels, OrderByType.Asc).OrderBy(m => m.CreateTime, OrderByType.Asc) .First(s => (s.Status == TaskStatusEnum.Wait || s.Status == TaskStatusEnum.Doing) && s.TaskType == TaskTypeEnum.In && s.StartLocate == modTask.EndLocate); if (modInTask != null) { // ç›®æ ‡å‡ºåº“å£æœ‰å¯¹åº”的入库任务跳出循环,ç‰å¾…入库任务完æˆã€‚ break; } // æ ¹æ®ç›®æ ‡å·¥ä½å·èŽ·å–输é€çº¿é“¾æŽ¥ var plcCconn = PLCCommon.GetPlcIp(modTask.EndLocate); // 读å–ç›®æ ‡å·¥ä½å½“å‰çŠ¶æ€ var ConveyorMod = PLCTaskAction.plcDevices.First(m => m.StationNum == modTask.EndLocate && m.DeviceType == DeviceTypeEnum.Business); var (result, value) = plcCconn.GetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.PlcPos); if (result.IsSucceed) { if (value.ToString() != "120") { // ç›®æ ‡å·¥ä½è¢«å 用跳出循环,ç‰å¾…å·¥ä½é‡Šæ”¾ã€‚ break; } } if (modTask.StartRoadway != "R05") { string aaa = PLCCommon.RoadwayToOutStationNum(modTask.StartRoadway, "1"); // 获å–1楼ä¸ä¸“å·¥ä½å· taskInfo.Ip = PLCCommon.GetPlcIp(aaa).PlcIP; taskInfo.EndPai = "2"; taskInfo.EndLie = "60"; taskInfo.EndCeng = "1"; taskInfo.EndStation = aaa; } } if (modTask.EndLocate == "265") // && modTask.StartRoadway != "R05" && modTask.StartRoadway != "R06" { // 判æ–å…¥åº“å·¥ä½æ˜¯å¦å˜åœ¨æœªå®Œæˆçš„入库任务 var modInTask = _db.Queryable<WcsTask>().OrderBy(m => m.Levels, OrderByType.Asc).OrderBy(m => m.CreateTime, OrderByType.Asc) .First(s => (s.Status == TaskStatusEnum.Wait || s.Status == TaskStatusEnum.Doing) && s.TaskType == TaskTypeEnum.In && s.StartLocate == modTask.EndLocate); if (modInTask != null) { // ç›®æ ‡å‡ºåº“å£æœ‰å¯¹åº”的入库任务跳出循环,ç‰å¾…入库任务完æˆã€‚ break; } // æ ¹æ®ç›®æ ‡å·¥ä½å·èŽ·å–输é€çº¿é“¾æŽ¥ var plcCconn = PLCCommon.GetPlcIp(modTask.EndLocate); // 读å–ç›®æ ‡å·¥ä½å½“å‰çŠ¶æ€ var ConveyorMod = PLCTaskAction.plcDevices.First(m => m.StationNum == modTask.EndLocate && m.DeviceType == DeviceTypeEnum.Business); var (result, value) = plcCconn.GetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.PlcPos); if (result.IsSucceed) { if (value.ToString() != "120") { // ç›®æ ‡å·¥ä½è¢«å 用跳出循环,ç‰å¾…å·¥ä½é‡Šæ”¾ã€‚ break; } } if (modTask.StartRoadway != "R05" && modTask.StartRoadway != "R06") { string aaa = PLCCommon.RoadwayToOutStationNum(modTask.StartRoadway, "1"); // 获å–1楼ä¸ä¸“å·¥ä½å· taskInfo.Ip = PLCCommon.GetPlcIp(aaa).PlcIP; taskInfo.EndPai = "2"; taskInfo.EndLie = "60"; taskInfo.EndCeng = "1"; taskInfo.EndStation = aaa; } } // 写入放货工ä½å›ºå®šåœ°å€ #endregion // 打开对应的输é€çº¿è¿žæŽ¥ var plcConveyorConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == taskInfo.Ip); if (plcConveyorConn.Connected) { // èŽ·å–æ”¾è´§å·¥ä½é…ç½®ä¿¡æ¯ var ConveyorMod = PLCTaskAction.plcDevices.First(m => m.StationNum == taskInfo.EndStation && m.DeviceType == DeviceTypeEnum.Business); var (result, value) = plcConveyorConn.GetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.PlcPos); if (result.IsSucceed) { if (value.ToString() != "720") // 720:放货空ä½ç©ºé—²ï¼Œå¯æ”¾è´§ liudl 程åºè°ƒè¯•完æˆåŽæ”¾å¼€ { Log.Error(string.Format("任务å·:{0}:放货工ä½å 用,ç¨åŽæ‰§è¡Œã€‚", modTask.TaskNo)); break; } else if (value.ToString() == "720") { // 若空闲æå‰å 用æ¤å·¥ä½ï¼ŒåŒå·¥ä½å‡ºå…¥å…¬ç”¨å£ 放开æ¤ç¨‹åº var ret = plcConveyorConn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "730"); if (!ret.IsSucceed) { break; } } } else { break; } } else { break; } } } // 获å–转æ¢åŽçš„起始排列层 06010101 // 移库时起始排列层 PlcTaskInfo startTaskInfo = PLCCommon.GetEndPai(modTask.StartRoadway.Substring(1, 2), modTask.StartLocate.Substring(2, 2), modTask.StartLocate.Substring(0, 2), modTask.StartLocate.Substring(4, 2), modTask.StartLocate.Substring(6, 2)); // ç»™PLCå†™å…¥ä»»åŠ¡æ•°æ® var listResult = new List<Result>(); // ä»»åŠ¡å·æ‰˜ç›˜å· var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务å·"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo)); var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘ç "); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); // 起始排列层 var modPosRow = modDevice.listStation.FirstOrDefault(s => s.Text == "å–货排"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosRow.PosType, modDevice.DbNumber, modPosRow.PlcPos, startTaskInfo.EndPai)); var modPosColumn = modDevice.listStation.FirstOrDefault(s => s.Text == "å–货列"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosColumn.PosType, modDevice.DbNumber, modPosColumn.PlcPos, startTaskInfo.EndLie)); var modPosStorey = modDevice.listStation.FirstOrDefault(s => s.Text == "å–货层"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosStorey.PosType, modDevice.DbNumber, modPosStorey.PlcPos, startTaskInfo.EndCeng)); if (modTask.TaskType == TaskTypeEnum.Out) { var modEndNo = modDevice.listStation.FirstOrDefault(s => s.Text == "目的工ä½"); listResult.Add(plcConn.SetPlcDBValueRepeat(modEndNo.PosType, modDevice.DbNumber, modEndNo.PlcPos, taskInfo.EndStation)); } // ç›®æ ‡æ”¾è´§å·¥ä½(固定排列层) var modPosEndRow = modDevice.listStation.FirstOrDefault(s => s.Text == "放货排"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosEndRow.PosType, modDevice.DbNumber, modPosEndRow.PlcPos, taskInfo.EndPai)); var modPosEndColumn = modDevice.listStation.FirstOrDefault(s => s.Text == "放货列"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosEndColumn.PosType, modDevice.DbNumber, modPosEndColumn.PlcPos, taskInfo.EndLie)); var modPosEndStorey = modDevice.listStation.FirstOrDefault(s => s.Text == "放货层"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosEndStorey.PosType, modDevice.DbNumber, modPosEndStorey.PlcPos, taskInfo.EndCeng)); // 是å¦å†™å…¥æˆåŠŸ if (listResult.All(s => s.IsSucceed)) { // 写入跺机任务下å‘å®Œæˆ var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "830"); // 将移库任务待执行改为æ£åœ¨æ‰§è¡Œ _db.Updateable<WcsTask>() .SetColumns(s => s.Status == TaskStatusEnum.Doing) .Where(s => s.Id == modTask.Id) .ExecuteCommand(); HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); WcsTaskMonitor modInsertTaskMonitor; if (string.IsNullOrEmpty(taskInfo.EndStation)) { // åŒå··é“移库 modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, InteractiveMsg = $"写入指令:{modTask.StartLocate}储ä½====》{modTask.EndLocate}储ä½ã€‚", PalletNo = modTask.PalletNo, Status = TaskStatusEnum.Complete, StartLocat = modTask.StartLocate, EndLocat = modTask.EndLocate, }; } else { // 出库任务 跨巷é“移库 modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, InteractiveMsg = $"写入指令:{modTask.StartLocate}储ä½====》{taskInfo.EndStation}å·¥ä½ã€‚", PalletNo = modTask.PalletNo, Status = TaskStatusEnum.Complete, StartLocat = modTask.StartLocate, EndLocat = modTask.EndLocate, }; } // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); //修改ledå±ä¿¡æ¯ var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == taskInfo.EndStation && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business); ledText += $"任务类型:{modTask.TaskType.GetDescription()}\n\n"; ledText += $"任务å·:{modTask.TaskNo}\n"; ledText += $"托盘å·:{modTask.PalletNo}\n\n"; ledText += $"èµ·å§‹ä½:{modTask.StartRoadway + " " + modTask.StartLocate}\n"; ledText += $"ç›®æ ‡ä½:{modTask.EndRoadway + " " + modTask.EndLocate}"; LedDisplay(ledDevice.LedIP, ledText); } } break; case "840": // å–è´§å®Œæˆ { // 获å–跺机点ä½é…ç½® var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务å·"); var (res, val) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); if (res.IsSucceed) { // 获å–ä»»åŠ¡ä¿¡æ¯ string tasknoVal = val.ToString(); var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == false); if (modTask == null) { Log.Error(string.Format($"PLC控制å—840:未找到对应的任务。任务å·ï¼š{tasknoVal}")); break; } // 记录任务明细 var modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, PalletNo = modTask.PalletNo, Status = TaskStatusEnum.Complete, StartLocat = modTask.StartLocate, }; var modPosEndStation = modDevice.listStation.FirstOrDefault(m => m.Text == "目的工ä½"); var (endRes, endStation) = plcConn.GetPlcDBValue(modPosEndStation.PosType, modDevice.DbNumber, modPosEndStation.PlcPos); var modPosStartStation = modDevice.listStation.FirstOrDefault(m => m.Text == "èµ·å§‹å·¥ä½"); var (startStationRes, startStationVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.Short, modDevice.DbNumber, modPosStartStation.PlcPos); if (modTask.TaskType == TaskTypeEnum.In) { // 获å–跺机起始工ä½ç‚¹ä½é…ç½®,读å–èµ·å§‹å·¥ä½ if (startStationRes.IsSucceed) { // æ ¹æ®å·¥ä½å·èŽ·å–对应的输é€çº¿IP PLCUtil plcConveyorConn = PLCCommon.GetPlcIp(startStationVal.ToString().PadLeft(3, '0')); if (plcConveyorConn.Connected) { // å‘å–è´§å·¥ä½å†™å…¥æµç¨‹å—640 å–è´§å·²å®Œæˆ var ConveyorMod = PLCTaskAction.plcDevices.First(m => m.StationNum == startStationVal.ToString().PadLeft(3, '0') && m.DeviceType == DeviceTypeEnum.Business && m.IsDelete == false); var modcTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = ConveyorMod.Id, PlcName = ConveyorMod.Text, PalletNo = modTask.PalletNo, Status = TaskStatusEnum.Complete, StartLocat = startStationVal.ToString(), EndLocat = modTask.EndLocate // ç›®æ ‡å‚¨ä½åœ°å€ }; // 读å–wcsæŽ§åˆ¶å— var (ress, va1s) = plcConveyorConn.GetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos); if (va1s.ToString() == "630") { var retc = plcConveyorConn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "640"); if (retc.IsSucceed) { // 冿¬¡è¯»å–wcs控制å—,ç¡®ä¿å†™å…¥æˆåŠŸ640 var (ress2, va1s2) = plcConveyorConn.GetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos); if (va1s2.ToString() == "630")//还是ç‰äºŽ630说明640没有写入æˆåŠŸï¼Œå†æ¬¡å†™å…¥640 { retc = plcConveyorConn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "640"); Log.Information($"840垛机å–货完æˆå†™å…¥640失败åŽå†æ¬¡å†™å…¥ï¼ŒDbNumber:{ConveyorMod.DbNumber}"); } modcTaskMonitor.InteractiveMsg = string.Format("å·¥ä½ï¼š{0},写入å–货完æˆ:640", startStationVal); // æ’入交互日志 _db.Insertable(modcTaskMonitor).ExecuteCommand(); } else { modcTaskMonitor.InteractiveMsg = string.Format("å·¥ä½ï¼š{0},写入å–货完æˆ640失败", startStationVal); // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); break; } //下å‘任务日志 HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); // 读å–wcsæŽ§åˆ¶å— var (resss, va1ss) = plcConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos); if (va1ss.ToString() == "830") { modInsertTaskMonitor.InteractiveMsg = string.Format("å·¥ä½ï¼š{0}跺机å–货完æˆå†™å…¥850", startStationVal); modInsertTaskMonitor.EndLocat = modTask.EndLocate; // ç›®æ ‡å‚¨ä½åœ°å€ // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); } // 写入æµç¨‹æŽ§åˆ¶å— var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "850"); if (!ret.IsSucceed) { modInsertTaskMonitor.InteractiveMsg = string.Format("å·¥ä½ï¼š{0}跺机å–货完æˆå†™å…¥850失败,ç‰å¾…冿¬¡å†™å…¥ã€‚", startStationVal); modInsertTaskMonitor.EndLocat = modTask.EndLocate; // ç›®æ ‡å‚¨ä½åœ°å€ // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); break; // 写入失败跳出ç‰å¾…冿¬¡å†™å…¥ } //下å‘任务日志 HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); } } } } else if (modTask.TaskType == TaskTypeEnum.Out) { #region 跺机转è¿ä»»åŠ¡å¤„ç† if (modTask.StartRoadway != modDevice.StationNum) {// 转è¿ä»»åŠ¡ // 写入起始工ä½640 string stationFrom = startStationVal.ToString(); var plcItemconn = PLCCommon.GetPlcIp(stationFrom); if (plcItemconn.Connected) { // 写入起始工ä½640 var modFrom = PLCTaskAction.plcDevices.First(m => m.IsDelete == false && m.StationNum == stationFrom); var retFrom = plcItemconn.SetPlcDBValue(modFrom.PosType, modFrom.DbNumber, modFrom.WcsPos, "640"); if (retFrom.IsSucceed) { Log.Error(stationFrom + "ä¸è½¬å·¥ä½å†™å…¥640"); } else { break; } // 读å–wcsæŽ§åˆ¶å— var (resss, va1ss) = plcConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos); if (va1ss.ToString() == "830") { // 记录任务明细 modInsertTaskMonitor.InteractiveMsg = string.Format("储ä½åœ°å€ï¼š{0}å–货完æˆå†™å…¥850", modTask.StartLocate); modInsertTaskMonitor.EndLocat = endStation.ToString(); // æ”¾è´§å·¥ä½ } // 写入æµç¨‹æŽ§åˆ¶å— var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "850"); if (!ret.IsSucceed) { modInsertTaskMonitor.InteractiveMsg = string.Format("储ä½åœ°å€ï¼š{0}å–货完æˆå†™å…¥850失败,ç‰å¾…冿¬¡å†™å…¥ã€‚", modTask.StartLocate); modInsertTaskMonitor.EndLocat = modTask.EndLocate; // ç›®æ ‡å‚¨ä½åœ°å€ // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); break; // 写入失败跳出ç‰å¾…冿¬¡å†™å…¥ } //下å‘任务日志 HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); } } else { //if (modTask.EndLocate == "266" && modTask.StartRoadway == "R06") //{ // // R06å··é“å•独转è¿ä»»åŠ¡ã€‚ // // 写入起始工ä½640 // string stationFrom = startStationVal.ToString(); // var plcItemconn = PLCCommon.GetPlcIp(stationFrom); // var modFrom = PLCTaskAction.plcDevices.First(m => m.IsDelete == false && m.StationNum == stationFrom); // var retFrom = plcItemconn.SetPlcDBValue(modFrom.PosType, modFrom.DbNumber, modFrom.WcsPos, "640"); // if (retFrom.IsSucceed) // { // Log.Error(stationFrom + "ä¸è½¬å·¥ä½å†™å…¥640"); // } // else // { // break; // } // // 读å–wcsæŽ§åˆ¶å— // var (resss, va1ss) = plcConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos); // if (va1ss.ToString() == "830") // { // // 记录任务明细 // modInsertTaskMonitor.InteractiveMsg = string.Format("储ä½åœ°å€ï¼š{0}å–货完æˆå†™å…¥850", modTask.StartLocate); // modInsertTaskMonitor.EndLocat = endStation.ToString(); // æ”¾è´§å·¥ä½ // } // // 写入æµç¨‹æŽ§åˆ¶å— // var ret11 = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "850"); // if (!ret11.IsSucceed) // { // modInsertTaskMonitor.InteractiveMsg = string.Format("储ä½åœ°å€ï¼š{0}å–货完æˆå†™å…¥850失败,ç‰å¾…冿¬¡å†™å…¥ã€‚", modTask.StartLocate); // modInsertTaskMonitor.EndLocat = modTask.EndLocate; // ç›®æ ‡å‚¨ä½åœ°å€ // // æ’入交互日志 // _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); // break; // 写入失败跳出ç‰å¾…冿¬¡å†™å…¥ // } // //下å‘任务日志 // HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); // break; //} // 写入æµç¨‹æŽ§åˆ¶å— var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "850"); if (!ret.IsSucceed) { break; // 写入失败跳出ç‰å¾…冿¬¡å†™å…¥ } modInsertTaskMonitor.InteractiveMsg = string.Format("储ä½åœ°å€ï¼š{0}å–货完æˆ", modTask.StartLocate); modInsertTaskMonitor.EndLocat = endStation; // ç›®æ ‡å‚¨ä½ // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); } #endregion } else { // 写入æµç¨‹æŽ§åˆ¶å— var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "850"); if (!ret.IsSucceed) { break; // 写入失败跳出ç‰å¾…冿¬¡å†™å…¥ } modInsertTaskMonitor.InteractiveMsg = string.Format("储ä½åœ°å€ï¼š{0}å–货完æˆ", modTask.StartLocate); modInsertTaskMonitor.EndLocat = endStation.ToString(); // ç›®æ ‡å‚¨ä½ // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); } } } break; case "860": //è·ºæœºæ”¾è´§å®Œæˆ { // 获å–跺机点ä½é…ç½® var modPos860Task = modDevice.listStation.FirstOrDefault(m => m.Text == "任务å·"); var (res, val) = plcConn.GetPlcDBValue(modPos860Task.PosType, modDevice.DbNumber, modPos860Task.PlcPos); // æ ¹æ®ä»»åŠ¡å·èŽ·å–ä»»åŠ¡ä¿¡æ¯ if (res.IsSucceed) { string tasknoVal = val.ToString(); var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == false); if (modTask == null) { Log.Error(string.Format("跺机控制å—860:未找到对应的任务。")); break; } switch (modTask.TaskType) { case TaskTypeEnum.In: { #region 跨跺机转è¿ä»»åС处ç†##### // åˆ¤æ–æ˜¯å¦è·¨è·ºæœºè½¬è¿ä»»åŠ¡ var modPos860endAddre = modDevice.listStation.FirstOrDefault(m => m.Text == "目的工ä½"); var (ress, endVal) = plcConn.GetPlcDBValue(modPos860endAddre.PosType, modDevice.DbNumber, modPos860endAddre.PlcPos); string endValStr = endVal.ToString().PadLeft(3, '0'); // æ ¹æ®å··é“ã€å±‚数获å–å…¥åº“æ”¾è´§å·¥ä½ var inVal = PLCCommon.RoadwayToStationNum(modTask.EndRoadway, "1"); var inVal1 = PLCCommon.RoadwayToStationNum(modTask.EndRoadway, "2", modTask.StartLocate.ToString()); // æ ¹æ®å½“å‰è·ºæœºæ”¾è´§å·¥ä½å¯¹æ¯”ç›®æ ‡å··é“入库å–è´§å·¥ä½åšå¯¹æ¯”确认是å¦è½¬è¿ä»»åŠ¡ã€‚ if (endValStr != inVal && endValStr != inVal1) { // æ ¹æ®å·¥ä½å·èŽ·å–输é€çº¿é“¾æŽ¥ var plcCconn = PLCCommon.GetPlcIp(endValStr); if (plcCconn.Connected) { // 写入转è¿ä¿¡æ¯ // ç»™PLCå†™å…¥ä»»åŠ¡æ•°æ® var listResult = new List<Result>(); // æ ¹æ®å·¥ä½å·èŽ·å–å·¥ä½ä¿¡æ¯ var wcsDevice = PLCTaskAction.plcDevices.First(s => s.PlcId == plcCconn.PlcId && s.Level == DeviceLevelEnum.Station && s.StationNum == endValStr); // 读å–当å‰å·¥ä½å„åç§»é‡å€¼ var listPos = PLCTaskAction.plcPositions.Where(s => s.DeviceId == wcsDevice.Id).ToList(); //ä»»åŠ¡å· var modPosTask = listPos.FirstOrDefault(s => s.Text == "任务å·"); listResult.Add(plcCconn.SetPlcDBValueRepeat(modPosTask.PosType, wcsDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo)); //任务类型 var modPosTaskType = listPos.FirstOrDefault(s => s.Text == "任务类型"); listResult.Add(plcCconn.SetPlcDBValueRepeat(modPosTaskType.PosType, wcsDevice.DbNumber, modPosTaskType.PlcPos, ((int)modTask.TaskType).ToString())); //æ‰˜ç›˜å· var modPosPalletNo = listPos.FirstOrDefault(s => s.Text == "托盘ç "); listResult.Add(plcCconn.SetPlcDBValueRepeat(modPosPalletNo.PosType, wcsDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); //èµ·å§‹å·¥ä½ var modPosLocatNo = listPos.FirstOrDefault(s => s.Text == "èµ·å§‹å·¥ä½"); listResult.Add(plcCconn.SetPlcDBValueRepeat(modPosLocatNo.PosType, wcsDevice.DbNumber, modPosLocatNo.PlcPos, endValStr)); // ç›®æ ‡å·¥ä½ var modPosEndLocatNo = listPos.FirstOrDefault(s => s.Text == "目的工ä½"); listResult.Add(plcCconn.SetPlcDBValueRepeat(modPosEndLocatNo.PosType, wcsDevice.DbNumber, modPosEndLocatNo.PlcPos, inVal)); // 是å¦å†™å…¥æˆåŠŸ if (listResult.All(s => s.IsSucceed)) { var result = plcCconn.SetPlcDBValue(wcsDevice.PosType, wcsDevice.DbNumber, wcsDevice.WcsPos, "740"); if (result.IsSucceed) { // 写入跺机wcsæŽ§åˆ¶å— è¿”å›žåž›æœºæ‰§è¡Œå®Œæˆ result = modDevice.PLCUtil.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "870"); if (result.IsSucceed) { var modcTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = wcsDevice.Id, PlcName = wcsDevice.Text, PalletNo = modTask.PalletNo, Status = TaskStatusEnum.Complete, StartLocat = "", EndLocat = modTask.EndRoadway, InteractiveMsg = $"写入指令:收到跺机放货完æˆï¼›æ”¾è´§{endValStr}å·¥ä½===》{inVal}å·¥ä½" }; // æ’入交互日志 _db.Insertable(modcTaskMonitor).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>()); break; } } } } } // å‘å·¥ä½å†™å…¥ï¼Œå½“å‰å·¥ä½åˆ°ç›®æ ‡å··é“入库å–è´§å·¥ä½æµç¨‹ã€‚写入æµç¨‹æŽ§åˆ¶å—"740" #endregion var res870 = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "870"); if (!res870.IsSucceed) { Log.Error(string.Format("跺机控制å—860写入870失败!")); break; } // 改å˜ä»»åŠ¡çŠ¶æ€ modTask.Status = TaskStatusEnum.Complete; modTask.FinishDate = DateTime.Now; _db.Updateable(modTask).ExecuteCommand(); HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); var modTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, PalletNo = modTask.PalletNo, Status = TaskStatusEnum.Complete, StartLocat = modTask.StartLocate, EndLocat = modTask.EndLocate, InteractiveMsg = $"任务完æˆ" }; if (modTask.Origin == "WMS") { // å馈WMS var requestMode = new TaskRequestWMS() { TaskNo = modTask.TaskNo, PalletNo = modTask.PalletNo, TaskType = ((int)TaskTypeEnum.In).ToString(), TaskStatus = ((int)TaskStatusEnum.Complete).ToString() }; HttpService httpService = new HttpService(); var modResponseTask = httpService.RequestTask(requestMode).Result; if (modResponseTask.StatusCode == 0) { modTaskMonitor.InteractiveMsg = "任务完æˆï¼Œè¿”回给WMS任务完æˆ"; } else { Log.Error(string.Format("c:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg)); } } // æ ¹æ®ä»»åŠ¡å·èŽ·å–èµ·å§‹å·¥ä½åœ°å€ï¼Œæ ¹æ®èµ·å§‹å·¥ä½åœ°å€èŽ·å–LEDIP 推é€åˆ°LEDå±å¹•。 modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == modTask.StartLocate).Select(s => s.LedIP).First(); // æ’入交互日志 _db.Insertable(modTaskMonitor).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); // led显示内容 var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modTask.StartLocate && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business); ledText += $"入库完æˆ\n\n"; ledText += $"任务å·:{modTask.TaskNo}\n"; ledText += $"托盘å·:{modTask.PalletNo}\n\n"; ledText += $"èµ·å§‹ä½:{modTask.StartRoadway + " " + modTask.StartLocate}\n"; ledText += $"ç›®æ ‡ä½:{modTask.EndRoadway + " " + modTask.EndLocate}"; LedDisplay(ledDevice.LedIP, ledText); // æ¤å¤„æ·»åŠ ä¸ç©ºè·‘业务 } break; case TaskTypeEnum.Out: // 出库任务 { string roadway = modTask.StartRoadway; // ä»Žå‡ºåº“ä»»åŠ¡èŽ·å–æ”¾è´§å·¥ä½ string outCode = modTask.EndLocate; #region 跨跺机转è¿ä»»åŠ¡ ########## var modPosStation = modDevice.listStation.FirstOrDefault(m => m.Text == "目的工ä½"); var (ress, stationNum) = plcConn.GetPlcDBValue(modPosStation.PosType, modDevice.DbNumber, modPosStation.PlcPos); if (!ress.IsSucceed) { // 获å–当剿‰˜ç›˜æ‰€åœ¨å·¥ä½å¤±è´¥ break; } // æ ¹æ®ç›®æ ‡åœ°å€å’Œå··é“èŽ·å–æ”¾è´§å·¥ä½å¯¹åº”的排列层 PlcTaskInfo taskInfo = PLCCommon.GetCTaskInfo(modTask.EndLocate, ((int)modTask.TaskType).ToString(), modTask.StartRoadway, modTask.EndRoadway); string stationNumstr = stationNum.ToString(); if (!taskInfo.EndStation.Contains(stationNumstr) && stationNumstr != "0") { // 是跺机ä¸ä¸“å·¥ä½ //taskInfo.EndStation = stationNumstr; string roadwayto = "R05"; // æ ¹æ®å‡ºåº“壿”¾è´§å·¥ä½èŽ·å–对应的ä¸è½¬å··é“ if (taskInfo.EndStation.Contains("277")) { roadwayto = "R05"; } else if (taskInfo.EndStation.Contains("250")) { roadwayto = "R06"; } // æ ¹æ®å±‚æ•°å’Œå··é“æ•°ç¡®å®šä¸ä¸“å·¥ä½ outCode = PLCCommon.RoadwayToStationNum(roadwayto, "1"); } #endregion // æ ¹æ®å·¥ä½å·èŽ·å–对应的输é€çº¿IP var plcConveyorConn = PLCCommon.GetPlcIp(stationNumstr); if (plcConveyorConn.Connected) { stationNumstr = stationNumstr.PadLeft(3, '0'); // æ ¹æ®å·¥ä½å·èŽ·å–å·¥ä½ä¿¡æ¯ var wcsDevice = PLCTaskAction.plcDevices.First(s => s.PlcId == plcConveyorConn.PlcId && s.Level == DeviceLevelEnum.Station && s.StationNum == stationNumstr); // 读å–当å‰å·¥ä½å„åç§»é‡å€¼ var listPos = PLCTaskAction.plcPositions.Where(s => s.DeviceId == wcsDevice.Id).ToList(); // ç»™PLCå†™å…¥ä»»åŠ¡æ•°æ® var listResult = new List<Result>(); //ä»»åŠ¡å· var modPosTask = listPos.FirstOrDefault(s => s.Text == "任务å·"); listResult.Add(plcConveyorConn.SetPlcDBValueRepeat(modPosTask.PosType, wcsDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo)); //任务类型 var modPosTaskType = listPos.FirstOrDefault(s => s.Text == "任务类型"); listResult.Add(plcConveyorConn.SetPlcDBValueRepeat(modPosTaskType.PosType, wcsDevice.DbNumber, modPosTaskType.PlcPos, ((int)modTask.TaskType).ToString())); //æ‰˜ç›˜å· var modPosPalletNo = listPos.FirstOrDefault(s => s.Text == "托盘ç "); listResult.Add(plcConveyorConn.SetPlcDBValueRepeat(modPosPalletNo.PosType, wcsDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); //èµ·å§‹å·¥ä½ var modPosLocatNo = listPos.FirstOrDefault(s => s.Text == "èµ·å§‹å·¥ä½"); listResult.Add(plcConveyorConn.SetPlcDBValueRepeat(modPosLocatNo.PosType, wcsDevice.DbNumber, modPosLocatNo.PlcPos, stationNumstr)); // ç›®æ ‡å·¥ä½ var modPosEndLocatNo = listPos.FirstOrDefault(s => s.Text == "目的工ä½"); listResult.Add(plcConveyorConn.SetPlcDBValueRepeat(modPosEndLocatNo.PosType, wcsDevice.DbNumber, modPosEndLocatNo.PlcPos, outCode)); // 是å¦å†™å…¥æˆåŠŸ if (listResult.All(s => s.IsSucceed)) { var result = plcConveyorConn.SetPlcDBValue(wcsDevice.PosType, wcsDevice.DbNumber, wcsDevice.WcsPos, "740"); if (result.IsSucceed) { // 写入跺机wcsæŽ§åˆ¶å— è¿”å›žåž›æœºæ‰§è¡Œå®Œæˆ result = modDevice.PLCUtil.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "870"); if (result.IsSucceed) { var modcTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = wcsDevice.Id, PlcName = wcsDevice.Text, PalletNo = modTask.PalletNo, Status = TaskStatusEnum.Complete, StartLocat = taskInfo.EndStation, EndLocat = outCode, InteractiveMsg = $"写入指令:收到跺机放货完æˆï¼›æ”¾è´§{taskInfo.EndStation}å·¥ä½===》{outCode}å·¥ä½" }; // æ’入交互日志 _db.Insertable(modcTaskMonitor).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>()); break; } } } //æ¤å¤„æ·»åŠ ä¸ç©ºè·‘业务 } } break; case TaskTypeEnum.Move: // 移库任务 { var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务å·"); var result = plcConn.SetPlcDBValueRepeat(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo); if (!result.IsSucceed) { Log.Error($"{modDevice.Text}写入任务å·å¤±è´¥"); break; } result = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "870"); if (!result.IsSucceed) { Log.Error($"{modDevice.Text}控制å—写入870失败"); break; } // 改å˜ä»»åŠ¡çŠ¶æ€ modTask.Status = TaskStatusEnum.Complete; modTask.FinishDate = DateTime.Now; modTask.Levels = 999; _db.Updateable(modTask).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); var modcTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, PalletNo = modTask.PalletNo, Status = TaskStatusEnum.Complete, StartLocat = modTask.StartLocate, EndLocat = modTask.EndLocate, InteractiveMsg = $"任务完æˆ" }; if (modTask.Origin == "WMS") { // å馈WMS var requestMode = new TaskRequestWMS() { TaskNo = modTask.TaskNo, PalletNo = modTask.PalletNo, TaskType = ((int)TaskTypeEnum.Move).ToString(), TaskStatus = ((int)TaskStatusEnum.Complete).ToString() }; HttpService httpService = new HttpService(); var modResponseTask = httpService.RequestTask(requestMode).Result; if (modResponseTask.StatusCode == 0) { modcTaskMonitor.InteractiveMsg = "任务完æˆï¼Œè¿”回给WMS任务完æˆ"; //修改储ä½ä¿¡æ¯ 任务类型 æ‰§è¡ŒçŠ¶æ€ èµ·å§‹ä½ç½® ç›®æ ‡ä½ç½® } else { Log.Error(string.Format("任务å馈失败:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg)); } } // æ’入交互日志 _db.Insertable(modcTaskMonitor).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>()); // æ¤å¤„æ·»åŠ ä¸ç©ºè·‘业务 } break; default: break; } } } break; case "841": { } break; case "843": { //空å–货异常 var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务å·"); var (result, TaskNo) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); if (!result.IsSucceed) break; string taskNo = Convert.ToString(TaskNo); var modTask = _db.Queryable<WcsTask>().First(s => s.TaskNo == taskNo && s.Status == TaskStatusEnum.Doing); if (modTask == null) { Log.Error($"ã€å †åž›æœºã€‘当å‰ä»»åŠ¡å·ä¸å˜åœ¨å¯¹åº”的任务,任务å·ï¼š{modTask.TaskNo}"); break; } var res = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "844"); if (!res.IsSucceed) break; modTask.Status = TaskStatusEnum.Exception; _db.Updateable(modTask).UpdateColumns(s => s.Status).ExecuteCommand(); HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); Log.Information($"ã€å †åž›æœºã€‘wcsä»»åŠ¡å˜æ›´ç©ºå–异常,任务å·ï¼š{modTask.TaskNo}"); var modTaskRequest = modTask.Adapt<TaskRequest>(); HttpService httpService = new HttpService(); var modResponseTask = httpService.RequestEmptyException(modTaskRequest).Result; if (modResponseTask.StatusCode == "0") { //请求æˆåŠŸ modTask.IsSuccess = TaskSuccessEnum.Success; _db.Updateable(modTask).UpdateColumns(s => s.IsSuccess).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); } else { //请求失败 modTask.IsSuccess = TaskSuccessEnum.Fail; modTask.Information = modResponseTask.Message; _db.Updateable(modTask).UpdateColumns(s => new { s.IsSuccess, s.Information }).ExecuteCommand(); HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); } } break; case "861": { //满放货异常 var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务å·"); var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘å·"); var (result, TaskNo) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); if (!result.IsSucceed) break; string taskNo = Convert.ToString(TaskNo); var modTask = _db.Queryable<WcsTask>().First(s => s.TaskNo == taskNo && s.Status == TaskStatusEnum.Doing); if (modTask == null) { Log.Error($"ã€å †åž›æœºã€‘当å‰ä»»åŠ¡å·ä¸å˜åœ¨å¯¹åº”的任务,任务å·ï¼š{modTask.TaskNo}"); break; } modTask.Status = TaskStatusEnum.Exception; _db.Updateable(modTask).UpdateColumns(s => s.Status).ExecuteCommand(); HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); Log.Information($"ã€å †åž›æœºã€‘wcsä»»åŠ¡å˜æ›´æ»¡å–异常,任务å·ï¼š{modTask.TaskNo}"); var modTaskRequest = modTask.Adapt<TaskRequest>(); HttpService httpService = new HttpService(); var modResponseTask = httpService.RequestFullException(modTaskRequest).Result; if (modResponseTask.StatusCode == "0") { //修改任务为æ£åœ¨æ‰§è¡Œ modTask.Status = TaskStatusEnum.Doing; _db.Updateable(modTask).UpdateColumns(s => s.Status).ExecuteCommand(); // 起始排列层 var modPosRow = modDevice.listStation.FirstOrDefault(s => s.Text == "å–货排"); var modPosColumn = modDevice.listStation.FirstOrDefault(s => s.Text == "å–货列"); var modPosStorey = modDevice.listStation.FirstOrDefault(s => s.Text == "å–货层"); // ç›®æ ‡æ”¾è´§å·¥ä½ var modPosEndRow = modDevice.listStation.FirstOrDefault(s => s.Text == "放货排"); var modPosEndColumn = modDevice.listStation.FirstOrDefault(s => s.Text == "放货列"); var modPosEndStorey = modDevice.listStation.FirstOrDefault(s => s.Text == "放货层"); string endLocat = modResponseTask.TaskList.EndLocate; string row = int.Parse(endLocat.Substring(0, 2)).ToString(); string column = int.Parse(endLocat.Substring(2, 2)).ToString(); string storey = int.Parse(endLocat.Substring(4, 2)).ToString(); // ç»™PLCå†™å…¥ä»»åŠ¡æ•°æ® var listResult = new List<Result>(); // ä»»åŠ¡å·æ‰˜ç›˜å· listResult.Add(plcConn.SetPlcDBValueRepeat(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo)); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); // 起始排列层 listResult.Add(plcConn.SetPlcDBValueRepeat(modPosRow.PosType, modDevice.DbNumber, modPosRow.PlcPos, "2")); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosColumn.PosType, modDevice.DbNumber, modPosColumn.PlcPos, "100")); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosStorey.PosType, modDevice.DbNumber, modPosStorey.PlcPos, "1")); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosEndRow.PosType, modDevice.DbNumber, modPosEndRow.PlcPos, row)); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosEndColumn.PosType, modDevice.DbNumber, modPosEndColumn.PlcPos, column)); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosEndStorey.PosType, modDevice.DbNumber, modPosEndStorey.PlcPos, storey)); // 是å¦å†™å…¥æˆåŠŸ if (listResult.All(s => s.IsSucceed)) { // å‘跺机写入控制æµç¨‹å— var res = modDevice.PLCUtil.SetPlcDBValue(modDevice.PosType, modDevice.WcsPos, "862"); var modcTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, PalletNo = modTask.PalletNo, Status = TaskStatusEnum.Complete, StartLocat = modDevice.StationNum, EndLocat = endLocat, InteractiveMsg = $"写入指令:{modDevice.StationNum}å·¥ä½====》" + endLocat + "储ä½åœ°å€!" }; // æ’入交互日志 _db.Insertable(modcTaskMonitor).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>()); } } //else //{ // //请求失败 // modTask.IsSuccess = TaskSuccessEnum.Fail; // modTask.Information = modResponseTask.Message; // _db.Updateable(modTask).UpdateColumns(s => new { s.IsSuccess, s.Information }).ExecuteCommand(); //} } break; default: break; } } /// <summary> /// ä¸ç©ºè·‘ /// </summary> /// <param name="modTask">æ“作完æˆçš„任务</param> /// <param name="plcConn">plc连接</param> /// <param name="modDevice">设备信æ¯</param> private static void ContinuousOperation(WcsTask modTask, PLCUtil plcConn, WcsDeviceDto modDevice) { // 查询所有待执行的任务 var listTask = _db.Queryable<WcsTask>().Where(s => s.Status == TaskStatusEnum.Wait).ToList(); WcsTask modNextTask = null; switch (modTask.TaskType) { case TaskTypeEnum.In: { // 先找出对应排列层的入库任务 var listInTask = listTask.Where(s => s.TaskType == TaskTypeEnum.In) .Select(s => s.EndLocate.Substring(0, 6)) .ToHashSet(); // 找出库任务,对应巷é“的任务 var listNextTask = listTask.Where(s => s.TaskType == TaskTypeEnum.Out && s.StartRoadway == modTask.EndRoadway).ToList(); foreach (var modNext in listNextTask) { // 如果有对应排列层的入库任务,那就ä¸èƒ½ä¼˜å…ˆæ‰§è¡Œ if (listInTask.Contains(modNext.EndLocate.Substring(0, 6))) { continue; } // todo: 写入modNext任务信æ¯ç»™plc Console.WriteLine($"入库任务{modTask.TaskNo}执行完æˆåŽï¼Œä¸ç©ºè·‘逻辑检测下一任务为{modNext.TaskNo}"); modNextTask = modNext; break; } } break; case TaskTypeEnum.Out: { // 先找出对应排列层的出库任务 var listInTask = listTask.Where(s => s.TaskType == TaskTypeEnum.Out) .Select(s => s.EndLocate.Substring(0, 6)) .ToHashSet(); // 找入库任务,对应巷é“的任务 var listNextTask = listTask.Where(s => s.TaskType == TaskTypeEnum.In && s.StartRoadway == modTask.EndRoadway).ToList(); foreach (var modNext in listNextTask) { // 如果有对应排列层的出库任务,那就ä¸èƒ½ä¼˜å…ˆæ‰§è¡Œ if (listInTask.Contains(modNext.EndLocate.Substring(0, 6))) { continue; } // todo: 写入modNext任务信æ¯ç»™plc Console.WriteLine($"出库任务{modTask.TaskNo}执行完æˆåŽï¼Œä¸ç©ºè·‘逻辑检测下一任务为{modNext.TaskNo}"); modNextTask = modNext; break; } } break; case TaskTypeEnum.Move: { var modDevicePos = _db.Queryable<WcsDevice>().Where(s => s.PlcId == plcConn.PlcId && s.DeviceType == DeviceTypeEnum.Show).First(); var (result, value) = plcConn.GetPlcDBValue(modDevicePos.PosType, modDevicePos.DbNumber, modDevicePos.PlcPos); //当å‰å †åž›æœºæ‰€åœ¨ä½ç½® var height = Math.Round(value / 790000d * 200).ToInt(); //todo:这里看能ä¸èƒ½æ‰¾åˆ°å †åž›æœºæ‰€åœ¨ä½ç½®åœ¨å“ªä¸ªæŽ’列层,优先寻找附近的任务? } break; } if (modNextTask != null) { // 获å–转æ¢åŽçš„起始排列层 06010101 PlcTaskInfo startTaskInfo = PLCCommon.GetEndPai(modTask.StartRoadway.Substring(1, 2), modTask.StartLocate.Substring(2, 2), modTask.StartLocate.Substring(0, 2), modTask.StartLocate.Substring(4, 2), modTask.StartLocate.Substring(6, 2)); // ç»™PLCå†™å…¥ä»»åŠ¡æ•°æ® var listResult = new List<Result>(); // ä»»åŠ¡å·æ‰˜ç›˜å· var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务å·"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo)); var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘ç "); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); // 起始排列层 var modPosRow = modDevice.listStation.FirstOrDefault(s => s.Text == "å–货排"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosRow.PosType, modDevice.DbNumber, modPosRow.PlcPos, startTaskInfo.EndPai)); var modPosColumn = modDevice.listStation.FirstOrDefault(s => s.Text == "å–货列"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosColumn.PosType, modDevice.DbNumber, modPosColumn.PlcPos, startTaskInfo.EndLie)); var modPosStorey = modDevice.listStation.FirstOrDefault(s => s.Text == "å–货层"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosStorey.PosType, modDevice.DbNumber, modPosStorey.PlcPos, startTaskInfo.EndCeng)); // ç›®æ ‡æ”¾è´§å·¥ä½(固定排列层) PlcTaskInfo taskInfo = PLCCommon.GetCTaskInfo(modTask.EndLocate, ((int)modTask.TaskType).ToString(), modTask.StartRoadway, modTask.EndRoadway); var modPosEndRow = modDevice.listStation.FirstOrDefault(s => s.Text == "放货排"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosEndRow.PosType, modDevice.DbNumber, modPosEndRow.PlcPos, taskInfo.EndPai)); var modPosEndColumn = modDevice.listStation.FirstOrDefault(s => s.Text == "放货列"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosEndColumn.PosType, modDevice.DbNumber, modPosEndColumn.PlcPos, taskInfo.EndLie)); var modPosEndStorey = modDevice.listStation.FirstOrDefault(s => s.Text == "放货层"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosEndStorey.PosType, modDevice.DbNumber, modPosEndStorey.PlcPos, taskInfo.EndCeng)); // 是å¦å†™å…¥æˆåŠŸ if (listResult.All(s => s.IsSucceed)) { // 写入跺机任务下å‘å®Œæˆ var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "830"); // 将移库任务待执行改为æ£åœ¨æ‰§è¡Œ _db.Updateable<WcsTask>() .SetColumns(s => s.Status == TaskStatusEnum.Doing) .Where(s => s.Id == modTask.Id) .ExecuteCommand(); HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); WcsTaskMonitor modInsertTaskMonitor; if (string.IsNullOrEmpty(taskInfo.EndStation)) { // åŒå··é“移库 modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, InteractiveMsg = $"写入指令:{modTask.StartLocate}储ä½====》{modTask.EndLocate}储ä½ã€‚", PalletNo = modTask.PalletNo, Status = TaskStatusEnum.Complete, StartLocat = modTask.StartLocate, EndLocat = modTask.EndLocate, }; } else { // 出库任务 跨巷é“移库 modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, InteractiveMsg = $"写入指令:{modTask.StartLocate}储ä½====》{taskInfo.EndStation}å·¥ä½ã€‚", PalletNo = modTask.PalletNo, Status = TaskStatusEnum.Complete, StartLocat = modTask.StartLocate, EndLocat = modTask.EndLocate, }; } // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); //修改ledå±ä¿¡æ¯ //LedDisplay(modDevice.LedIP, "å·¥ä½:" + modTask.EndLocate, "å‡ºåº“ä¸ " + $"储ä½åœ°å€ï¼š{modTask.StartLocate}", "托盘å·:" + modTask.PalletNo); } } } /// <summary> /// 输é€çº¿ä¸šåŠ¡å¤„ç† /// </summary> /// <param name="modDevice"></param> private static void ConveyorLine(WcsDeviceDto modDevice) { var plcConn = modDevice.PLCUtil; // èŽ·å–æ¥¼å±‚æ•°ceshi var louCeng = PLCCommon.GetRoadwayByStationNew(modDevice.StationNum); if (louCeng == "") { return; } #region#实时显示é‡é‡åˆ°LEDå±å¹• var modPosPalletWeightIng = modDevice.listStation.FirstOrDefault(m => m.Text == "实际é‡é‡"); if (modPosPalletWeightIng != null) { var (resPalletWeightIng, palletWeightValIng) = plcConn.GetPlcDBValue(modPosPalletWeightIng.PosType, modDevice.DbNumber, modPosPalletWeightIng.PlcPos); switch (modDevice.StationNum) { case "094": { if (Convert.ToDecimal(palletWeightValIng) != weight94) { LedDisplay(modDevice.LedIP, $"当å‰é‡é‡(KG):{Convert.ToDecimal(palletWeightValIng)}"); weight94 = Convert.ToDecimal(palletWeightValIng); } } break; case "160": { if (Convert.ToDecimal(palletWeightValIng) != weight160) { LedDisplay(modDevice.LedIP, $"当å‰é‡é‡(KG):{Convert.ToDecimal(palletWeightValIng)}"); weight160 = Convert.ToDecimal(palletWeightValIng); } } break; case "155": { if (Convert.ToDecimal(palletWeightValIng) != weight155) { LedDisplay(modDevice.LedIP, $"当å‰é‡é‡(KG):{Convert.ToDecimal(palletWeightValIng)}"); weight155 = Convert.ToDecimal(palletWeightValIng); } } break; case "152": { if (Convert.ToDecimal(palletWeightValIng) != weight152) { LedDisplay(modDevice.LedIP, $"当å‰é‡é‡(KG):{Convert.ToDecimal(palletWeightValIng)}"); weight152 = Convert.ToDecimal(palletWeightValIng); } } break; case "153": { if (Convert.ToDecimal(palletWeightValIng) != weight153) { LedDisplay(modDevice.LedIP, $"当å‰é‡é‡(KG):{Convert.ToDecimal(palletWeightValIng)}"); weight153 = Convert.ToDecimal(palletWeightValIng); } } break; } } #endregion var ledText = ""; switch (modDevice.Value.ToString()) { case "120": { // 120:空闲; wcs调度å°è½¦å†™130请求放(å ä½å·¥ä½) } break; case "140": { // 140:坿”¾ï¼›å†™å…¥ä»»åŠ¡å·ç‰äº¤äº’ä¿¡æ¯æœ€åŽå†™å…¥150æ£åœ¨æ”¾ï¼› wcs接å—wmså‘é€çš„å°è½¦ä»»åŠ¡å®Œæˆä¿¡å·åŽå˜æ›´ä¸ºï¼š160: var http = new HttpService(); var modResponseTask = http.IssuedAgvTask(modDevice.StationNum).Result; if (modResponseTask.StatusCode == 0) { plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "150"); } } break; case "230": { // 230:托盘输é€åˆ°ä½ï¼Œè¯·æ±‚å°è½¦ï¼› WCSå‘WMS申请å°è½¦è¾“é€WMS返回æˆåŠŸï¼›å†™å…¥240 ï¼› } break; case "310": //入库申请PLC出现异常(托盘超宽ã€è¶…高ç‰ï¼‰ { plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "311"); string dbStr = ""; switch (modDevice.StationNum) { case "094": dbStr = "2381"; break; case "160": dbStr = "2385"; break; case "155": dbStr = "2383"; break; case "152": dbStr = "2401"; break; case "153": dbStr = "2403"; break; } string errorStr = string.Empty; //å°†å¼‚å¸¸ä¿¡æ¯æ˜¾ç¤ºåˆ°LEDå±å¹•上 var (errorRes0, errorVal0) = plcConn.GetPlcDBValue(PLCDataTypeEnum.Bit, $"M{dbStr}.0", ""); if (errorRes0.IsSucceed && errorVal0 == true) { errorStr += " 扫ç 失败"; } var (errorRes1, errorVal1) = plcConn.GetPlcDBValue(PLCDataTypeEnum.Bit, $"M{dbStr}.1", ""); if (errorRes1.IsSucceed && errorVal1 == true) { errorStr += " ç§°é‡å¤±è´¥"; } var (errorRes2, errorVal2) = plcConn.GetPlcDBValue(PLCDataTypeEnum.Bit, $"M{dbStr}.2", ""); if (errorRes2.IsSucceed && errorVal2 == true) { errorStr += " 垛型左超宽"; } var (errorRes3, errorVal3) = plcConn.GetPlcDBValue(PLCDataTypeEnum.Bit, $"M{dbStr}.3", ""); if (errorRes3.IsSucceed && errorVal3 == true) { errorStr += " 垛型å³è¶…宽"; } var (errorRes4, errorVal4) = plcConn.GetPlcDBValue(PLCDataTypeEnum.Bit, $"M{dbStr}.4", ""); if (errorRes4.IsSucceed && errorVal4 == true) { errorStr += " 垛型å‰è¶…é•¿"; } var (errorRes5, errorVal5) = plcConn.GetPlcDBValue(PLCDataTypeEnum.Bit, $"M{dbStr}.5", ""); if (errorRes5.IsSucceed && errorVal5 == true) { errorStr += " 垛型åŽè¶…é•¿"; } var (errorRes6, errorVal6) = plcConn.GetPlcDBValue(PLCDataTypeEnum.Bit, $"M{dbStr}.6", ""); if (errorRes6.IsSucceed && errorVal6 == true) { errorStr += " 垛型åŽè¶…高"; } var (errorRes7, errorVal7) = plcConn.GetPlcDBValue(PLCDataTypeEnum.Bit, $"M{dbStr}.7", ""); if (errorRes7.IsSucceed && errorVal7 == true) { errorStr += " 高低ä½å¼‚常报è¦"; } var (errorRes9, errorVal9) = plcConn.GetPlcDBValue(PLCDataTypeEnum.Bit, $"M{Convert.ToUInt32(dbStr)-1}.1", ""); if (errorRes9.IsSucceed && errorVal9 == true) { errorStr += " 扫ç 仪通讯报è¦"; } if (!string.IsNullOrEmpty(errorStr)) { errorStr = "异常信æ¯ï¼š" + errorStr; ledText += $"申请入库失败\n\n"; ledText += $"{errorStr}"; LedDisplay(modDevice.LedIP, ledText); } } break; case "320": { //防æ¢é‡å¤ç”³è¯· var (res0, Val0) = plcConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos); if (res0.IsSucceed && Val0 != 0) { break; } // ç”³è¯·å··é“ string strMsg = ""; string taskModel = ""; // 获å–工使‰˜ç›˜ç ä¿¡æ¯ var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘ç "); var (res, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos); if (!res.IsSucceed) { break; } string palletStr = Convert.ToString(palletVal); var modPosEndLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "目的工ä½"); //èŽ·å–æ‰˜ç›˜é«˜åº¦ var modPosPalletHeight = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘高度"); var (resPalletHeight, palletHeightVal) = plcConn.GetPlcDBValue(modPosPalletHeight.PosType, modDevice.DbNumber, modPosPalletHeight.PlcPos); if (!resPalletHeight.IsSucceed) { break; } //èŽ·å–æ‰˜ç›˜å®žé™…é‡é‡ var modPosPalletWeight = modDevice.listStation.FirstOrDefault(m => m.Text == "实际é‡é‡"); var (resPalletWeight, palletWeightVal) = plcConn.GetPlcDBValue(modPosPalletWeight.PosType, modDevice.DbNumber, modPosPalletWeight.PlcPos); //判æ–入库é”å®šæ˜¯å¦æ‰“å¼€ if (PLCTaskAction.boEnterLock) { var (res350, palletVal350) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos); if (res350.IsSucceed && palletVal350 != "350") { ledText += $"申请入库失败\n\n"; ledText += $"托盘å·:{palletVal}\n"; ledText += $"入库任务已é”定,请解é”åŽé‡è¯•!\n"; LedDisplay(modDevice.LedIP, ledText); } // 写入输é€çº¿é€€å›žæŒ‡ä»¤ var ret = plcConn.SetPlcDBValueRepeat(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum); if (ret.IsSucceed) { plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350"); } break; } if (palletVal == null) { var (res350, palletVal350) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos); if (res350.IsSucceed && palletVal350 != "350") { ledText += $"申请入库失败\n\n"; ledText += $"托盘å·:{palletVal}\n"; ledText += $"æ‰«ææ‰˜ç›˜å·å¤±è´¥!\n"; LedDisplay(modDevice.LedIP, ledText); } // 写入输é€çº¿é€€å›žæŒ‡ä»¤ var ret = plcConn.SetPlcDBValueRepeat(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum); if (ret.IsSucceed) { plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350"); } break; } var http = new HttpService(); string TaskNo = "", EndLocate = ""; //æ ¹æ®å·¥ä½åˆ¤æ–是å¦ä¸ºå 托机工ä½ç”³è¯·ç©ºæ‰˜ç›˜è·ºå…¥åº“,是:å‘WMS申请空托盘跺组托 string groupMsg = ""; if (modDevice.StationNum == "72") { groupMsg = http.BindNullPalletWcs(10, palletVal); if (groupMsg.Contains("-1")) { // 写入输é€çº¿é€€å›žæŒ‡ä»¤ var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum); if (ret.IsSucceed) { plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350"); } break; } } //å‘WMSç”³è¯·å··é“ strMsg = http.RequestRoadWay(palletVal, modDevice.StationNum, taskModel, louCeng, ref EndLocate, ref TaskNo, (int)palletHeightVal); if (!strMsg.Contains("-1")) { // æ ¹æ®ä»»åŠ¡å·èŽ·å–èµ·å§‹å·¥ä½åœ°å€ï¼Œæ ¹æ®èµ·å§‹å·¥ä½åœ°å€èŽ·å–LEDIP 推é€åˆ°LEDå±å¹•。 var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == TaskNo); modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.StartLocate).Select(s => s.LedIP).First(); // 写入330 var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "330"); if (ret.IsSucceed) { // æ’入任务明细 var modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, InteractiveMsg = $"写入指令330:{modDevice.StationNum}å·¥ä½ç”³è¯·å··é“", PalletNo = palletVal, Status = TaskStatusEnum.Complete, StartLocat = modDevice.StationNum, EndLocat = EndLocate, }; // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); // 通知任务界é¢ä»»åС已å˜åœ¨æ›´æ–° è¯·æ›´æ–°ç•Œé¢ HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); // led显示内容 try { ledText += $"任务类型:{taskInfo.TaskType.GetDescription()}\n\n"; ledText += $"任务å·:{taskInfo.TaskNo}\n"; ledText += $"托盘å·:{taskInfo.PalletNo}\n"; ledText += $"èµ·å§‹ä½:{taskInfo.StartRoadway + " " + taskInfo.StartLocate}\n"; ledText += $"ç›®æ ‡ä½:{taskInfo.EndRoadway + " " + taskInfo.EndLocate}\n"; ledText += $"é‡é‡(KG):{Convert.ToDecimal(palletWeightVal)}"; LedDisplay(modDevice.LedIP, ledText); } catch (Exception ex) { Log.Error(ex.Message); } } } else { var (res350, palletVal350) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos); if (res350.IsSucceed && palletVal350 != "350") { ledText += $"申请入库失败\n\n"; ledText += $"托盘å·:{palletVal}\n"; ledText += $"{strMsg}\n"; LedDisplay(modDevice.LedIP, ledText); } // 写入输é€çº¿é€€å›žæŒ‡ä»¤ var ret = plcConn.SetPlcDBValueRepeat(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum); if (ret.IsSucceed) { plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350"); } } } break; case "330": { // 写入任务 托盘移动 340 // 获å–工使‰˜ç›˜ç ä¿¡æ¯ var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘ç "); var (res, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos); if (!res.IsSucceed) { break; } string pallet = palletVal.ToString(); // 获å–ä»»åŠ¡ä¿¡æ¯ var modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false && s.PalletNo == pallet && (s.Status == TaskStatusEnum.Wait || s.Status == TaskStatusEnum.Doing) && s.TaskType == TaskTypeEnum.In); if (modTask == null) { // æ¤æ‰˜ç›˜æ²¡æœ‰å¯¹åº”的转移任务 led显示 break; } //判æ–入库é”å®šæ˜¯å¦æ‰“å¼€ if (PLCTaskAction.boEnterLock) { break;//入库é”å®šæ‰“å¼€åˆ™ä¸æ‰§è¡Œå…¥åº“任务 } // 获å–å··é“å£å…¥åº“å·¥ä½ string endLocatVlue = PLCCommon.RoadwayToStationNum(modTask.EndRoadway, louCeng, modDevice.StationNum); #region 跺机转è¿ä»»åŠ¡å¤„ç† ########## // åˆ¤æ–æ˜¯å¦å››æ¥¼è¾“é€çº¿ if (modDevice.StationNum == "265") { // 是 if (modTask.EndRoadway != "R05" && modTask.EndRoadway != "R06") { // æ ¹æ®å··é“获å–ä¸è½¬è·ºæœºIP ### R05å··é“ var sInfo = PLCCommon.GetStokePlc("R05", louCeng); var plcStackeConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == sInfo.Ip); if (plcStackeConn.Connected) { var djmodel = _db.Queryable<WcsPlc>().First(m => m.IP == sInfo.Ip); var djMod = PLCTaskAction.plcDevices.First(m => m.PlcId == djmodel.Id && m.DeviceType == DeviceTypeEnum.Business && m.IsDelete == false); var (djRes, djVal) = plcStackeConn.GetPlcDBValue(djMod.PosType, djMod.DbNumber, djMod.PlcPos); // 判æ–R05跺机是å¦ç©ºé—² if (djRes.IsSucceed && djVal.ToString() == "820") { endLocatVlue = "253"; } } // æ ¹æ®å··é“获å–ä¸è½¬è·ºæœºIP ### R06å··é“ var sInfoR06 = PLCCommon.GetStokePlc("R06", louCeng); var plcStackeConnR06 = PLCTaskAction.listPlcConn.First(m => m.PlcIP == sInfoR06.Ip); if (plcStackeConnR06.Connected) { var djmodel = _db.Queryable<WcsPlc>().First(m => m.IP == sInfoR06.Ip); var djMod = PLCTaskAction.plcDevices.First(m => m.PlcId == djmodel.Id && m.DeviceType == DeviceTypeEnum.Business && m.IsDelete == false); var (djRes, djVal) = plcStackeConnR06.GetPlcDBValue(djMod.PosType, djMod.DbNumber, djMod.PlcPos); // 判æ–R05跺机是å¦ç©ºé—² if (djRes.IsSucceed && djVal.ToString() == "820") { endLocatVlue = "250"; } } } } if (modDevice.StationNum == "266") { // 是 if (modTask.EndRoadway != "R05") { endLocatVlue = "277"; } } #endregion // ç»™PLCå†™å…¥ä»»åŠ¡æ•°æ® var listResult = new List<Result>(); // 任务å·ã€ä»»åŠ¡ç±»åž‹ã€æ‰˜ç›˜å· var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务å·"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo)); var modPosTaskType = modDevice.listStation.FirstOrDefault(s => s.Text == "任务类型"); var taskTypeStr = (int)modTask.TaskType; listResult.Add(plcConn.SetPlcDBValueRepeat(modPosTaskType.PosType, modDevice.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString())); var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘ç "); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); // èµ·å§‹å·¥ä½ã€ç›®çš„å·¥ä½ var modPosStrLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "èµ·å§‹å·¥ä½"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosStrLocat.PosType, modDevice.DbNumber, modPosStrLocat.PlcPos, modDevice.StationNum)); var modPosEndLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "目的工ä½"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosEndLocat.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, endLocatVlue)); if (listResult.All(s => s.IsSucceed)) { Log.Information($"写入340,任务å·ï¼š{modTask.TaskNo},任务类型:{taskTypeStr.ToString()},托盘ç :{modTask.PalletNo},起始工ä½ï¼š{modDevice.StationNum},目的工ä½ï¼š{endLocatVlue}"); // 将任务状æ€å˜æ›´ä¸ºæ£åœ¨æ‰§è¡Œ _db.Updateable<WcsTask>() .SetColumns(s => s.Status == TaskStatusEnum.Doing) .Where(s => s.Id == modTask.Id) .ExecuteCommand(); // 写入æµç¨‹å— 330 340 var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "340"); // æ ¹æ®ä»»åŠ¡å·èŽ·å–èµ·å§‹å·¥ä½åœ°å€ï¼Œæ ¹æ®èµ·å§‹å·¥ä½åœ°å€èŽ·å–LEDIP 推é€åˆ°LEDå±å¹•。 modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == modTask.StartLocate).Select(s => s.LedIP).First(); if (ret.IsSucceed) { // æ’入任务明细 var modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, InteractiveMsg = $"写入指令340:{modDevice.StationNum}储ä½====》{endLocatVlue}å·¥ä½", PalletNo = palletVal, Status = TaskStatusEnum.Complete, StartLocat = modDevice.StationNum, EndLocat = endLocatVlue, }; // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); // 通知任务界é¢ä»»åС已å˜åœ¨æ›´æ–° è¯·æ›´æ–°ç•Œé¢ HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); } } } break; case "620": { // ç”³è¯·å‚¨ä½ æ›´æ–°å…¥åº“ä»»åŠ¡(储ä½åœ°å€) 630 var strMsg = ""; var taskModel = ""; // åˆ¤æ–æ˜¯å¦æ¼”ç¤ºæ¨¡å¼ if (PLCTaskAction.boDemo) { // æ¼”ç¤ºæ¨¡å¼ taskModel = "1"; } // æ ¹æ®å·¥ä½å·èŽ·å–å··é“å· var roadway = PLCCommon.GetRoadwayByStation(modDevice.StationNum); if (roadway == "") { break; } // 获å–工使‰˜ç›˜ç ä¿¡æ¯ var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘ç "); var (res, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos); if (!res.IsSucceed) { break; } #region 跺机转è¿ä»»åŠ¡å¤„ç† ########### // æ ¹æ®ä»»åŠ¡ç›®æ ‡å··é“å·èŽ·å–å·¥ä½å· var modPosEndStation = modDevice.listStation.FirstOrDefault(m => m.Text == "任务å·"); var (ress, endTaskNoVal) = plcConn.GetPlcDBValue(modPosEndStation.PosType, modDevice.DbNumber, modPosEndStation.PlcPos); if (!ress.IsSucceed) { break; } string taskno = endTaskNoVal; var taskInfo2 = _db.Queryable<WcsTask>().First(w => w.TaskNo == taskno); // æ ¹æ®ä»»åŠ¡å·èŽ·å–当å‰ä»»åŠ¡ç›®æ ‡å··é“ if (taskInfo2 == null) { break; } string roadwayNo = PLCCommon.GetRoadwayByStation(modDevice.StationNum); // 当å‰å·¥ä½å¯¹åº”的巷é“å· // åˆ¤æ–æ˜¯å¦å…¥åº“转è¿ä»»åŠ¡ if (roadwayNo != taskInfo2.EndRoadway && taskInfo2.TaskType == TaskTypeEnum.In) {// 是 var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "630"); if (ret.IsSucceed) { var modPosTaskNo = modDevice.listStation.FirstOrDefault(m => m.Text == "任务å·"); var (resss, taskNoVal) = plcConn.GetPlcDBValue(modPosEndStation.PosType, modDevice.DbNumber, modPosEndStation.PlcPos); if (!resss.IsSucceed) { break; } string taskNo = taskNoVal.ToString(); var taskInfos = _db.Queryable<WcsTask>().First(w => w.TaskNo == taskNo); modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfos.StartLocate).Select(s => s.LedIP).First(); // æ’入任务明细 var modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = taskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, InteractiveMsg = $"写入指令630:开å¯è·ºæœºè½¬è¿ä»»åŠ¡", PalletNo = palletVal, Status = TaskStatusEnum.Complete, StartLocat = modDevice.StationNum, EndLocat = strMsg, }; // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); // 通知任务界é¢ä»»åС已å˜åœ¨æ›´æ–° è¯·æ›´æ–°ç•Œé¢ HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business); ledText += $"任务类型:{taskInfos.TaskType.GetDescription()}\n\n"; ledText += $"任务å·:{taskInfos.TaskNo}\n"; ledText += $"托盘å·:{taskInfos.PalletNo}\n\n"; ledText += $"èµ·å§‹ä½:{taskInfos.StartRoadway + " " + taskInfos.StartLocate}\n"; ledText += $"ç›®æ ‡ä½:{taskInfos.EndRoadway + " " + taskInfos.EndLocate}"; LedDisplay(modDevice.LedIP, ledText); } break; } // åˆ¤æ–æ˜¯å¦å‡ºåº“转è¿ä»»åŠ¡ var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务å·"); var (res1, taskVal) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); if (res1.IsSucceed) { string taskNo = taskVal.ToString(); var taskInfos = _db.Queryable<WcsTask>().First(w => w.TaskNo == taskNo); if (taskInfos.TaskType == TaskTypeEnum.Out) { var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "630"); if (!ret.IsSucceed) { break; } modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfos.EndLocate).Select(s => s.LedIP).First(); // æ’入任务明细 var modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = taskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, InteractiveMsg = $"写入指令630:开å¯è·ºæœºè½¬è¿ä»»åŠ¡", PalletNo = palletVal, Status = TaskStatusEnum.Complete, StartLocat = modDevice.StationNum, EndLocat = strMsg, }; // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); // 通知任务界é¢ä»»åС已å˜åœ¨æ›´æ–° è¯·æ›´æ–°ç•Œé¢ HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business); ledText += $"任务类型:{taskInfos.TaskType.GetDescription()}\n\n"; ledText += $"任务å·:{taskInfos.TaskNo}\n"; ledText += $"托盘å·:{taskInfos.PalletNo}\n\n"; ledText += $"èµ·å§‹ä½:{taskInfos.StartRoadway + " " + taskInfos.StartLocate}\n"; ledText += $"ç›®æ ‡ä½:{taskInfos.EndRoadway + " " + taskInfos.EndLocate}"; LedDisplay(modDevice.LedIP, ledText); break; } } else { break; } #endregion var http = new HttpService(); string TaskNo = ""; lock (RuKuLock) { // å‘WMS申请储ä½ä¿¡æ¯ strMsg = http.RequestLocate(palletVal, modDevice.StationNum, taskModel, roadway, ref TaskNo, (int)taskInfo2.PalletQty); } // æ ¹æ®ä»»åŠ¡å·èŽ·å–èµ·å§‹å·¥ä½åœ°å€ï¼Œæ ¹æ®èµ·å§‹å·¥ä½åœ°å€èŽ·å–LEDIP 推é€åˆ°LEDå±å¹•。 var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == TaskNo); modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.StartLocate).Select(s => s.LedIP).First(); if (!strMsg.Contains("-1")) { // 写入æµç¨‹å— 630 var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "630"); if (ret.IsSucceed) { // æ’入任务明细 var modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, InteractiveMsg = $"写入指令340:{modDevice.StationNum}å·¥ä½ç”³è¯·å‚¨ä½", PalletNo = palletVal, Status = TaskStatusEnum.Complete, StartLocat = modDevice.StationNum, EndLocat = strMsg, }; // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); // 通知任务界é¢ä»»åС已å˜åœ¨æ›´æ–° è¯·æ›´æ–°ç•Œé¢ HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business); ledText += $"任务类型:{taskInfo.TaskType.GetDescription()}\n\n"; ledText += $"任务å·:{taskInfo.TaskNo}\n"; ledText += $"托盘å·:{taskInfo.PalletNo}\n\n"; ledText += $"èµ·å§‹ä½:{taskInfo.StartRoadway + " " + taskInfo.StartLocate}\n"; ledText += $"ç›®æ ‡ä½:{taskInfo.EndRoadway + " " + taskInfo.EndLocate}"; LedDisplay(modDevice.LedIP, ledText); } } else { // 申请储ä½å¤±è´¥ï¼LED显示 Log.Error(string.Format($"申请储ä½å¤±è´¥:{strMsg},读写plc错误")); // led显示内容 var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business); ledText += $"申请入库失败\n\n"; ledText += $"{strMsg}\n"; LedDisplay(modDevice.LedIP, ledText); } } break; case "630": { #region 写入跺机å–货任务 ä¸ç”¨å†™å…¥640åž›å–货完æˆåŽä¼šå†™ // 获å–工使‰˜ç›˜ç ä¿¡æ¯ var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘ç "); var (res, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos); // 获å–å·¥ä½ä»»åŠ¡å·ä¿¡æ¯ var modPosTaskNo = modDevice.listStation.FirstOrDefault(m => m.Text == "任务å·"); var (taskRes, taskNoVal) = plcConn.GetPlcDBValue(modPosTaskNo.PosType, modDevice.DbNumber, modPosTaskNo.PlcPos); if (!res.IsSucceed || !taskRes.IsSucceed) { break; } string pallet = palletVal.ToString(); string taskNo = taskNoVal.ToString(); // 获å–ä»»åŠ¡ä¿¡æ¯ var modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false && s.PalletNo == pallet && s.Status == TaskStatusEnum.Doing && s.TaskNo == taskNo); if (modTask == null) { // æ¤æ‰˜ç›˜æ²¡æœ‰å¯¹åº”的转移任务 led显示 break; } #region 跺机转è¿ä»»åŠ¡å¤„ç† ########### string taskno = taskNoVal; string roadwayNo = PLCCommon.GetRoadwayByStation(modDevice.StationNum); // 当å‰å·¥ä½å¯¹åº”的巷é“å· // 获å–当å‰å·¥ä½ç›®æ ‡åœ°å€ var modPosEndStation = modDevice.listStation.FirstOrDefault(m => m.Text == "目的工ä½"); var (ress, endStationVal) = plcConn.GetPlcDBValue(modPosEndStation.PosType, modDevice.DbNumber, modPosEndStation.PlcPos); if (!ress.IsSucceed) { break; } if (modTask.EndRoadway == null) { modTask.EndRoadway = ""; } var sInfo = PLCCommon.GetStokePlc(roadwayNo, louCeng, modDevice.StationNum); // æ ¹æ®å½“å‰å··é“获å–è·ºæœºä¿¡æ¯ // åˆ¤æ–æ˜¯å¦å…¥åº“转è¿ä»»åŠ¡ // åˆ¤æ–æ˜¯å¦å…¥åº“转è¿ä»»åŠ¡ if (roadwayNo != modTask.EndRoadway && modTask.TaskType == TaskTypeEnum.In) {// 是 // æ ¹æ®å½“å‰å·¥ä½å·ï¼ŒèŽ·å–对应的å–货排列层 sInfo = PLCCommon.GetStokePlc(roadwayNo, louCeng, modDevice.StationNum); // 判æ–1层放货工ä½çŠ¶æ€æ˜¯å¦ç©ºé—² var endStationNum = PLCCommon.RoadwayToOutStationNum(roadwayNo, "1"); var ConveyorMod = PLCTaskAction.plcDevices.First(m => m.StationNum == endStationNum && m.DeviceType == DeviceTypeEnum.Business && m.IsDelete == false); var plcConveyorConn = PLCCommon.GetPlcIp(endStationNum); if (plcConveyorConn.Connected) { // 读å–1楼放货工ä½çŠ¶æ€ var (reouts, plcVal) = plcConveyorConn.GetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.PlcPos); if (reouts.IsSucceed) { //if (plcVal.ToString() != "720") //{ // // 1层放货工ä½å 用,ç‰å¾…放货工ä½é‡Šæ”¾ // break; //} // 判æ–跺机是å¦ç©ºé—² var plcSConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == sInfo.Ip); if (plcSConn.Connected) { var djmodel = _db.Queryable<WcsPlc>().First(m => m.IP == sInfo.Ip); var djMod = PLCTaskAction.plcDevices.First(m => m.PlcId == djmodel.Id && m.DeviceType == DeviceTypeEnum.Business && m.IsDelete == false); var djInfos = PLCTaskAction.plcPositions.Where(m => m.IsDelete == false && m.DeviceId == djMod.Id).ToList(); var djInfo = djInfos.First(m => m.Text == "PLCæµç¨‹å—"); // 获å–跺机当å‰çŠ¶æ€ var (djRess, djVal) = plcSConn.GetPlcDBValue(djMod.PosType, djMod.DbNumber, djMod.PlcPos); if (!djRess.IsSucceed || djVal.ToString() != "820") { // 跺机éžç©ºé—²ç‰å¾… break; } var listResult = new List<Result>(); // 任务å·ã€ä»»åŠ¡ç±»åž‹ã€æ‰˜ç›˜å· var modPosTask = djInfos.FirstOrDefault(s => s.Text == "任务å·"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosTask.PosType, djMod.DbNumber, modPosTask.PlcPos, modTask.TaskNo)); var modPosTaskType = djInfos.FirstOrDefault(s => s.Text == "任务类型"); var taskTypeStr = (int)modTask.TaskType; listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosTaskType.PosType, djMod.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString())); var modPosPalletNo = djInfos.FirstOrDefault(s => s.Text == "托盘ç "); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosPalletNo.PosType, djMod.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); //èµ·å§‹å·¥ä½ var modPosStrStationNum = djInfos.FirstOrDefault(s => s.Text == "èµ·å§‹å·¥ä½"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosStrStationNum.PosType, djMod.DbNumber, modPosStrStationNum.PlcPos, modDevice.StationNum)); // ç›®çš„å·¥ä½ var modPosendStationNum = djInfos.FirstOrDefault(s => s.Text == "目的工ä½"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosendStationNum.PosType, djMod.DbNumber, modPosendStationNum.PlcPos, endStationNum)); //å–货排ã€åˆ—ã€å±‚ var modPosStrPai = djInfos.FirstOrDefault(s => s.Text == "å–货排"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosStrPai.PosType, djMod.DbNumber, modPosStrPai.PlcPos, sInfo.Pai)); var modPosStrLie = djInfos.FirstOrDefault(s => s.Text == "å–货列"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosStrLie.PosType, djMod.DbNumber, modPosStrLie.PlcPos, sInfo.Lie)); var modPosStrCeng = djInfos.FirstOrDefault(s => s.Text == "å–货层"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosStrCeng.PosType, djMod.DbNumber, modPosStrCeng.PlcPos, sInfo.Ceng)); //放货排ã€åˆ—ã€å±‚ var modPosEndPai = djInfos.FirstOrDefault(s => s.Text == "放货排"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosEndPai.PosType, djMod.DbNumber, modPosEndPai.PlcPos, "2")); var modPosEndLie = djInfos.FirstOrDefault(s => s.Text == "放货列"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosEndLie.PosType, djMod.DbNumber, modPosEndLie.PlcPos, "60")); var modPosEndCeng = djInfos.FirstOrDefault(s => s.Text == "放货层"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosEndCeng.PosType, djMod.DbNumber, modPosEndCeng.PlcPos, "1")); if (listResult.All(s => s.IsSucceed)) { // 写入跺机 830 var retc2 = plcSConn.SetPlcDBValue(djMod.PosType, djMod.DbNumber, djMod.WcsPos, "830"); // æ’入任务明细 任务明细实体类 var modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, PalletNo = modTask.PalletNo, Status = TaskStatusEnum.Complete, StartLocat = modDevice.StationNum, EndLocat = modTask.EndLocate // ç›®æ ‡å‚¨ä½åœ°å€ }; if (!retc2.IsSucceed) { modInsertTaskMonitor.InteractiveMsg = $"输é€çº¿å–è´§å·¥ä½ï¼š{modDevice.StationNum},写入垛机å–货任务830失败ç‰å¾…冿¬¡å†™å…¥"; // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); break; } // å†™å…¥ç›®æ ‡å·¥ä½ 730 : 逻辑上æ¤å¤„ä¸ç”¨å 用地å€ã€‚ var retc3 = plcConveyorConn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "730"); modInsertTaskMonitor.InteractiveMsg = $"跺机写入指令830:{modDevice.StationNum}å·¥ä½====》" + modTask.EndLocate + "储ä½åœ°å€!"; // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); if (PLCTaskAction.boRefresh) { //下å‘任务日志 HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); } } } } } break; } // åˆ¤æ–æ˜¯å¦å‡ºåº“转è¿ä»»åŠ¡ if (modTask.TaskType == TaskTypeEnum.Out) { var roadWay1 = "R06"; if (modTask.EndLocate == "266") { roadWay1 = "R05"; } var sInfo1 = PLCCommon.GetStokePlc(roadWay1, "2"); // æ”¾è´§æŽ’åˆ—å±‚ä¿¡æ¯ var plcSConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == sInfo1.Ip); if (plcSConn.Connected) { var djmodel = _db.Queryable<WcsPlc>().First(m => m.IP == sInfo1.Ip); var djMod = PLCTaskAction.plcDevices.First(m => m.PlcId == djmodel.Id && m.DeviceType == DeviceTypeEnum.Business && m.IsDelete == false); var djInfos = PLCTaskAction.plcPositions.Where(m => m.IsDelete == false && m.DeviceId == djMod.Id).ToList(); var djInfo = djInfos.First(m => m.Text == "PLCæµç¨‹å—"); // 获å–跺机当å‰çŠ¶æ€ var (djRess, djVal) = plcSConn.GetPlcDBValue(djMod.PosType, djMod.DbNumber, djMod.PlcPos); if (!djRess.IsSucceed || djVal.ToString() != "820") { // 跺机éžç©ºé—²ç‰å¾… break; } var listResult = new List<Result>(); // 任务å·ã€ä»»åŠ¡ç±»åž‹ã€æ‰˜ç›˜å· var modPosTask = djInfos.FirstOrDefault(s => s.Text == "任务å·"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosTask.PosType, djMod.DbNumber, modPosTask.PlcPos, modTask.TaskNo)); var modPosTaskType = djInfos.FirstOrDefault(s => s.Text == "任务类型"); var taskTypeStr = (int)modTask.TaskType; listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosTaskType.PosType, djMod.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString())); var modPosPalletNo = djInfos.FirstOrDefault(s => s.Text == "托盘ç "); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosPalletNo.PosType, djMod.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); //èµ·å§‹å·¥ä½ var modPosStrStationNum = djInfos.FirstOrDefault(s => s.Text == "èµ·å§‹å·¥ä½"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosStrStationNum.PosType, djMod.DbNumber, modPosStrStationNum.PlcPos, modDevice.StationNum)); //ç›®çš„å·¥ä½ if (modTask.EndLocate == "266") { modTask.EndLocate = "277"; } if (modTask.EndLocate == "265") { modTask.EndLocate = "250"; } var modPosStrend = djInfos.FirstOrDefault(s => s.Text == "目的工ä½"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosStrend.PosType, djMod.DbNumber, modPosStrend.PlcPos, modTask.EndLocate)); // æ¤å¤„现在å˜çš„æ˜¯å‡ºåº“å£266。 //å–货排ã€åˆ—ã€å±‚ var modPosStrPai = djInfos.FirstOrDefault(s => s.Text == "å–货排"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosStrPai.PosType, djMod.DbNumber, modPosStrPai.PlcPos, "3")); var modPosStrLie = djInfos.FirstOrDefault(s => s.Text == "å–货列"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosStrLie.PosType, djMod.DbNumber, modPosStrLie.PlcPos, "60")); var modPosStrCeng = djInfos.FirstOrDefault(s => s.Text == "å–货层"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosStrCeng.PosType, djMod.DbNumber, modPosStrCeng.PlcPos, "1")); //放货排ã€åˆ—ã€å±‚ var modPosEndPai = djInfos.FirstOrDefault(s => s.Text == "放货排"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosEndPai.PosType, djMod.DbNumber, modPosEndPai.PlcPos, sInfo1.Pai)); var modPosEndLie = djInfos.FirstOrDefault(s => s.Text == "放货列"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosEndLie.PosType, djMod.DbNumber, modPosEndLie.PlcPos, sInfo1.Lie)); var modPosEndCeng = djInfos.FirstOrDefault(s => s.Text == "放货层"); listResult.Add(plcSConn.SetPlcDBValueRepeat(modPosEndCeng.PosType, djMod.DbNumber, modPosEndCeng.PlcPos, sInfo1.Ceng)); if (listResult.All(s => s.IsSucceed)) { // 写入跺机 830 var retc2 = plcSConn.SetPlcDBValue(djMod.PosType, djMod.DbNumber, djMod.WcsPos, "830"); // æ’入任务明细 任务明细实体类 var modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, PalletNo = modTask.PalletNo, Status = TaskStatusEnum.Complete, StartLocat = modTask.StartLocate, EndLocat = modTask.EndLocate // ç›®æ ‡å‚¨ä½åœ°å€ }; if (!retc2.IsSucceed) { modInsertTaskMonitor.InteractiveMsg = $"输é€çº¿å–è´§å·¥ä½ï¼š{modDevice.StationNum},写入垛机å–货任务830失败ç‰å¾…冿¬¡å†™å…¥"; // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); break; } modInsertTaskMonitor.InteractiveMsg = $"跺机写入指令830:{modDevice.StationNum}å·¥ä½====》" + modTask.EndLocate + "储ä½åœ°å€!"; // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); if (PLCTaskAction.boRefresh) { //下å‘任务日志 HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); } } } break; } #endregion // éžæ£å¸¸å…¥åº“任务ä¸å¾€ä¸‹æ‰§è¡Œ if (modTask.TaskType != TaskTypeEnum.In) { break; } if (string.IsNullOrWhiteSpace(sInfo.Ip)) { //éœ€åŠ ä¸ŠLED显示 Log.Error(string.Format($"æ ¹æ®å··é“获å–跺机IP失败,请è”系管ç†å‘˜")); break; } // 跺机连接 var plcStackeConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == sInfo.Ip); if (plcStackeConn.Connected) { // ç›®æ ‡æŽ’åˆ—å±‚ var endLocate = modTask.EndLocate; if (string.IsNullOrWhiteSpace(modTask.EndLocate)) { Log.Error(string.Format($"ç›®æ ‡ä½ç½®ä¸ºç©ºï¼Œè¯·äººå·¥å¤„ç†,读写plc错误")); break; } // 转æ¢ç›®æ ‡å·¥ä½æŽ’列层 03010301 var paiVal = PLCCommon.GetDjAdress(modTask.EndRoadway.Substring(1, 2), endLocate.Substring(0, 2), endLocate.Substring(6, 2)); string pai = paiVal.ToString(); string lie = int.Parse(endLocate.Substring(2, 2)).ToString(); string ceng = int.Parse(endLocate.Substring(4, 2)).ToString(); var djmodel = _db.Queryable<WcsPlc>().First(m => m.IP == sInfo.Ip); var djMod = PLCTaskAction.plcDevices.First(m => m.PlcId == djmodel.Id && m.DeviceType == DeviceTypeEnum.Business && m.IsDelete == false); var djInfos = PLCTaskAction.plcPositions.Where(m => m.IsDelete == false && m.DeviceId == djMod.Id).ToList(); var djInfo = djInfos.First(m => m.Text == "PLCæµç¨‹å—"); // 获å–跺机当å‰çŠ¶æ€ var (djRes, djVal) = plcStackeConn.GetPlcDBValue(djMod.PosType, djMod.DbNumber, djMod.PlcPos); if (!djRes.IsSucceed || djVal.ToString() != "820") { // 跺机éžç©ºé—²ç‰å¾… break; } // ç»™PLCå†™å…¥ä»»åŠ¡æ•°æ® var listResult = new List<Result>(); // 任务å·ã€ä»»åŠ¡ç±»åž‹ã€æ‰˜ç›˜å· var modPosTask = djInfos.FirstOrDefault(s => s.Text == "任务å·"); listResult.Add(plcStackeConn.SetPlcDBValueRepeat(modPosTask.PosType, djMod.DbNumber, modPosTask.PlcPos, modTask.TaskNo)); var modPosTaskType = djInfos.FirstOrDefault(s => s.Text == "任务类型"); var taskTypeStr = (int)modTask.TaskType; listResult.Add(plcStackeConn.SetPlcDBValueRepeat(modPosTaskType.PosType, djMod.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString())); var modPosPalletNo = djInfos.FirstOrDefault(s => s.Text == "托盘ç "); listResult.Add(plcStackeConn.SetPlcDBValueRepeat(modPosPalletNo.PosType, djMod.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); //èµ·å§‹å·¥ä½ var modPosStrStationNum = djInfos.FirstOrDefault(s => s.Text == "èµ·å§‹å·¥ä½"); listResult.Add(plcStackeConn.SetPlcDBValueRepeat(modPosStrStationNum.PosType, djMod.DbNumber, modPosStrStationNum.PlcPos, modDevice.StationNum)); //ç›®çš„å·¥ä½ var modPosendStationNum = djInfos.FirstOrDefault(s => s.Text == "目的工ä½"); listResult.Add(plcStackeConn.SetPlcDBValueRepeat(modPosStrStationNum.PosType, djMod.DbNumber, modPosendStationNum.PlcPos, modDevice.StationNum)); // æ¤å¤„现在是139 应该为0 //å–货排ã€åˆ—ã€å±‚ var modPosStrPai = djInfos.FirstOrDefault(s => s.Text == "å–货排"); listResult.Add(plcStackeConn.SetPlcDBValueRepeat(modPosStrPai.PosType, djMod.DbNumber, modPosStrPai.PlcPos, sInfo.Pai)); var modPosStrLie = djInfos.FirstOrDefault(s => s.Text == "å–货列"); listResult.Add(plcStackeConn.SetPlcDBValueRepeat(modPosStrLie.PosType, djMod.DbNumber, modPosStrLie.PlcPos, sInfo.Lie)); var modPosStrCeng = djInfos.FirstOrDefault(s => s.Text == "å–货层"); listResult.Add(plcStackeConn.SetPlcDBValueRepeat(modPosStrCeng.PosType, djMod.DbNumber, modPosStrCeng.PlcPos, sInfo.Ceng)); //放货排ã€åˆ—ã€å±‚ var modPosEndPai = djInfos.FirstOrDefault(s => s.Text == "放货排"); listResult.Add(plcStackeConn.SetPlcDBValueRepeat(modPosEndPai.PosType, djMod.DbNumber, modPosEndPai.PlcPos, pai)); var modPosEndLie = djInfos.FirstOrDefault(s => s.Text == "放货列"); listResult.Add(plcStackeConn.SetPlcDBValueRepeat(modPosEndLie.PosType, djMod.DbNumber, modPosEndLie.PlcPos, lie)); var modPosEndCeng = djInfos.FirstOrDefault(s => s.Text == "放货层"); listResult.Add(plcStackeConn.SetPlcDBValueRepeat(modPosEndCeng.PosType, djMod.DbNumber, modPosEndCeng.PlcPos, ceng)); if (listResult.All(s => s.IsSucceed)) { // 写入跺机 830 var retc2 = plcStackeConn.SetPlcDBValue(djMod.PosType, djMod.DbNumber, djMod.WcsPos, "830"); // æ’入任务明细 任务明细实体类 var modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, PalletNo = modTask.PalletNo, Status = TaskStatusEnum.Complete, StartLocat = modDevice.StationNum, EndLocat = modTask.EndLocate // ç›®æ ‡å‚¨ä½åœ°å€ }; if (!retc2.IsSucceed) { modInsertTaskMonitor.InteractiveMsg = $"输é€çº¿å–è´§å·¥ä½ï¼š{modDevice.StationNum},写入垛机å–货任务830失败ç‰å¾…冿¬¡å†™å…¥"; // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); break; } modInsertTaskMonitor.InteractiveMsg = $"跺机写入指令830:{modDevice.StationNum}å·¥ä½====》" + modTask.EndLocate + "储ä½åœ°å€!"; // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); if (PLCTaskAction.boRefresh) { //下å‘任务日志 HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); } } } #endregion } break; #region 出库交互 case "420": { string plcValue = "430"; #region 托盘到达拣选工ä½/å‡ºåº“å£ var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务å·"); var (res, taskVal) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘ç "); var (res2, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos); var modPosStarStationNum = modDevice.listStation.FirstOrDefault(m => m.Text == "èµ·å§‹å·¥ä½"); var (res3, starVal) = plcConn.GetPlcDBValue(modPosStarStationNum.PosType, modDevice.DbNumber, modPosStarStationNum.PlcPos); //åˆ¤æ–æ˜¯å¦å››æ¥¼å‡ºåº“å£ //if (modDevice.StationNum == "265" || modDevice.StationNum == "266") //{ // var http = new HttpService(); // //æ ¹æ®å‡ºåº“任务å·èŽ·å–出库å•类型 // var modResponseTask = http.GetSoOrderTypeByTaskNo(taskVal).Result; // if (modResponseTask.StatusCode == 0 && modResponseTask.Msg == "1")//1ï¼šé¢†æ–™å‡ºåº“å• // { // plcValue = "230"; // } //} var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, plcValue); if (ret.IsSucceed) { // æ’入任务明细 var modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = taskVal, PlcId = modDevice.Id, PlcName = modDevice.Text, InteractiveMsg = $"写入指令{plcValue}:托盘到达{modDevice.StationNum}å·¥ä½", PalletNo = palletVal, Status = TaskStatusEnum.Complete, StartLocat = starVal, EndLocat = modDevice.StationNum, }; // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); // 通知任务界é¢ä»»åС已å˜åœ¨æ›´æ–° è¯·æ›´æ–°ç•Œé¢ HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); // æ ¹æ®ä»»åŠ¡å·èŽ·å–èµ·å§‹å·¥ä½åœ°å€ï¼Œæ ¹æ®èµ·å§‹å·¥ä½åœ°å€èŽ·å–LEDIP 推é€åˆ°LEDå±å¹•。 var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == modInsertTaskMonitor.TaskNo); modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.EndLocate).Select(s => s.LedIP).First(); // led显示内容 // æ ¹æ®ç›®æ ‡å·¥ä½å·èŽ·å–对应的LEDIPåœ°å€ var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business && m.PlcId == modDevice.PlcId); ledText += $"出库完æˆ\n\n"; ledText += $"任务å·:{taskInfo.TaskNo}\n"; ledText += $"托盘å·:{taskInfo.PalletNo}\n\n"; ledText += $"èµ·å§‹ä½:{taskInfo.StartRoadway + " " + taskInfo.StartLocate}\n"; ledText += $"ç›®æ ‡ä½:{taskInfo.EndRoadway + " " + taskInfo.EndLocate}"; LedDisplay(ledDevice.LedIP, ledText); } // å馈WMSå‡ºåº“å®Œæˆ //TaskReques taskReques = new TaskReques(); //taskReques.taskNo = TaskNo; //taskReques.TaskType = "1"; //taskReques.TaskStatus = "2"; //bool bl = wcsMySql.RequestTasks(taskReques); #endregion } break; case "440": { #region 拣选完æˆ,æ‰˜ç›˜ç¦»å¼€å·¥ä½ // 写入450 var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "450"); if (ret.IsSucceed) { var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务å·"); var (res, taskVal) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘ç "); var (res2, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos); var modPosStarStationNum = modDevice.listStation.FirstOrDefault(m => m.Text == "èµ·å§‹å·¥ä½"); var (res3, starVal) = plcConn.GetPlcDBValue(modPosStarStationNum.PosType, modDevice.DbNumber, modPosStarStationNum.PlcPos); string tasknoVal = taskVal.ToString(); var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == false); if (modTask == null) { Log.Error(string.Format("输é€çº¿440:未找到对应的任务。")); break; } // 改å˜ä»»åŠ¡çŠ¶æ€ modTask.Status = TaskStatusEnum.Complete; modTask.FinishDate = DateTime.Now; modTask.Levels = 999; _db.Updateable(modTask).ExecuteCommand(); HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); // æ’入任务明细 var modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, InteractiveMsg = $"写入指令450:{modDevice.StationNum}拣选完æˆ,托盘离开工ä½", PalletNo = palletVal, Status = TaskStatusEnum.Complete, StartLocat = starVal.ToString(), EndLocat = modDevice.StationNum, }; if (modTask.Origin == "WMS") { // å馈WMS var requestMode = new TaskRequestWMS() { TaskNo = modTask.TaskNo, PalletNo = modTask.PalletNo, TaskType = ((int)TaskTypeEnum.Out).ToString(), TaskStatus = ((int)TaskStatusEnum.Complete).ToString() }; lock(OutLock) { HttpService httpService = new HttpService(); var modResponseTask = httpService.RequestTask(requestMode).Result; if (modResponseTask.StatusCode == 0) { modInsertTaskMonitor.InteractiveMsg += ",返回给WMS任务完æˆ"; } else { Log.Error(string.Format("任务å馈失败:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg)); } } } // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); // 通知任务界é¢ä»»åС已å˜åœ¨æ›´æ–° è¯·æ›´æ–°ç•Œé¢ HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); // led显示内容 var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business && m.PlcId == modDevice.PlcId); ledText += $"拣选完æˆï¼Œæ‰˜ç›˜ç¦»å¼€å·¥ä½\n\n"; ledText += $"任务å·:{modTask.TaskNo}\n"; ledText += $"托盘å·:{modTask.PalletNo}\n\n"; ledText += $"èµ·å§‹ä½:{modTask.StartRoadway + " " + modTask.StartLocate}\n"; ledText += $"ç›®æ ‡ä½:{modTask.EndRoadway + " " + modTask.EndLocate}"; LedDisplay(ledDevice.LedIP, ledText); } #endregion } break; #endregion #region å«ç©ºæ‰˜ç›˜è·º case "50": // plc申请空托 { lock (OLock) { // åˆ¤æ–æ˜¯å¦å·²æœ‰å‘å«ç©ºæ‰˜å·¥ä½çš„出库任务 var modTask = _db.Queryable<WcsTask>().First(m => (m.Status == TaskStatusEnum.Doing || m.Status == TaskStatusEnum.Wait) && m.EndLocate == modDevice.StationNum && m.IsDelete == false); if (modTask != null) { Log.Error("å·²å˜åœ¨å‘" + modDevice.StationNum + "å·¥ä½çš„任务。任务å·:" + modTask.TaskNo); break; } // 防æ¢é‡å¤å«ç©ºæ‰˜è·º var (res, palletVal) = plcConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos); if (palletVal != 0) { break; } // 调用WMS空托出库接å£ï¼Œè¿”回出库任务å˜å…¥å‡ºåº“表 var strMsg = ""; var http = new HttpService(); strMsg = http.IssuePlnOutHouseWcs("1", modDevice.StationNum); if (!strMsg.Contains("-1")) { // 写入plcæµç¨‹å—60 var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "60"); } else { // 申请巷é“失败ï¼LED显示 Log.Error(string.Format($"å·¥ä½å·ï¼š{modDevice.StationNum}申请空托跺失败:{strMsg};")); } } } break; case "80": // ç©ºæ‰˜ç›˜è·ºå·²åˆ°ä½ { // 调用wmsä»»åŠ¡å‡ºåº“ä»»åŠ¡å®Œæˆ // 获å–跺机点ä½é…ç½® var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务å·"); var (res, val) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); // æ ¹æ®ä»»åŠ¡å·èŽ·å–ä»»åŠ¡ä¿¡æ¯ if (res.IsSucceed) { string tasknoVal = val.ToString(); var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == false); if (modTask == null) { //Log.Error(string.Format($"å·¥ä½å·ï¼š{modDevice.StationNum}空托盘到达,未找到对应的任务!任务å·{tasknoVal};")); break; } // 写入plcæµç¨‹å—90 var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "90"); if (ret.IsSucceed) { // 改å˜ä»»åŠ¡çŠ¶æ€ modTask.Status = TaskStatusEnum.Complete; modTask.FinishDate = DateTime.Now; modTask.Levels = 999; _db.Updateable(modTask).ExecuteCommand(); HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); var modTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, PalletNo = modTask.PalletNo, Status = TaskStatusEnum.Complete, StartLocat = modTask.StartLocate, EndLocat = modTask.EndLocate, InteractiveMsg = $"任务完æˆ" }; if (modTask.Origin == "WMS") { // å馈WMS var requestMode = new TaskRequestWMS() { TaskNo = modTask.TaskNo, PalletNo = modTask.PalletNo, TaskType = ((int)TaskTypeEnum.Out).ToString(), TaskStatus = ((int)TaskStatusEnum.Complete).ToString() }; HttpService httpService = new HttpService(); var modResponseTask = httpService.RequestTask(requestMode).Result; if (modResponseTask.StatusCode == 0) { modTaskMonitor.InteractiveMsg = "任务完æˆï¼Œè¿”回给WMS任务完æˆ"; } else { Log.Error(string.Format("任务å馈失败:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg)); } } // æ’入交互日志 _db.Insertable(modTaskMonitor).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); } } } break; #endregion #region 拆垛业务 case "520": //托盘达到拆垛工ä½ï¼ŒWCS写入å“ç§å·å¹¶å†™å…¥530 { // èŽ·å–æ‰˜ç›˜æ¡ç é…ç½® var modPalletNo = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘ç " && m.IsDelete == false); // 读å–PLC托盘æ¡ç å· var (res, palletVal) = plcConn.GetPlcDBValue(modPalletNo.PosType, modDevice.DbNumber, modPalletNo.PlcPos); string palletNo = palletVal.ToString(); if (string.IsNullOrEmpty(palletNo)) { Log.Error(string.Format("{0},读å–的托盘å·ä¸ºnull", modDevice.Text)); break; } string pzNo = string.Empty; //调用WMS接å£èŽ·å–æ‰˜ç›˜ä¸Šç‰©æ–™å“ç§ä¿¡æ¯ var http = new HttpService(); pzNo = http.GetPalletPzNo(palletNo); if (!string.IsNullOrEmpty(pzNo)) { var modAddCode = modDevice.listStation.FirstOrDefault(m => m.Text == "å“ç§" && m.IsDelete == false); // 写入拆垛å“ç§ var retVal = plcConn.SetPlcDBValueRepeat(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, pzNo); if (retVal.IsSucceed) { plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "530"); } } } break; case "540": //拆垛完æˆå³å‡ºåº“完æˆä»»åŠ¡ç»“æŸï¼ŒWCS写入550,PLC清0 { // èŽ·å–æ‰˜ç›˜æ¡ç é…ç½® var modPalletNo = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘æ¡ç " && m.IsDelete == false); // 读å–PLC托盘æ¡ç å· var (res, palletVal) = plcConn.GetPlcDBValue(modPalletNo.PosType, modDevice.DbNumber, modPalletNo.PlcPos); string palletNo = palletVal.ToString(); if (string.IsNullOrEmpty(palletNo)) { Log.Error(string.Format("{0},读å–的托盘å·ä¸ºnull", modDevice.Text)); break; } //调用WMS接å£è¿›è¡Œæˆå“ç®±ç æ‹£è´§ var http = new HttpService(); var strMsg = http.BoxUnstackd(palletNo); if (!strMsg.Contains("-1")) { plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "550"); } } break; #endregion default: break; } } /// <summary> /// AGVä¸šåŠ¡å¤„ç† /// </summary> /// <param name="modDevice"></param> private static void AGV(WcsDeviceDto modDevice) { } /// <summary> /// å æ‰˜æœºä¸šåŠ¡å¤„ç† /// </summary> /// <param name="modDevice"></param> private static void PalletMachine(WcsDeviceDto modDevice) { var plcConn = modDevice.PLCUtil; switch (modDevice.Value.ToString()) { case "220": // 注释1 { } break; case "230": // 注释2 { } break; case "240": { } break; default: break; } } /// <summary> /// 件箱输é€å’Œç åž›æœºå™¨äººä¸šåŠ¡å¤„ç† é…ç½®çš„æ˜¯ä»¶ç®±è¾“é€ /// </summary> /// <param name="modDevice"></param> private static void BoxConveyorLine(WcsDeviceDto modDevice) { var plcConn = modDevice.PLCUtil; if (modDevice.DbNumber == "DB101" || modDevice.DbNumber == "DB102" || modDevice.DbNumber == "DB103" || modDevice.DbNumber == "DB104" || modDevice.DbNumber == "DB105") { // 主扫交互æµç¨‹ switch (modDevice.Value.ToString()) { case "1": // ä¸»æ‰«ç”³è¯·åˆ†é“ wcs写入2 { var modPosReadBox = modDevice.listStation.FirstOrDefault(m => m.Text == "读å–ç®±ç " && m.IsDelete == false); var (res, boxNo) = plcConn.GetPlcDBValue(modPosReadBox.PosType, modDevice.DbNumber, modPosReadBox.PlcPos); if (string.IsNullOrWhiteSpace(boxNo.ToString())) { // 写入æµç¨‹æŽ§åˆ¶å— 2 var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); if (retVal.IsSucceed) { Log.Error("ç®±ç 为null进行剔除"); break; } } // æ ¹æ®ç®±ç 获å–ç®±å†…ä¿¡æ¯ string boxNoVal = boxNo.ToString(); var boxInfo = _db.Queryable<WcsBoxInfo>().First(w => w.IsDelete == false && w.BoxNo == boxNoVal && string.IsNullOrEmpty(w.PalletNo)); if (boxInfo == null) { // 写入æµç¨‹æŽ§åˆ¶å— 2 var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); if (retVal.IsSucceed) { Log.Error($"ç®±ç 为null或已绑定托盘,进行剔除。箱ç :{boxNoVal}"); break; } } // æ ¹æ®ç®±å†…å“ç§å·èŽ·å–ç 躲绑定工ä½åŠå¯¹åº”的分é“å· var checkTaskInfo = _db.Queryable<WcsCheckTask>().First(w => w.SkuNo == boxInfo.SkuNo && w.SkuName == boxInfo.SkuName && w.LotNo == boxInfo.LotNo); if (checkTaskInfo == null) { Log.Error($"测试--。箱ç :{boxNoVal},ç®±ID:{boxInfo.Id},物料编ç :{boxInfo.SkuNo},物料å称:{boxInfo.SkuName},批次:{boxInfo.LotNo}"); // 写入æµç¨‹æŽ§åˆ¶å— 2 var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); if (retVal.IsSucceed) { Log.Error($"ç®±ç æœªç»‘定分拣任务,进行剔除。箱ç :{boxNoVal}"); break; } } else { // ç»™PLCå†™å…¥ä»»åŠ¡æ•°æ® var listResult = new List<Result>(); //æ‰¹æ¬¡å· var modPosLotNo = modDevice.listStation.FirstOrDefault(m => m.Text == "批次å·" && m.IsDelete == false); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosLotNo.PosType, modDevice.DbNumber, modPosLotNo.PlcPos, boxInfo.LotNo)); //å“ç§ var modPosPZ = modDevice.listStation.FirstOrDefault(m => m.Text == "å“ç§" && m.IsDelete == false); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosPZ.PosType, modDevice.DbNumber, modPosPZ.PlcPos, checkTaskInfo.PZNo)); //是å¦å°¾ç®± var modPosIsEndBox = modDevice.listStation.FirstOrDefault(m => m.Text == "是å¦å°¾ç®±" && m.IsDelete == false); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosIsEndBox.PosType, modDevice.DbNumber, modPosIsEndBox.PlcPos, boxInfo.EndLotFlag)); //写入箱ç var modPosBox = modDevice.listStation.FirstOrDefault(m => m.Text == "写入箱ç " && m.IsDelete == false); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosBox.PosType, modDevice.DbNumber, modPosBox.PlcPos, boxInfo.BoxNo)); // 是å¦å†™å…¥æˆåŠŸ if (listResult.All(s => s.IsSucceed)) { // 写入æµç¨‹æŽ§åˆ¶å— 2 var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); if (retVal.IsSucceed) { break; } } } } break; default: break; } } else { // æ’ç 交互 switch (modDevice.Value.ToString()) { case "1": // 托盘æ¡ç å¯è¯» { // èŽ·å–æ‰˜ç›˜æ¡ç é…ç½® var modPalletNo = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘æ¡ç " && m.IsDelete == false); // 读å–PLC托盘æ¡ç å· var (res, palletVal) = plcConn.GetPlcDBValue(modPalletNo.PosType, modDevice.DbNumber, modPalletNo.PlcPos); string palletNo = palletVal.ToString(); if (string.IsNullOrEmpty(palletNo)) { Log.Error(string.Format("{0},读å–的托盘å·ä¸ºnull", modDevice.Text)); break; } // æ ¹æ®å·¥ä½å·å°†æ‰˜ç›˜å·ä¿å˜åœ¨åˆ†é“表 var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false); if (checkTaskMedel == null) { Log.Error(string.Format("æ ¹æ®ç 垛工ä½{0},获å–分é“失败!", modDevice.StationNum)); break; } checkTaskMedel.PalletNo = palletNo; checkTaskMedel.BoxCount = 0; var rowCount = _db.Updateable(checkTaskMedel).ExecuteCommand(); if (rowCount > 0) { // plcå†™å…¥è¯»å–æˆåŠŸè¡¨ç¤º 2 var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); if (retVal.IsSucceed) { // liudl æ¤å¤„éœ€æ·»åŠ // 通知分拣ç 垛页更新 } } } break; case "20": // 申请æ’ç { // èŽ·å–æ‰˜ç›˜æ¡ç é…ç½® var modAddCode = modDevice.listStation.FirstOrDefault(m => m.Text == "æ’ç 结果" && m.IsDelete == false); //èŽ·å–æ’ç 箱数 var modAddBoxNum = modDevice.listStation.FirstOrDefault(m => m.Text == "æ’ç 箱数" && m.IsDelete == false); var (boxNumRes, boxNumVal) = plcConn.GetPlcDBValue(modAddBoxNum.PosType, modDevice.DbNumber, modAddBoxNum.PlcPos); int boxNum = Convert.ToInt32(boxNumVal); if (boxNum != 1 && boxNum != 2) { Log.Error(string.Format($"ç 垛工ä½{0},请求æ’ç ç®±æ•°ä¸æ£ç¡®! boxNum:{boxNum}", modDevice.StationNum)); // 写入æ’入结果 2:æ’ç 失败 var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2"); break; } // 获å–当å‰åˆ†é“æ‰˜ç›˜å· var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false); if (checkTaskMedel == null) { Log.Error(string.Format("æ ¹æ®ç 垛工ä½{0},获å–分é“失败!", modDevice.StationNum)); // 写入æ’入结果 2:æ’ç 失败 var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2"); break; } string palletNo = checkTaskMedel.PalletNo; if (string.IsNullOrEmpty(palletNo)) { Log.Error(string.Format("获å–ç 垛工ä½{0}上的托盘å·å¤±è´¥ï¼", modDevice.StationNum)); // 写入æ’入结果 2:æ’ç 失败 var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2"); break; } for (int i = 1; i <= boxNum; i++) { // 获å–ç®±æ¡ç // 获å–ç®±æ¡ç é…ç½® var modBoxNo = modDevice.listStation.FirstOrDefault(m => m.Text == $"读å–ç®±ç {i}"); var (res, boxVal) = plcConn.GetPlcDBValue(modBoxNo.PosType, modDevice.DbNumber, modBoxNo.PlcPos); string boxNo = boxVal.ToString(); if (string.IsNullOrEmpty(boxNo)) { Log.Error(string.Format("ç 垛工ä½{0},箱ç 为nullæ’ç 失败!请人工强制结批。", modDevice.StationNum)); break; } // 验è¯ç®±ç 表是å¦å˜åœ¨æ¤ç®±ç var boxInfo = _db.Queryable<WcsBoxInfo>().Where(w => w.IsDelete == false && w.BoxNo == boxNo).ToList(); if (boxInfo.Count == 0) { Log.Error(string.Format("ç 垛工ä½{0},箱ç {1}ä¸å˜åœ¨!请人工强制结批。", modDevice.StationNum, boxNo)); // 写入æ’入结果 2:æ’ç 失败 plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2"); break; } // 修改æ’ç 表 foreach (WcsBoxInfo item in boxInfo) { item.PalletNo = palletNo; item.UpdateTime = DateTime.Now; } var resultCount = _db.Updateable(boxInfo).ExecuteCommand(); if (resultCount <= 0) { // æ’ç 失败 Log.Error(string.Format("ç®±ç {0};ç 垛工ä½{1},绑定托盘{2}失败,请强制结批", boxNo, modDevice.StationNum, palletNo)); // 写入æ’入结果 2:æ’ç 失败 plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2"); break; } } // æ’ç æˆåŠŸ var retVal2 = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "1"); if (retVal2.IsSucceed) { //æ›´æ–°å·²æ’ç æ•°é‡ checkTaskMedel.BoxCount += boxNum; _db.Updateable(checkTaskMedel).ExecuteCommand(); } else { // 写入失败 Log.Error(string.Format("写入PLCæ’ç 结果失败,ç 垛工ä½{1},托盘å·{2}", modDevice.StationNum, palletNo)); } } break; case "40": // 请求组托,申请入库 { lock (OLock) { // æ ¹æ®å·¥ä½å·ï¼ŒèŽ·å–æ‰˜ç›˜å· var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false); // æ ¹æ®å·¥ä½å·èŽ·å– æ‰˜ç›˜çº¿è¯¥å·¥ä½å·çš„é…ç½®ä¿¡æ¯ var numModel = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business && m.PlcId != modDevice.PlcId); //var posModel = PLCTaskAction.plcPositions.First(m => m.DeviceId == numModel.Id && m.Text == "目的工ä½" && m.IsDelete == false); if (checkTaskMedel == null) { Log.Error(string.Format("ç»„æ‰˜å¤±è´¥æ ¹æ®ç 垛工ä½{0}ï¼ŒèŽ·å–æ‰˜ç›˜å·å¤±è´¥!", modDevice.StationNum)); // å†™å…¥ç»„æ‰˜å›žå¤æµç¨‹å— var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "60"); break; } //èŽ·å–æ‰˜ç›˜é«˜åº¦ //var posPalletHeightModel = PLCTaskAction.plcPositions.First(m => m.DeviceId == numModel.Id && m.Text == "托盘高度" && m.IsDelete == false); //var (resPalletHeight, palletHeightVal) = plcConn.GetPlcDBValue(posPalletHeightModel.PosType, modDevice.DbNumber, posPalletHeightModel.PlcPos); //if (!resPalletHeight.IsSucceed) //{ // break; //} // ç åž›å·¥ä½æ‰˜ç›˜å· string palletNo = checkTaskMedel.PalletNo; //判æ–è¯¥æ‰˜ç›˜æ˜¯å¦æœ‰æ£åœ¨æ‰§è¡Œçš„任务,防æ¢é‡å¤ç”³è¯· var taskIng = _db.Queryable<WcsTask>().First(w => w.PalletNo == palletNo && (w.Status == TaskStatusEnum.Wait || w.Status == TaskStatusEnum.Doing) && w.IsDelete == false); if (taskIng != null) { break; } // æ ¹æ®æ‰˜ç›˜å·ï¼Œå°†ç»„æ‰˜ä¿¡æ¯æ’å…¥boxinfolog表 å¹¶åˆ é™¤boxinfoè¡¨æ•°æ® var boxInfoList = _db.Queryable<WcsBoxInfo>().Where(w => w.IsDelete == false && w.PalletNo == palletNo).ToList(); if (boxInfoList.Count <= 0) { Log.Error(string.Format("申请巷é“失败,ç 垛工ä½{0},箱ç ä¿¡æ¯ä¸å˜åœ¨", modDevice.StationNum)); // å†™å…¥ç»„æ‰˜å›žå¤æµç¨‹å— var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "60"); break; } // å‘WMSç”³è¯·å··é“ var http = new HttpService(); string TaskNo = "", EndLocate = ""; string strMsg = http.BindRequestRoadWay(checkTaskMedel.OrderNo, palletNo, checkTaskMedel.BoxCount.ToDecimal(), "0", checkTaskMedel.SkuNo, checkTaskMedel.LotNo, "", "", boxInfoList, modDevice.StationNum, "1", "1", ref EndLocate, ref TaskNo, (int)1351); if (strMsg.Contains("-1")) { Log.Error(string.Format("申请巷é“失败,ç 垛工ä½{0};åŽŸå› {1}", modDevice.StationNum, strMsg)); // å†™å…¥ç»„æ‰˜å›žå¤æµç¨‹å— var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "60"); break; } else { // 获å–å…¥åº“ä»»åŠ¡ä¿¡æ¯ var taskModel = _db.Queryable<WcsTask>().First(m => m.TaskNo == TaskNo && m.IsDelete == false && m.Status == TaskStatusEnum.Wait); if (taskModel != null) { // å†™å…¥ç»„æ‰˜å›žå¤æµç¨‹å— var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50"); if (retVal.IsSucceed) { // 将入库任务由æ£åœ¨æ‰§è¡Œæ”¹ä¸ºæ£åœ¨æ‰§è¡Œ taskModel.Status = TaskStatusEnum.Doing; _db.Updateable(taskModel).ExecuteCommand(); string sqlStr = $"insert into WCSBoxInfoLog select * from WCSBoxInfo where IsDelete=0 and PalletNo='{palletNo}'"; int insertCount = _db.Ado.ExecuteCommand(sqlStr); if (insertCount > 0) { string sqlStr2 = $"delete from WCSBoxInfo where IsDelete=0 and PalletNo='{palletNo}'"; _db.Ado.ExecuteCommand(sqlStr2); } // æ’入任务明细 var modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, InteractiveMsg = $"写入指令50ï¼šç”³è¯·å··é“æˆåŠŸ", PalletNo = palletNo, Status = TaskStatusEnum.Complete, StartLocat = modDevice.StationNum, EndLocat = strMsg, }; // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); // 通知任务界é¢ä»»åС已å˜åœ¨æ›´æ–° è¯·æ›´æ–°ç•Œé¢ HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); } } } } } break; case "100": //自动结批 { // 获å–当å‰åˆ†é“æ‰˜ç›˜å· var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false); if (checkTaskMedel == null) { Log.Error(string.Format("ç 垛工ä½{0},批次{1},自动结批失败!请人工强制结批!", modDevice.StationNum, checkTaskMedel.LotNo)); break; } // 触å‘结批 è§£ç»‘åˆ†é“ AutoEndLot(checkTaskMedel.LotNo, plcConn, "0", modDevice); } break; default: break; } } } /// <summary> /// æ‹†åž›æœºå™¨äººä¸šåŠ¡å¤„ç† /// </summary> /// <param name="modDevice"></param> private static void StackingRobot(WcsDeviceDto modDevice) { var plcConn = modDevice.PLCUtil; switch (modDevice.Value.ToString()) { case "0": { // 若拆垛工ä½ä¸ºç©ºé—²ï¼ŒæŸ¥è¯¢ä»»åŠ¡è¡¨æ˜¯å¦æœ‰æœªç»‘定的出库任务,åšç»‘定æ“作 } break; default: break; } } private static void LedDisplay(string ip,string text,int type=0) { try { LedDll Led = new LedDll(); if (type == 0) { Led.ConsoleLeds(ip, text); } else { Led.LEDstr(ip, text); } // 设置实例 //Led.ConsoleLeds("10.18.51.238", $"任务类型:{TaskTypeEnum.Move.GetDescription()}\n\n任务å·:TK2024102100001\n托盘å·:LN000145\n\nèµ·å§‹ä½:033\nç›®æ ‡ä½:R01-02010102"); } catch (Exception ex) { Log.Error(ex.Message); } } /// <summary> /// 自动结批 å¹¶ è§£ç»‘åˆ†é“ /// </summary> /// <param name="lotNo">批次å·</param> /// <param name="plcConn">Plc连接</param> /// <param name="status">是å¦è§£ç»‘åˆ†é“ 0:解绑 1:绑定</param> private static void AutoEndLot(string lotNo, PLCUtil plcConn, string status, WcsDeviceDto modDevice) { try { if (string.IsNullOrWhiteSpace(lotNo)) { Console.WriteLine("批次å·ä¸ºnull"); } var checkTaskList = _db.Queryable<WcsCheckTask>().Where(w => w.LotNo == lotNo && w.Status == "1").ToList(); if (checkTaskList.Count <= 0) { Console.WriteLine("未找到分é“绑定信æ¯"); } var taskInfo = _db.Queryable<WcsOderTask>().First(w => w.OrderNo == checkTaskList[0].OrderNo); if (taskInfo != null) { taskInfo.Status= TaskStatusEnum.Complete;//å·²ç»“æŸ //æ›´æ–°ä»»åŠ¡çŠ¶æ€ _db.Updateable(taskInfo).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); } foreach (var item in checkTaskList) { #region#ç»™PLCå†™å…¥ç»“æ‰¹æ‰¹æ¬¡å· var listResult = new List<Result>(); listResult.Add(plcConn.SetPlcDBValueRepeat(item.PosType, item.DbNumber, item.PlcPos, "0"));//å“ç§å· listResult.Add(plcConn.SetPlcDBValueRepeat(item.PosTypeLot, item.DbNumber, item.PosLot, ""));//æ‰¹æ¬¡å· listResult.Add(plcConn.SetPlcDBValueRepeat(item.PosTypeStatus, item.DbNumber, item.PosStatus, "0"));//ç»‘å®šçŠ¶æ€ 0:未绑定 1:已绑定 if (listResult.All(s => s.IsSucceed)) { // å†™å…¥ç»„æ‰˜å›žå¤æµç¨‹å— var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "110"); if (retVal.IsSucceed) { //写入æµç¨‹å—æˆåŠŸåŽæ›´æ–°åˆ†æ‹£ä»»åŠ¡ item.OrderNo = ""; item.TaskNo = ""; item.LotNo = ""; item.SkuNo = ""; item.SkuName = ""; item.BoxType = ""; item.Qty = 0; item.BoxCount = 0; item.PZNo = ""; item.PalletNo = ""; item.Status = status; // ç»‘å®šåˆ†é“ 0:解绑 1:绑定 //æ›´æ–°ç»‘å®šä¿¡æ¯ _db.Updateable(item).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); } } else { throw Oops.Bah("与PCL交互失败,结批失败ï¼"); } #endregion } } catch (Exception ex) { Log.Error(ex.Message); throw; } } private static void Test(WcsDeviceDto modDevice) { //å†™æ»æµ‹è¯•读string var (res, val) = modDevice.PLCUtil.GetPlcDBValue(PLCDataTypeEnum.String, "DB100", "64"); Console.WriteLine("DB100.64----" + val); //测试批é‡è¯»å– Dictionary<string, PLCDataTypeEnum> listaddress = new Dictionary<string, PLCDataTypeEnum>(); foreach (var modStation in modDevice.listStation) { listaddress.Add(modStation.PlcPos, modStation.PosType); } var result = modDevice.PLCUtil.GetPlcBatchDBValue(listaddress); if (result.Value.Count > 0) { foreach (var value in result.Value) { Console.WriteLine("地å€" + value.Key + "----值" + value, value); } } if (!result.IsSucceed) { foreach (var err in result.ErrList) { Console.WriteLine(err); } if (result.Value.Count > 0)//有错误的也有æˆåŠŸçš„ { } } if (modDevice.Value == 820) { //测试写入830 //var result = mod.PLCUtil.SetPlcDBValue(mod.PosType.Value, mod.DbNumber, mod.PlcPos, "830"); ////å†™å…¥æ˜¯å¦æˆåŠŸ //if (result.IsSucceed) //{ //} } else if (modDevice.Value == 840) { } else if (modDevice.Value == 860) { } } }