master
2 years ago
parent 3d2762b61a
commit 7b713adc42

@ -25,22 +25,6 @@ namespace Khd.Core.Api.Controllers
public ReponseagvCallbackDto agvCallback(agvCallbackDto agvCallbackDto) public ReponseagvCallbackDto agvCallback(agvCallbackDto agvCallbackDto)
{ {
LogManager.Info($"RecieveRcsController接口信息{agvCallbackDto.ToJsonString()}"); LogManager.Info($"RecieveRcsController接口信息{agvCallbackDto.ToJsonString()}");
agvCallbackDto.method = "outbin";
return _application.AgvCallback(agvCallbackDto);
}
/// <summary>
/// 接收agv接收任务通知接口
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
[HttpPost("agvContinue")]
public ReponseagvCallbackDto agvContinue(agvCallbackDto agvCallbackDto)
{
LogManager.Info($"RecieveRcsController接口信息{agvCallbackDto.ToJsonString()}");
agvCallbackDto.method = "continue";
return _application.AgvCallback(agvCallbackDto); return _application.AgvCallback(agvCallbackDto);
} }

@ -12,8 +12,8 @@
"AllowedHosts": "*", "AllowedHosts": "*",
"ConnectionStrings": { "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": "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=localhost;port=3306;database=jyhb;uid=root;pwd=root;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True"
}, },
"JwtSecurityOption": { "JwtSecurityOption": {
"SigningKey": "3c41f60c-1d12-11ec-890d-00163e1b8678", "SigningKey": "3c41f60c-1d12-11ec-890d-00163e1b8678",

@ -48,11 +48,14 @@ namespace Khd.Core.Application
try 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) if (wcscmd != null)
{ {
//start 开始 end结束 continue继续
//待取货 //待取货
if (agvCallbackDto.method == "continue") if (agvCallbackDto.method.ToLower() == "start")
{ {
wcscmd.cmdStatus = 2; wcscmd.cmdStatus = 2;
wcscmd.sendFlag = 1; wcscmd.sendFlag = 1;
@ -60,7 +63,7 @@ namespace Khd.Core.Application
_dbContext.SaveChanges(); _dbContext.SaveChanges();
} }
//已取货待放货 //已取货待放货
if (agvCallbackDto.method == "compeleted") if (agvCallbackDto.method.ToLower() == "continue")
{ {
wcscmd.cmdStatus = 3; wcscmd.cmdStatus = 3;
wcscmd.sendFlag = 1; 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 }); 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.cmdStatus = 5;
wcscmd.sendFlag = 1; wcscmd.sendFlag = 1;

@ -26,6 +26,18 @@ namespace Khd.Core.Domain.Dto.webapi
public string tokenCode { get; set; } public string tokenCode { get; set; }
/// <summary> /// <summary>
/// 任务类型, /// 任务类型,
/// 业务流程
/// 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
/// </summary> /// </summary>
public string taskTyp { get; set; } public string taskTyp { get; set; }
/// <summary> /// <summary>

@ -17,6 +17,8 @@ namespace Khd.Core.Domain.Models
[Table("wcs_base_equip")] [Table("wcs_base_equip")]
public class BaseEquip public class BaseEquip
{ {
[Column("agv_position_code")]
public string agvPositionCode;
[Key] [Key]
[Column("objid")] [Column("objid")]

@ -20,7 +20,7 @@ namespace Khd.Core.Domain.Models
[Key] [Key]
[Column("id")] [Column("id")]
public long id { get; set; } public long? id { get; set; }
/// <summary> /// <summary>
/// plc点位编码 /// plc点位编码
@ -38,7 +38,7 @@ namespace Khd.Core.Domain.Models
/// 点位长度 /// 点位长度
/// </summary> /// </summary>
[Column("plcpoint_length")] [Column("plcpoint_length")]
public string plcpointLength { get; set; } public int? plcpointLength { get; set; }
/// <summary> /// <summary>
/// 点位地址 /// 点位地址

@ -21,7 +21,7 @@ namespace Khd.Core.Domain.Models
/// 任务代码 /// 任务代码
/// </summary> /// </summary>
[Column("task_code")] [Column("task_code")]
public string taskCode; public string taskCode { get; set; }
[Key] [Key]
[Column("objid")] [Column("objid")]

@ -64,11 +64,9 @@ namespace Khd.Core.Domain.Models
[Column("station_id")] [Column("station_id")]
public int? stationId { get; set; } public int? stationId { get; set; }
/// <summary>
/// 物料ID,关联物料表物料id [Column("material_id")]
/// </summary> public long? materialId { get; set; }
[Column("product_id")]
public long? productId { get; set; }
/// <summary> /// <summary>
/// 物料批次 /// 物料批次

@ -141,6 +141,9 @@ namespace Khd.Core.Domain.Models
/// </summary> /// </summary>
[Column("active_flag")] [Column("active_flag")]
public string activeFlag { get; set; } public string activeFlag { get; set; }
[Column("sale_order_id")]
public long? saleOrderId { get; set; }
} }
} }

@ -79,6 +79,12 @@ namespace Khd.Core.Plc.S7
return Read(adr.DataType, adr.DbNumber, adr.StartByte, adr.VarType, 1, (byte)adr.BitNumber); 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);
}
/// <summary> /// <summary>
/// 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. /// 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.
/// </summary> /// </summary>

