diff --git a/src/Khd.Core.Api/Controllers/RecieveRcsController.cs b/src/Khd.Core.Api/Controllers/RecieveRcsController.cs index 4b79eb3..cd65964 100644 --- a/src/Khd.Core.Api/Controllers/RecieveRcsController.cs +++ b/src/Khd.Core.Api/Controllers/RecieveRcsController.cs @@ -25,10 +25,24 @@ namespace Khd.Core.Api.Controllers public ReponseagvCallbackDto agvCallback(agvCallbackDto agvCallbackDto) { LogManager.Info($"RecieveRcsController接口信息:{agvCallbackDto.ToJsonString()}"); - + agvCallbackDto.method = "outbin"; return _application.AgvCallback(agvCallbackDto); } + + /// + /// 接收agv接收任务通知接口 + /// + /// + /// + [HttpPost("agvContinue")] + public ReponseagvCallbackDto agvContinue(agvCallbackDto agvCallbackDto) + { + LogManager.Info($"RecieveRcsController接口信息:{agvCallbackDto.ToJsonString()}"); + agvCallbackDto.method = "continue"; + return _application.AgvCallback(agvCallbackDto); + + } } } \ No newline at end of file diff --git a/src/Khd.Core.Api/appsettings.json b/src/Khd.Core.Api/appsettings.json index ee669a9..1114562 100644 --- a/src/Khd.Core.Api/appsettings.json +++ b/src/Khd.Core.Api/appsettings.json @@ -11,8 +11,8 @@ }, "AllowedHosts": "*", "ConnectionStrings": { - "DefaultConnection": "server=106.12.13.113;port=3336;database=khd_jyhb;uid=khd;pwd=khd@123;charset='utf8';persistsecurityinfo=True;SslMode=none;Allow User Variables=True" - // "DefaultConnection": "Data Source=localhost;Initial Catalog=lanju_op_xiaolan_ds;Persist Security Info=True;User ID=sa;Password=root;MultipleActiveResultSets=True;TrustServerCertificate=True", + //"DefaultConnection": "server=175.27.215.92;port=3306;database=hwjy-cloud;uid=kehaida;pwd=khd2024;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True", + "DefaultConnection": "server=175.27.215.92;port=3306;database=hwjy-cloud;uid=kehaida;pwd=khd2024;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True" //"DefaultConnection": "Data Source=121.36.58.109;Initial Catalog=lanju_op_xiaolan_ds;Persist Security Info=True;User ID=sa;Password=haiwei@123;MultipleActiveResultSets=True;TrustServerCertificate=True" }, "JwtSecurityOption": { diff --git a/src/Khd.Core.Application/WcsTaskApplication.cs b/src/Khd.Core.Application/WcsTaskApplication.cs index 5ddf3a8..e84e88e 100644 --- a/src/Khd.Core.Application/WcsTaskApplication.cs +++ b/src/Khd.Core.Application/WcsTaskApplication.cs @@ -52,7 +52,7 @@ namespace Khd.Core.Application if (wcscmd != null) { //待取货 - if (agvCallbackDto.method == "") + if (agvCallbackDto.method == "continue") { wcscmd.cmdStatus = 2; wcscmd.sendFlag = 1; @@ -60,7 +60,7 @@ namespace Khd.Core.Application _dbContext.SaveChanges(); } //已取货待放货 - if (agvCallbackDto.method == "") + if (agvCallbackDto.method == "compeleted") { wcscmd.cmdStatus = 3; wcscmd.sendFlag = 1; diff --git a/src/Khd.Core.Domain/Dto/webapi/genAgvSchedulingTask.cs b/src/Khd.Core.Domain/Dto/webapi/genAgvSchedulingTask.cs index 3075428..5f0e16c 100644 --- a/src/Khd.Core.Domain/Dto/webapi/genAgvSchedulingTask.cs +++ b/src/Khd.Core.Domain/Dto/webapi/genAgvSchedulingTask.cs @@ -55,7 +55,15 @@ namespace Khd.Core.Domain.Dto.webapi /// /// “180”,”0”,”90”,”-90” 分别对应地图的”左”,”右”,”上”,”下” ,不指定方向可以为空 /// - public string podDir { get; set; } + public string podDir { get; set; } + /// + /// “180”,”0”,”90”,”-90” 分别对应地图的”左”,”右”,”上”,”下” ,不指定方向可以为空 + /// + public string podTyp { get; set; } + /// + /// “180”,”0”,”90”,”-90” 分别对应地图的”左”,”右”,”上”,”下” ,不指定方向可以为空 + /// + public string podCode { get; set; } /// /// 物料批次或货架上的物料唯一编码, /// @@ -95,11 +103,11 @@ namespace Khd.Core.Domain.Dto.webapi /// /// 货架编号,不指定货架可以为空 /// - public string podCode { get; set; } + public string positionCode { get; set; } /// /// 货架类型, 传空时表示随机找个货架 /// - public string podTyp { get; set; } + public string type { get; set; } } @@ -110,7 +118,7 @@ namespace Khd.Core.Domain.Dto.webapi /// public string code { get; set; } /// - /// 返回消息 + /// 返回消息,成功或其他 /// public string message { get; set; } /// diff --git a/src/Khd.Core.Domain/Models/BaseDictionary.cs b/src/Khd.Core.Domain/Models/BaseDictionary.cs index dfc76a8..edd6e11 100644 --- a/src/Khd.Core.Domain/Models/BaseDictionary.cs +++ b/src/Khd.Core.Domain/Models/BaseDictionary.cs @@ -14,7 +14,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace Khd.Core.Domain.Models { - [Table("base_dictionary")] + [Table("wcs_base_dictionary")] public class BaseDictionary { diff --git a/src/Khd.Core.Domain/Models/BaseEquip.cs b/src/Khd.Core.Domain/Models/BaseEquip.cs index 3a2f440..d42fe05 100644 --- a/src/Khd.Core.Domain/Models/BaseEquip.cs +++ b/src/Khd.Core.Domain/Models/BaseEquip.cs @@ -14,7 +14,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace Khd.Core.Domain.Models { - [Table("base_equip")] + [Table("wcs_base_equip")] public class BaseEquip { diff --git a/src/Khd.Core.Domain/Models/BasePlcpoint.cs b/src/Khd.Core.Domain/Models/BasePlcpoint.cs index e3f842e..775e402 100644 --- a/src/Khd.Core.Domain/Models/BasePlcpoint.cs +++ b/src/Khd.Core.Domain/Models/BasePlcpoint.cs @@ -14,7 +14,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace Khd.Core.Domain.Models { - [Table("base_plcpoint")] + [Table("wcs_base_plcpoint")] public class BasePlcpoint { @@ -38,7 +38,7 @@ namespace Khd.Core.Domain.Models /// 点位长度 /// [Column("plcpoint_length")] - public int? plcpointLength { get; set; } + public string plcpointLength { get; set; } /// /// 点位地址 diff --git a/src/Khd.Core.Domain/Models/PlcPoint.cs b/src/Khd.Core.Domain/Models/PlcPoint.cs index e4b56b8..43c4104 100644 --- a/src/Khd.Core.Domain/Models/PlcPoint.cs +++ b/src/Khd.Core.Domain/Models/PlcPoint.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace Khd.Core.Domain.Models { - [Table("Plc_Point")] + [Table("wcs_Plc_Point")] public class PlcPoint { [Column("id")] diff --git a/src/Khd.Core.Domain/Models/WcsCmd.cs b/src/Khd.Core.Domain/Models/WcsCmd.cs index f8b1073..66d30db 100644 --- a/src/Khd.Core.Domain/Models/WcsCmd.cs +++ b/src/Khd.Core.Domain/Models/WcsCmd.cs @@ -17,6 +17,11 @@ namespace Khd.Core.Domain.Models [Table("wcs_cmd")] public class WcsCmd { + /// + /// 任务代码 + /// + [Column("task_code")] + public string taskCode; [Key] [Column("objid")] diff --git a/src/Khd.Core.Domain/Models/WcsTask.cs b/src/Khd.Core.Domain/Models/WcsTask.cs index a3c33f8..aaeaa57 100644 --- a/src/Khd.Core.Domain/Models/WcsTask.cs +++ b/src/Khd.Core.Domain/Models/WcsTask.cs @@ -17,6 +17,8 @@ namespace Khd.Core.Domain.Models [Table("wcs_task")] public class WcsTask { + [Column("from_floor_no")] + public int? fromFloorNo; [Key] [Column("objid")] diff --git a/src/Khd.Core.Domain/Models/WmsBaseLocation.cs b/src/Khd.Core.Domain/Models/WmsBaseLocation.cs index 52f49f1..d4261a2 100644 --- a/src/Khd.Core.Domain/Models/WmsBaseLocation.cs +++ b/src/Khd.Core.Domain/Models/WmsBaseLocation.cs @@ -22,6 +22,11 @@ namespace Khd.Core.Domain.Models [Column("location_id")] public long locationId { get; set; } + /// + /// 料箱号 + /// + [Column("container_code")] + public string containerCode { get; set; } /// /// 仓库ID,关联wms_base_warehouse的warehouse_id /// @@ -34,6 +39,9 @@ namespace Khd.Core.Domain.Models [Column("agv_position_code")] public string agvPositionCode { get; set; } + [Column("warehouse_floor")] + public int warehouseFloor { get; set; } + /// /// 库位编码 /// diff --git a/src/Khd.Core.EntityFramework/DefaultDbContext.cs b/src/Khd.Core.EntityFramework/DefaultDbContext.cs index 4a2e0da..15e754d 100644 --- a/src/Khd.Core.EntityFramework/DefaultDbContext.cs +++ b/src/Khd.Core.EntityFramework/DefaultDbContext.cs @@ -10,89 +10,60 @@ namespace Khd.Core.EntityFramework } public DbSet BaseDictionary { get; set; } - public DbSet BaseEquip { get; set; } - - - public DbSet BasePlcpoint { get; set; } - - - public DbSet MesBasePalletInfo { get; set; } - - - public DbSet WcsCmd { get; set; } - public DbSet WcsCmdLog { get; set; } - public DbSet WcsStock { get; set; } - public DbSet WcsTask { get; set; } - public DbSet WcsTaskLog { get; set; } - - public DbSet WcsWarehouseOrder { get; set; } - public DbSet WcsWarehouseOrderDetaile { get; set; } - public DbSet WmsBaseLocation { get; set; } - public DbSet WmsBaseWarehouse { get; set; } - public DbSet WmsProductInstock { get; set; } - public DbSet WmsProductInstockDetail { get; set; } - public DbSet WmsProductOutstock { get; set; } - public DbSet WmsProductOutstockDetail { get; set; } - public DbSet WmsProductStock { get; set; } - public DbSet WmsProductStockSaleorder { get; set; } - public DbSet WmsRawInstock { get; set; } - public DbSet WmsRawInstockDetail { get; set; } - public DbSet WmsRawOutstock { get; set; } - public DbSet WmsRawOutstockDetail { get; set; } - public DbSet WmsRawStock { get; set; } - public DbSet WmsRawStockOccupy { get; set; } - public DbSet WmsWarehouseMaterial { get; set; } + public DbSet WcsOutstockLock { get; set; } + public DbSet MesBaseBarcodeInfo { get; set; } + public DbSet PlcPoint { get; set; } } } \ No newline at end of file diff --git a/src/Khd.Core.Plc/StaticPlcHelper.cs b/src/Khd.Core.Plc/StaticPlcHelper.cs new file mode 100644 index 0000000..e65e848 --- /dev/null +++ b/src/Khd.Core.Plc/StaticPlcHelper.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Khd.Core.Plc +{ + /// + /// Plc帮助类 + /// + public static class StaticPlcHelper + { + /// + /// 进行高低位转换后,写入Plc地址 + /// + /// plc + /// 写入地址 + /// 值 + /// 长度 + public static void WriteToPoint(this Plc.S7.Plc plc,string address,string valueString,string len) + { + var value = GetValue(len, valueString); + plc.Write(address, value); + } + + /// + /// 电气写入点位高低位转换 + /// + /// 点位地址位长度 + /// 写入数值 + /// + private static object GetValue(string len, string value) + { + if (len == "2") + { + return Convert.ToInt16(value); + } + if (len == "4") + { + return Convert.ToInt32(value); + } + return 0; + } + } +} diff --git a/src/Khd.Core.Wcs/MainCentralControl.cs b/src/Khd.Core.Wcs/MainCentralControl.cs index 3b60008..ebce8a2 100644 --- a/src/Khd.Core.Wcs/MainCentralControl.cs +++ b/src/Khd.Core.Wcs/MainCentralControl.cs @@ -1,7 +1,7 @@ using Khd.Core.EntityFramework; using Khd.Core.Plc.S7; using Khd.Core.Wcs.Global; -using Khd.Core.Wcs.MyWcs; +using Khd.Core.Wcs.Wcs; using Masuit.Tools.Logging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -31,10 +31,20 @@ namespace Khd.Core.Wcs public void Start() { try - { + { //加载配置项 + foreach (var plcConfig in StaticData.PlcConfigs) + { + if (!StaticData.PlcDic.Any(t => t.Key == plcConfig.Code)) + { + Plc.S7.Plc plc; + plc = new Plc.S7.Plc((CpuType)plcConfig.CpuType, plcConfig.IP, plcConfig.Port, plcConfig.Rack, plcConfig.Slot); + plc.Open(); + StaticData.PlcDic.TryAdd(plcConfig.Code, plc); + } + } using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); - StaticData.PlcPoints = dbContext.PlcPoint.GroupBy(t => t.Floor_No).ToDictionary(t => t.Key, t => t.ToDictionary(t => t.PlcPoint_No, t => t)); + //设置程序启动时清空点位的数据=>0为 Int16位 QingKongDianWei = GetValue("2", "0"); //设置默认处理完成=>1为 Int16位 @@ -43,39 +53,60 @@ namespace Khd.Core.Wcs WcsMoRenQuXiang = GetValue("2", "1"); StaticData.BasePlcpointList = dbContext.BasePlcpoint.Where(t => t.isDelete == 0).ToList(); - var baseEquips = dbContext.BaseEquip.ToList(); - //加载配置项 - foreach (var plcConfig in StaticData.PlcConfigs) - { - if (!StaticData.PlcDic.Any(t => t.Key == plcConfig.Code)) - { - var plc = new Plc.S7.Plc((CpuType)plcConfig.CpuType, plcConfig.IP, plcConfig.Port, plcConfig.Rack, plcConfig.Slot); - plc.Open(); - StaticData.PlcDic.TryAdd(plcConfig.Code, plc); - } - } - //连接PLC判断 - foreach (var item in baseEquips) - { - if (item.floorNo != null) - { - if (item.equipType == 1) - { - DockingPositionLogic dockingPositionLogic = new(item.floorNo.Value, item, _host, StaticData.PlcDic[0]); - dockingPositionLogic.Start(); - } - else if (item.equipType == 2) - { - ElevatorLogic elevatorLogic = new(item.floorNo.Value, item, _host, StaticData.PlcDic[0]); - elevatorLogic.Start(); - } - else if (item.equipType == 4 || item.equipType == 5) - { - AgvTaskLogic agvTaskLogic = new(item.floorNo.Value, item, baseEquips.First(t => t.equipType == 1 && t.floorNo == item.floorNo), _host, StaticData.PlcDic[0]); - agvTaskLogic.Start(); - } - } - } + StaticData.BaseEquip = dbContext.BaseEquip.ToList(); + + ////创建任务 + //CreateTaskByRecord createTaskByRecord = new(_host, StaticData.PlcDic[0], ""); + //createTaskByRecord.StartPoint(); + + //一楼提升机以及接驳位 + FirstFloor firstFloor = new(_host, StaticData.PlcDic[0]); + firstFloor.StartPoint(); + + ////二层接驳位 + //var SecondBaseFloorEquip = StaticData.BaseEquip.Where(t => t.floorNo == 2 && t.equipType == 1).First(); + //SecondFloorPoint secondFloorPoint = new(_host, StaticData.PlcDic[0], SecondBaseFloorEquip.floorNo.Value, SecondBaseFloorEquip.equipNo); + //secondFloorPoint.StartPoint(); + + ////二层AGV + //var SecondFloorAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 2 && t.equipType == 4).First(); + //SecondFloorAGV secondFloorAGV = new(_host, StaticData.PlcDic[0], SecondFloorAgvEquip.floorNo.Value, SecondFloorAgvEquip.equipNo); + //secondFloorAGV.StartPoint(); + + ////二楼线体 + //var SecondFloorLineEquip = StaticData.BaseEquip.Where(t => t.floorNo == 2 && t.equipType == 3).First(); + //SecondFloorLine secondFloorLine = new(_host, StaticData.PlcDic[0], SecondFloorLineEquip.floorNo.Value, SecondFloorLineEquip.equipNo); + //secondFloorLine.StartPoint(); + + ////三层接驳位 + //var ThirdBaseFloorEquip = StaticData.BaseEquip.Where(t => t.floorNo == 3 && t.equipType == 1).First(); + //ThirdFloorPoint thirdFloorPoint = new(_host, StaticData.PlcDic[0], ThirdBaseFloorEquip.floorNo.Value, ThirdBaseFloorEquip.equipNo); + //thirdFloorPoint.StartPoint(); + + ////三层AGV + //var ThirdFloorAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 3 && t.equipType == 4).First(); + //ThirdFloorAGV thirdFloorAGV = new(_host, StaticData.PlcDic[0], ThirdFloorAgvEquip.floorNo.Value, ThirdFloorAgvEquip.equipNo); + //thirdFloorAGV.StartPoint(); + + //五层接驳位 + var FifthBaseFloorEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 1).First(); + FiveFloorPoint fifthFloorPoint = new(_host, StaticData.PlcDic[0], FifthBaseFloorEquip.floorNo.Value, FifthBaseFloorEquip.equipNo); + fifthFloorPoint.StartPoint(); + + ////五层线体 + //var FiveFloorLineEquip = StaticData.BaseEquip.Where(t => t.floorNo == 4 && t.equipType == 3).First(); + //FiveFloorLine fiveFloorLine = new(_host, StaticData.PlcDic[0], FiveFloorLineEquip.floorNo.Value, FiveFloorLineEquip.equipNo); + //fiveFloorLine.StartPoint(); + + ////五层CTU + //var FiveFloorCTUEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 6).First(); + //FiveFloorCTU fiveFloorCTU = new(_host, StaticData.PlcDic[0], FiveFloorCTUEquip.floorNo.Value, FiveFloorCTUEquip.equipNo); + //fiveFloorCTU.StartPoint(); + + ////五层AGV + //var FifthFloorAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 5).First(); + //FiveFloorAGV fifthFloorAGV = new(_host, StaticData.PlcDic[0], FifthFloorAgvEquip.floorNo.Value, FifthFloorAgvEquip.equipNo); + //fifthFloorAGV.StartPoint(); } catch (Exception ex) { diff --git a/src/Khd.Core.Wcs/MyWcs/AgvTaskLogic.cs b/src/Khd.Core.Wcs/MyWcs/AgvTaskLogic.cs deleted file mode 100644 index a5d39a9..0000000 --- a/src/Khd.Core.Wcs/MyWcs/AgvTaskLogic.cs +++ /dev/null @@ -1,282 +0,0 @@ -using Khd.Core.Domain.Dto.webapi; -using Khd.Core.Domain.Models; -using Khd.Core.EntityFramework; -using Khd.Core.Wcs.Global; -using Masuit.Tools.Logging; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Khd.Core.Wcs.MyWcs -{ - /// - /// AGV任务逻辑 - /// - public class AgvTaskLogic - { - private readonly Dictionary _plcPoints; - private readonly Plc.S7.Plc _plc; - private readonly int _floorNo; - private readonly BaseEquip _baseEquip; - private readonly IHost _host; - private readonly BaseEquip _lineEquip; - - /// - /// 构造函数 - /// - /// 楼层号 - /// 基站设备 - /// 线路设备 - /// IHost - /// Plc - public AgvTaskLogic(int FloorNo, BaseEquip baseEquip, BaseEquip lineEquip, IHost host, Plc.S7.Plc plc) - { - _plc = plc; - _floorNo = FloorNo; - _baseEquip = baseEquip; - _lineEquip = lineEquip; - _host = host; - _plcPoints = StaticData.PlcPoints[FloorNo]; - } - - /// - /// 启动AGV任务逻辑 - /// - public void Start() - { - Thread ExecuteLogicThread = new(ExecuteTaskLogic) - { - IsBackground = true - }; - ExecuteLogicThread.Start(); - - Thread ContinueLogicThread = new(ContinueTaskLogic) - { - IsBackground = true - }; - ContinueLogicThread.Start(); - Console.WriteLine($"{DateTime.Now}:{this._floorNo}楼Agv任务逻辑启动成功"); - LogManager.Info($"{this._floorNo}楼Agv任务逻辑启动成功"); - } - - /// - /// 执行AGV任务逻辑 - /// - private void ExecuteTaskLogic() - { - while (true) - { - try - { - using var scope = _host.Services.CreateScope(); - using var dbContext = scope.ServiceProvider.GetRequiredService(); - var wcsTask = dbContext.WcsTask - .Where(t => t.floorNo == _floorNo) - .Where(t => t.nextPointId == _baseEquip.objid) - .OrderBy(t => t.createTime) - .FirstOrDefault(); - if (wcsTask != null && wcsTask.taskStatus == 0)//未执行的任务 - { - if (wcsTask.taskType % 2 == 1)//入库 - { - var wmsBaseLocations = dbContext.WmsBaseLocation - .Where(t => t.activeFlag == "1") - .Where(t => t.delFlag == "0") - .Where(t => t.instockFlag == "0") - .Where(t => t.locationScrapType == "1") - .Where(t => t.locationStatus == "1") - .Where(t => t.outstockFlag == "0") - .Where(t => t.warehouseId == wcsTask.endPointId).ToList(); - if (wmsBaseLocations.Count > 0) - { - var wmsBaseLocation = wmsBaseLocations.First(); - wcsTask.endPointId = wmsBaseLocation.locationId; - wcsTask.endPointNo = wmsBaseLocation.locationCode; - var request = new RequestAGVTaskDto() - { - reqCode = wcsTask.objid.ToString(), - taskMode = "2", - positionCodePath = new List - { - new Position - { - podCode=_lineEquip.equipNo - }, - new Position - { - podCode=wmsBaseLocation.agvPositionCode - } - } - }; - var reponse = SendTask(request); - if (reponse != null) - { - if (reponse.message == "成功") - { - LogManager.Info("AGV任务执行成功,任务ID:" + wcsTask.objid); - wcsTask.taskStatus = 1; - wcsTask.updateTime = DateTime.Now; - wmsBaseLocation.instockFlag = "1"; - wmsBaseLocation.locationStatus = "2"; - dbContext.Update(wmsBaseLocation); - dbContext.Update(wcsTask); - dbContext.SaveChanges(); - } - else - { - LogManager.Debug("AGV任务执行失败,任务ID:" + wcsTask.objid + ",失败原因:" + reponse.message); - } - } - } - } - else//出库 - { - var request = new RequestAGVTaskDto() - { - reqCode = wcsTask.objid.ToString(), - taskMode = "2", - positionCodePath = new List - { - new Position - { - podCode=wcsTask.startPointNo - }, - new Position - { - podCode=wcsTask.nextPointNo - } - } - }; - var reponse = SendTask(request); - if (reponse != null) - { - if (reponse.message == "成功") - { - LogManager.Info("AGV任务执行成功,任务ID:" + wcsTask.objid); - var wmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.agvPositionCode == wcsTask.startPointNo).ToList(); - foreach (var item in wmsBaseLocations) - { - var wmsBaseWarehouse = dbContext.WmsBaseWarehouse.FirstOrDefault(t => t.warehouseId == item.warehouseId); - if (wmsBaseWarehouse != null && wmsBaseWarehouse.warehouseFloor == _floorNo) - { - item.outstockFlag = "1"; - item.locationStatus = "6"; - dbContext.Update(item); - break; - } - } - wcsTask.taskStatus = 1; - wcsTask.updateTime = DateTime.Now; - dbContext.Update(wcsTask); - dbContext.SaveChanges(); - } - else - { - LogManager.Debug("AGV任务执行失败,任务ID:" + wcsTask.objid + ",失败原因:" + reponse.message); - } - } - } - } - } - catch (Exception ex) - { - LogManager.Error(ex); - } - Thread.Sleep(1000); - } - } - - /// - /// 继续执行AGV任务逻辑 - /// - private void ContinueTaskLogic() - { - while (true) - { - try - { - using var scope = _host.Services.CreateScope(); - using var dbContext = scope.ServiceProvider.GetRequiredService(); - var wcsTask = dbContext.WcsTask - .Where(t => t.floorNo == _floorNo) - .Where(t => t.nextPointId == _baseEquip.objid) - .Where(t=>t.taskStatus==2) - .OrderBy(t => t.createTime) - .FirstOrDefault(); - if (wcsTask != null) - { - var request = new RequestAGVTaskDto(); - request.reqCode = wcsTask.objid.ToString(); - var reponse = ContinueTask(request); - if (reponse != null) - { - if (reponse.message == "成功") - { - LogManager.Info("AGV任务继续执行成功,任务ID:" + wcsTask.objid); - wcsTask.taskStatus = 3; - wcsTask.updateTime = DateTime.Now; - var wmsBaseLocation = dbContext.WmsBaseLocation.FirstOrDefault(t => t.locationId == wcsTask.endPointId); - if (wmsBaseLocation != null) - { - wmsBaseLocation.instockFlag = "0"; - wmsBaseLocation.outstockFlag = "0"; - wmsBaseLocation.locationStatus = "1"; - dbContext.Update(wmsBaseLocation); - } - dbContext.Update(wcsTask); - dbContext.SaveChanges(); - } - else - { - LogManager.Debug("AGV任务继续执行失败,任务ID:" + wcsTask.objid + ",失败原因:" + reponse.message); - } - } - } - } - catch(Exception ex) - { - LogManager.Error(ex); - } - } - } - - /// - /// 发送任务 - /// - private ReponseagvCallbackDto? SendTask(RequestAGVTaskDto request) - { - if (_baseEquip.serverPort == null) - { - throw new Exception("服务器端口不能为空"); - } - string ip = _baseEquip.serverIp; - int port = _baseEquip.serverPort.Value; - string url = ""; - string message = JsonConvert.SerializeObject(request); - string result = HttpHelper.SendPostMessage(ip, port, url, message); - return JsonConvert.DeserializeObject(result); - } - - /// - /// 继续执行任务 - /// - private ReponseagvcontinueTaskDto? ContinueTask(RequestAGVTaskDto request) - { - if (_baseEquip.serverPort == null) - { - throw new Exception("服务器端口不能为空"); - } - string ip = _baseEquip.serverIp; - int port = _baseEquip.serverPort.Value; - string url = ""; - string message = JsonConvert.SerializeObject(request); - string result = HttpHelper.SendPostMessage(ip, port, url, message); - return JsonConvert.DeserializeObject(result); - } - } -} diff --git a/src/Khd.Core.Wcs/MyWcs/DockingPositionLogic.cs b/src/Khd.Core.Wcs/MyWcs/DockingPositionLogic.cs deleted file mode 100644 index b234495..0000000 --- a/src/Khd.Core.Wcs/MyWcs/DockingPositionLogic.cs +++ /dev/null @@ -1,194 +0,0 @@ -using Khd.Core.Domain.Models; -using Khd.Core.EntityFramework; -using Khd.Core.Wcs.Global; -using Masuit.Tools.Logging; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Khd.Core.Wcs.MyWcs -{ - /// - /// 接驳位逻辑 - /// - public class DockingPositionLogic - { - private readonly int _floorNo; - private readonly Dictionary _dockingPosition; - private readonly Plc.S7.Plc _plc; - private readonly IHost _host; - private readonly BaseEquip _currentEquip; - - /// - /// 构造函数 - /// - /// 楼层号 - /// 当前设备 - /// IHost - /// Plc - public DockingPositionLogic(int floorNo, BaseEquip currentEquip, IHost host, Plc.S7.Plc plc) - { - _floorNo = floorNo; - _host = host; - _plc = plc; - _currentEquip = currentEquip; - _dockingPosition = StaticData.PlcPoints[floorNo]; - } - - /// - /// 启动线程 - /// - public void Start() - { - var ExecuteLogicThread = new Thread(ExecuteLogic); - ExecuteLogicThread.IsBackground = true; - ExecuteLogicThread.Start(); - Console.WriteLine($"{DateTime.Now}:{this._floorNo}楼接驳位线程启动成功"); - LogManager.Info($"{this._floorNo}楼接驳位线程启动成功"); - } - - /// - /// 执行任务 - /// - public void ExecuteLogic() - { - while (true) - { - try - { - var rfid = _plc.Read(_dockingPosition[$"RFID00{_floorNo}"].PlcPoint_Address); - var serialNo = _plc.Read(_dockingPosition[$"SerialNo00{_floorNo}"].PlcPoint_Address); - var isPallet = _plc.Read(_dockingPosition[$"IsPallet00{_floorNo}"].PlcPoint_Address); - var lineSignal = _plc.Read(_dockingPosition[$"LineSignal00{_floorNo}"].PlcPoint_Address); - var wcsRun = _plc.Read(_dockingPosition[$"WcsRun00{_floorNo}"].PlcPoint_Address); - if (rfid != null && serialNo != null && isPallet != null && lineSignal != null && wcsRun != null) - { - if (!string.IsNullOrEmpty(rfid.ToString()) && Convert.ToInt32(isPallet) == 1) - { - using var scope = _host.Services.CreateScope(); - using var dbContext = scope.ServiceProvider.GetRequiredService(); - var wcsTask = dbContext.WcsTask - .Where(t => t.floorNo == _floorNo) - .Where(t => t.containerNo == rfid.ToString()) - .OrderBy(t => t.createTime) - .FirstOrDefault(); - - if (wcsTask == null) - { - var PalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == rfid.ToString()); - if (PalletInfo != null) - { - var WarehouseMaterial = dbContext.WmsWarehouseMaterial.FirstOrDefault(t => t.storageId == PalletInfo.materialId); - if (WarehouseMaterial != null) - { - var BaseWarehouse = dbContext.WmsBaseWarehouse.FirstOrDefault(t => t.warehouseId == WarehouseMaterial.warehouseId); - if (BaseWarehouse != null) - { - if (BaseWarehouse.warehouseFloor == _floorNo) - { - var agvEquip = dbContext.BaseEquip.FirstOrDefault(t => t.floorNo == _floorNo && (t.equipType == 4 || t.equipType == 5)); - if (agvEquip != null) - { - wcsTask = new WcsTask() - { - objid = StaticData.SnowId.NextId(), - floorNo = _floorNo, - containerNo = rfid.ToString(), - createBy = "WCS", - createTime = DateTime.Now, - startPointId = _currentEquip.objid, - startPointNo = _currentEquip.equipNo, - currPointId = _currentEquip.objid, - currPointNo = _currentEquip.equipNo, - taskStatus = 0, - endPointId = BaseWarehouse.warehouseId, - endPointNo = BaseWarehouse.warehouseCode, - equipmentNo = _currentEquip.equipNo, - masterId = null, - materialId = PalletInfo.materialId, - materialNo = PalletInfo.materialCode, - nextPointId = agvEquip.objid, - nextPointNo = agvEquip.equipNo, - taskType = 0, - useFlag = 1 - }; - } - } - else - { - var elevatorEquip = dbContext.BaseEquip.FirstOrDefault(t => t.floorNo == 1 && t.equipType == 2); - if (elevatorEquip != null) - { - wcsTask = new WcsTask() - { - objid = StaticData.SnowId.NextId(), - floorNo = _floorNo, - containerNo = rfid.ToString(), - createBy = "WCS", - createTime = DateTime.Now, - startPointId = _currentEquip.objid, - startPointNo = _currentEquip.equipNo, - currPointId = _currentEquip.objid, - currPointNo = _currentEquip.equipNo, - taskStatus = 0, - endPointId = BaseWarehouse.warehouseId, - endPointNo = BaseWarehouse.warehouseCode, - equipmentNo = _currentEquip.equipNo, - masterId = null, - materialId = PalletInfo.materialId, - materialNo = PalletInfo.materialCode, - nextPointId = elevatorEquip.objid, - nextPointNo = elevatorEquip.equipNo, - taskType = 0, - useFlag = 1 - }; - } - } - } - } - } - }//没有任务,默认入库 - - if (wcsTask != null && wcsTask.taskStatus == 0) - { - var ElevatorEquip = dbContext.BaseEquip.First(t => t.equipType == 2); - var AgvEquip = dbContext.BaseEquip.FirstOrDefault(t => t.floorNo == _floorNo && (t.equipType == 4 || t.equipType == 5)); - if (wcsTask.nextPointId == ElevatorEquip.objid)//下一个为提升机 - { - wcsTask.taskStatus = 1; - wcsTask.currPointId = _currentEquip.objid; - wcsTask.currPointNo = _currentEquip.equipNo; - wcsTask.nextPointId = ElevatorEquip.objid; - wcsTask.nextPointNo = ElevatorEquip.equipNo; - dbContext.Update(wcsTask); - dbContext.SaveChanges(); - _plc.Write(_dockingPosition[$"WcsRun00{_floorNo}"].PlcPoint_Address, 1); - } - else if (AgvEquip != null && wcsTask.nextPointId == AgvEquip.objid)//下一个为AGV,即入库 - { - wcsTask.taskStatus = 0; - wcsTask.currPointId = _currentEquip.objid; - wcsTask.currPointNo = _currentEquip.equipNo; - wcsTask.nextPointId = AgvEquip.objid; - wcsTask.nextPointNo = AgvEquip.equipNo; - dbContext.Update(wcsTask); - dbContext.SaveChanges(); - _plc.Write(_dockingPosition[$"WcsRun00{_floorNo}"].PlcPoint_Address, 2); - } - } - } - } - } - catch (Exception ex) - { - LogManager.Error(ex); - } - Thread.Sleep(1000); - } - } - } -} diff --git a/src/Khd.Core.Wcs/MyWcs/ElevatorLogic.cs b/src/Khd.Core.Wcs/MyWcs/ElevatorLogic.cs deleted file mode 100644 index b4a752b..0000000 --- a/src/Khd.Core.Wcs/MyWcs/ElevatorLogic.cs +++ /dev/null @@ -1,122 +0,0 @@ -using Khd.Core.Domain.Models; -using Khd.Core.EntityFramework; -using Khd.Core.Wcs.Global; -using Masuit.Tools.Logging; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Khd.Core.Wcs.MyWcs -{ - /// - /// 提升机逻辑 - /// - public class ElevatorLogic - { - private readonly Plc.S7.Plc _plc; - private readonly int _floorNo; - private readonly Dictionary ElevatorPoints; - private readonly IHost _host; - private readonly BaseEquip _baseEquip; - - /// - /// 构造函数 - /// - /// 楼层号 - /// 基础设备 - /// IHost - /// Plc - public ElevatorLogic(int FloorNo, BaseEquip baseEquip, IHost host, Plc.S7.Plc plc) - { - _plc = plc; - _floorNo = FloorNo; - _host = host; - _baseEquip = baseEquip; - ElevatorPoints = StaticData.PlcPoints[_floorNo]; - } - - /// - /// 启动提升机逻辑 - /// - public void Start() - { - Thread executeThread = new(ExecuteLogic) - { - IsBackground = true - }; - executeThread.Start(); - Console.WriteLine($"{DateTime.Now}:提升机逻辑启动"); - LogManager.Info("提升机逻辑启动"); - } - - /// - /// 执行逻辑 - /// - public void ExecuteLogic() - { - while (true) - { - try - { - var targetFloor = _plc.Read(ElevatorPoints["ElevatorTargetFloor"].PlcPoint_Address);//目标楼层 - var signal = _plc.Read(ElevatorPoints["ElevatorSignal"].PlcPoint_Address);//到位信号 - var state = _plc.Read(ElevatorPoints["ElevatorState"].PlcPoint_Address);//提升机状态 - var currentFloor = _plc.Read(ElevatorPoints["ElevatorCurrentFloor"].PlcPoint_Address);//提升机当前楼层 - var serialNo = _plc.Read(ElevatorPoints["ElevatorSerialNo"].PlcPoint_Address);//提升机流水号 - var taskState = _plc.Read(ElevatorPoints["ElevatorTaskState"].PlcPoint_Address);//任务状态 - if (targetFloor != null && signal != null && state != null && currentFloor != null && serialNo != null && taskState != null) - { - if (Convert.ToInt32(state) == 0 && Convert.ToInt32(taskState) == 2) - { - using var scope = _host.Services.CreateScope(); - using var dbContext = scope.ServiceProvider.GetRequiredService(); - for (int i = 1; i <= 5; i++) - { - try - { - var elevatorSerialNo = _plc.Read(StaticData.PlcPoints[i][$"ElevatorSerialNo00{i}"].PlcPoint_Address); - var elevatorTake = _plc.Read(StaticData.PlcPoints[i][$"ElevatorTake00{i}"].PlcPoint_Address); - if (elevatorSerialNo != null && elevatorTake != null && Convert.ToInt32(elevatorTake) == 1 && Convert.ToInt64(elevatorSerialNo) > 0) - { - var baseEquip = dbContext.BaseEquip.First(t => t.floorNo == i && t.equipType == 2); - var wcsTask = dbContext.WcsTask.OrderBy(t => t.createTime).FirstOrDefault(t => t.nextPointId == baseEquip.objid && t.taskStatus == 1); - if (wcsTask != null) - { - var endEquip = dbContext.BaseEquip.First(t => t.objid == wcsTask.endPointId); - if (endEquip.floorNo != null) - { - wcsTask.taskStatus = 2; - wcsTask.nextPointId = _baseEquip.objid; - wcsTask.nextPointNo = _baseEquip.equipNo; - _plc.Write(ElevatorPoints["ElevatorCurrentFloor"].PlcPoint_Address, i); - _plc.Write(ElevatorPoints["ElevatorTargetFloor"].PlcPoint_Address, endEquip.floorNo);//写入目的地楼层 - dbContext.Update(wcsTask); - dbContext.SaveChanges(); - LogManager.Info($"提升机下发任务{i}=>{wcsTask.nextPointId}"); - Console.WriteLine($"{DateTime.Now}:提升机下发任务{i}=>{wcsTask.nextPointId}"); - break; - } - } - } - } - catch (Exception e) - { - LogManager.Error($"{i}楼提升机异常", e); - } - } - } - } - } - catch (Exception ex) - { - LogManager.Error(ex); - } - Thread.Sleep(1000); - } - } - } -} diff --git a/src/Khd.Core.Wcs/Program.cs b/src/Khd.Core.Wcs/Program.cs index c35db02..fcb3fb0 100644 --- a/src/Khd.Core.Wcs/Program.cs +++ b/src/Khd.Core.Wcs/Program.cs @@ -12,6 +12,7 @@ internal class Program private static void Main(string[] args) { + Console.ForegroundColor = ConsoleColor.Yellow; Init(); //初始化加载配置文件 AppDomain.CurrentDomain.UnhandledException += GlobalExceptionHandler; //全局异常捕获 try @@ -45,6 +46,7 @@ internal class Program catch (Exception ex) { Console.Write("系统启动异常:" + ex.Message + "\n" + ex.StackTrace); + LogManager.Error(ex); } } @@ -78,7 +80,7 @@ internal class Program StaticData.PlcConfigs = configuration.GetSection("PlcConfigs").Get>(); ConnectionStrings.ConnectionString = configuration["ConnectionStrings:DefaultConnection"]; } - static IHostBuilder CreateHostBuilder(string[] args) => + private static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((_, services) => { diff --git a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs index 5201566..34acc02 100644 --- a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs +++ b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs @@ -61,6 +61,8 @@ namespace Khd.Core.Wcs.Wcs var FlowPointThread = new Thread(MonitorInLocatorPoint); FlowPointThread.Start(); + Console.WriteLine(DateTime.Now+":出库任务监听启动成功"); + LogManager.Info("出库任务监听启动成功"); } public void MonitorInLocatorPoint() { @@ -83,6 +85,7 @@ namespace Khd.Core.Wcs.Wcs } } } + /// /// 成品出库 /// diff --git a/src/Khd.Core.Wcs/Wcs/FirstFloor.cs b/src/Khd.Core.Wcs/Wcs/FirstFloor.cs index 0e596bc..75739dc 100644 --- a/src/Khd.Core.Wcs/Wcs/FirstFloor.cs +++ b/src/Khd.Core.Wcs/Wcs/FirstFloor.cs @@ -2,6 +2,7 @@ using Khd.Core.Application.Interface; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; +using Khd.Core.Plc; using Khd.Core.Wcs.Global; using Masuit.Tools.Logging; using Microsoft.Extensions.DependencyInjection; @@ -26,85 +27,38 @@ namespace Khd.Core.Wcs.Wcs /// /// 到位信号 读 /// - private readonly BasePlcpoint linesignal01 ; - /// - /// 是否有托盘 读 - /// - private readonly BasePlcpoint ispallet01 ; + private readonly BasePlcpoint linesignal01; /// /// 去向 写 /// - private readonly BasePlcpoint wcsrun01 ; - /// - /// 流水号 读 - /// - private readonly BasePlcpoint serialno01 ; + private readonly BasePlcpoint wcsrun01; /// /// 提升机流水号 读 /// - private readonly BasePlcpoint serialno06 ; + private readonly BasePlcpoint serialno06; /// /// 提升机状态 读 /// - private readonly BasePlcpoint equipstate06 ; + private readonly BasePlcpoint equipstate06; /// /// 提升机任务状态 读 /// - private readonly BasePlcpoint taskstate06 ; + private readonly BasePlcpoint hoistertrayin06; /// /// 提升机当前楼层 写 /// - private readonly BasePlcpoint currentfloor06 ; + private readonly BasePlcpoint currentfloor06; /// /// 提升机目的楼层 写 /// - private readonly BasePlcpoint targetfloor06 ; + private readonly BasePlcpoint targetfloor06; /// - /// 提升机到位信号 读 + /// 提升机反馈流水号 /// - private readonly BasePlcpoint linesignal06 ; - /// - /// 一楼提升机前允许取 读 - /// - private readonly BasePlcpoint hoisterallowedtake01 ; - /// - /// 一楼提升机前反馈流水号 读 - /// - private readonly BasePlcpoint feedserialno01 ; - /// - /// 二楼提升机前允许取 读 - /// - private readonly BasePlcpoint hoisterallowedtake02 ; - /// - /// 二楼提升机前反馈流水号 读 - /// - private readonly BasePlcpoint feedserialno02 ; - /// - /// 三楼提升机前允许取 读 - /// - private readonly BasePlcpoint hoisterallowedtake03 ; - /// - /// 三楼提升机前反馈流水号 读 - /// - private readonly BasePlcpoint feedserialno03 ; - /// - /// 四楼提升机前允许取 读 - /// - private readonly BasePlcpoint hoisterallowedtake04 ; - /// - /// 四楼提升机前反馈流水号 读 - /// - private readonly BasePlcpoint feedserialno04 ; - /// - /// 五楼提升机前允许取 读 - /// - private readonly BasePlcpoint hoisterallowedtake05 ; - /// - /// 五楼提升机前反馈流水号 读 - /// - private readonly BasePlcpoint feedserialno05 ; + private readonly BasePlcpoint reserialno06; - public FirstFloor(IHost host, Plc.S7.Plc plc, string siteNo) + + public FirstFloor(IHost host, Plc.S7.Plc plc) { this._host = host; this._plc = plc; @@ -113,53 +67,41 @@ namespace Khd.Core.Wcs.Wcs this.RFID001 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorLine") && t.plcpointNo.Contains("RFID001")); //到位信号 读 this.linesignal01 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorLine") && t.plcpointNo.Contains("linesignal01")); - //是否有托盘 读 - this.ispallet01 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorLine") && t.plcpointNo.Contains("ispallet01")); //去向 写 this.wcsrun01 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorLine") && t.plcpointNo.Contains("wcsrun01")); - //流水号 读 - this.serialno01 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorLine") && t.plcpointNo.Contains("serialno01")); + + //一楼提升机流水号 读 - this.serialno06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorHoister") && t.plcpointNo.Contains("serialno06")); + this.serialno06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("serialno06")); //一楼提升机状态 读 - this.equipstate06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorHoister") && t.plcpointNo.Contains("equipstate06")); + this.equipstate06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("equipstate06")); //一楼提升机任务状态 读 - this.taskstate06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorHoister") && t.plcpointNo.Contains("taskstate06")); + this.hoistertrayin06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("hoistertrayin06")); //一楼提升机当前楼层 写 - this.currentfloor06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorHoister") && t.plcpointNo.Contains("currentfloor06")); + this.currentfloor06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("currentfloor06")); //一楼提升机目的楼层 写 - this.targetfloor06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorHoister") && t.plcpointNo.Contains("targetfloor06")); + this.targetfloor06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("targetfloor06")); //一楼提升机到位信号 读 - this.linesignal06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorHoister") && t.plcpointNo.Contains("linesignal06")); - //一楼提升机前允许取 - this.hoisterallowedtake01 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorBeforeHoister") && t.plcpointNo.Contains("hoisterallowedtake01")); - //一楼提升机前反馈流水号 - this.feedserialno01 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorBeforeHoister") && t.plcpointNo.Contains("feedserialno01")); - this.hoisterallowedtake02 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("SecondFloorBeforeHoister") && t.plcpointNo.Contains("hoisterallowedtake02")); - this.feedserialno02 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("SecondFloorBeforeHoister") && t.plcpointNo.Contains("feedserialno02")); - this.hoisterallowedtake03 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("ThirdFloorBeforeHoister") && t.plcpointNo.Contains("hoisterallowedtake03")); - this.feedserialno03 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("ThirdFloorBeforeHoister") && t.plcpointNo.Contains("feedserialno03")); - this.hoisterallowedtake04 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FourthlyFloorBeforeHoister") && t.plcpointNo.Contains("hoisterallowedtake04")); - this.feedserialno04 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FourthlyFloorBeforeHoister") && t.plcpointNo.Contains("feedserialno04")); - this.hoisterallowedtake05 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FifthFloorBeforeHoister") && t.plcpointNo.Contains("hoisterallowedtake05")); - this.feedserialno05 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FifthFloorBeforeHoister") && t.plcpointNo.Contains("feedserialno05")); + this.reserialno06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("reserialno06")); } /// - /// 启动线程 + /// 启动上件扫描监听 /// public void StartPoint() { Thread firstFloorLine = new Thread(FirstFloorLine); firstFloorLine.IsBackground = true; firstFloorLine.Start(); - Console.WriteLine("启动一楼接驳位线程"); + Console.WriteLine(DateTime.Now + ":一楼接驳位线程启动成功"); + LogManager.Info("一楼接驳位线程启动成功"); Thread firstFloorHoister = new Thread(FirstFloorHoister); firstFloorHoister.IsBackground = true; firstFloorHoister.Start(); - Console.WriteLine("启动一楼提升机线程"); + Console.WriteLine(DateTime.Now + ":一楼提升机线程启动成功"); + LogManager.Info("一楼提升机线程启动成功"); } /// @@ -167,112 +109,100 @@ namespace Khd.Core.Wcs.Wcs /// private void FirstFloorLine() { - List Itpyes = new List() { 1, 3, 5, 7 }; + List Itpyes = new() { 1, 3, 5, 7 }; + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { try { var RFID001Value = this._plc.Read(this.RFID001.plcpointAddress); //一楼RFID 读 var linesignal01Value = this._plc.Read(this.linesignal01.plcpointAddress); //到位信号 读 - var ispallet01Value = this._plc.Read(this.ispallet01.plcpointAddress); //是否有托盘 读 var wcsrun01Value = this._plc.Read(this.wcsrun01.plcpointAddress); //去向 写 - var serialno01Value = this._plc.Read(this.serialno01.plcpointAddress); //流水号 读 - using (var scope = _host.Services.CreateScope()) + //正常读到plc值 + if (linesignal01Value != null && RFID001Value != null) { - using (var dbContext = scope.ServiceProvider.GetRequiredService()) + //正常托盘到位 + if (Convert.ToInt32(linesignal01Value) == 1) { - //正常读到plc值 - if (linesignal01Value != null && RFID001Value != null || ispallet01Value != null || serialno01Value != null) + + //判断task表里没有该rfid的未完成的入库信息,未下发去向 + var task = dbContext.WcsTask.Where(t => t.containerNo == RFID001Value.ToString() && t.taskStatus < 1).FirstOrDefault(); + if (task == null) { - //正常托盘到位 - if (Convert.ToInt32(linesignal01Value) != 0 && Convert.ToInt32(serialno01Value) != 0 && Convert.ToInt32(ispallet01Value) == 1 && Convert.ToInt32(ispallet01Value) != 0) + //入库 + + //根据托盘号获取物料码 + var material = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value.ToString()).FirstOrDefault(); + if (material != null) { - - //判断task表里没有该rfid的未完成的入库信息,未下发去向 - var task = dbContext.WcsTask.Where(t => t.containerNo == RFID001Value.ToString() && t.taskStatus < 1).FirstOrDefault(); - if (task == null || Itpyes.Contains(task.taskType)) + var warehouseId = dbContext.WmsWarehouseMaterial.Where(t => t.storageType == "1" && t.storageId == material.materialId).FirstOrDefault()?.warehouseId; + if (warehouseId != null) { - //入库 - if (task == null || Itpyes.Contains(task.taskType)) + var TargetFloor = dbContext.WmsBaseWarehouse.Where(t => t.warehouseId == warehouseId).FirstOrDefault(); + if (TargetFloor != null) { - //根据托盘号获取物料码 - var material = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value.ToString()).FirstOrDefault(); - if (material != null) + //插入task表 + + var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "I" && t.dicField == TargetFloor.warehouseInstockType).FirstOrDefault(); + if (dic != null) { - var warehouseId = dbContext.WmsWarehouseMaterial.Where(t => t.storageType == "1" && t.storageId == material.materialId).FirstOrDefault()?.warehouseId; - if (warehouseId != null) + var newTask = new WcsTask() { - var TargetFloor = dbContext.WmsBaseWarehouse.Where(t => t.warehouseId == warehouseId).FirstOrDefault(); - if (TargetFloor != null) - { - //插入task表 - - var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "I" && t.dicField == TargetFloor.warehouseInstockType).FirstOrDefault(); - if (dic != null) - { - if (task == null) - { - var newTask = new WcsTask() - { - objid = StaticData.SnowId.NextId(), - serialNo = Convert.ToInt32(serialno01Value), - equipmentNo = "F01", - taskType = Convert.ToInt32(dic.dicValue), - taskStatus = 0, - containerNo = RFID001Value.ToString(), - materialNo = material.materialCode, - materialId = material.materialId, - qty = Convert.ToInt32(material.bindAmount), - startPointId = F01, - startPointNo = "F01", - currPointId = F01, - currPointNo = "F01", - nextPointId = T01, - nextPointNo = "T01", - endPointId = warehouseId, - floorNo = TargetFloor.warehouseFloor, - useFlag = 1, - createBy = "一楼接驳位", - createTime = DateTime.Now, - remark = "一楼创建入库任务" - }; - dbContext.Add(newTask); - } - else - { - task.currPointId = F01; - task.currPointNo = "F01"; - task.nextPointId = T01; - task.nextPointNo = "T01"; - task.taskStatus = 0; - task.updateBy = "一楼接驳位线程"; - task.updateTime = DateTime.Now; - task.remark = "一楼创建入库任务"; - dbContext.WcsTask.Update(task); - dbContext.SaveChanges(); - } - - //下发去向 - this._plc.Write(this.wcsrun01.plcpointAddress, 1); - } - } - } - } - } - //出库 - { - //清空托盘绑定 - var material = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value.ToString()).FirstOrDefault(); - if (material != null) - { - dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value.ToString()).Delete(); - dbContext.SaveChanges(); + objid = StaticData.SnowId.NextId(), + serialNo = 1235, + equipmentNo = "F01", + taskType = Convert.ToInt32(dic.dicValue), + taskStatus = 0, + containerNo = RFID001Value.ToString(), + materialNo = material.materialCode, + materialId = material.materialId, + qty = Convert.ToInt32(material.bindAmount), + startPointId = F01, + startPointNo = "F01", + currPointId = F01, + currPointNo = "F01", + nextPointId = T01, + nextPointNo = "T01", + endPointId = warehouseId, + fromFloorNo = 1, + floorNo = TargetFloor.warehouseFloor, + useFlag = 1, + createBy = "一楼接驳位", + createTime = DateTime.Now, + remark = "一楼创建入库任务" + }; + dbContext.Add(newTask); } } } } } + else if (Itpyes.Contains(task.taskType)) + { + task.currPointId = F01; + task.currPointNo = "F01"; + task.nextPointId = T01; + task.nextPointNo = "T01"; + task.taskStatus = 0; + task.updateBy = "一楼接驳位线程"; + task.updateTime = DateTime.Now; + task.remark = "一楼创建入库任务"; + dbContext.WcsTask.Update(task); + dbContext.SaveChanges(); + } + //出库 + else + { + //清空托盘绑定 + //var material = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value.ToString()).FirstOrDefault(); + //if (material != null) + //{ + // dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value.ToString()).Delete(); + // dbContext.SaveChanges(); + //} + } } } } @@ -289,203 +219,90 @@ namespace Khd.Core.Wcs.Wcs /// private void FirstFloorHoister() { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { try { var serialno06Value = this._plc.Read(this.serialno06.plcpointAddress); //提升机流水号 读 var equipstate06Value = this._plc.Read(this.equipstate06.plcpointAddress); //提升机状态 读 - var taskstate06Value = this._plc.Read(this.taskstate06.plcpointAddress); //提升机任务状态 读 + var hoisterTrayIn06Value = this._plc.Read(this.hoistertrayin06.plcpointAddress); //提升机货物到位状态 读 var currentfloor06Value = this._plc.Read(this.currentfloor06.plcpointAddress); //提升机当前楼层 写 var targetfloor06Value = this._plc.Read(this.targetfloor06.plcpointAddress); //提升机目的楼层 写 - var linesignal06Value = this._plc.Read(this.linesignal06.plcpointAddress); //提升机到位信号 读 + var reserialno06 = this._plc.Read(this.reserialno06.plcpointAddress); //反馈流水号 - var hoisterallowedtake01Value = this._plc.Read(this.hoisterallowedtake01.plcpointAddress); //一楼提升机前允许取 - var feedserialno01Value = this._plc.Read(this.feedserialno01.plcpointAddress); //一楼提升机前反馈流水号 - var hoisterallowedtake02Value = this._plc.Read(this.hoisterallowedtake02.plcpointAddress); //二楼提升机前允许取 - var feedserialno02Value = this._plc.Read(this.feedserialno02.plcpointAddress); //二楼提升机前反馈流水号 - var hoisterallowedtake03Value = this._plc.Read(this.hoisterallowedtake03.plcpointAddress); //三楼提升机前允许取 - var feedserialno03Value = this._plc.Read(this.feedserialno03.plcpointAddress); //三楼提升机前反馈流水号 - var hoisterallowedtake04Value = this._plc.Read(this.hoisterallowedtake04.plcpointAddress); //四楼提升机前允许取 - var feedserialno04Value = this._plc.Read(this.feedserialno04.plcpointAddress); //四楼提升机前反馈流水号 - var hoisterallowedtake05Value = this._plc.Read(this.hoisterallowedtake05.plcpointAddress); //五楼提升机前允许取 - var feedserialno05Value = this._plc.Read(this.feedserialno05.plcpointAddress); //五楼提升机前反馈流水号 - using var scope = _host.Services.CreateScope(); - using var dbContext = scope.ServiceProvider.GetRequiredService(); //正常读到plc值 - if (targetfloor06Value != null && serialno06Value != null && equipstate06Value != null && taskstate06Value != null && currentfloor06Value != null && linesignal06Value != null) + if (targetfloor06Value != null && serialno06Value != null && equipstate06Value != null && currentfloor06Value != null && reserialno06 != null && hoisterTrayIn06Value != null) { //提升机空闲 if (Convert.ToInt32(equipstate06Value) == 0) { - var wcsTask = dbContext.WcsTask.Where(t => t.nextPointId == T01).Where(t => t.taskStatus > 1).FirstOrDefault(); - if (wcsTask == null) + var wcsTask = dbContext.WcsTask.Where(t => t.nextPointId == T01).OrderBy(t => t.createTime).FirstOrDefault(); + if (wcsTask != null) { - //一楼到位 - if (hoisterallowedtake01Value != null && feedserialno01Value != null && Convert.ToInt32(hoisterallowedtake01Value) == 1 && Convert.ToInt32(feedserialno01Value) > 0) + if (wcsTask.taskStatus == 0)//创建 { - var task = dbContext.WcsTask.Where(t => t.serialNo == Convert.ToInt32(feedserialno01Value)).FirstOrDefault(); - if (task != null) + if (Convert.ToInt32(currentfloor06Value) == wcsTask.fromFloorNo) { - if (task.nextPointId == T01) - { - var nextPoint = dbContext.BaseEquip - .Where(t => t.equipType == 1) - .Where(t => t.floorNo == task.floorNo).FirstOrDefault(); - if (nextPoint != null) - { - //给提升机下发去向 - this._plc.Write(this.currentfloor06.plcpointAddress, 1); - this._plc.Write(this.targetfloor06.plcpointAddress, task.floorNo); - //修改task状态 - task.currPointId = T01; - task.currPointNo = "T01"; - task.nextPointId = nextPoint.objid; - task.nextPointNo = nextPoint.equipNo; - task.taskStatus = 1; - task.updateBy = "提升机线程"; - task.updateTime = DateTime.Now; - task.remark = "一楼到位提升机线程"; - dbContext.WcsTask.Update(task); - dbContext.SaveChanges(); - continue; - } - } + wcsTask.taskStatus = 2; + wcsTask.updateBy = "提升机线程"; + wcsTask.updateTime = DateTime.Now; + wcsTask.remark = "提升机任务执行中"; + BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.fromFloorNo && t.plcpointNo.Contains("wcsrun")); + this._plc.WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength); + dbContext.Update(wcsTask); + dbContext.SaveChanges(); + } + else + { + wcsTask.taskStatus = 1; + wcsTask.updateBy = "提升机线程"; + wcsTask.updateTime = DateTime.Now; + wcsTask.remark = "提升机任务执行中"; + this._plc.WriteToPoint(this.targetfloor06.plcpointAddress, wcsTask.fromFloorNo.ToString(),this.targetfloor06.plcpointLength);//目的地楼层 + dbContext.Update(wcsTask); + dbContext.SaveChanges(); } } - //二楼到位 - if (hoisterallowedtake02Value != null && feedserialno02Value != null && Convert.ToInt32(hoisterallowedtake02Value) == 1 && Convert.ToInt32(feedserialno02Value) > 0) + if (wcsTask.taskStatus == 1) { - var task = dbContext.WcsTask.Where(t => t.serialNo == Convert.ToInt32(feedserialno01Value)).FirstOrDefault(); - if (task != null) + if (Convert.ToInt32(currentfloor06Value) == wcsTask.fromFloorNo)//提升机当前楼层为初始地楼层 { - if (task.nextPointId == T01) - { - var nextPoint = dbContext.BaseEquip - .Where(t => t.equipType == 1) - .Where(t => t.floorNo == task.floorNo).FirstOrDefault(); - if (nextPoint != null) - { - //给提升机下发去向 - this._plc.Write(this.currentfloor06.plcpointAddress, 2); - this._plc.Write(this.targetfloor06.plcpointAddress, task.floorNo); - //修改task状态 - task.currPointId = T01; - task.currPointNo = "T01"; - task.nextPointId = nextPoint.objid; - task.nextPointNo = nextPoint.equipNo; - task.taskStatus = 1; - task.updateBy = "提升机线程"; - task.updateTime = DateTime.Now; - task.remark = "二楼到位提升机线程"; - dbContext.WcsTask.Update(task); - dbContext.SaveChanges(); - continue; - } - } + wcsTask.taskStatus = 2; + wcsTask.updateBy = "提升机线程"; + wcsTask.updateTime = DateTime.Now; + wcsTask.remark = "提升机任务执行中"; + BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.fromFloorNo && t.plcpointNo.Contains("wcsrun")); + this._plc.WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength); + dbContext.Update(wcsTask); + dbContext.SaveChanges(); } } - //三楼到位 - if (hoisterallowedtake03Value != null && feedserialno03Value != null && Convert.ToInt32(hoisterallowedtake03Value) == 1 && Convert.ToInt32(feedserialno03Value) > 0) + if (wcsTask.taskStatus == 2) { - var task = dbContext.WcsTask.Where(t => t.serialNo == Convert.ToInt32(feedserialno01Value)).FirstOrDefault(); - if (task != null) + if (Convert.ToInt32(hoisterTrayIn06Value) == 1)//托盘已经进提升机 { - if (task.nextPointId == T01) - { - var nextPoint = dbContext.BaseEquip - .Where(t => t.equipType == 1) - .Where(t => t.floorNo == task.floorNo).FirstOrDefault(); - if (nextPoint != null) - { - //给提升机下发去向 - this._plc.Write(this.currentfloor06.plcpointAddress, 3); - this._plc.Write(this.targetfloor06.plcpointAddress, task.floorNo); - //修改task状态 - task.currPointId = T01; - task.currPointNo = "T01"; - task.nextPointId = nextPoint.objid; - task.nextPointNo = nextPoint.equipNo; - task.taskStatus = 1; - task.updateBy = "提升机线程"; - task.updateTime = DateTime.Now; - task.remark = "三楼到位提升机线程"; - dbContext.WcsTask.Update(task); - dbContext.SaveChanges(); - continue; - } - } + wcsTask.taskStatus = 3; + wcsTask.updateBy = "提升机线程"; + wcsTask.updateTime = DateTime.Now; + wcsTask.remark = "提升机任务执行完成"; + this._plc.WriteToPoint(this.targetfloor06.plcpointAddress, wcsTask.floorNo.ToString(),this.targetfloor06.plcpointLength);//目的地楼层 + dbContext.Update(wcsTask); + dbContext.SaveChanges(); } } - //四楼到位 - if (hoisterallowedtake04Value != null && feedserialno04Value != null && Convert.ToInt32(hoisterallowedtake04Value) == 1 && Convert.ToInt32(feedserialno04Value) > 0) + if (wcsTask.taskStatus == 3 && Convert.ToInt32(currentfloor06Value) == wcsTask.floorNo)//任务状态为3,且当前楼层为任务的目的楼层 { - var task = dbContext.WcsTask.Where(t => t.serialNo == Convert.ToInt32(feedserialno01Value)).FirstOrDefault(); - if (task != null) - { - if (task.nextPointId == T01) - { - var nextPoint = dbContext.BaseEquip - .Where(t => t.equipType == 1) - .Where(t => t.floorNo == task.floorNo).FirstOrDefault(); - if (nextPoint != null) - { - //给提升机下发去向 - this._plc.Write(this.currentfloor06.plcpointAddress, 4); - this._plc.Write(this.targetfloor06.plcpointAddress, task.floorNo); - //修改task状态 - task.currPointId = T01; - task.currPointNo = "T01"; - task.nextPointId = nextPoint.objid; - task.nextPointNo = nextPoint.equipNo; - task.taskStatus = 1; - task.updateBy = "提升机线程"; - task.updateTime = DateTime.Now; - task.remark = "四楼到位提升机线程"; - dbContext.WcsTask.Update(task); - dbContext.SaveChanges(); - continue; - } - } - } + wcsTask.taskStatus = 4; + wcsTask.updateBy = "提升机线程"; + wcsTask.updateTime = DateTime.Now; + wcsTask.remark = "提升机任务执行完成"; + BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.fromFloorNo && t.plcpointNo.Contains("wcsrun")); + this._plc.WriteToPoint(basePlcpoint.plcpointAddress, "2", basePlcpoint.plcpointLength);//去向为2,表示提升机已到达目的地,让货出去 + dbContext.Update(wcsTask); + dbContext.SaveChanges(); } - //五楼到位 - if (hoisterallowedtake05Value != null && feedserialno05Value != null && Convert.ToInt32(hoisterallowedtake05Value) == 1 && Convert.ToInt32(feedserialno05Value) > 0) - { - var task = dbContext.WcsTask.Where(t => t.serialNo == Convert.ToInt32(feedserialno01Value)).FirstOrDefault(); - if (task != null) - { - if (task.nextPointId == T01) - { - var nextPoint = dbContext.BaseEquip - .Where(t => t.equipType == 1) - .Where(t => t.floorNo == task.floorNo).FirstOrDefault(); - if (nextPoint != null) - { - //给提升机下发去向 - this._plc.Write(this.currentfloor06.plcpointAddress, 5); - this._plc.Write(this.targetfloor06.plcpointAddress, task.floorNo); - //修改task状态 - task.currPointId = T01; - task.currPointNo = "T01"; - task.nextPointId = nextPoint.objid; - task.nextPointNo = nextPoint.equipNo; - task.taskStatus = 1; - task.updateBy = "提升机线程"; - task.updateTime = DateTime.Now; - task.remark = "五楼到位提升机线程"; - dbContext.WcsTask.Update(task); - dbContext.SaveChanges(); - continue; - } - } - } - } - } - else - { - Console.WriteLine($"{DateTime.Now}:提升机有任务未反,流水号为{wcsTask.serialNo}······"); - LogManager.Info($"提升机有任务未反,流水号为{wcsTask.serialNo}······"); } } } diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs index a20e618..b8b93cd 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs @@ -5,6 +5,7 @@ using Khd.Core.Wcs.Global; using Masuit.Tools.Logging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Newtonsoft.Json; using Z.EntityFramework.Plus; namespace Khd.Core.Wcs.Wcs @@ -22,7 +23,6 @@ namespace Khd.Core.Wcs.Wcs private readonly BasePlcpoint LineSignal; private readonly BasePlcpoint LineIsPallet; private readonly BasePlcpoint LineSerialNO; - private readonly BasePlcpoint LineFeedSeriaNo; int FloorNo { get; set; } string EquipNo = ""; int agvID = 10; @@ -38,12 +38,11 @@ namespace Khd.Core.Wcs.Wcs this.LineSignal = this.ScanPoint.First(t => t.plcpointNo.Contains("linesignal")); this.LineIsPallet = this.ScanPoint.First(t => t.plcpointNo.Contains("ispallet")); this.LineSerialNO = this.ScanPoint.First(t => t.plcpointNo.Contains("serialno")); - this.LineFeedSeriaNo = this.ScanPoint.First(t => t.plcpointNo.Contains("feedserialno")); //var lineRFID = this._plc.Read(NodeSettingCarNo.plcpointAddress); try { //默认启动,清理plc的上位机写入点位值 - this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei); + //this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei); } catch (Exception ex) { @@ -59,26 +58,136 @@ namespace Khd.Core.Wcs.Wcs Thread FlowPointThread = new Thread(MonitorInLocatorPoint); FlowPointThread.Start(); + Console.WriteLine(DateTime.Now + ":五楼AGV上件扫描监听启动成功"); + LogManager.Info("五楼AGV上件扫描监听启动成功"); } public void MonitorInLocatorPoint() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); - List taskType = new() { 1, 2, 3, 7, 8 }; + List taskType = new() { 1, 3, 5, 7 }; while (true) { try { - var taskList = dbContext.WcsTask.Where(t => t.nextPointId == agvID && taskType.Contains(t.taskType)).ToList(); + var taskList = dbContext.WcsTask.Where(t => t.nextPointId == agvID).OrderBy(t => t.createTime).ToList(); if (taskList.Count == 0) { LogManager.Info(FloorNo + "楼AGV无任务"); } foreach (var item in taskList) { - SendAndUpdateTask(item); + if (item.taskStatus == 0)//下发任务 + { + BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1); + WcsCmd wcsCmd = new WcsCmd() + { + objid = item.objid, + cmdStatus = 0, + taskId = item.orderId, + useFlag = 1, + cmdType = item.taskType, + containerNo = item.containerNo, + createTime = DateTime.Now, + createBy = FloorNo + "楼AGV", + currPointId = baseEquip.objid, + currPointNo = baseEquip.equipNo, + nextPointId = item.endPointId, + nextPointNo = item.endPointNo, + }; + RequestAGVTaskDto agvTask = new RequestAGVTaskDto(); + agvTask.reqCode = item.objid.ToString(); + agvTask.positionCodePath = new List + { + new Position + { + positionCode=wcsCmd.currPointNo, + type="1" + }, + new Position + { + positionCode=wcsCmd.nextPointNo, + type="2" + } + }; + string message = JsonConvert.SerializeObject(agvTask); + string result = HttpHelper.HttpPost("http://172.16.12.24:8182/rcms/services/rest/hikRpcService/genAgvSchedulingTask", message); + var reponseMessage = JsonConvert.DeserializeObject(result); + if (reponseMessage != null && reponseMessage.message == "成功") + { + wcsCmd.taskCode = reponseMessage.data; + wcsCmd.cmdStatus = 1; + item.taskStatus = 1; + dbContext.Update(item); + dbContext.Add(wcsCmd); + dbContext.SaveChanges(); + } + } + else + { + WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.objid == item.objid); + if (wcsCmd != null) + { + if (wcsCmd.cmdStatus == 2) + { + RequestAGVTaskDto agvTask = new RequestAGVTaskDto(); + agvTask.reqCode = item.objid.ToString(); + agvTask.taskCode = wcsCmd.taskCode; + string message = JsonConvert.SerializeObject(agvTask); + string result = HttpHelper.HttpPost("http://172.16.12.24:8182/rcms/services/rest/hikRpcService/continueTask", message); + ReponseMessage? reponseMessage = JsonConvert.DeserializeObject(result); + if (reponseMessage != null && reponseMessage.message == "成功") + { + wcsCmd.cmdStatus = 3; + dbContext.Update(wcsCmd); + dbContext.SaveChanges(); + } + } + else if (wcsCmd.cmdStatus == 4) + { + //任务完成 + //如果是入库任务,更新库存信息,并删除任务 + if (taskType.Contains(item.taskType)) + { + WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation + .First(t => t.locationId == item.startPointId && t.warehouseFloor == 5); + wmsBaseLocation.outstockFlag = "0"; + wmsBaseLocation.locationStatus = "1"; + dbContext.Update(wmsBaseLocation); + + + dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete(); + dbContext.WcsTask.Where(t => t.objid == item.objid).Delete(); + dbContext.SaveChanges(); + } + else//如果是出库任务,更新库存信息,下一个任务为提升机 + { + WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation + .First(t => t.locationId == item.startPointId && t.warehouseFloor == 5); + wmsBaseLocation.outstockFlag = "0"; + wmsBaseLocation.locationStatus = "1"; + dbContext.Update(wmsBaseLocation); + + BaseEquip floorLineEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == 5); + BaseEquip eletorEquip = StaticData.BaseEquip.First(t => t.equipType == 2); + item.nextPointId = floorLineEquip.objid; + item.nextPointNo = floorLineEquip.equipNo; + item.fromFloorNo = 5; + item.floorNo = 1; + item.taskStatus = 6; + dbContext.Update(item); + dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete(); + dbContext.SaveChanges(); + } + } + } + } } + //foreach (var item in taskList) + //{ + // SendAndUpdateTask(item); + //} } catch (Exception ex) { @@ -91,6 +200,7 @@ namespace Khd.Core.Wcs.Wcs } } + public List GetTask(int floorNo, string equipNo) { using var scope = _host.Services.CreateScope(); @@ -149,16 +259,20 @@ namespace Khd.Core.Wcs.Wcs setPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault(); } putPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault(); - p.podCode = setPos?.agvPositionCode; - p.podTyp = ""; + p.positionCode = setPos?.agvPositionCode; + p.type = ""; agvtask.positionCodePath.Add(p); - p.podCode = putPos?.agvPositionCode; - p.podTyp = ""; + p.positionCode = putPos?.agvPositionCode; + p.type = ""; //取料点 agvtask.positionCodePath.Add(p); agvtask.taskTyp = ""; //给agv创建任务 - wcsToWms.genAgvSchedulingTask(agvtask); + var reponseMessage = wcsToWms.genAgvSchedulingTask(agvtask); + if (reponseMessage != null) + { + + } //未下发给agv下发指令 WcsCmd taskCmd = new WcsCmd() { diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs index bc70659..2f8b283 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs @@ -6,6 +6,7 @@ using Masuit.Tools.Logging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json; +using Z.EntityFramework.Plus; namespace Khd.Core.Wcs.Wcs { @@ -22,7 +23,6 @@ namespace Khd.Core.Wcs.Wcs private readonly BasePlcpoint LineSignal; private readonly BasePlcpoint LineIsPallet; private readonly BasePlcpoint LineSerialNO; - private readonly BasePlcpoint LineFeedSeriaNo; int FloorNo { get; set; } string EquipNo = ""; int CTUID = 11; @@ -38,13 +38,12 @@ namespace Khd.Core.Wcs.Wcs this.LineSignal = this.ScanPoint.First(t => t.plcpointNo.Contains("linesignal")); this.LineIsPallet = this.ScanPoint.First(t => t.plcpointNo.Contains("ispallet")); this.LineSerialNO = this.ScanPoint.First(t => t.plcpointNo.Contains("serialno")); - this.LineFeedSeriaNo = this.ScanPoint.First(t => t.plcpointNo.Contains("feedserialno")); //var lineRFID = this._plc.Read(NodeSettingCarNo.plcpointAddress); try { //默认启动,清理plc的上位机写入点位值 - this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei); + //this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei); } catch (Exception ex) { @@ -61,25 +60,131 @@ namespace Khd.Core.Wcs.Wcs Thread FlowPointThread = new Thread(MonitorInLocatorPoint); FlowPointThread.Start(); + Console.WriteLine(DateTime.Now+":五楼CTU上件扫描监听启动"); + LogManager.Info("五楼CTU上件扫描监听启动"); } public void MonitorInLocatorPoint() { + List taskType = new() { 1, 3, 5, 7 }; using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { try { - var taskList = dbContext.WcsTask.Where(t => t.nextPointId == CTUID && (t.taskType == 7 || t.taskType == 8)).GroupBy(t => t.orderId).ToList(); + var taskList = dbContext.WcsTask.Where(t => t.nextPointId == CTUID && (t.taskType == 7 || t.taskType == 8)).ToList(); if (taskList.Count == 0) { LogManager.Info(FloorNo + "楼CTU无任务"); } foreach (var item in taskList) { + if (item.taskStatus == 0)//下发任务 + { + BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1); + WcsCmd wcsCmd = new WcsCmd() + { + objid = item.objid, + cmdStatus = 0, + taskId = item.orderId, + useFlag = 1, + cmdType = item.taskType, + containerNo = item.containerNo, + createTime = DateTime.Now, + createBy = FloorNo + "楼AGV", + currPointId = baseEquip.objid, + currPointNo = baseEquip.equipNo, + nextPointId = item.endPointId, + nextPointNo = item.endPointNo, + }; + RequestAGVTaskDto agvTask = new RequestAGVTaskDto(); + agvTask.reqCode = item.objid.ToString(); + agvTask.positionCodePath = new List + { + new Position + { + positionCode=wcsCmd.currPointNo, + type="1" + }, + new Position + { + positionCode=wcsCmd.nextPointNo, + type="2" + } + }; + string message = JsonConvert.SerializeObject(agvTask); + string result = HttpHelper.HttpPost("http://172.16.12.24:8182/rcms/services/rest/hikRpcService/genAgvSchedulingTask", message); + var reponseMessage = JsonConvert.DeserializeObject(result); + if (reponseMessage != null && reponseMessage.message == "成功") + { + wcsCmd.taskCode = reponseMessage.data; + wcsCmd.cmdStatus = 1; + item.taskStatus = 1; + dbContext.Update(item); + dbContext.Add(wcsCmd); + dbContext.SaveChanges(); + } + } + else + { + WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.objid == item.objid); + if (wcsCmd != null) + { + if (wcsCmd.cmdStatus == 2) + { + RequestAGVTaskDto agvTask = new RequestAGVTaskDto(); + agvTask.reqCode = item.objid.ToString(); + agvTask.taskCode = wcsCmd.taskCode; + string message = JsonConvert.SerializeObject(agvTask); + string result = HttpHelper.HttpPost("http://172.16.12.24:8182/rcms/services/rest/hikRpcService/continueTask", message); + ReponseMessage? reponseMessage = JsonConvert.DeserializeObject(result); + if (reponseMessage != null && reponseMessage.message == "成功") + { + wcsCmd.cmdStatus = 3; + dbContext.Update(wcsCmd); + dbContext.SaveChanges(); + } + } + else if (wcsCmd.cmdStatus == 4) + { + //任务完成 + //如果是入库任务,更新库存信息,并删除任务 + if (taskType.Contains(item.taskType)) + { + WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation + .First(t => t.locationId == item.startPointId && t.warehouseFloor == 5); + wmsBaseLocation.outstockFlag = "0"; + wmsBaseLocation.locationStatus = "1"; + dbContext.Update(wmsBaseLocation); - SendTask(item.FirstOrDefault().orderId); + + dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete(); + dbContext.WcsTask.Where(t => t.objid == item.objid).Delete(); + dbContext.SaveChanges(); + } + else//如果是出库任务,更新库存信息,下一个任务为提升机 + { + WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation + .First(t => t.locationId == item.startPointId && t.warehouseFloor == 5); + wmsBaseLocation.outstockFlag = "0"; + wmsBaseLocation.locationStatus = "1"; + dbContext.Update(wmsBaseLocation); + + BaseEquip floorLineEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == 5); + BaseEquip eletorEquip = StaticData.BaseEquip.First(t => t.equipType == 2); + item.nextPointId = floorLineEquip.objid; + item.nextPointNo = floorLineEquip.equipNo; + item.fromFloorNo = 5; + item.floorNo = 1; + item.taskStatus = 6; + dbContext.Update(item); + dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete(); + dbContext.SaveChanges(); + } + } + } + } } } catch (Exception ex) diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorLine.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorLine.cs index a51e3ac..8fd9ca6 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorLine.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorLine.cs @@ -54,6 +54,8 @@ namespace Khd.Core.Wcs.Wcs Thread FlowPointThread = new Thread(MonitorInLocatorPoint); FlowPointThread.Start(); + Console.WriteLine(DateTime.Now+":五楼人工分拣输送线启动成功"); + LogManager.Info("五楼人工分拣输送线启动成功"); } public void MonitorInLocatorPoint() diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs index 454086d..24bc253 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs @@ -22,7 +22,6 @@ namespace Khd.Core.Wcs.Wcs private readonly BasePlcpoint LineSignal; private readonly BasePlcpoint LineIsPallet; private readonly BasePlcpoint LineSerialNO; - private readonly BasePlcpoint LineFeedSeriaNo; int FloorNo { get; set; } string EquipNo = ""; public FiveFloorPoint(IHost host, Plc.S7.Plc plc, int floor, string equipNo) @@ -37,12 +36,11 @@ namespace Khd.Core.Wcs.Wcs this.LineSignal = this.ScanPoint.First(t => t.plcpointNo.Contains("linesignal")); this.LineIsPallet = this.ScanPoint.First(t => t.plcpointNo.Contains("ispallet")); this.LineSerialNO = this.ScanPoint.First(t => t.plcpointNo.Contains("serialno")); - this.LineFeedSeriaNo = this.ScanPoint.First(t => t.plcpointNo.Contains("feedserialno")); try { //默认启动,清理plc的上位机写入点位值 - this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei); + //this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei); } catch (Exception ex) { @@ -59,10 +57,13 @@ namespace Khd.Core.Wcs.Wcs var FlowPointThread = new Thread(MonitorInLocatorPoint); FlowPointThread.IsBackground = true; FlowPointThread.Start(); + Console.WriteLine(DateTime.Now + ":五楼接驳位调度启动成功"); + LogManager.Info("五楼接驳位调度启动成功"); } public void MonitorInLocatorPoint() { + List ITypes = new List { 1, 3, 5, 7 }; using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) @@ -80,32 +81,61 @@ namespace Khd.Core.Wcs.Wcs { //获取条码信息 var palletNo = Convert.ToString(rfid); - if (!string.IsNullOrEmpty(palletNo)) + BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == FloorNo); + var wcsTask = dbContext.WcsTask.OrderBy(t => t.createTime) + .FirstOrDefault(t => t.floorNo == FloorNo && t.containerNo == palletNo); + if (wcsTask != null) { - //获取入库任务 - var wcsTask = GetTask(palletNo, FloorNo, EquipNo); - //判断是否为出库任务 - if (wcsTask != null && (wcsTask.taskType == 2 || wcsTask.taskType == 3)) + if (ITypes.Contains(wcsTask.taskType) && wcsTask.taskStatus == 4)//入库,提升机任务是完成状态 { - this._plc.Write(LineWcsrun.plcpointAddress, 1); - //更新任务下一点位为提升机 - wcsTask.nextPointId = 6; - wcsTask.nextPointNo = "T01"; - wcsTask.floorNo = 0; + var wmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseFloor == FloorNo) + .Where(t => t.activeFlag == "1") + .Where(t => t.delFlag == "0") + .Where(t => t.instockFlag == "0") + .Where(t => t.locationScrapType == "1") + .Where(t => t.locationStatus == "1") + .Where(t => t.outstockFlag == "0") + .Where(t=>string.IsNullOrEmpty(t.containerCode)) + .ToList(); + + //深浅库位问题?库位入库优先级等 + + var AgvEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 5);//背负Agv + if (wmsBaseLocations.Count > 0) + { + WmsBaseLocation wmsBaseLocation = wmsBaseLocations.First(); + wcsTask.taskStatus = 0;//创建状态 + wcsTask.updateTime = DateTime.Now; + wcsTask.currPointId = baseEquip.objid; + wcsTask.currPointNo = baseEquip.equipNo; + wcsTask.nextPointId = AgvEquip.objid; + wcsTask.nextPointNo = AgvEquip.equipNo; + wcsTask.endPointId = wmsBaseLocation.locationId; + wcsTask.endPointNo = wmsBaseLocation.locationCode; + wmsBaseLocation.instockFlag = "1"; + wmsBaseLocation.locationStatus = "2"; + dbContext.Update(wmsBaseLocation); + dbContext.Update(wcsTask); + dbContext.SaveChanges(); + } + } + else//出库 + { + BaseEquip nextEquip = StaticData.BaseEquip.First(t => t.equipType == 2);//提升机 + wcsTask.nextPointId = nextEquip.objid; + wcsTask.nextPointNo = nextEquip.equipNo; + wcsTask.currPointId = baseEquip.objid; + wcsTask.currPointNo = baseEquip.equipNo; + wcsTask.fromFloorNo = FloorNo; + wcsTask.floorNo = 1;//出库到一楼 + wcsTask.taskStatus = 0; wcsTask.updateTime = DateTime.Now; dbContext.Update(wcsTask); dbContext.SaveChanges(); } - else if (wcsTask != null) - { - //入库任务 - //下发agv任务 - SendTask(wcsTask); - } } } } - } catch (Exception ex) { diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs index 70e06d4..8f5c7e9 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs @@ -22,7 +22,6 @@ namespace Khd.Core.Wcs.Wcs private readonly BasePlcpoint LineSignal; private readonly BasePlcpoint LineIsPallet; private readonly BasePlcpoint LineSerialNO; - private readonly BasePlcpoint LineFeedSeriaNo; int FloorNo { get; set; } string EquipNo = ""; int EquipID = 8; //2楼AGV @@ -40,13 +39,12 @@ namespace Khd.Core.Wcs.Wcs this.LineSignal = this.ScanPoint.First(t => t.plcpointNo.Contains("linesignal")); this.LineIsPallet = this.ScanPoint.First(t => t.plcpointNo.Contains("ispallet")); this.LineSerialNO = this.ScanPoint.First(t => t.plcpointNo.Contains("serialno")); - this.LineFeedSeriaNo = this.ScanPoint.First(t => t.plcpointNo.Contains("feedserialno")); //var IsPallet = this._plc.Read(LineIsPallet.plcpointAddress); try { //默认启动,清理plc的上位机写入点位值 - this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei); + //this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei); } catch (Exception ex) { @@ -62,6 +60,8 @@ namespace Khd.Core.Wcs.Wcs Thread FlowPointThread = new Thread(MonitorInLocatorPoint); FlowPointThread.Start(); + Console.WriteLine(DateTime.Now + ":二楼AGV上件扫描监听启动成功"); + LogManager.Info("二楼AGV上件扫描监听启动成功"); } public void MonitorInLocatorPoint() @@ -224,11 +224,11 @@ namespace Khd.Core.Wcs.Wcs setPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault(); } putPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault(); - p.podCode = setPos?.agvPositionCode; - p.podTyp = ""; + p.positionCode = setPos?.agvPositionCode; + p.type = ""; agvtask.positionCodePath.Add(p); - p.podCode = putPos?.agvPositionCode; - p.podTyp = ""; + p.positionCode = putPos?.agvPositionCode; + p.type = ""; //取料点 agvtask.positionCodePath.Add(p); agvtask.taskTyp = ""; diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs index b2fdc12..b97c59a 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs @@ -23,7 +23,6 @@ namespace Khd.Core.Wcs.Wcs private readonly BasePlcpoint LineSignal; private readonly BasePlcpoint LineIsPallet; private readonly BasePlcpoint LineSerialNO; - private readonly BasePlcpoint LineFeedSeriaNo; int FloorNo { get; set; } string EquipNo = ""; public SecondFloorPoint(IHost host, Plc.S7.Plc plc, int floor, string equipNo) @@ -38,13 +37,12 @@ namespace Khd.Core.Wcs.Wcs this.LineSignal = this.ScanPoint.First(t => t.plcpointNo.Contains("linesignal")); this.LineIsPallet = this.ScanPoint.First(t => t.plcpointNo.Contains("ispallet")); this.LineSerialNO = this.ScanPoint.First(t => t.plcpointNo.Contains("serialno")); - this.LineFeedSeriaNo = this.ScanPoint.First(t => t.plcpointNo.Contains("feedserialno")); //var lineRFID = this._plc.Read(NodeSettingCarNo.plcpointAddress); try { //默认启动,清理plc的上位机写入点位值 - this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei); + //this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei); } catch (Exception ex) { @@ -60,6 +58,8 @@ namespace Khd.Core.Wcs.Wcs Thread FlowPointThread = new Thread(MonitorInLocatorPoint); FlowPointThread.Start(); + Console.WriteLine(DateTime.Now + ":二楼码垛输送线调度启动成功"); + LogManager.Info("二楼码垛输送线调度启动成功"); } public void MonitorInLocatorPoint() diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs index 785fec1..fb68c69 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs @@ -21,7 +21,6 @@ namespace Khd.Core.Wcs.Wcs private readonly BasePlcpoint LineSignal; private readonly BasePlcpoint LineIsPallet; private readonly BasePlcpoint LineSerialNO; - private readonly BasePlcpoint LineFeedSeriaNo; int FloorNo { get; set; } string EquipNo = ""; int EquipID = 2; @@ -37,7 +36,6 @@ namespace Khd.Core.Wcs.Wcs this.LineSignal = this.ScanPoint.First(t => t.plcpointNo.Contains("linesignal")); this.LineIsPallet = this.ScanPoint.First(t => t.plcpointNo.Contains("ispallet")); this.LineSerialNO = this.ScanPoint.First(t => t.plcpointNo.Contains("serialno")); - this.LineFeedSeriaNo = this.ScanPoint.First(t => t.plcpointNo.Contains("feedserialno")); //var lineRFID = this._plc.Read(NodeSettingCarNo.plcpointAddress); try @@ -59,6 +57,8 @@ namespace Khd.Core.Wcs.Wcs Thread FlowPointThread = new Thread(MonitorInLocatorPoint); FlowPointThread.Start(); + Console.WriteLine(DateTime.Now + ":二楼接驳位扫描线程启动"); + LogManager.Info("二楼接驳位扫描线程启动"); } public void MonitorInLocatorPoint() @@ -85,19 +85,26 @@ namespace Khd.Core.Wcs.Wcs //判断是否为出库任务 if (wcsTask != null) { - //下发去提升机的去向 - this._plc.Write(LineWcsrun.plcpointAddress, 1); - //更新任务 - dbContext.WcsTask.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTask() + var wmsProductOutstock = dbContext.WmsProductOutstock.Where(t => t.saleOrderId == wcsTask.orderId).FirstOrDefault(); + if (wmsProductOutstock != null) { - currPointId = 2, - currPointNo = "F02", - //提升机 - nextPointId = 6, - nextPointNo = "T01", - updateTime = DateTime.Now, - updateBy = "二楼接驳位", - }); + long? endStationCode = wmsProductOutstock.endStationCode; + //找到目的地楼层 + int floorNo=0; + //下发去提升机的去向 + this._plc.Write(LineWcsrun.plcpointAddress, 1); + //更新任务 + dbContext.WcsTask.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTask() + { + currPointId = 2, + currPointNo = "F02", + floorNo = floorNo, + nextPointId = 6, + nextPointNo = "T01", + updateTime = DateTime.Now, + updateBy = "二楼接驳位", + }); + } } } } diff --git a/src/Khd.Core.Wcs/Wcs/SystemData.cs b/src/Khd.Core.Wcs/Wcs/SystemData.cs new file mode 100644 index 0000000..a3948ed --- /dev/null +++ b/src/Khd.Core.Wcs/Wcs/SystemData.cs @@ -0,0 +1,34 @@ +using Khd.Core.EntityFramework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Khd.Core.Wcs.Wcs +{ + public class SystemData + { + public static long _serialNo { get; set; } = 1; + + public static object serialLock = new object(); + + public static long GetSerialNo(DefaultDbContext dbContext) + { + lock (serialLock) + { + List list = dbContext.WcsTask.Select(t => t.serialNo).ToList(); + while (list.Contains(_serialNo)) + { + _serialNo++; + if(_serialNo > 9999) + { + _serialNo = 1; + } + } + return _serialNo; + } + } + + } +} diff --git a/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs index 8374ce6..819fbb7 100644 --- a/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs @@ -22,7 +22,6 @@ namespace Khd.Core.Wcs.Wcs private readonly BasePlcpoint LineSignal; private readonly BasePlcpoint LineIsPallet; private readonly BasePlcpoint LineSerialNO; - private readonly BasePlcpoint LineFeedSeriaNo; int FloorNo { get; set; } string EquipNo = ""; int EquipID = 9; //3楼AGV @@ -40,13 +39,12 @@ namespace Khd.Core.Wcs.Wcs this.LineSignal = this.ScanPoint.First(t => t.plcpointNo.Contains("linesignal")); this.LineIsPallet = this.ScanPoint.First(t => t.plcpointNo.Contains("ispallet")); this.LineSerialNO = this.ScanPoint.First(t => t.plcpointNo.Contains("serialno")); - this.LineFeedSeriaNo = this.ScanPoint.First(t => t.plcpointNo.Contains("feedserialno")); //var IsPallet = this._plc.Read(LineIsPallet.plcpointAddress); try { //默认启动,清理plc的上位机写入点位值 - this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei); + //this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei); } catch (Exception ex) { @@ -62,6 +60,8 @@ namespace Khd.Core.Wcs.Wcs Thread FlowPointThread = new Thread(MonitorInLocatorPoint); FlowPointThread.Start(); + Console.WriteLine(DateTime.Now + ":三楼AGV 启动上件扫描监听"); + LogManager.Info("三楼AGV 启动上件扫描监听"); } public void MonitorInLocatorPoint() @@ -73,7 +73,7 @@ namespace Khd.Core.Wcs.Wcs try { //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv - var taskList = StaticData.WcsTask.Where(t => t.nextPointId == EquipID && t.currPointId != EquipID && (t.taskType == 1 || t.taskType == 2 || t.taskType == 9)).ToList(); + var taskList = dbContext.WcsTask.Where(t => t.nextPointId == EquipID && t.currPointId != EquipID && (t.taskType == 1 || t.taskType == 2 || t.taskType == 9)).ToList(); if (taskList.Count == 0) { LogManager.Info(FloorNo + "楼AGV无任务"); @@ -225,11 +225,11 @@ namespace Khd.Core.Wcs.Wcs setPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault(); } putPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault(); - p.podCode = setPos?.agvPositionCode; - p.podTyp = ""; + p.positionCode = setPos?.agvPositionCode; + p.type = ""; agvtask.positionCodePath.Add(p); - p.podCode = putPos?.agvPositionCode; - p.podTyp = ""; + p.positionCode = putPos?.agvPositionCode; + p.type = ""; //取料点 agvtask.positionCodePath.Add(p); agvtask.taskTyp = ""; diff --git a/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs index bd831e0..90d4265 100644 --- a/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs @@ -22,7 +22,6 @@ namespace Khd.Core.Wcs.Wcs private readonly BasePlcpoint LineSignal; private readonly BasePlcpoint LineIsPallet; private readonly BasePlcpoint LineSerialNO; - private readonly BasePlcpoint LineFeedSeriaNo; int FloorNo { get; set; } int EquipID = 3; string EquipNo = ""; @@ -38,13 +37,12 @@ namespace Khd.Core.Wcs.Wcs this.LineSignal = this.ScanPoint.First(t => t.plcpointNo.Contains("linesignal")); this.LineIsPallet = this.ScanPoint.First(t => t.plcpointNo.Contains("ispallet")); this.LineSerialNO = this.ScanPoint.First(t => t.plcpointNo.Contains("serialno")); - this.LineFeedSeriaNo = this.ScanPoint.First(t => t.plcpointNo.Contains("feedserialno")); //var lineRFID = this._plc.Read(NodeSettingCarNo.plcpointAddress); try { //默认启动,清理plc的上位机写入点位值 - this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei); + //this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei); } catch (Exception ex) { @@ -60,6 +58,8 @@ namespace Khd.Core.Wcs.Wcs Thread FlowPointThread = new Thread(MonitorInLocatorPoint); FlowPointThread.Start(); + Console.WriteLine(DateTime.Now + ":三楼接驳位调度启动成功"); + LogManager.Info("三楼接驳位调度启动成功"); } public void MonitorInLocatorPoint() diff --git a/src/Khd.Core.Wcs/Wcs/WcsToWms.cs b/src/Khd.Core.Wcs/Wcs/WcsToWms.cs index 1876d7a..0ad3dfe 100644 --- a/src/Khd.Core.Wcs/Wcs/WcsToWms.cs +++ b/src/Khd.Core.Wcs/Wcs/WcsToWms.cs @@ -78,22 +78,13 @@ namespace Khd.Core.Wcs.Wcs /// /// /// - public bool genAgvSchedulingTask(RequestAGVTaskDto requestAGVTaskDto) + public ReponseMessage? genAgvSchedulingTask(RequestAGVTaskDto requestAGVTaskDto) { //生成任务单 var url = "http://IP:PORT/rcms/services/rest/hikRpcService/genAgvSchedulingTask"; var concontentType = "application/json"; var result = HttpHelper.HttpPost(url, requestAGVTaskDto.ToJsonString(), concontentType, 60, null); - var model = (ReponseMessage)JsonConvert.DeserializeObject(result.ToString(), typeof(ReponseMessage)); - if (model.code == "0") - { - LogManager.Info("调用成功。"); - } - else - { - LogManager.Info("调用失败。"); - } - return true; + return JsonConvert.DeserializeObject(result.ToString()); } /// /// 继续执行 diff --git a/src/Khd.Core.Wcs/appsettings.json b/src/Khd.Core.Wcs/appsettings.json index b4b4c8e..91fdeeb 100644 --- a/src/Khd.Core.Wcs/appsettings.json +++ b/src/Khd.Core.Wcs/appsettings.json @@ -1,19 +1,15 @@ { "ConnectionStrings": { - //雅迪工控机数据库 - //"DefaultConnection": "server=192.168.0.81;port=3306;database=khd_suspension_chain;uid=root;pwd=123456;charset='utf8';persistsecurityinfo=True;SslMode=none;Allow User Variables=True" - //mysql 本地 - //"DefaultConnection": "server=localhost;port=3306;database=khd_jyhb;uid=root;pwd=root;charset='utf8';persistsecurityinfo=True;SslMode=none;Allow User Variables=True" - //khd服务器 - "DefaultConnection": "server=106.12.13.113;port=3336;database=khd_jyhb;uid=khd;pwd=khd@123;charset='utf8';persistsecurityinfo=True;SslMode=none;Allow User Variables=True" + //"DefaultConnection": "server=106.12.13.113;port=3336;database=khd_jyhb;uid=khd;pwd=khd@123;charset='utf8';persistsecurityinfo=True;SslMode=none;Allow User Variables=True", + "DefaultConnection": "server=175.27.215.92;port=3306;database=hwjy-cloud;uid=kehaida;pwd=khd2024;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True" }, "PlcConfigs": [ { - "IP": "192.168.0.1", - "Port": "102", - "CpuType": 30, - "Rack": "0", - "Slot": "0", + "IP": "192.168.2.30", + "Port": 102, //102是默认端口 + "CpuType": 40, + "Rack": 0, + "Slot": 1, "Code": 0 } ],