diff --git a/src/Khd.Core.Api/Controllers/RecieveRcsController.cs b/src/Khd.Core.Api/Controllers/RecieveRcsController.cs
index cd65964..9fcaf38 100644
--- a/src/Khd.Core.Api/Controllers/RecieveRcsController.cs
+++ b/src/Khd.Core.Api/Controllers/RecieveRcsController.cs
@@ -25,22 +25,6 @@ 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);
}
diff --git a/src/Khd.Core.Api/appsettings.json b/src/Khd.Core.Api/appsettings.json
index 1114562..73658d4 100644
--- a/src/Khd.Core.Api/appsettings.json
+++ b/src/Khd.Core.Api/appsettings.json
@@ -12,8 +12,8 @@
"AllowedHosts": "*",
"ConnectionStrings": {
//"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"
+ //"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=localhost;port=3306;database=jyhb;uid=root;pwd=root;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True"
},
"JwtSecurityOption": {
"SigningKey": "3c41f60c-1d12-11ec-890d-00163e1b8678",
diff --git a/src/Khd.Core.Application/WcsTaskApplication.cs b/src/Khd.Core.Application/WcsTaskApplication.cs
index e84e88e..a9b227a 100644
--- a/src/Khd.Core.Application/WcsTaskApplication.cs
+++ b/src/Khd.Core.Application/WcsTaskApplication.cs
@@ -48,11 +48,14 @@ namespace Khd.Core.Application
try
{
//处理逻辑
- var wcscmd = _dbContext.WcsCmd.Where(t => t.objid == Convert.ToInt64(agvCallbackDto.taskCode)).FirstOrDefault();
+ var wcscmd = _dbContext.WcsCmd
+ .Where(t=>t.taskCode==agvCallbackDto.taskCode)
+ .Where(t => t.taskId == Convert.ToInt64(agvCallbackDto.reqCode)).FirstOrDefault();
if (wcscmd != null)
{
+ //start 开始 end结束 continue继续
//待取货
- if (agvCallbackDto.method == "continue")
+ if (agvCallbackDto.method.ToLower() == "start")
{
wcscmd.cmdStatus = 2;
wcscmd.sendFlag = 1;
@@ -60,7 +63,7 @@ namespace Khd.Core.Application
_dbContext.SaveChanges();
}
//已取货待放货
- if (agvCallbackDto.method == "compeleted")
+ if (agvCallbackDto.method.ToLower() == "continue")
{
wcscmd.cmdStatus = 3;
wcscmd.sendFlag = 1;
@@ -70,7 +73,7 @@ namespace Khd.Core.Application
var list = _dbContext.WcsTask.Where(t => t.objid == wcscmd.taskId).Update(a => new WcsTask() { currPointNo = wcscmd.equipmentNo });
}
//放货完成
- if (agvCallbackDto.method == "outbin")
+ if (agvCallbackDto.method.ToLower() == "end")
{
wcscmd.cmdStatus = 5;
wcscmd.sendFlag = 1;
diff --git a/src/Khd.Core.Domain/Dto/webapi/genAgvSchedulingTask.cs b/src/Khd.Core.Domain/Dto/webapi/genAgvSchedulingTask.cs
index 5f0e16c..009e5d9 100644
--- a/src/Khd.Core.Domain/Dto/webapi/genAgvSchedulingTask.cs
+++ b/src/Khd.Core.Domain/Dto/webapi/genAgvSchedulingTask.cs
@@ -26,6 +26,18 @@ namespace Khd.Core.Domain.Dto.webapi
public string tokenCode { get; set; }
///
/// 任务类型,
+ /// 业务流程
+ /// 5层柜体来料验收拆分 柜体物料 提升机输送线对接位-验收拆分区 WMS F501 2
+ /// 5层柜体来料入库 柜体物料 验收拆分区-原材料周转区 WMS F502 2
+ /// 5层辅料立体库物料入库 辅料料箱 回转输送线回库口-辅料库货架 WMS F503 1
+ /// 5层辅料立体库分拣出库 辅料料箱 辅料库货架-回转输送线出库口 WMS F504 1
+ /// 5层辅料立体库分拣回库 辅料料箱 回转输送线回库口-辅料库货架 WMS F505 1
+ /// 5层辅料配送流程 辅料料箱 物料分拣位-装配区领料工位 WMS F506 空值
+ /// 5层背板安装区物料配送 柜体物料 原材料周转区-背板安装区 WMS F507 2
+ /// 5层半成品下线 半成品柜 背板安装区-半成品周转区 WMS F508 2
+ /// 5层半成品检验 半成品柜 半成品周转区-检测台 WMS F509 2
+ /// 5层成品柜体入库 成品柜体 检验台-成品区 WMS F510 2
+ /// 5层成品柜体出库 成品柜体 成品区-提升机输送线对接点 WMS F511 2
///
public string taskTyp { get; set; }
///
diff --git a/src/Khd.Core.Domain/Models/BaseEquip.cs b/src/Khd.Core.Domain/Models/BaseEquip.cs
index d42fe05..3bf1e7d 100644
--- a/src/Khd.Core.Domain/Models/BaseEquip.cs
+++ b/src/Khd.Core.Domain/Models/BaseEquip.cs
@@ -17,6 +17,8 @@ namespace Khd.Core.Domain.Models
[Table("wcs_base_equip")]
public class BaseEquip
{
+ [Column("agv_position_code")]
+ public string agvPositionCode;
[Key]
[Column("objid")]
diff --git a/src/Khd.Core.Domain/Models/BasePlcpoint.cs b/src/Khd.Core.Domain/Models/BasePlcpoint.cs
index 775e402..8610d8d 100644
--- a/src/Khd.Core.Domain/Models/BasePlcpoint.cs
+++ b/src/Khd.Core.Domain/Models/BasePlcpoint.cs
@@ -20,7 +20,7 @@ namespace Khd.Core.Domain.Models
[Key]
[Column("id")]
- public long id { get; set; }
+ public long? id { get; set; }
///
/// plc点位编码
@@ -38,7 +38,7 @@ namespace Khd.Core.Domain.Models
/// 点位长度
///
[Column("plcpoint_length")]
- public string plcpointLength { get; set; }
+ public int? plcpointLength { get; set; }
///
/// 点位地址
diff --git a/src/Khd.Core.Domain/Models/WcsCmd.cs b/src/Khd.Core.Domain/Models/WcsCmd.cs
index 66d30db..4067f6a 100644
--- a/src/Khd.Core.Domain/Models/WcsCmd.cs
+++ b/src/Khd.Core.Domain/Models/WcsCmd.cs
@@ -21,7 +21,7 @@ namespace Khd.Core.Domain.Models
/// 任务代码
///
[Column("task_code")]
- public string taskCode;
+ public string taskCode { get; set; }
[Key]
[Column("objid")]
diff --git a/src/Khd.Core.Domain/Models/WmsRawOutstock.cs b/src/Khd.Core.Domain/Models/WmsRawOutstock.cs
index 80a6e72..cc0873c 100644
--- a/src/Khd.Core.Domain/Models/WmsRawOutstock.cs
+++ b/src/Khd.Core.Domain/Models/WmsRawOutstock.cs
@@ -64,11 +64,9 @@ namespace Khd.Core.Domain.Models
[Column("station_id")]
public int? stationId { get; set; }
- ///
- /// 物料ID,关联物料表物料id
- ///
- [Column("product_id")]
- public long? productId { get; set; }
+
+ [Column("material_id")]
+ public long? materialId { get; set; }
///
/// 物料批次
diff --git a/src/Khd.Core.Domain/Models/WmsRawStock.cs b/src/Khd.Core.Domain/Models/WmsRawStock.cs
index a164a4c..684d925 100644
--- a/src/Khd.Core.Domain/Models/WmsRawStock.cs
+++ b/src/Khd.Core.Domain/Models/WmsRawStock.cs
@@ -141,6 +141,9 @@ namespace Khd.Core.Domain.Models
///
[Column("active_flag")]
public string activeFlag { get; set; }
+
+ [Column("sale_order_id")]
+ public long? saleOrderId { get; set; }
}
}
diff --git a/src/Khd.Core.Plc/S7/PlcSynchronous.cs b/src/Khd.Core.Plc/S7/PlcSynchronous.cs
index 8c35dc2..774dbcf 100644
--- a/src/Khd.Core.Plc/S7/PlcSynchronous.cs
+++ b/src/Khd.Core.Plc/S7/PlcSynchronous.cs
@@ -79,6 +79,12 @@ namespace Khd.Core.Plc.S7
return Read(adr.DataType, adr.DbNumber, adr.StartByte, adr.VarType, 1, (byte)adr.BitNumber);
}
+ public object? Read(string variable,VarType varType)
+ {
+ var adr = new PLCAddress(variable);
+ return Read(adr.DataType, adr.DbNumber, adr.StartByte, varType, 1, (byte)adr.BitNumber);
+ }
+
///
/// Reads all the bytes needed to fill a struct in C#, starting from a certain address, and return an object that can be casted to the struct.
///
diff --git a/src/Khd.Core.Plc/StaticPlcHelper.cs b/src/Khd.Core.Plc/StaticPlcHelper.cs
index e65e848..f65e10c 100644
--- a/src/Khd.Core.Plc/StaticPlcHelper.cs
+++ b/src/Khd.Core.Plc/StaticPlcHelper.cs
@@ -18,19 +18,47 @@ namespace Khd.Core.Plc
/// 写入地址
/// 值
/// 长度
- public static void WriteToPoint(this Plc.S7.Plc plc,string address,string valueString,string len)
+ public static void WriteToPoint(this Plc.S7.Plc plc, string address, string? valueString, string? len)
{
+ if (len == null)
+ {
+ throw new ArgumentException("StaticPlcHelper Ex len is null");
+ }
+ if (valueString == null)
+ {
+ throw new ArgumentException("StaticPlcHelper Ex valueString is null");
+ }
var value = GetValue(len, valueString);
plc.Write(address, value);
}
+ ///
+ /// 读取RFID
+ ///
+ /// plc
+ /// 读取地址
+ /// 长度
+ /// 读取到的RFID
+ public static string? ReadRFID(this Plc.S7.Plc plc, string address, int len = 36)
+ {
+ string[] adds = address.Split(".");
+ int db = int.Parse(adds[0].Replace("DB", ""));
+ int startByteAdr = int.Parse(adds[1].Replace("DBX", ""));
+ var result = (byte[]?)plc.Read(S7.DataType.DataBlock, db, startByteAdr, S7.VarType.Byte, len);
+ if (result == null)
+ {
+ return null;
+ }
+ return Encoding.UTF8.GetString(result).Replace("\0", "").Replace("$", "").Trim();
+ }
+
///
/// 电气写入点位高低位转换
///
/// 点位地址位长度
/// 写入数值
///
- private static object GetValue(string len, string value)
+ public static object GetValue(string? len, string? value)
{
if (len == "2")
{
@@ -40,6 +68,10 @@ namespace Khd.Core.Plc
{
return Convert.ToInt32(value);
}
+ if (len == "6")
+ {
+ return Convert.ToByte(value);
+ }
return 0;
}
}
diff --git a/src/Khd.Core.Wcs/Global/PlcConfig.cs b/src/Khd.Core.Wcs/Global/PlcConfig.cs
index 37a3ce7..3873161 100644
--- a/src/Khd.Core.Wcs/Global/PlcConfig.cs
+++ b/src/Khd.Core.Wcs/Global/PlcConfig.cs
@@ -1,8 +1,10 @@
-namespace Khd.Core.Wcs.Global
+using Khd.Core.Plc.S7;
+
+namespace Khd.Core.Wcs.Global
{
public class PlcConfig
{
- public int CpuType { get; set; }
+ public CpuType CpuType { get; set; }
public string IP { get; set; }
public int Port { get; set; }
public short Rack { get; set; }
diff --git a/src/Khd.Core.Wcs/MainCentralControl.cs b/src/Khd.Core.Wcs/MainCentralControl.cs
index ebce8a2..5d623b9 100644
--- a/src/Khd.Core.Wcs/MainCentralControl.cs
+++ b/src/Khd.Core.Wcs/MainCentralControl.cs
@@ -1,10 +1,14 @@
using Khd.Core.EntityFramework;
+using Khd.Core.Plc;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
using Khd.Core.Wcs.Wcs;
using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
+using System.Data;
+using System.Net.Http.Headers;
+using System.Text;
namespace Khd.Core.Wcs
{
@@ -32,36 +36,35 @@ namespace Khd.Core.Wcs
{
try
{ //加载配置项
+
+ using var scope = _host.Services.CreateScope();
+ using var dbContext = scope.ServiceProvider.GetRequiredService();
+ //设置程序启动时清空点位的数据=>0为 Int16位
+ QingKongDianWei = StaticPlcHelper.GetValue("2", "0");
+ //设置默认处理完成=>1为 Int16位
+ WcsChuLiWanCheng = StaticPlcHelper.GetValue("2", "1");
+ //设置默认去向=>1为 Int16位
+ WcsMoRenQuXiang = StaticPlcHelper.GetValue("2", "1");
+
+ StaticData.BasePlcpointList = dbContext.BasePlcpoint.Where(t => t.isDelete == 0).ToList();
+ StaticData.BaseEquip = dbContext.BaseEquip.ToList();
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();
+ plc = new Plc.S7.Plc(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();
-
- //设置程序启动时清空点位的数据=>0为 Int16位
- QingKongDianWei = GetValue("2", "0");
- //设置默认处理完成=>1为 Int16位
- WcsChuLiWanCheng = GetValue("2", "1");
- //设置默认去向=>1为 Int16位
- WcsMoRenQuXiang = GetValue("2", "1");
-
- StaticData.BasePlcpointList = dbContext.BasePlcpoint.Where(t => t.isDelete == 0).ToList();
- StaticData.BaseEquip = dbContext.BaseEquip.ToList();
-
////创建任务
//CreateTaskByRecord createTaskByRecord = new(_host, StaticData.PlcDic[0], "");
//createTaskByRecord.StartPoint();
- //一楼提升机以及接驳位
- FirstFloor firstFloor = new(_host, StaticData.PlcDic[0]);
- firstFloor.StartPoint();
+ ////一楼提升机以及接驳位
+ //FirstFloor firstFloor = new(_host, StaticData.PlcDic[0]);
+ //firstFloor.StartPoint();
////二层接驳位
//var SecondBaseFloorEquip = StaticData.BaseEquip.Where(t => t.floorNo == 2 && t.equipType == 1).First();
@@ -88,20 +91,20 @@ namespace Khd.Core.Wcs
//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 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();
+ //五层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();
@@ -115,23 +118,5 @@ namespace Khd.Core.Wcs
}
}
- ///
- /// 电气写入点位高低位转换
- ///
- /// 点位地址位长度
- /// 写入数值
- ///
- public 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/Wcs/SystemData.cs b/src/Khd.Core.Wcs/SystemData.cs
similarity index 90%
rename from src/Khd.Core.Wcs/Wcs/SystemData.cs
rename to src/Khd.Core.Wcs/SystemData.cs
index a3948ed..c1c7b19 100644
--- a/src/Khd.Core.Wcs/Wcs/SystemData.cs
+++ b/src/Khd.Core.Wcs/SystemData.cs
@@ -5,7 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
-namespace Khd.Core.Wcs.Wcs
+namespace Khd.Core.Wcs
{
public class SystemData
{
@@ -21,7 +21,7 @@ namespace Khd.Core.Wcs.Wcs
while (list.Contains(_serialNo))
{
_serialNo++;
- if(_serialNo > 9999)
+ if (_serialNo > 9999)
{
_serialNo = 1;
}
@@ -29,6 +29,6 @@ namespace Khd.Core.Wcs.Wcs
return _serialNo;
}
}
-
+
}
}
diff --git a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs
index 34acc02..ead0c82 100644
--- a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs
+++ b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs
@@ -5,7 +5,9 @@ using Khd.Core.Wcs.Global;
using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
+using SixLabors.ImageSharp;
using System.Data;
+using System.Security.Cryptography;
using Z.EntityFramework.Plus;
namespace Khd.Core.Wcs.Wcs
@@ -61,7 +63,7 @@ namespace Khd.Core.Wcs.Wcs
var FlowPointThread = new Thread(MonitorInLocatorPoint);
FlowPointThread.Start();
- Console.WriteLine(DateTime.Now+":出库任务监听启动成功");
+ Console.WriteLine(DateTime.Now + ":出库任务监听启动成功");
LogManager.Info("出库任务监听启动成功");
}
public void MonitorInLocatorPoint()
@@ -148,80 +150,186 @@ namespace Khd.Core.Wcs.Wcs
}
}
+
+ ///
+ /// 原材料出库
+ ///
public void CreateRawTask()
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService();
//原材料库存
- var rawStock = dbContext.WmsRawStock.Where(t => t.activeFlag == "0").ToList();
+ var rawStock = dbContext.WmsRawStock.Where(t => t.activeFlag == "1").ToList();
//原材料出库记录
- var rawOutStock = dbContext.WmsRawOutstock.Where(t => t.executeStatus == "0").ToList();
+ var rawOutStock = dbContext.WmsRawOutstock
+ .Where(t => t.executeStatus != "2").ToList();
foreach (var item in rawOutStock)
{
//自动获取id
+ if (item.warehouseId == 512)//CTU出库
+ {
+ var wmsRawStocks = rawStock
+ .Where(t => t.materialId == item.materialId && t.warehouseId == item.warehouseId)
+ .Select(t => t.palletInfoCode)
+ .ToList();
- var objid = StaticData.SnowId.NextId();
- long orderID = 0;
- //插入锁定库存
- WcsOutstockLock stockLock = new()
- {
- objid = objid,
- materialId = item.productId,
- qty = 1,
- warehouseId = item.warehouseId,
- wmsOrderId = item.rawOutstockId,
- wmsOrderDetailId = item.rawOutstockId,
- createBy = "sys",
- createTime = DateTime.Now
- };
- dbContext.Add(stockLock);
- if (item.warehouseId == 5)//五楼辅料出库
- {
- //辅料出库时,需创建订单表数据
- orderID = StaticData.SnowId.NextId();
- WcsWarehouseOrder order = new()
+ var wmsBaseLocations = dbContext.WmsBaseLocation
+ .Where(t => t.activeFlag == "1")
+ .Where(t => t.delFlag == "0")
+ .Where(t => t.locationScrapType == "1")
+ .Where(t => t.instockFlag == "0")
+ .Where(t => t.outstockFlag == "0")
+ .Where(t => t.warehouseId == item.warehouseId)
+ .Where(t => wmsRawStocks.Contains(t.containerCode))
+ .ToList();
+
+ decimal needNumber = item.outstockAmount - item.realOutstockAmount;
+ if (needNumber <= 0)
{
- objid = orderID,
- wmsOrderId = item.rawOutstockId,
- orderType = Convert.ToInt32(item.taskType),
- qty = 1,
- createBy = "",
- createTime = DateTime.Now
- };
- dbContext.Add(order);
+ item.executeStatus = "2";
+ dbContext.Update(item);
+ dbContext.SaveChanges();
+ continue;
+ }
+
+ var bill = from a in wmsBaseLocations
+ from b in rawStock
+ where a.containerCode == b.palletInfoCode
+ select new { a, b };
+ //如果第一列满足需求,则按第一列排序,否则按最后一列排序
+ if (bill.Where(t => t.a.locColumn == 1).Select(t => t.b.totalAmount - t.b.occupyAmount - t.b.frozenAmount).Sum() > needNumber)
+ {
+ bill = bill.OrderBy(t => t.a.locColumn).ToList();
+ }
+ else
+ {
+ bill = bill.OrderByDescending(t => t.a.locColumn).ToList();
+ }
+ //做数量限制
+
+ bill = bill.Take(5 - dbContext.WcsCmd.Where(t => t.cmdStatus < 3 && t.nextPointId == 20).Count());
+ BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11);
+ BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 20);
+ foreach (var b in bill)
+ {
+ item.executeStatus = "1";
+ WmsBaseLocation location = b.a;
+ WmsRawStock stock = b.b;
+ WcsTask wcsTask;
+ int qty = 0;
+ if (stock.totalAmount - stock.occupyAmount - stock.frozenAmount <= needNumber)//该料箱全部出
+ {
+ item.realOutstockAmount += stock.totalAmount - stock.occupyAmount - stock.frozenAmount;
+ qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount);
+ stock.occupyAmount += qty;
+ stock.updateDate = DateTime.Now;
+ }
+ else
+ {
+ item.realOutstockAmount += needNumber;
+ stock.occupyAmount += needNumber;
+ qty = Convert.ToInt32(needNumber);
+ stock.updateDate = DateTime.Now;
+ }
+ wcsTask = new WcsTask()
+ {
+ objid = StaticData.SnowId.NextId(),
+ orderId = item.rawOutstockId,
+ taskType = 38,
+ containerNo = location.containerCode,
+ createBy = "WCS",
+ createTime = DateTime.Now,
+ taskStatus = 0,
+ materialId = item.materialId,
+ currPointId = location.locationId,
+ currPointNo = location.locationCode,
+ startPointId = location.locationId,
+ startPointNo = location.locationCode,
+ nextPointId = ctuEquip.objid,
+ nextPointNo = ctuEquip.equipNo,
+ endPointId = lineEquip.objid,
+ endPointNo = lineEquip.equipNo,
+ equipmentNo = ctuEquip.equipNo,
+ useFlag = 1,
+ qty = qty
+ };
+ dbContext.Add(wcsTask);
+ dbContext.Update(stock);
+ dbContext.SaveChanges();
+ if (qty == needNumber)
+ {
+ break;
+ }
+ }
+ dbContext.Update(item);
+ dbContext.SaveChanges();
}
- var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "O").FirstOrDefault();
- if(dic!= null)
+ else
{
- WcsTask rawTask = new()
- {
- objid = StaticData.SnowId.NextId(),
- orderId = item.rawOutstockId,
- masterId = orderID,
- taskType = Convert.ToInt32(dic.dicValue),
- containerNo = "",
- taskStatus = 0,
- materialId = item.warehouseId,
- qty = 1,
- startPointId = item.warehouseId,
- startPointNo = "",
- currPointId = item.warehouseId,
- currPointNo = "",
- endPointId = item.warehouseId,
- endPointNo = ""
- };
- dbContext.Add(rawTask);
- //获取最早入库时间
- var firstDate = rawStock.Where(t => t.materialId == item.productId && t.warehouseId == item.warehouseId).OrderBy(t => t.createDate).FirstOrDefault();
-
- //回写wms出库记录表
- dbContext.WmsRawOutstock.Where(t => t.rawOutstockId == item.rawOutstockId).Update(t => new WmsProductOutstock()
- {
- executeStatus = "1",
- updateDate = DateTime.Now
- });
}
+ //var objid = StaticData.SnowId.NextId();
+ //long orderID = 0;
+ ////插入锁定库存
+ //WcsOutstockLock stockLock = new()
+ //{
+ // objid = objid,
+ // materialId = item.productId,
+ // qty = 1,
+ // warehouseId = item.warehouseId,
+ // wmsOrderId = item.rawOutstockId,
+ // wmsOrderDetailId = item.rawOutstockId,
+ // createBy = "sys",
+ // createTime = DateTime.Now
+ //};
+ //dbContext.Add(stockLock);
+ //if (item.warehouseId == 5)//五楼辅料出库
+ //{
+ // //辅料出库时,需创建订单表数据
+ // orderID = StaticData.SnowId.NextId();
+ // WcsWarehouseOrder order = new()
+ // {
+ // objid = orderID,
+ // wmsOrderId = item.rawOutstockId,
+ // orderType = Convert.ToInt32(item.taskType),
+ // qty = 1,
+ // createBy = "",
+ // createTime = DateTime.Now
+ // };
+ // dbContext.Add(order);
+ //}
+ //var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "O").FirstOrDefault();
+ //if (dic != null)
+ //{
+ // WcsTask rawTask = new()
+ // {
+ // objid = StaticData.SnowId.NextId(),
+ // orderId = item.rawOutstockId,
+ // masterId = orderID,
+ // taskType = Convert.ToInt32(dic.dicValue),
+ // containerNo = "",
+ // taskStatus = 0,
+ // materialId = item.materialId,
+ // qty = 1,
+ // startPointId = item.warehouseId,
+ // startPointNo = "",
+ // currPointId = item.warehouseId,
+ // currPointNo = "",
+ // endPointId = item.warehouseId,
+ // endPointNo = ""
+ // };
+ // dbContext.Add(rawTask);
+
+ // //获取最早入库时间
+ // var firstDate = rawStock.Where(t => t.materialId == item.productId && t.warehouseId == item.warehouseId).OrderBy(t => t.createDate).FirstOrDefault();
+
+ // //回写wms出库记录表
+ // dbContext.WmsRawOutstock.Where(t => t.rawOutstockId == item.rawOutstockId).Update(t => new WmsProductOutstock()
+ // {
+ // executeStatus = "1",
+ // updateDate = DateTime.Now
+ // });
+ //}
}
}
diff --git a/src/Khd.Core.Wcs/Wcs/FirstFloor.cs b/src/Khd.Core.Wcs/Wcs/FirstFloor.cs
index 75739dc..557a8d9 100644
--- a/src/Khd.Core.Wcs/Wcs/FirstFloor.cs
+++ b/src/Khd.Core.Wcs/Wcs/FirstFloor.cs
@@ -3,6 +3,7 @@ using Khd.Core.Application.Interface;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Plc;
+using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection;
@@ -17,9 +18,9 @@ namespace Khd.Core.Wcs.Wcs
public class FirstFloor
{
private readonly IHost _host;
- private readonly Plc.S7.Plc _plc;
- private long F01 = 1;
- private long T01 = 6;
+ private Plc.S7.Plc _plc;
+ private readonly long F01 = 1;
+ private readonly long T01 = 6;
///
/// 一楼RFID 读
///
@@ -29,10 +30,6 @@ namespace Khd.Core.Wcs.Wcs
///
private readonly BasePlcpoint linesignal01;
///
- /// 去向 写
- ///
- private readonly BasePlcpoint wcsrun01;
- ///
/// 提升机流水号 读
///
private readonly BasePlcpoint serialno06;
@@ -67,9 +64,6 @@ 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.wcsrun01 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorLine") && t.plcpointNo.Contains("wcsrun01"));
-
//一楼提升机流水号 读
this.serialno06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("serialno06"));
@@ -91,14 +85,18 @@ namespace Khd.Core.Wcs.Wcs
///
public void StartPoint()
{
- Thread firstFloorLine = new Thread(FirstFloorLine);
- firstFloorLine.IsBackground = true;
+ Thread firstFloorLine = new(FirstFloorLine)
+ {
+ IsBackground = true
+ };
firstFloorLine.Start();
Console.WriteLine(DateTime.Now + ":一楼接驳位线程启动成功");
LogManager.Info("一楼接驳位线程启动成功");
- Thread firstFloorHoister = new Thread(FirstFloorHoister);
- firstFloorHoister.IsBackground = true;
+ Thread firstFloorHoister = new(FirstFloorHoister)
+ {
+ IsBackground = true
+ };
firstFloorHoister.Start();
Console.WriteLine(DateTime.Now + ":一楼提升机线程启动成功");
LogManager.Info("一楼提升机线程启动成功");
@@ -116,9 +114,8 @@ namespace Khd.Core.Wcs.Wcs
{
try
{
- var RFID001Value = this._plc.Read(this.RFID001.plcpointAddress); //一楼RFID 读
+ var RFID001Value = this._plc.ReadRFID(this.RFID001.plcpointAddress); //一楼RFID 读
var linesignal01Value = this._plc.Read(this.linesignal01.plcpointAddress); //到位信号 读
- var wcsrun01Value = this._plc.Read(this.wcsrun01.plcpointAddress); //去向 写
//正常读到plc值
if (linesignal01Value != null && RFID001Value != null)
@@ -126,15 +123,14 @@ namespace Khd.Core.Wcs.Wcs
//正常托盘到位
if (Convert.ToInt32(linesignal01Value) == 1)
{
-
//判断task表里没有该rfid的未完成的入库信息,未下发去向
- var task = dbContext.WcsTask.Where(t => t.containerNo == RFID001Value.ToString() && t.taskStatus < 1).FirstOrDefault();
+ var task = dbContext.WcsTask.Where(t => t.containerNo == RFID001Value && t.taskStatus < 1).FirstOrDefault();
if (task == null)
{
//入库
//根据托盘号获取物料码
- var material = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value.ToString()).FirstOrDefault();
+ var material = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value).FirstOrDefault();
if (material != null)
{
var warehouseId = dbContext.WmsWarehouseMaterial.Where(t => t.storageType == "1" && t.storageId == material.materialId).FirstOrDefault()?.warehouseId;
@@ -151,11 +147,11 @@ namespace Khd.Core.Wcs.Wcs
var newTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
- serialNo = 1235,
+ serialNo = SystemData.GetSerialNo(dbContext),
equipmentNo = "F01",
taskType = Convert.ToInt32(dic.dicValue),
taskStatus = 0,
- containerNo = RFID001Value.ToString(),
+ containerNo = RFID001Value,
materialNo = material.materialCode,
materialId = material.materialId,
qty = Convert.ToInt32(material.bindAmount),
@@ -179,35 +175,58 @@ namespace Khd.Core.Wcs.Wcs
}
}
}
- else if (Itpyes.Contains(task.taskType))
+ 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();
+ if (task.nextPointId != T01)
+ {
+ 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();
- //}
+ var material = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value).FirstOrDefault();
+ if (material != null)
+ {
+ material.bindAmount = 0;
+ material.materialBarcode = null;
+ material.materialCode = null;
+ material.materialId = null;
+ material.materialName = null;
+ material.updateBy = "SYS";
+ material.updateTime = DateTime.Now;
+ dbContext.Update(material);
+ //dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value).Delete();
+ dbContext.SaveChanges();
+ }
}
}
}
}
catch (Exception ex)
{
+ if (ex is PlcException)
+ {
+ try
+ {
+ this._plc = new Plc.S7.Plc(this._plc.CPU, this._plc.IP, this._plc.Port, this._plc.Rack, this._plc.Slot);
+ this._plc.Open();
+ }
+ catch
+ {
+
+ }
+ }
LogManager.Error(ex);
}
Thread.Sleep(1000);
@@ -228,7 +247,7 @@ namespace Khd.Core.Wcs.Wcs
var serialno06Value = this._plc.Read(this.serialno06.plcpointAddress); //提升机流水号 读
var equipstate06Value = this._plc.Read(this.equipstate06.plcpointAddress); //提升机状态 读
var hoisterTrayIn06Value = this._plc.Read(this.hoistertrayin06.plcpointAddress); //提升机货物到位状态 读
- var currentfloor06Value = this._plc.Read(this.currentfloor06.plcpointAddress); //提升机当前楼层 写
+ var currentfloor06Value = this._plc.Read(this.currentfloor06.plcpointAddress); //提升机当前楼层 读
var targetfloor06Value = this._plc.Read(this.targetfloor06.plcpointAddress); //提升机目的楼层 写
var reserialno06 = this._plc.Read(this.reserialno06.plcpointAddress); //反馈流水号
@@ -241,7 +260,7 @@ namespace Khd.Core.Wcs.Wcs
var wcsTask = dbContext.WcsTask.Where(t => t.nextPointId == T01).OrderBy(t => t.createTime).FirstOrDefault();
if (wcsTask != null)
{
- if (wcsTask.taskStatus == 0)//创建
+ if (wcsTask.taskStatus == 0 && Convert.ToInt32(hoisterTrayIn06Value) == 0)//创建状态,并且里面没有货物
{
if (Convert.ToInt32(currentfloor06Value) == wcsTask.fromFloorNo)
{
@@ -250,7 +269,8 @@ namespace Khd.Core.Wcs.Wcs
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);
+ this._plc.WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString());
+ this._plc.WriteToPoint(this.serialno06.plcpointAddress, wcsTask.serialNo.ToString(), this.serialno06.plcpointLength.ToString());
dbContext.Update(wcsTask);
dbContext.SaveChanges();
}
@@ -260,12 +280,13 @@ namespace Khd.Core.Wcs.Wcs
wcsTask.updateBy = "提升机线程";
wcsTask.updateTime = DateTime.Now;
wcsTask.remark = "提升机任务执行中";
- this._plc.WriteToPoint(this.targetfloor06.plcpointAddress, wcsTask.fromFloorNo.ToString(),this.targetfloor06.plcpointLength);//目的地楼层
+ this._plc.WriteToPoint(this.targetfloor06.plcpointAddress, wcsTask.fromFloorNo.ToString(), this.targetfloor06.plcpointLength.ToString());//目的地楼层
+ this._plc.WriteToPoint(this.serialno06.plcpointAddress, wcsTask.serialNo.ToString(), this.serialno06.plcpointLength.ToString());
dbContext.Update(wcsTask);
dbContext.SaveChanges();
}
}
- if (wcsTask.taskStatus == 1)
+ if (wcsTask.taskStatus == 1 && Convert.ToInt32(reserialno06) == wcsTask.serialNo)
{
if (Convert.ToInt32(currentfloor06Value) == wcsTask.fromFloorNo)//提升机当前楼层为初始地楼层
{
@@ -274,12 +295,12 @@ namespace Khd.Core.Wcs.Wcs
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);
+ this._plc.WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString());
dbContext.Update(wcsTask);
dbContext.SaveChanges();
}
}
- if (wcsTask.taskStatus == 2)
+ if (wcsTask.taskStatus == 2 && Convert.ToInt32(reserialno06) == wcsTask.serialNo)
{
if (Convert.ToInt32(hoisterTrayIn06Value) == 1)//托盘已经进提升机
{
@@ -287,19 +308,19 @@ namespace Khd.Core.Wcs.Wcs
wcsTask.updateBy = "提升机线程";
wcsTask.updateTime = DateTime.Now;
wcsTask.remark = "提升机任务执行完成";
- this._plc.WriteToPoint(this.targetfloor06.plcpointAddress, wcsTask.floorNo.ToString(),this.targetfloor06.plcpointLength);//目的地楼层
+ this._plc.WriteToPoint(this.targetfloor06.plcpointAddress, wcsTask.floorNo.ToString(), this.targetfloor06.plcpointLength.ToString());//目的地楼层
dbContext.Update(wcsTask);
dbContext.SaveChanges();
}
}
- if (wcsTask.taskStatus == 3 && Convert.ToInt32(currentfloor06Value) == wcsTask.floorNo)//任务状态为3,且当前楼层为任务的目的楼层
+ if (wcsTask.taskStatus == 3 && Convert.ToInt32(currentfloor06Value) == wcsTask.floorNo && Convert.ToInt32(reserialno06) == wcsTask.serialNo)//任务状态为3,且当前楼层为任务的目的楼层
{
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,表示提升机已到达目的地,让货出去
+ this._plc.WriteToPoint(basePlcpoint.plcpointAddress, "2", basePlcpoint.plcpointLength.ToString());//去向为2,表示提升机已到达目的地,让货出去
dbContext.Update(wcsTask);
dbContext.SaveChanges();
}
@@ -309,6 +330,18 @@ namespace Khd.Core.Wcs.Wcs
}
catch (Exception ex)
{
+ if (ex is PlcException)
+ {
+ try
+ {
+ this._plc = new Plc.S7.Plc(this._plc.CPU, this._plc.IP, this._plc.Port, this._plc.Rack, this._plc.Slot);
+ this._plc.Open();
+ }
+ catch
+ {
+
+ }
+ }
LogManager.Error(ex);
}
Thread.Sleep(1000);
diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs
index b8b93cd..9953ba1 100644
--- a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs
+++ b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs
@@ -1,4 +1,5 @@
-using Khd.Core.Domain.Dto.webapi;
+using Jc.SnowId;
+using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Wcs.Global;
@@ -21,10 +22,8 @@ namespace Khd.Core.Wcs.Wcs
private readonly BasePlcpoint LineRFID;
private readonly BasePlcpoint LineWcsrun;
private readonly BasePlcpoint LineSignal;
- private readonly BasePlcpoint LineIsPallet;
- private readonly BasePlcpoint LineSerialNO;
int FloorNo { get; set; }
- string EquipNo = "";
+ private readonly string EquipNo = "";
int agvID = 10;
public FiveFloorAGV(IHost host, Plc.S7.Plc plc, int floor, string equipNo)
{
@@ -36,8 +35,6 @@ namespace Khd.Core.Wcs.Wcs
this.LineRFID = this.ScanPoint.First(t => t.plcpointNo.Contains("RFID"));
this.LineWcsrun = this.ScanPoint.First(t => t.plcpointNo.Contains("wcsrun"));
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"));
//var lineRFID = this._plc.Read(NodeSettingCarNo.plcpointAddress);
try
{
@@ -56,7 +53,7 @@ namespace Khd.Core.Wcs.Wcs
public void StartPoint()
{
- Thread FlowPointThread = new Thread(MonitorInLocatorPoint);
+ Thread FlowPointThread = new(MonitorInLocatorPoint);
FlowPointThread.Start();
Console.WriteLine(DateTime.Now + ":五楼AGV上件扫描监听启动成功");
LogManager.Info("五楼AGV上件扫描监听启动成功");
@@ -80,48 +77,120 @@ namespace Khd.Core.Wcs.Wcs
{
if (item.taskStatus == 0)//下发任务
{
- BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1);
- WcsCmd wcsCmd = new WcsCmd()
+ if (taskType.Contains(item.taskType))//入库任务
{
- 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
+ if (Convert.ToInt32(this._plc.Read(LineSignal.plcpointAddress)) == 1)
{
- positionCode=wcsCmd.currPointNo,
- type="1"
- },
- new Position
- {
- positionCode=wcsCmd.nextPointNo,
- type="2"
+ Console.WriteLine($"{DateTime.Now}:5楼接驳位上有货,无法下发Agv出库任务");
+ continue;
}
- };
- 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 == "成功")
+ WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId);
+ BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1);
+ WcsCmd wcsCmd = new()
+ {
+ objid = StaticData.SnowId.NextId(),
+ cmdStatus = 0,
+ taskId = item.objid,
+ useFlag = 1,
+ cmdType = item.taskType,
+ containerNo = item.containerNo,
+ createTime = DateTime.Now,
+ createBy = FloorNo + "楼AGV",
+ currPointId = item.currPointId,
+ currPointNo = baseEquip.agvPositionCode,
+ nextPointId = item.endPointId,
+ nextPointNo = wmsBaseLocation.agvPositionCode,
+ };
+ var agvTask = new RequestAGVTaskDto
+ {
+ reqCode = item.objid.ToString(),
+ positionCodePath = new List
+ {
+ new ()
+ {
+ positionCode=wcsCmd.currPointNo,
+ type="1"
+ },
+ new ()
+ {
+ positionCode=wcsCmd.nextPointNo,
+ type="2"
+ }
+ },
+ ctnrTyp = "2",
+ };
+ string message = JsonConvert.SerializeObject(agvTask);
+ string result = HttpHelper.SendPostMessage("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
+ {
+
+ }
+ }
+ else//出库任务
{
- wcsCmd.taskCode = reponseMessage.data;
- wcsCmd.cmdStatus = 1;
- item.taskStatus = 1;
- dbContext.Update(item);
- dbContext.Add(wcsCmd);
- dbContext.SaveChanges();
+ if (Convert.ToInt32(this._plc.Read(LineSignal.plcpointAddress)) == 1)
+ {
+ Console.WriteLine($"{DateTime.Now}:5楼接驳位上有货,无法下发Agv出库任务");
+ continue;
+ }
+ WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.startPointId);
+ BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1);
+ WcsCmd wcsCmd = new()
+ {
+ objid = item.objid,
+ cmdStatus = 0,
+ taskId = item.orderId,
+ useFlag = 1,
+ cmdType = item.taskType,
+ containerNo = item.containerNo,
+ createTime = DateTime.Now,
+ createBy = FloorNo + "楼AGV",
+ currPointId = item.currPointId,
+ currPointNo = wmsBaseLocation.agvPositionCode,
+ nextPointId = item.endPointId,
+ nextPointNo = baseEquip.agvPositionCode,
+ };
+ RequestAGVTaskDto agvTask = new()
+ {
+ reqCode = item.objid.ToString(),
+ positionCodePath = new List
+ {
+ new ()
+ {
+ positionCode=wcsCmd.currPointNo,
+ type="1"
+ },
+ new ()
+ {
+ positionCode=wcsCmd.nextPointNo,
+ type="2"
+ }
+ },
+ taskTyp = "",
+ ctnrTyp = "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
@@ -131,11 +200,13 @@ namespace Khd.Core.Wcs.Wcs
{
if (wcsCmd.cmdStatus == 2)
{
- RequestAGVTaskDto agvTask = new RequestAGVTaskDto();
- agvTask.reqCode = item.objid.ToString();
- agvTask.taskCode = wcsCmd.taskCode;
+ var agvTask = new RequestAGVTaskDto
+ {
+ reqCode = item.objid.ToString(),
+ taskCode = wcsCmd.taskCode
+ };
string message = JsonConvert.SerializeObject(agvTask);
- string result = HttpHelper.HttpPost("http://172.16.12.24:8182/rcms/services/rest/hikRpcService/continueTask", message);
+ string result = HttpHelper.SendPostMessage("172.16.12.24", 8182, "rcms/services/rest/hikRpcService/continueTask", message);
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
@@ -144,7 +215,7 @@ namespace Khd.Core.Wcs.Wcs
dbContext.SaveChanges();
}
}
- else if (wcsCmd.cmdStatus == 4)
+ else if (wcsCmd.cmdStatus == 5)
{
//任务完成
//如果是入库任务,更新库存信息,并删除任务
@@ -209,8 +280,8 @@ namespace Khd.Core.Wcs.Wcs
var wareHouseList = StaticData.WmsBaseWarehouse.ToList();
var equip = StaticData.BaseEquip.Where(t => t.floorNo == floorNo && t.equipType == 4).FirstOrDefault();
//入库类型
- List taskInType = new List { 1, 3, 5, 7 };
- List taskOutType = new List { 2, 4, 6, 8 };
+ List taskInType = new() { 1, 3, 5, 7 };
+ List taskOutType = new() { 2, 4, 6, 8 };
try
{
//获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv
diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs
index 2f8b283..f7076cb 100644
--- a/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs
+++ b/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs
@@ -19,10 +19,8 @@ namespace Khd.Core.Wcs.Wcs
private readonly IHost _host;
private readonly Plc.S7.Plc _plc;
private readonly BasePlcpoint LineRFID;
- private readonly BasePlcpoint LineWcsrun;
- private readonly BasePlcpoint LineSignal;
- private readonly BasePlcpoint LineIsPallet;
- private readonly BasePlcpoint LineSerialNO;
+ private readonly BasePlcpoint isarrive;
+ private readonly BasePlcpoint isput;
int FloorNo { get; set; }
string EquipNo = "";
int CTUID = 11;
@@ -33,11 +31,9 @@ namespace Khd.Core.Wcs.Wcs
FloorNo = floor;
EquipNo = equipNo;
this.ScanPoint = StaticData.BasePlcpointList.Where(t => t.floorNo == floor).ToList();//加载当前站点所对应的点位
- this.LineRFID = this.ScanPoint.First(t => t.plcpointNo.Contains("RFID"));
- this.LineWcsrun = this.ScanPoint.First(t => t.plcpointNo.Contains("wcsrun"));
- 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.LineRFID = this.ScanPoint.First(t => t.plcpointNo.Contains("RFID5001"));
+ this.isarrive = this.ScanPoint.First(t => t.plcpointNo.Contains("isarrive"));
+ this.isput = this.ScanPoint.First(t => t.plcpointNo.Contains("isput"));
//var lineRFID = this._plc.Read(NodeSettingCarNo.plcpointAddress);
try
@@ -60,10 +56,64 @@ namespace Khd.Core.Wcs.Wcs
Thread FlowPointThread = new Thread(MonitorInLocatorPoint);
FlowPointThread.Start();
- Console.WriteLine(DateTime.Now+":五楼CTU上件扫描监听启动");
+
+ //Thread FlowCTUInWareThread = new Thread(MonitorInWare);
+ //FlowCTUInWareThread.Start();
+ Console.WriteLine(DateTime.Now + ":五楼CTU上件扫描监听启动");
LogManager.Info("五楼CTU上件扫描监听启动");
}
+ private void MonitorInWare(object? obj)
+ {
+ using var scope = _host.Services.CreateScope();
+ using var dbContext = scope.ServiceProvider.GetRequiredService();
+ while (true)
+ {
+ try
+ {
+ var rfid = this._plc.Read(LineRFID.plcpointAddress);
+ var isArrive = this._plc.Read(isarrive.plcpointAddress);
+ if (rfid != null && isArrive != null && Convert.ToInt32(isArrive) == 1)
+ {
+ //根据rfid找到库位
+ //生成入库任务
+ var wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.containerCode == rfid.ToString());
+ BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.equipNo == "FL051");
+ BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11);
+ if (wmsBaseLocation != null)
+ {
+ var wcsTask = new WcsTask()
+ {
+ objid = StaticData.SnowId.NextId(),
+ startPointId = baseEquip.objid,
+ startPointNo = baseEquip.agvPositionCode,
+ currPointId = baseEquip.objid,
+ currPointNo = baseEquip.agvPositionCode,
+ nextPointId = ctuEquip.objid,
+ nextPointNo = ctuEquip.equipNo,
+ endPointId = wmsBaseLocation.locationId,
+ endPointNo = wmsBaseLocation.agvPositionCode,
+ taskType = 1,
+ taskStatus = 0,
+ floorNo = 5,
+ ud1 = "0",//是否是最后一个任务
+ containerNo = rfid.ToString(),
+ equipmentNo = baseEquip.equipNo,
+ createBy = FloorNo + "楼CTU",
+ createTime = DateTime.Now,
+ };
+ dbContext.Add(wcsTask);
+ dbContext.SaveChanges();
+ }
+ }
+ }
+ catch
+ {
+
+ }
+ }
+ }
+
public void MonitorInLocatorPoint()
{
List taskType = new() { 1, 3, 5, 7 };
@@ -73,57 +123,114 @@ namespace Khd.Core.Wcs.Wcs
{
try
{
- var taskList = dbContext.WcsTask.Where(t => t.nextPointId == CTUID && (t.taskType == 7 || t.taskType == 8)).ToList();
+ var taskList = dbContext.WcsTask.Where(t => t.nextPointId == CTUID).ToList();
if (taskList.Count == 0)
{
LogManager.Info(FloorNo + "楼CTU无任务");
}
foreach (var item in taskList)
{
- if (item.taskStatus == 0)//下发任务
+ if (item.taskStatus == 0)//CTU会同时生成多个任务,生成就下发?
{
- BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1);
- WcsCmd wcsCmd = new WcsCmd()
+ if (item.taskType % 2 == 0)//出库任务
{
- 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
+ BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId);
+ WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.startPointId);
+ var wcsCmd = new WcsCmd()
{
- positionCode=wcsCmd.currPointNo,
- type="1"
- },
- new Position
+ objid = StaticData.SnowId.NextId(),
+ cmdStatus = 0,
+ taskId = item.objid,
+ useFlag = 1,
+ cmdType = item.taskType,
+ containerNo = item.containerNo,
+ createTime = DateTime.Now,
+ createBy = FloorNo + "楼CTU",
+ currPointId = wmsBaseLocation.locationId,
+ currPointNo = wmsBaseLocation.agvPositionCode,
+ nextPointId = baseEquip.objid,
+ nextPointNo = baseEquip.agvPositionCode,
+ taskCode=null
+ };
+ var agvTask = new RequestAGVTaskDto
{
- positionCode=wcsCmd.nextPointNo,
- type="2"
+ reqCode = wcsCmd.objid.ToString(),
+ positionCodePath = new List
+ {
+ new() {
+ positionCode=wcsCmd.currPointNo,
+ type="05"
+ },
+ new() {
+ positionCode=wcsCmd.nextPointNo,
+ type="05"
+ },
+ },
+ ctnrTyp = "1",
+ taskTyp = "F504"
+ };
+ 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.WcsCmd.Add(wcsCmd);
+ dbContext.SaveChanges();
}
- };
- 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 == "成功")
+ }
+ else//入库任务
{
- wcsCmd.taskCode = reponseMessage.data;
- wcsCmd.cmdStatus = 1;
- item.taskStatus = 1;
- dbContext.Update(item);
- dbContext.Add(wcsCmd);
- dbContext.SaveChanges();
+ BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == item.startPointId);
+ WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId);
+ var wcsCmd = new WcsCmd()
+ {
+ objid = StaticData.SnowId.NextId(),
+ cmdStatus = 0,
+ taskId = item.objid,
+ useFlag = 1,
+ cmdType = item.taskType,
+ containerNo = item.containerNo,
+ createTime = DateTime.Now,
+ createBy = FloorNo + "楼CTU",
+ nextPointId = wmsBaseLocation.locationId,
+ nextPointNo = wmsBaseLocation.agvPositionCode,
+ currPointId = baseEquip.objid,
+ currPointNo = baseEquip.agvPositionCode,
+ };
+ var agvTask = new RequestAGVTaskDto
+ {
+ reqCode = item.objid.ToString(),
+ positionCodePath = new List
+ {
+ new() {
+ positionCode=wcsCmd.currPointNo,
+ type="0"
+ },
+ new() {
+ positionCode=wcsCmd.nextPointNo,
+ type="0"
+ },
+ },
+ ctnrTyp = "1",
+ taskTyp = "F503"
+ };
+ 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(wmsBaseLocation);
+ dbContext.Update(item);
+ dbContext.Add(wcsCmd);
+ dbContext.SaveChanges();
+ }
}
}
else
@@ -131,22 +238,24 @@ namespace Khd.Core.Wcs.Wcs
WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.objid == item.objid);
if (wcsCmd != null)
{
- if (wcsCmd.cmdStatus == 2)
+ if (wcsCmd.cmdStatus == 3)
{
- RequestAGVTaskDto agvTask = new RequestAGVTaskDto();
- agvTask.reqCode = item.objid.ToString();
- agvTask.taskCode = wcsCmd.taskCode;
+ var agvTask = new RequestAGVTaskDto
+ {
+ reqCode = item.objid.ToString(),
+ 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;
+ wcsCmd.cmdStatus = 4;
dbContext.Update(wcsCmd);
dbContext.SaveChanges();
}
}
- else if (wcsCmd.cmdStatus == 4)
+ else if (wcsCmd.cmdStatus == 5)
{
//任务完成
//如果是入库任务,更新库存信息,并删除任务
@@ -158,7 +267,6 @@ namespace Khd.Core.Wcs.Wcs
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();
@@ -198,6 +306,8 @@ namespace Khd.Core.Wcs.Wcs
}
}
+
+
///
/// 下发任务
///
diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs
index 24bc253..3eb6a0c 100644
--- a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs
+++ b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs
@@ -1,11 +1,13 @@
using Khd.Core.Domain.Dto.webapi;
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;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
+using System.Security.Cryptography;
namespace Khd.Core.Wcs.Wcs
{
@@ -20,8 +22,7 @@ namespace Khd.Core.Wcs.Wcs
private readonly BasePlcpoint LineRFID;
private readonly BasePlcpoint LineWcsrun;
private readonly BasePlcpoint LineSignal;
- private readonly BasePlcpoint LineIsPallet;
- private readonly BasePlcpoint LineSerialNO;
+
int FloorNo { get; set; }
string EquipNo = "";
public FiveFloorPoint(IHost host, Plc.S7.Plc plc, int floor, string equipNo)
@@ -31,11 +32,9 @@ namespace Khd.Core.Wcs.Wcs
FloorNo = floor;
EquipNo = equipNo;
this.ScanPoint = StaticData.BasePlcpointList.Where(t => t.floorNo == floor).ToList();//加载当前站点所对应的点位
- this.LineRFID = this.ScanPoint.First(t => t.plcpointNo.Contains("RFID"));
+ this.LineRFID = this.ScanPoint.First(t => t.plcpointNo.Contains("RFID005"));
this.LineWcsrun = this.ScanPoint.First(t => t.plcpointNo.Contains("wcsrun"));
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"));
try
{
@@ -63,7 +62,7 @@ namespace Khd.Core.Wcs.Wcs
public void MonitorInLocatorPoint()
{
- List ITypes = new List { 1, 3, 5, 7 };
+ List ITypes = new() { 1, 3, 5, 7 };
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService();
while (true)
@@ -71,13 +70,12 @@ namespace Khd.Core.Wcs.Wcs
try
{
//入库任务
- var rfid = this._plc.Read(LineRFID.plcpointAddress);
+ var rfid = this._plc.ReadRFID(LineRFID.plcpointAddress);
var isSignal = this._plc.Read(LineSignal.plcpointAddress);
- var isPallet = this._plc.Read(LineIsPallet.plcpointAddress);
- if (rfid != null && isSignal != null && isPallet != null)
+ if (rfid != null && isSignal != null)
{
//正常读到输送线信息 有到位信号,并且有托盘,获取条码信息
- if (Convert.ToInt32(isSignal) > 0 && Convert.ToInt32(isPallet) == 1)
+ if (Convert.ToInt32(isSignal) == 1)
{
//获取条码信息
var palletNo = Convert.ToString(rfid);
@@ -91,19 +89,43 @@ namespace Khd.Core.Wcs.Wcs
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.instockFlag == "0")
.Where(t => t.outstockFlag == "0")
- .Where(t=>string.IsNullOrEmpty(t.containerCode))
+ //.Where(t => t.locationStatus == "1")
+ //.Where(t => string.IsNullOrEmpty(t.containerCode))
.ToList();
+ List containerCodes = wmsBaseLocations.Where(t => t.locDeep == 1).Select(t => t.containerCode).ToList();//深库位的托盘
+ List mesBasePalletInfos = dbContext.MesBasePalletInfo
+ .Where(t => t.materialId == wcsTask.materialId)
+ .Where(t => containerCodes.Contains(t.palletInfoCode)).ToList();//深库位的托盘的物料等于当前任务的物料
+
+ var bill = from a in mesBasePalletInfos
+ join b in wmsBaseLocations.Where(t => t.locDeep == 1) on a.palletInfoCode equals b.containerCode
+ select new { b };//等于当前任务的物料的托盘的库位信息
+
+ var outBill = from a in bill
+ from b in wmsBaseLocations
+ where a.b.layerNum == b.layerNum
+ && b.locDeep == 2
+ && a.b.locRow == b.locRow
+ && a.b.locColumn == b.locColumn
+ && b.locationStatus == "1"
+ && b.outstockFlag == "0"
+ && b.instockFlag == "0"
+ && string.IsNullOrEmpty(b.containerCode)
+ select new { a.b };//在上面的基础上获取对应托盘的外侧库位的空库位信息
+
+ WmsBaseLocation? wmsBaseLocation = null;
+ wmsBaseLocation ??= outBill.FirstOrDefault()?.b;//先找相同物料的外侧库位
+ wmsBaseLocation ??= wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(t => t.locDeep == 2);//找不到再找深库位
+ wmsBaseLocation ??= wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();//找不到再找任意库位
//深浅库位问题?库位入库优先级等
var AgvEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 5);//背负Agv
- if (wmsBaseLocations.Count > 0)
+ if (wmsBaseLocations.Count > 0 && wmsBaseLocation != null)
{
- WmsBaseLocation wmsBaseLocation = wmsBaseLocations.First();
wcsTask.taskStatus = 0;//创建状态
wcsTask.updateTime = DateTime.Now;
wcsTask.currPointId = baseEquip.objid;
@@ -118,6 +140,10 @@ namespace Khd.Core.Wcs.Wcs
dbContext.Update(wcsTask);
dbContext.SaveChanges();
}
+ else
+ {
+ Console.WriteLine(DateTime.Now + ":五楼接驳位调度入库任务,未找到库位");
+ }
}
else//出库
{
diff --git a/src/Khd.Core.Wcs/Wcs/FourthFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/FourthFloorPoint.cs
new file mode 100644
index 0000000..a025402
--- /dev/null
+++ b/src/Khd.Core.Wcs/Wcs/FourthFloorPoint.cs
@@ -0,0 +1,148 @@
+using Khd.Core.Domain.Models;
+using Khd.Core.EntityFramework;
+using Khd.Core.Plc.S7;
+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;
+using Z.EntityFramework.Plus;
+
+namespace Khd.Core.Wcs.Wcs
+{
+ ///
+ /// 四楼接驳位
+ ///
+ public class FourthFloorPoint
+ {
+ private readonly int Floor;
+ private readonly Plc.S7.Plc _plc;
+ private readonly IHost host;
+ private readonly BasePlcpoint LineRFID;
+ private readonly BasePlcpoint LineSignal;
+ private readonly BasePlcpoint WcsRun;
+ public FourthFloorPoint(int floor, Plc.S7.Plc plc, IHost host)
+ {
+ Floor = floor;
+ _plc = plc;
+ this.host = host;
+ this.LineRFID = StaticData.BasePlcpointList.First(t => t.floorNo == 4 && t.plcpointNo.Contains("RFID"));
+ this.LineSignal = StaticData.BasePlcpointList.First(t => t.floorNo == 4 && t.plcpointNo.Contains("signal"));
+ this.WcsRun = StaticData.BasePlcpointList.First(t => t.floorNo == 4 && t.plcpointNo.Contains("wcsrun"));
+ }
+
+ public void StartPoint()
+ {
+ Thread MonitorInLocatorPointThread=new Thread(MonitorInLocatorPoint);
+ MonitorInLocatorPointThread.Start();
+ }
+
+ private void MonitorInLocatorPoint()
+ {
+ List Itpyes = new() { 1, 3, 5, 7 };
+ using var scope = host.Services.CreateScope();
+ using var dbContext = scope.ServiceProvider.GetRequiredService();
+ while (true)
+ {
+ try
+ {
+ var RFID004Value = this._plc.Read(this.LineRFID.plcpointAddress); //一楼RFID 读
+ var linesignal04Value = this._plc.Read(this.LineSignal.plcpointAddress); //到位信号 读
+ var wcsrun04Value = this._plc.Read(this.WcsRun.plcpointAddress); //去向 写
+
+ //正常读到plc值
+ if (linesignal04Value != null && RFID004Value != null)
+ {
+ //正常托盘到位
+ if (Convert.ToInt32(linesignal04Value) == 1)
+ {
+
+ //判断task表里没有该rfid的未完成的入库信息,未下发去向
+ var task = dbContext.WcsTask.Where(t => t.containerNo == RFID004Value.ToString() && t.taskStatus < 1).FirstOrDefault();
+ if (task == null)
+ {
+ //入库
+
+ //根据托盘号获取物料码
+ var material = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID004Value.ToString()).FirstOrDefault();
+ if (material != null)
+ {
+ var warehouseId = dbContext.WmsWarehouseMaterial.Where(t => t.storageType == "1" && t.storageId == material.materialId).FirstOrDefault()?.warehouseId;
+ if (warehouseId != null)
+ {
+ 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)
+ {
+ var newTask = new WcsTask()
+ {
+ objid = StaticData.SnowId.NextId(),
+ serialNo = 1235,
+ equipmentNo = "F04",
+ taskType = Convert.ToInt32(dic.dicValue),
+ taskStatus = 0,
+ containerNo = RFID004Value.ToString(),
+ materialNo = material.materialCode,
+ materialId = material.materialId,
+ qty = Convert.ToInt32(material.bindAmount),
+ startPointId = 4,
+ startPointNo = "F04",
+ currPointId = 4,
+ currPointNo = "F04",
+ nextPointId = 6,
+ nextPointNo = "T01",
+ endPointId = warehouseId,
+ fromFloorNo = 4,
+ floorNo = TargetFloor.warehouseFloor,
+ useFlag = 1,
+ createBy = "四楼接驳位",
+ createTime = DateTime.Now,
+ remark = "四楼创建入库任务"
+ };
+ dbContext.Add(newTask);
+ }
+ }
+ }
+ }
+ }
+ else if (Itpyes.Contains(task.taskType))
+ {
+ if (task.nextPointId != 6)
+ {
+ task.currPointId = 4;
+ task.currPointNo = "F04";
+ task.nextPointId = 6;
+ task.nextPointNo = "T01";
+ task.taskStatus = 0;
+ task.updateBy = "四楼接驳位线程";
+ task.updateTime = DateTime.Now;
+ task.remark = "四楼创建入库任务";
+ dbContext.WcsTask.Update(task);
+ dbContext.SaveChanges();
+ }
+ }
+ //出库
+ else
+ {
+
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogManager.Error(ex);
+ }
+ Thread.Sleep(1000);
+ }
+ }
+ }
+}
diff --git a/src/Khd.Core.Wcs/Wcs/WcsToWms.cs b/src/Khd.Core.Wcs/Wcs/WcsToWms.cs
index 0ad3dfe..f6a9a9a 100644
--- a/src/Khd.Core.Wcs/Wcs/WcsToWms.cs
+++ b/src/Khd.Core.Wcs/Wcs/WcsToWms.cs
@@ -91,22 +91,13 @@ namespace Khd.Core.Wcs.Wcs
///
///
///
- public bool continueTask(continueTaskDto continueTaskDto)
+ public ReponseMessage? continueTask(continueTaskDto continueTaskDto)
{
//继续执行
var url = "http://IP:PORT/rcms/services/rest/hikRpcService/continueTask";
var concontentType = "application/json";
var result = HttpHelper.HttpPost(url, continueTaskDto.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 91fdeeb..85a0350 100644
--- a/src/Khd.Core.Wcs/appsettings.json
+++ b/src/Khd.Core.Wcs/appsettings.json
@@ -1,7 +1,8 @@
{
"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": "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=localhost;port=3306;database=jyhb;uid=root;pwd=root;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": [
{
@@ -21,11 +22,11 @@
"WaitTime": "60000",
"SiteCode": "999"
},
- "Logging": {
- "LogLevel": {
- "Default": "Information",
- "Microsoft": "Warning",
- "Microsoft.Hosting.Lifetime": "Information"
- }
- }
+ //"Logging": {
+ // "LogLevel": {
+ // "Default": "Information",
+ // "Microsoft": "Warning",
+ // "Microsoft.Hosting.Lifetime": "Information"
+ // }
+ //}
}