@ -18,19 +18,47 @@ namespace Khd.Core.Plc
/// <param name="address"> 写入地址 </param> /// <param name="address"> 写入地址 </param>
/// <param name="valueString"> 值 </param> /// <param name="valueString"> 值 </param>
/// <param name="len"> 长度 </param> /// <param name="len"> 长度 </param>
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); var value = GetValue(len, valueString);
plc.Write(address, value); plc.Write(address, value);
} }
/// <summary>
/// 读取RFID
/// </summary>
/// <param name="plc"> plc </param>
/// <param name="address"> 读取地址 </param>
/// <param name="len"> 长度 </param>
/// <returns> 读取到的RFID </returns>
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();
}
/// <summary> /// <summary>
/// 电气写入点位高低位转换 /// 电气写入点位高低位转换
/// </summary> /// </summary>
/// <param name="len">点位地址位长度</param> /// <param name="len">点位地址位长度</param>
/// <param name="value">写入数值</param> /// <param name="value">写入数值</param>
/// <returns></returns> /// <returns></returns>
private static object GetValue(string len, string value) public static object GetValue(string? len, string? value)
{ {
if (len == "2") if (len == "2")
{ {
@ -40,6 +68,10 @@ namespace Khd.Core.Plc
{ {
return Convert.ToInt32(value); return Convert.ToInt32(value);
} }
if (len == "6")
{
return Convert.ToByte(value);
}
return 0; return 0;
} }
} }

@ -1,8 +1,10 @@
namespace Khd.Core.Wcs.Global using Khd.Core.Plc.S7;
namespace Khd.Core.Wcs.Global
{ {
public class PlcConfig public class PlcConfig
{ {
public int CpuType { get; set; } public CpuType CpuType { get; set; }
public string IP { get; set; } public string IP { get; set; }
public int Port { get; set; } public int Port { get; set; }
public short Rack { get; set; } public short Rack { get; set; }

@ -1,10 +1,14 @@
using Khd.Core.EntityFramework; using Khd.Core.EntityFramework;
using Khd.Core.Plc;
using Khd.Core.Plc.S7; using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global; using Khd.Core.Wcs.Global;
using Khd.Core.Wcs.Wcs; using Khd.Core.Wcs.Wcs;
using Masuit.Tools.Logging; using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using System.Data;
using System.Net.Http.Headers;
using System.Text;
namespace Khd.Core.Wcs namespace Khd.Core.Wcs
{ {
@ -32,36 +36,35 @@ namespace Khd.Core.Wcs
{ {
try try
{ //加载配置项 { //加载配置项
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
//设置程序启动时清空点位的数据=>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) foreach (var plcConfig in StaticData.PlcConfigs)
{ {
if (!StaticData.PlcDic.Any(t => t.Key == plcConfig.Code)) if (!StaticData.PlcDic.Any(t => t.Key == plcConfig.Code))
{ {
Plc.S7.Plc plc; Plc.S7.Plc plc;
plc = new Plc.S7.Plc((CpuType)plcConfig.CpuType, plcConfig.IP, plcConfig.Port, plcConfig.Rack, plcConfig.Slot); plc = new Plc.S7.Plc(plcConfig.CpuType, plcConfig.IP, plcConfig.Port, plcConfig.Rack, plcConfig.Slot);
plc.Open(); //plc.Open();
StaticData.PlcDic.TryAdd(plcConfig.Code, plc); StaticData.PlcDic.TryAdd(plcConfig.Code, plc);
} }
} }
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
//设置程序启动时清空点位的数据=>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 createTaskByRecord = new(_host, StaticData.PlcDic[0], "");
//createTaskByRecord.StartPoint(); //createTaskByRecord.StartPoint();
//一楼提升机以及接驳位 ////一楼提升机以及接驳位
FirstFloor firstFloor = new(_host, StaticData.PlcDic[0]); //FirstFloor firstFloor = new(_host, StaticData.PlcDic[0]);
firstFloor.StartPoint(); //firstFloor.StartPoint();
////二层接驳位 ////二层接驳位
//var SecondBaseFloorEquip = StaticData.BaseEquip.Where(t => t.floorNo == 2 && t.equipType == 1).First(); //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 thirdFloorAGV = new(_host, StaticData.PlcDic[0], ThirdFloorAgvEquip.floorNo.Value, ThirdFloorAgvEquip.equipNo);
//thirdFloorAGV.StartPoint(); //thirdFloorAGV.StartPoint();
//五层接驳位 ////五层接驳位
var FifthBaseFloorEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 1).First(); //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); //FiveFloorPoint fifthFloorPoint = new(_host, StaticData.PlcDic[0], FifthBaseFloorEquip.floorNo.Value, FifthBaseFloorEquip.equipNo);
fifthFloorPoint.StartPoint(); //fifthFloorPoint.StartPoint();
////五层线体 ////五层线体
//var FiveFloorLineEquip = StaticData.BaseEquip.Where(t => t.floorNo == 4 && t.equipType == 3).First(); //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 fiveFloorLine = new(_host, StaticData.PlcDic[0], FiveFloorLineEquip.floorNo.Value, FiveFloorLineEquip.equipNo);
//fiveFloorLine.StartPoint(); //fiveFloorLine.StartPoint();
////五层CTU //五层CTU
//var FiveFloorCTUEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 6).First(); 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 fiveFloorCTU = new(_host, StaticData.PlcDic[0], FiveFloorCTUEquip.floorNo.Value, FiveFloorCTUEquip.equipNo);
//fiveFloorCTU.StartPoint(); fiveFloorCTU.StartPoint();
////五层AGV ////五层AGV
//var FifthFloorAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 5).First(); //var FifthFloorAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 5).First();
@ -115,23 +118,5 @@ namespace Khd.Core.Wcs
} }
} }
/// <summary>
/// 电气写入点位高低位转换
/// </summary>
/// <param name="len">点位地址位长度</param>
/// <param name="value">写入数值</param>
/// <returns></returns>
public static object GetValue(string len, string value)
{
if (len == "2")
{
return Convert.ToInt16(value);
}
if (len == "4")
{
return Convert.ToInt32(value);
}
return 0;
}
} }
} }

@ -5,7 +5,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Khd.Core.Wcs.Wcs namespace Khd.Core.Wcs
{ {
public class SystemData public class SystemData
{ {
@ -21,7 +21,7 @@ namespace Khd.Core.Wcs.Wcs
while (list.Contains(_serialNo)) while (list.Contains(_serialNo))
{ {
_serialNo++; _serialNo++;
if(_serialNo > 9999) if (_serialNo > 9999)
{ {
_serialNo = 1; _serialNo = 1;
} }
@ -29,6 +29,6 @@ namespace Khd.Core.Wcs.Wcs
return _serialNo; return _serialNo;
} }
} }
} }
} }

@ -5,7 +5,9 @@ using Khd.Core.Wcs.Global;
using Masuit.Tools.Logging; using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using SixLabors.ImageSharp;
using System.Data; using System.Data;
using System.Security.Cryptography;
using Z.EntityFramework.Plus; using Z.EntityFramework.Plus;
namespace Khd.Core.Wcs.Wcs namespace Khd.Core.Wcs.Wcs
@ -61,7 +63,7 @@ namespace Khd.Core.Wcs.Wcs
var FlowPointThread = new Thread(MonitorInLocatorPoint); var FlowPointThread = new Thread(MonitorInLocatorPoint);
FlowPointThread.Start(); FlowPointThread.Start();
Console.WriteLine(DateTime.Now+":出库任务监听启动成功"); Console.WriteLine(DateTime.Now + ":出库任务监听启动成功");
LogManager.Info("出库任务监听启动成功"); LogManager.Info("出库任务监听启动成功");
} }
public void MonitorInLocatorPoint() public void MonitorInLocatorPoint()
@ -148,80 +150,186 @@ namespace Khd.Core.Wcs.Wcs
} }
} }
/// <summary>
/// 原材料出库
/// </summary>
public void CreateRawTask() public void CreateRawTask()
{ {
using var scope = _host.Services.CreateScope(); using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>(); using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
//原材料库存 //原材料库存
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) foreach (var item in rawOutStock)
{ {
//自动获取id //自动获取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(); var wmsBaseLocations = dbContext.WmsBaseLocation
long orderID = 0; .Where(t => t.activeFlag == "1")
//插入锁定库存 .Where(t => t.delFlag == "0")
WcsOutstockLock stockLock = new() .Where(t => t.locationScrapType == "1")
{ .Where(t => t.instockFlag == "0")
objid = objid, .Where(t => t.outstockFlag == "0")
materialId = item.productId, .Where(t => t.warehouseId == item.warehouseId)
qty = 1, .Where(t => wmsRawStocks.Contains(t.containerCode))
warehouseId = item.warehouseId, .ToList();
wmsOrderId = item.rawOutstockId,
wmsOrderDetailId = item.rawOutstockId, decimal needNumber = item.outstockAmount - item.realOutstockAmount;
createBy = "sys", if (needNumber <= 0)
createTime = DateTime.Now
};
dbContext.Add(stockLock);
if (item.warehouseId == 5)//五楼辅料出库
{
//辅料出库时,需创建订单表数据
orderID = StaticData.SnowId.NextId();
WcsWarehouseOrder order = new()
{ {
objid = orderID, item.executeStatus = "2";
wmsOrderId = item.rawOutstockId, dbContext.Update(item);
orderType = Convert.ToInt32(item.taskType), dbContext.SaveChanges();
qty = 1, continue;
createBy = "", }
createTime = DateTime.Now
}; var bill = from a in wmsBaseLocations
dbContext.Add(order); 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(); else
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.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
// });
//}
} }
} }

@ -3,6 +3,7 @@ using Khd.Core.Application.Interface;
using Khd.Core.Domain.Models; using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework; using Khd.Core.EntityFramework;
using Khd.Core.Plc; using Khd.Core.Plc;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global; using Khd.Core.Wcs.Global;
using Masuit.Tools.Logging; using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -17,9 +18,9 @@ namespace Khd.Core.Wcs.Wcs
public class FirstFloor public class FirstFloor
{ {
private readonly IHost _host; private readonly IHost _host;
private readonly Plc.S7.Plc _plc; private Plc.S7.Plc _plc;
private long F01 = 1; private readonly long F01 = 1;
private long T01 = 6; private readonly long T01 = 6;
/// <summary> /// <summary>
/// 一楼RFID 读 /// 一楼RFID 读
/// </summary> /// </summary>
@ -29,10 +30,6 @@ namespace Khd.Core.Wcs.Wcs
/// </summary> /// </summary>
private readonly BasePlcpoint linesignal01; private readonly BasePlcpoint linesignal01;
/// <summary> /// <summary>
/// 去向 写
/// </summary>
private readonly BasePlcpoint wcsrun01;
/// <summary>
/// 提升机流水号 读 /// 提升机流水号 读
/// </summary> /// </summary>
private readonly BasePlcpoint serialno06; 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.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.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")); this.serialno06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("serialno06"));
@ -91,14 +85,18 @@ namespace Khd.Core.Wcs.Wcs
/// </summary> /// </summary>
public void StartPoint() public void StartPoint()
{ {
Thread firstFloorLine = new Thread(FirstFloorLine); Thread firstFloorLine = new(FirstFloorLine)
firstFloorLine.IsBackground = true; {
IsBackground = true
};
firstFloorLine.Start(); firstFloorLine.Start();
Console.WriteLine(DateTime.Now + ":一楼接驳位线程启动成功"); Console.WriteLine(DateTime.Now + ":一楼接驳位线程启动成功");
LogManager.Info("一楼接驳位线程启动成功"); LogManager.Info("一楼接驳位线程启动成功");
Thread firstFloorHoister = new Thread(FirstFloorHoister); Thread firstFloorHoister = new(FirstFloorHoister)
firstFloorHoister.IsBackground = true; {
IsBackground = true
};
firstFloorHoister.Start(); firstFloorHoister.Start();
Console.WriteLine(DateTime.Now + ":一楼提升机线程启动成功"); Console.WriteLine(DateTime.Now + ":一楼提升机线程启动成功");
LogManager.Info("一楼提升机线程启动成功"); LogManager.Info("一楼提升机线程启动成功");
@ -116,9 +114,8 @@ namespace Khd.Core.Wcs.Wcs
{ {
try 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 linesignal01Value = this._plc.Read(this.linesignal01.plcpointAddress); //到位信号 读
var wcsrun01Value = this._plc.Read(this.wcsrun01.plcpointAddress); //去向 写
//正常读到plc值 //正常读到plc值
if (linesignal01Value != null && RFID001Value != null) if (linesignal01Value != null && RFID001Value != null)
@ -126,15 +123,14 @@ namespace Khd.Core.Wcs.Wcs
//正常托盘到位 //正常托盘到位
if (Convert.ToInt32(linesignal01Value) == 1) if (Convert.ToInt32(linesignal01Value) == 1)
{ {
//判断task表里没有该rfid的未完成的入库信息未下发去向 //判断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) 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) if (material != null)
{ {
var warehouseId = dbContext.WmsWarehouseMaterial.Where(t => t.storageType == "1" && t.storageId == material.materialId).FirstOrDefault()?.warehouseId; 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() var newTask = new WcsTask()
{ {
objid = StaticData.SnowId.NextId(), objid = StaticData.SnowId.NextId(),
serialNo = 1235, serialNo = SystemData.GetSerialNo(dbContext),
equipmentNo = "F01", equipmentNo = "F01",
taskType = Convert.ToInt32(dic.dicValue), taskType = Convert.ToInt32(dic.dicValue),
taskStatus = 0, taskStatus = 0,
containerNo = RFID001Value.ToString(), containerNo = RFID001Value,
materialNo = material.materialCode, materialNo = material.materialCode,
materialId = material.materialId, materialId = material.materialId,
qty = Convert.ToInt32(material.bindAmount), 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; if (task.nextPointId != T01)
task.currPointNo = "F01"; {
task.nextPointId = T01; task.currPointId = F01;
task.nextPointNo = "T01"; task.currPointNo = "F01";
task.taskStatus = 0; task.nextPointId = T01;
task.updateBy = "一楼接驳位线程"; task.nextPointNo = "T01";
task.updateTime = DateTime.Now; task.taskStatus = 0;
task.remark = "一楼创建入库任务"; task.updateBy = "一楼接驳位线程";
dbContext.WcsTask.Update(task); task.updateTime = DateTime.Now;
dbContext.SaveChanges(); task.remark = "一楼创建入库任务";
dbContext.WcsTask.Update(task);
dbContext.SaveChanges();
}
} }
//出库 //出库
else else
{ {
//清空托盘绑定 //清空托盘绑定
//var material = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value.ToString()).FirstOrDefault(); var material = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value).FirstOrDefault();
//if (material != null) if (material != null)
//{ {
// dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value.ToString()).Delete(); material.bindAmount = 0;
// dbContext.SaveChanges(); 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) 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); LogManager.Error(ex);
} }
Thread.Sleep(1000); Thread.Sleep(1000);
@ -228,7 +247,7 @@ namespace Khd.Core.Wcs.Wcs
var serialno06Value = this._plc.Read(this.serialno06.plcpointAddress); //提升机流水号 读 var serialno06Value = this._plc.Read(this.serialno06.plcpointAddress); //提升机流水号 读
var equipstate06Value = this._plc.Read(this.equipstate06.plcpointAddress); //提升机状态 读 var equipstate06Value = this._plc.Read(this.equipstate06.plcpointAddress); //提升机状态 读
var hoisterTrayIn06Value = this._plc.Read(this.hoistertrayin06.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 targetfloor06Value = this._plc.Read(this.targetfloor06.plcpointAddress); //提升机目的楼层 写
var reserialno06 = this._plc.Read(this.reserialno06.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(); var wcsTask = dbContext.WcsTask.Where(t => t.nextPointId == T01).OrderBy(t => t.createTime).FirstOrDefault();
if (wcsTask != null) if (wcsTask != null)
{ {
if (wcsTask.taskStatus == 0)//创建 if (wcsTask.taskStatus == 0 && Convert.ToInt32(hoisterTrayIn06Value) == 0)//创建状态,并且里面没有货物
{ {
if (Convert.ToInt32(currentfloor06Value) == wcsTask.fromFloorNo) if (Convert.ToInt32(currentfloor06Value) == wcsTask.fromFloorNo)
{ {
@ -250,7 +269,8 @@ namespace Khd.Core.Wcs.Wcs
wcsTask.updateTime = DateTime.Now; wcsTask.updateTime = DateTime.Now;
wcsTask.remark = "提升机任务执行中"; wcsTask.remark = "提升机任务执行中";
BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.fromFloorNo && t.plcpointNo.Contains("wcsrun")); 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.Update(wcsTask);
dbContext.SaveChanges(); dbContext.SaveChanges();
} }
@ -260,12 +280,13 @@ namespace Khd.Core.Wcs.Wcs
wcsTask.updateBy = "提升机线程"; wcsTask.updateBy = "提升机线程";
wcsTask.updateTime = DateTime.Now; wcsTask.updateTime = DateTime.Now;
wcsTask.remark = "提升机任务执行中"; 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.Update(wcsTask);
dbContext.SaveChanges(); dbContext.SaveChanges();
} }
} }
if (wcsTask.taskStatus == 1) if (wcsTask.taskStatus == 1 && Convert.ToInt32(reserialno06) == wcsTask.serialNo)
{ {
if (Convert.ToInt32(currentfloor06Value) == wcsTask.fromFloorNo)//提升机当前楼层为初始地楼层 if (Convert.ToInt32(currentfloor06Value) == wcsTask.fromFloorNo)//提升机当前楼层为初始地楼层
{ {
@ -274,12 +295,12 @@ namespace Khd.Core.Wcs.Wcs
wcsTask.updateTime = DateTime.Now; wcsTask.updateTime = DateTime.Now;
wcsTask.remark = "提升机任务执行中"; wcsTask.remark = "提升机任务执行中";
BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.fromFloorNo && t.plcpointNo.Contains("wcsrun")); 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.Update(wcsTask);
dbContext.SaveChanges(); dbContext.SaveChanges();
} }
} }
if (wcsTask.taskStatus == 2) if (wcsTask.taskStatus == 2 && Convert.ToInt32(reserialno06) == wcsTask.serialNo)
{ {
if (Convert.ToInt32(hoisterTrayIn06Value) == 1)//托盘已经进提升机 if (Convert.ToInt32(hoisterTrayIn06Value) == 1)//托盘已经进提升机
{ {
@ -287,19 +308,19 @@ namespace Khd.Core.Wcs.Wcs
wcsTask.updateBy = "提升机线程"; wcsTask.updateBy = "提升机线程";
wcsTask.updateTime = DateTime.Now; wcsTask.updateTime = DateTime.Now;
wcsTask.remark = "提升机任务执行完成"; 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.Update(wcsTask);
dbContext.SaveChanges(); 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.taskStatus = 4;
wcsTask.updateBy = "提升机线程"; wcsTask.updateBy = "提升机线程";
wcsTask.updateTime = DateTime.Now; wcsTask.updateTime = DateTime.Now;
wcsTask.remark = "提升机任务执行完成"; wcsTask.remark = "提升机任务执行完成";
BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.fromFloorNo && t.plcpointNo.Contains("wcsrun")); 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.Update(wcsTask);
dbContext.SaveChanges(); dbContext.SaveChanges();
} }
@ -309,6 +330,18 @@ namespace Khd.Core.Wcs.Wcs
} }
catch (Exception ex) 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); LogManager.Error(ex);
} }
Thread.Sleep(1000); Thread.Sleep(1000);

@ -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.Domain.Models;
using Khd.Core.EntityFramework; using Khd.Core.EntityFramework;
using Khd.Core.Wcs.Global; using Khd.Core.Wcs.Global;
@ -21,10 +22,8 @@ namespace Khd.Core.Wcs.Wcs
private readonly BasePlcpoint LineRFID; private readonly BasePlcpoint LineRFID;
private readonly BasePlcpoint LineWcsrun; private readonly BasePlcpoint LineWcsrun;
private readonly BasePlcpoint LineSignal; private readonly BasePlcpoint LineSignal;
private readonly BasePlcpoint LineIsPallet;
private readonly BasePlcpoint LineSerialNO;
int FloorNo { get; set; } int FloorNo { get; set; }
string EquipNo = ""; private readonly string EquipNo = "";
int agvID = 10; int agvID = 10;
public FiveFloorAGV(IHost host, Plc.S7.Plc plc, int floor, string equipNo) 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.LineRFID = this.ScanPoint.First(t => t.plcpointNo.Contains("RFID"));
this.LineWcsrun = this.ScanPoint.First(t => t.plcpointNo.Contains("wcsrun")); this.LineWcsrun = this.ScanPoint.First(t => t.plcpointNo.Contains("wcsrun"));
this.LineSignal = this.ScanPoint.First(t => t.plcpointNo.Contains("linesignal")); 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); //var lineRFID = this._plc.Read(NodeSettingCarNo.plcpointAddress);
try try
{ {
@ -56,7 +53,7 @@ namespace Khd.Core.Wcs.Wcs
public void StartPoint() public void StartPoint()
{ {
Thread FlowPointThread = new Thread(MonitorInLocatorPoint); Thread FlowPointThread = new(MonitorInLocatorPoint);
FlowPointThread.Start(); FlowPointThread.Start();
Console.WriteLine(DateTime.Now + ":五楼AGV上件扫描监听启动成功"); Console.WriteLine(DateTime.Now + ":五楼AGV上件扫描监听启动成功");
LogManager.Info("五楼AGV上件扫描监听启动成功"); LogManager.Info("五楼AGV上件扫描监听启动成功");
@ -80,48 +77,120 @@ namespace Khd.Core.Wcs.Wcs
{ {
if (item.taskStatus == 0)//下发任务 if (item.taskStatus == 0)//下发任务
{ {
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1); if (taskType.Contains(item.taskType))//入库任务
WcsCmd wcsCmd = new WcsCmd()
{ {
objid = item.objid, if (Convert.ToInt32(this._plc.Read(LineSignal.plcpointAddress)) == 1)
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<Position>
{
new Position
{ {
positionCode=wcsCmd.currPointNo, Console.WriteLine($"{DateTime.Now}:5楼接驳位上有货无法下发Agv出库任务");
type="1" continue;
},
new Position
{
positionCode=wcsCmd.nextPointNo,
type="2"
} }
}; WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId);
string message = JsonConvert.SerializeObject(agvTask); BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1);
string result = HttpHelper.HttpPost("http://172.16.12.24:8182/rcms/services/rest/hikRpcService/genAgvSchedulingTask", message); WcsCmd wcsCmd = new()
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result); {
if (reponseMessage != null && reponseMessage.message == "成功") 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<Position>
{
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<ReponseMessage>(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; if (Convert.ToInt32(this._plc.Read(LineSignal.plcpointAddress)) == 1)
wcsCmd.cmdStatus = 1; {
item.taskStatus = 1; Console.WriteLine($"{DateTime.Now}:5楼接驳位上有货无法下发Agv出库任务");
dbContext.Update(item); continue;
dbContext.Add(wcsCmd); }
dbContext.SaveChanges(); 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<Position>
{
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<ReponseMessage>(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
@ -131,11 +200,13 @@ namespace Khd.Core.Wcs.Wcs
{ {
if (wcsCmd.cmdStatus == 2) if (wcsCmd.cmdStatus == 2)
{ {
RequestAGVTaskDto agvTask = new RequestAGVTaskDto(); var agvTask = new RequestAGVTaskDto
agvTask.reqCode = item.objid.ToString(); {
agvTask.taskCode = wcsCmd.taskCode; reqCode = item.objid.ToString(),
taskCode = wcsCmd.taskCode
};
string message = JsonConvert.SerializeObject(agvTask); 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<ReponseMessage>(result); ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功") if (reponseMessage != null && reponseMessage.message == "成功")
{ {
@ -144,7 +215,7 @@ namespace Khd.Core.Wcs.Wcs
dbContext.SaveChanges(); 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 wareHouseList = StaticData.WmsBaseWarehouse.ToList();
var equip = StaticData.BaseEquip.Where(t => t.floorNo == floorNo && t.equipType == 4).FirstOrDefault(); var equip = StaticData.BaseEquip.Where(t => t.floorNo == floorNo && t.equipType == 4).FirstOrDefault();
//入库类型 //入库类型
List<int> taskInType = new List<int> { 1, 3, 5, 7 }; List<int> taskInType = new() { 1, 3, 5, 7 };
List<int> taskOutType = new List<int> { 2, 4, 6, 8 }; List<int> taskOutType = new() { 2, 4, 6, 8 };
try try
{ {
//获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv

@ -19,10 +19,8 @@ namespace Khd.Core.Wcs.Wcs
private readonly IHost _host; private readonly IHost _host;
private readonly Plc.S7.Plc _plc; private readonly Plc.S7.Plc _plc;
private readonly BasePlcpoint LineRFID; private readonly BasePlcpoint LineRFID;
private readonly BasePlcpoint LineWcsrun; private readonly BasePlcpoint isarrive;
private readonly BasePlcpoint LineSignal; private readonly BasePlcpoint isput;
private readonly BasePlcpoint LineIsPallet;
private readonly BasePlcpoint LineSerialNO;
int FloorNo { get; set; } int FloorNo { get; set; }
string EquipNo = ""; string EquipNo = "";
int CTUID = 11; int CTUID = 11;
@ -33,11 +31,9 @@ namespace Khd.Core.Wcs.Wcs
FloorNo = floor; FloorNo = floor;
EquipNo = equipNo; EquipNo = equipNo;
this.ScanPoint = StaticData.BasePlcpointList.Where(t => t.floorNo == floor).ToList();//加载当前站点所对应的点位 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("RFID5001"));
this.LineWcsrun = this.ScanPoint.First(t => t.plcpointNo.Contains("wcsrun")); this.isarrive = this.ScanPoint.First(t => t.plcpointNo.Contains("isarrive"));
this.LineSignal = this.ScanPoint.First(t => t.plcpointNo.Contains("linesignal")); this.isput = this.ScanPoint.First(t => t.plcpointNo.Contains("isput"));
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); //var lineRFID = this._plc.Read(NodeSettingCarNo.plcpointAddress);
try try
@ -60,10 +56,64 @@ namespace Khd.Core.Wcs.Wcs
Thread FlowPointThread = new Thread(MonitorInLocatorPoint); Thread FlowPointThread = new Thread(MonitorInLocatorPoint);
FlowPointThread.Start(); FlowPointThread.Start();
Console.WriteLine(DateTime.Now+":五楼CTU上件扫描监听启动");
//Thread FlowCTUInWareThread = new Thread(MonitorInWare);
//FlowCTUInWareThread.Start();
Console.WriteLine(DateTime.Now + ":五楼CTU上件扫描监听启动");
LogManager.Info("五楼CTU上件扫描监听启动"); LogManager.Info("五楼CTU上件扫描监听启动");
} }
private void MonitorInWare(object? obj)
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
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() public void MonitorInLocatorPoint()
{ {
List<int?> taskType = new() { 1, 3, 5, 7 }; List<int?> taskType = new() { 1, 3, 5, 7 };
@ -73,57 +123,114 @@ namespace Khd.Core.Wcs.Wcs
{ {
try 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) if (taskList.Count == 0)
{ {
LogManager.Info(FloorNo + "楼CTU无任务"); LogManager.Info(FloorNo + "楼CTU无任务");
} }
foreach (var item in taskList) 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); if (item.taskType % 2 == 0)//出库任务
WcsCmd wcsCmd = new WcsCmd()
{ {
objid = item.objid, BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId);
cmdStatus = 0, WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.startPointId);
taskId = item.orderId, var wcsCmd = new WcsCmd()
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<Position>
{
new Position
{ {
positionCode=wcsCmd.currPointNo, objid = StaticData.SnowId.NextId(),
type="1" cmdStatus = 0,
}, taskId = item.objid,
new Position 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, reqCode = wcsCmd.objid.ToString(),
type="2" positionCodePath = new List<Position>
{
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<ReponseMessage>(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); else//入库任务
string result = HttpHelper.HttpPost("http://172.16.12.24:8182/rcms/services/rest/hikRpcService/genAgvSchedulingTask", message);
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{ {
wcsCmd.taskCode = reponseMessage.data; BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == item.startPointId);
wcsCmd.cmdStatus = 1; WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId);
item.taskStatus = 1; var wcsCmd = new WcsCmd()
dbContext.Update(item); {
dbContext.Add(wcsCmd); objid = StaticData.SnowId.NextId(),
dbContext.SaveChanges(); 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<Position>
{
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<ReponseMessage>(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 else
@ -131,22 +238,24 @@ namespace Khd.Core.Wcs.Wcs
WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.objid == item.objid); WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.objid == item.objid);
if (wcsCmd != null) if (wcsCmd != null)
{ {
if (wcsCmd.cmdStatus == 2) if (wcsCmd.cmdStatus == 3)
{ {
RequestAGVTaskDto agvTask = new RequestAGVTaskDto(); var agvTask = new RequestAGVTaskDto
agvTask.reqCode = item.objid.ToString(); {
agvTask.taskCode = wcsCmd.taskCode; reqCode = item.objid.ToString(),
taskCode = wcsCmd.taskCode
};
string message = JsonConvert.SerializeObject(agvTask); string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.HttpPost("http://172.16.12.24:8182/rcms/services/rest/hikRpcService/continueTask", message); string result = HttpHelper.HttpPost("http://172.16.12.24:8182/rcms/services/rest/hikRpcService/continueTask", message);
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result); ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功") if (reponseMessage != null && reponseMessage.message == "成功")
{ {
wcsCmd.cmdStatus = 3; wcsCmd.cmdStatus = 4;
dbContext.Update(wcsCmd); dbContext.Update(wcsCmd);
dbContext.SaveChanges(); dbContext.SaveChanges();
} }
} }
else if (wcsCmd.cmdStatus == 4) else if (wcsCmd.cmdStatus == 5)
{ {
//任务完成 //任务完成
//如果是入库任务,更新库存信息,并删除任务 //如果是入库任务,更新库存信息,并删除任务
@ -158,7 +267,6 @@ namespace Khd.Core.Wcs.Wcs
wmsBaseLocation.locationStatus = "1"; wmsBaseLocation.locationStatus = "1";
dbContext.Update(wmsBaseLocation); dbContext.Update(wmsBaseLocation);
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete(); dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
dbContext.WcsTask.Where(t => t.objid == item.objid).Delete(); dbContext.WcsTask.Where(t => t.objid == item.objid).Delete();
dbContext.SaveChanges(); dbContext.SaveChanges();
@ -198,6 +306,8 @@ namespace Khd.Core.Wcs.Wcs
} }
} }
/// <summary> /// <summary>
/// 下发任务 /// 下发任务
/// </summary> /// </summary>

@ -1,11 +1,13 @@
using Khd.Core.Domain.Dto.webapi; using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models; using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework; using Khd.Core.EntityFramework;
using Khd.Core.Plc;
using Khd.Core.Wcs.Global; using Khd.Core.Wcs.Global;
using Masuit.Tools.Logging; using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Security.Cryptography;
namespace Khd.Core.Wcs.Wcs namespace Khd.Core.Wcs.Wcs
{ {
@ -20,8 +22,7 @@ namespace Khd.Core.Wcs.Wcs
private readonly BasePlcpoint LineRFID; private readonly BasePlcpoint LineRFID;
private readonly BasePlcpoint LineWcsrun; private readonly BasePlcpoint LineWcsrun;
private readonly BasePlcpoint LineSignal; private readonly BasePlcpoint LineSignal;
private readonly BasePlcpoint LineIsPallet;
private readonly BasePlcpoint LineSerialNO;
int FloorNo { get; set; } int FloorNo { get; set; }
string EquipNo = ""; string EquipNo = "";
public FiveFloorPoint(IHost host, Plc.S7.Plc plc, int floor, 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; FloorNo = floor;
EquipNo = equipNo; EquipNo = equipNo;
this.ScanPoint = StaticData.BasePlcpointList.Where(t => t.floorNo == floor).ToList();//加载当前站点所对应的点位 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.LineWcsrun = this.ScanPoint.First(t => t.plcpointNo.Contains("wcsrun"));
this.LineSignal = this.ScanPoint.First(t => t.plcpointNo.Contains("linesignal")); 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 try
{ {
@ -63,7 +62,7 @@ namespace Khd.Core.Wcs.Wcs
public void MonitorInLocatorPoint() public void MonitorInLocatorPoint()
{ {
List<int?> ITypes = new List<int?> { 1, 3, 5, 7 }; List<int?> ITypes = new() { 1, 3, 5, 7 };
using var scope = _host.Services.CreateScope(); using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>(); using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
while (true) while (true)
@ -71,13 +70,12 @@ namespace Khd.Core.Wcs.Wcs
try try
{ {
//入库任务 //入库任务
var rfid = this._plc.Read(LineRFID.plcpointAddress); var rfid = this._plc.ReadRFID(LineRFID.plcpointAddress);
var isSignal = this._plc.Read(LineSignal.plcpointAddress); var isSignal = this._plc.Read(LineSignal.plcpointAddress);
var isPallet = this._plc.Read(LineIsPallet.plcpointAddress); if (rfid != null && isSignal != null)
if (rfid != null && isSignal != null && isPallet != null)
{ {
//正常读到输送线信息 有到位信号,并且有托盘,获取条码信息 //正常读到输送线信息 有到位信号,并且有托盘,获取条码信息
if (Convert.ToInt32(isSignal) > 0 && Convert.ToInt32(isPallet) == 1) if (Convert.ToInt32(isSignal) == 1)
{ {
//获取条码信息 //获取条码信息
var palletNo = Convert.ToString(rfid); var palletNo = Convert.ToString(rfid);
@ -91,19 +89,43 @@ namespace Khd.Core.Wcs.Wcs
var wmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseFloor == FloorNo) var wmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseFloor == FloorNo)
.Where(t => t.activeFlag == "1") .Where(t => t.activeFlag == "1")
.Where(t => t.delFlag == "0") .Where(t => t.delFlag == "0")
.Where(t => t.instockFlag == "0")
.Where(t => t.locationScrapType == "1") .Where(t => t.locationScrapType == "1")
.Where(t => t.locationStatus == "1") .Where(t => t.instockFlag == "0")
.Where(t => t.outstockFlag == "0") .Where(t => t.outstockFlag == "0")
.Where(t=>string.IsNullOrEmpty(t.containerCode)) //.Where(t => t.locationStatus == "1")
//.Where(t => string.IsNullOrEmpty(t.containerCode))
.ToList(); .ToList();
List<string> containerCodes = wmsBaseLocations.Where(t => t.locDeep == 1).Select(t => t.containerCode).ToList();//深库位的托盘
List<MesBasePalletInfo> 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 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.taskStatus = 0;//创建状态
wcsTask.updateTime = DateTime.Now; wcsTask.updateTime = DateTime.Now;
wcsTask.currPointId = baseEquip.objid; wcsTask.currPointId = baseEquip.objid;
@ -118,6 +140,10 @@ namespace Khd.Core.Wcs.Wcs
dbContext.Update(wcsTask); dbContext.Update(wcsTask);
dbContext.SaveChanges(); dbContext.SaveChanges();
} }
else
{
Console.WriteLine(DateTime.Now + ":五楼接驳位调度入库任务,未找到库位");
}
} }
else//出库 else//出库
{ {

@ -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
{
/// <summary>
/// 四楼接驳位
/// </summary>
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<int?> Itpyes = new() { 1, 3, 5, 7 };
using var scope = host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
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);
}
}
}
}

@ -91,22 +91,13 @@ namespace Khd.Core.Wcs.Wcs
/// </summary> /// </summary>
/// <param name="requestCheck"></param> /// <param name="requestCheck"></param>
/// <returns></returns> /// <returns></returns>
public bool continueTask(continueTaskDto continueTaskDto) public ReponseMessage? continueTask(continueTaskDto continueTaskDto)
{ {
//继续执行 //继续执行
var url = "http://IP:PORT/rcms/services/rest/hikRpcService/continueTask"; var url = "http://IP:PORT/rcms/services/rest/hikRpcService/continueTask";
var concontentType = "application/json"; var concontentType = "application/json";
var result = HttpHelper.HttpPost(url, continueTaskDto.ToJsonString(), concontentType, 60, null); var result = HttpHelper.HttpPost(url, continueTaskDto.ToJsonString(), concontentType, 60, null);
var model = (ReponseMessage)JsonConvert.DeserializeObject(result.ToString(), typeof(ReponseMessage)); return JsonConvert.DeserializeObject<ReponseMessage>(result.ToString());
if (model.code == "0")
{
LogManager.Info("调用成功。");
}
else
{
LogManager.Info("调用失败。");
}
return true;
} }
/// <summary> /// <summary>
/// 继续执行 /// 继续执行

@ -1,7 +1,8 @@
{ {
"ConnectionStrings": { "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=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": [ "PlcConfigs": [
{ {
@ -21,11 +22,11 @@
"WaitTime": "60000", "WaitTime": "60000",
"SiteCode": "999" "SiteCode": "999"
}, },
"Logging": { //"Logging": {
"LogLevel": { // "LogLevel": {
"Default": "Information", // "Default": "Information",
"Microsoft": "Warning", // "Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information" // "Microsoft.Hosting.Lifetime": "Information"
} // }
} //}
} }

Loading…
Cancel
Save