|
|
|
|
|
using CentralControl.BaseData;
|
|
|
|
|
|
using CentralControl.DBDAO;
|
|
|
|
|
|
using CommonFunc;
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using System.Threading;
|
|
|
|
|
|
using XGL.Thrift;
|
|
|
|
|
|
|
|
|
|
|
|
namespace CentralControl.App_Code
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 出库暂存点逻辑
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class Logic1003OutLocator
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// plc 正在读取
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
// bool IsPlcRead { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
Thread InputMaterialThread;
|
|
|
|
|
|
PlcHelper plcHelper;
|
|
|
|
|
|
string LineNo { get; set; }
|
|
|
|
|
|
NodeSetting ScanPoint { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 是否运行发车中
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
//bool IsRuning { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 当前上件点空车信号
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
NodeSetting OutLocatorPoint { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 1号上件点 空车信号
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
NodeSetting otherLocatorPoint1 { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 2号上件点 空车信号
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
NodeSetting otherLocatorPoint2 { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
public Logic1003OutLocator(PlcHelper plc, string LineNo)
|
|
|
|
|
|
{
|
|
|
|
|
|
NodeSetting linenode1 = StaticData.NodeSettingList.FirstOrDefault(t => t.LineCatchArea != null && t.NodeType == 4 && t.LineCatchArea.LineNo == LineNo && t.LineCatchArea.AreaType == 3);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.OutLocatorPoint = StaticData.NodeSettingList.FirstOrDefault(t => t.LineCatchArea != null && t.NodeType == 5 && t.LineCatchArea.LineNo == LineNo && t.LineCatchArea.AreaType == 3);
|
|
|
|
|
|
|
|
|
|
|
|
//1号上件点 空车信号
|
|
|
|
|
|
this.otherLocatorPoint1 = StaticData.NodeSettingList.FirstOrDefault(t => t.LineCatchArea != null && t.NodeType == 5 && t.LineCatchArea.LineNo == "1" && t.LineCatchArea.AreaType == 3);
|
|
|
|
|
|
|
|
|
|
|
|
//2号上件点 空车信号
|
|
|
|
|
|
this.otherLocatorPoint2 = StaticData.NodeSettingList.FirstOrDefault(t => t.LineCatchArea != null && t.NodeType == 5 && t.LineCatchArea.LineNo == "2" && t.LineCatchArea.AreaType == 3);
|
|
|
|
|
|
|
|
|
|
|
|
//IsRuning = true;
|
|
|
|
|
|
if (linenode1 != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.ScanPoint = linenode1;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Logger logger = new Logger();
|
|
|
|
|
|
logger.Log("创建线体,未找到扫描点位");
|
|
|
|
|
|
}
|
|
|
|
|
|
this.LineNo = LineNo;
|
|
|
|
|
|
this.plcHelper = plc;
|
|
|
|
|
|
///回写plc状态处理完成,plc会清理数据
|
|
|
|
|
|
object wcsend = this.plcHelper.Read(ScanPoint.PlcSetting5);
|
|
|
|
|
|
//if (Convert.ToInt32(wcsend) == 1)
|
|
|
|
|
|
//{
|
|
|
|
|
|
//默认启动,清理plc的上位机写入点位值
|
|
|
|
|
|
this.plcHelper.Write(this.ScanPoint.PlcSetting4, 0);
|
|
|
|
|
|
this.plcHelper.Write(this.ScanPoint.PlcSetting5, 0);
|
|
|
|
|
|
//}
|
|
|
|
|
|
this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, 0);
|
|
|
|
|
|
//点位取消 this.plcHelper.Write(this.OutLocatorPoint.PlcSetting2, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 启动上件扫描监听
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public void StartPoint()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
InputMaterialThread = new Thread(MonitorInLocatorPoint);
|
|
|
|
|
|
InputMaterialThread.Start();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 出库暂存点
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="lineNo"></param>
|
|
|
|
|
|
/// <param name="materials"></param>
|
|
|
|
|
|
public void MonitorInLocatorPoint()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
Logger logger = new Logger();
|
|
|
|
|
|
while (true)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///读取小车号
|
|
|
|
|
|
object carno = this.plcHelper.Read(this.ScanPoint.PlcSetting1);
|
|
|
|
|
|
//小车是否到位
|
|
|
|
|
|
object carstate = this.plcHelper.Read(this.ScanPoint.PlcSetting2);
|
|
|
|
|
|
//小车是否离开
|
|
|
|
|
|
object carrun = this.plcHelper.Read(this.ScanPoint.PlcSetting3);
|
|
|
|
|
|
///上位机写入岔道信息
|
|
|
|
|
|
object wcsstate = this.plcHelper.Read(this.ScanPoint.PlcSetting4);
|
|
|
|
|
|
///回写plc状态处理完成,plc会清理数据
|
|
|
|
|
|
object wcsend = this.plcHelper.Read(this.ScanPoint.PlcSetting5);
|
|
|
|
|
|
|
|
|
|
|
|
//var isoutCar = StaticData.CarRealList.OrderBy(t => t.CreateDt).FirstOrDefault(t => t.IsOutLocator == 1 && t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo);
|
|
|
|
|
|
//if (this.LineNo == "1")
|
|
|
|
|
|
//{
|
|
|
|
|
|
// if (isoutCar != null)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// carno = isoutCar.CarNo;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// else
|
|
|
|
|
|
// {
|
|
|
|
|
|
// if (ScanPoint.CarNo != "")
|
|
|
|
|
|
// {
|
|
|
|
|
|
// carno = Convert.ToInt32(ScanPoint.CarNo);
|
|
|
|
|
|
// }
|
|
|
|
|
|
// else
|
|
|
|
|
|
// {
|
|
|
|
|
|
// carno = 0;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
///由于1号线 安装不上一个 扫描头 ,所以,这个出库数据由系统自己缓存
|
|
|
|
|
|
if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(wcsend) == 0 && Convert.ToInt32(wcsstate) == 0 && Convert.ToInt32(carstate) == 1 && Convert.ToInt32(carrun) == 0 && StaticData.IsOutCarGo)//&& IsPlcRead == false
|
|
|
|
|
|
{
|
|
|
|
|
|
StaticData.IsOutCarGo = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ScanPoint.CarNo = carno.ToString();
|
|
|
|
|
|
logger.Log(this.LineNo + "号线记录小车出库车号" + carno);
|
|
|
|
|
|
//IsRuning = true;
|
|
|
|
|
|
CarRealInfo car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault();
|
|
|
|
|
|
|
|
|
|
|
|
if (car != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
DBService.AddSystemLog(this.ScanPoint.NodeNo, car);
|
|
|
|
|
|
//空车出库
|
|
|
|
|
|
if (car.IsProOutLocator == 0 && (car.OffMaterialId == null || car.OffMaterialId == 0))
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
//1003点需要叫车
|
|
|
|
|
|
// object needState = this.plcHelper.Read(this.OutLocatorPoint.PlcSetting3);
|
|
|
|
|
|
|
|
|
|
|
|
NodePrecuss nextpro = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == this.ScanPoint.Id && t.NodeValue == 1005);
|
|
|
|
|
|
// if (this.LineNo == "2" && needState != null && Convert.ToInt32(needState) > 0)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// nextpro = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == this.ScanPoint.Id && t.NodeValue == 1009);
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
//car.LocatorNodeId = car.LocatorId;
|
|
|
|
|
|
//car.ProLocatorArea = car.LocatorArea;
|
|
|
|
|
|
car.IsOver = 1;
|
|
|
|
|
|
car.LocatorId = 0;
|
|
|
|
|
|
car.LocatorArea = null;
|
|
|
|
|
|
car.IsOutLocator = 0;
|
|
|
|
|
|
car.CurrNodeId = this.ScanPoint.Id;
|
|
|
|
|
|
car.CurrNodeSetting = this.ScanPoint;
|
|
|
|
|
|
//car.LocatorNodeId = this.ScanPoint.Id;
|
|
|
|
|
|
//car.LocatorNodeSetting = this.ScanPoint;
|
|
|
|
|
|
car.OptDt = DateTime.Now;
|
|
|
|
|
|
car.IsOver = 1;
|
|
|
|
|
|
DBService.ModifyRealCarinfoRecord(car);
|
|
|
|
|
|
car.IsOver = 1;
|
|
|
|
|
|
|
|
|
|
|
|
lock (StaticData.OutCarLock)
|
|
|
|
|
|
{
|
|
|
|
|
|
StaticData.IsOutCarGo = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
this.plcHelper.Write(this.ScanPoint.PlcSetting4, nextpro.AfterNodeSetting.NodeNo);
|
|
|
|
|
|
///回写plc状态处理完成,plc会清理数据
|
|
|
|
|
|
this.plcHelper.Write(this.ScanPoint.PlcSetting5, 1);
|
|
|
|
|
|
//this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, 0);
|
|
|
|
|
|
//IsPlcRead = true;
|
|
|
|
|
|
logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + nextpro.AfterNodeSetting.NodeNo);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (car.IsProOutLocator == 1)
|
|
|
|
|
|
//正常下件
|
|
|
|
|
|
{
|
|
|
|
|
|
//查找出库扫描产生的出库安排顺序CreateDt, 决定,当前到位的小车,是否是第一个, 不是,等待另一条道的小车到位
|
|
|
|
|
|
var throuthCar = StaticData.CarRealList.Where(t => t.IsProOutLocator == 1 && t.IsOutLocator == 1 && t.IsOver == 0 && t.LocatorArea != null).OrderBy(t => t.CreateDt).FirstOrDefault();
|
|
|
|
|
|
//互斥 逻辑
|
|
|
|
|
|
if (throuthCar.CarNo != car.CarNo)
|
|
|
|
|
|
{
|
|
|
|
|
|
StaticData.IsOutCarGo = true;
|
|
|
|
|
|
logger.Log("逻辑互斥 ,另一个口先出,当前出口" + this.LineNo + " carno:" + car.CarNo + " othercarno:" + throuthCar.CarNo);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.Log("查找到出库数据,当前执行出库" + this.LineNo + " 小车号:" + car.CarNo + " 物料" + car.MaterialNo);
|
|
|
|
|
|
|
|
|
|
|
|
car.IsOver = 1;
|
|
|
|
|
|
car.LocatorId = 0;
|
|
|
|
|
|
car.IsOutLocator = 0;
|
|
|
|
|
|
car.OffMaterialId = 0;
|
|
|
|
|
|
car.CurrNodeId = this.ScanPoint.Id;
|
|
|
|
|
|
car.CurrNodeSetting = this.ScanPoint;
|
|
|
|
|
|
//car.LocatorNodeId = this.ScanPoint.Id;
|
|
|
|
|
|
//car.LocatorNodeSetting = this.ScanPoint;
|
|
|
|
|
|
car.OptDt = DateTime.Now;
|
|
|
|
|
|
DBService.ModifyRealCarinfoRecord(car);
|
|
|
|
|
|
//写入出库点位
|
|
|
|
|
|
lock (StaticData.OutCarLock)
|
|
|
|
|
|
{
|
|
|
|
|
|
StaticData.IsOutCarGo = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
NodePrecuss nextpro = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == this.ScanPoint.Id && t.NodeValue == 1005);
|
|
|
|
|
|
this.plcHelper.Write(this.ScanPoint.PlcSetting4, nextpro.AfterNodeSetting.NodeNo);
|
|
|
|
|
|
///回写plc状态处理完成,plc会清理数据
|
|
|
|
|
|
this.plcHelper.Write(this.ScanPoint.PlcSetting5, 1);
|
|
|
|
|
|
//this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, 0);
|
|
|
|
|
|
//IsPlcRead = true;
|
|
|
|
|
|
|
|
|
|
|
|
logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + nextpro.AfterNodeSetting.NodeNo);
|
|
|
|
|
|
}
|
|
|
|
|
|
#region 旧代码
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//if (car.OffMaterialId > 0)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// OffLineMaterialList offmaterial = null;
|
|
|
|
|
|
// lock (StaticData.offMaterialCarLock)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// //调度出库指令
|
|
|
|
|
|
// offmaterial = StaticData.OffMaterialAreaList.FirstOrDefault(t => t.MaterialNo == car.MaterialNo && t.Number > 0 && t.IsOver == 1);
|
|
|
|
|
|
// if (offmaterial != null && offmaterial.Id == car.OffMaterialId)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// //扣减出库队列的物料数量
|
|
|
|
|
|
// offmaterial.Number -= car.Number;
|
|
|
|
|
|
// //箱体正在等待配送
|
|
|
|
|
|
// offmaterial.IsOver = 2;
|
|
|
|
|
|
// DBService.UpdateOffLineMaterialList(offmaterial);
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
//if (offmaterial != null)
|
|
|
|
|
|
//{
|
|
|
|
|
|
//car.IsOver = 1;
|
|
|
|
|
|
//car.LocatorId = 0;
|
|
|
|
|
|
//car.IsOutLocator = 0;
|
|
|
|
|
|
//car.OffMaterialId = offmaterial.Id;
|
|
|
|
|
|
//car.CurrNodeId = this.ScanPoint.Id;
|
|
|
|
|
|
//car.CurrNodeSetting = this.ScanPoint;
|
|
|
|
|
|
////car.LocatorNodeId = this.ScanPoint.Id;
|
|
|
|
|
|
////car.LocatorNodeSetting = this.ScanPoint;
|
|
|
|
|
|
//car.OptDt = DateTime.Now;
|
|
|
|
|
|
//DBService.ModifyRealCarinfoRecord(car);
|
|
|
|
|
|
////写入出库点位
|
|
|
|
|
|
//NodePrecuss nextpro = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == this.ScanPoint.Id && t.NodeValue == 1005);
|
|
|
|
|
|
//this.plcHelper.Write(this.ScanPoint.PlcSetting4, nextpro.AfterNodeSetting.NodeNo);
|
|
|
|
|
|
/////回写plc状态处理完成,plc会清理数据
|
|
|
|
|
|
//this.plcHelper.Write(this.ScanPoint.PlcSetting5, 1);
|
|
|
|
|
|
//this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, 0);
|
|
|
|
|
|
//IsPlcRead = true;
|
|
|
|
|
|
|
|
|
|
|
|
//logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + nextpro.AfterNodeSetting.NodeNo);
|
|
|
|
|
|
// IsPlcRead = true;
|
|
|
|
|
|
//}
|
|
|
|
|
|
//else
|
|
|
|
|
|
//{
|
|
|
|
|
|
// // IsPlcRead = false;
|
|
|
|
|
|
// logger.Log("未匹配到符合出库物料的小车");
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
//}
|
|
|
|
|
|
//else//强制出车
|
|
|
|
|
|
//{
|
|
|
|
|
|
// car.IsOver = 1;
|
|
|
|
|
|
// car.LocatorId = 0;
|
|
|
|
|
|
// car.IsOutLocator = 0;
|
|
|
|
|
|
// car.OffMaterialId = 0;
|
|
|
|
|
|
// car.CurrNodeId = this.ScanPoint.Id;
|
|
|
|
|
|
// car.CurrNodeSetting = this.ScanPoint;
|
|
|
|
|
|
// //car.LocatorNodeId = this.ScanPoint.Id;
|
|
|
|
|
|
// //car.LocatorNodeSetting = this.ScanPoint;
|
|
|
|
|
|
// car.OptDt = DateTime.Now;
|
|
|
|
|
|
// DBService.ModifyRealCarinfoRecord(car);
|
|
|
|
|
|
// //写入出库点位
|
|
|
|
|
|
// NodePrecuss nextpro = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == this.ScanPoint.Id && t.NodeValue == 1005);
|
|
|
|
|
|
// this.plcHelper.Write(this.ScanPoint.PlcSetting4, nextpro.AfterNodeSetting.NodeNo);
|
|
|
|
|
|
// ///回写plc状态处理完成,plc会清理数据
|
|
|
|
|
|
// this.plcHelper.Write(this.ScanPoint.PlcSetting5, 1);
|
|
|
|
|
|
// this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, 0);
|
|
|
|
|
|
// IsPlcRead = true;
|
|
|
|
|
|
|
|
|
|
|
|
// logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + nextpro.AfterNodeSetting.NodeNo);
|
|
|
|
|
|
//}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
}
|
|
|
|
|
|
else//避让小车
|
|
|
|
|
|
{
|
|
|
|
|
|
//判定是否是出库小车 0 避让小车 ,1 指定出库小车
|
|
|
|
|
|
if (this.LineNo == "2")
|
|
|
|
|
|
{
|
|
|
|
|
|
// car.IsProOutLocator = 0;
|
|
|
|
|
|
car.LocatorId = 0;
|
|
|
|
|
|
car.LocatorArea = null;
|
|
|
|
|
|
car.IsOutLocator = 0;
|
|
|
|
|
|
car.CurrNodeId = this.ScanPoint.Id;
|
|
|
|
|
|
car.CurrNodeSetting = this.ScanPoint;
|
|
|
|
|
|
//car.LocatorNodeId = this.ScanPoint.Id;
|
|
|
|
|
|
//car.LocatorNodeSetting = this.ScanPoint;
|
|
|
|
|
|
car.OptDt = DateTime.Now;
|
|
|
|
|
|
car.IsOver = 1;
|
|
|
|
|
|
DBService.ModifyRealCarinfoRecord(car);
|
|
|
|
|
|
lock (StaticData.OutCarLock)
|
|
|
|
|
|
{
|
|
|
|
|
|
StaticData.IsOutCarGo = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
NodePrecuss nextpro = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == this.ScanPoint.Id && t.NodeValue == 1009);
|
|
|
|
|
|
|
|
|
|
|
|
this.plcHelper.Write(this.ScanPoint.PlcSetting4, nextpro.AfterNodeSetting.NodeNo);
|
|
|
|
|
|
///回写plc状态处理完成,plc会清理数据
|
|
|
|
|
|
this.plcHelper.Write(this.ScanPoint.PlcSetting5, 1);
|
|
|
|
|
|
|
|
|
|
|
|
// this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, 0);
|
|
|
|
|
|
//IsPlcRead = true;
|
|
|
|
|
|
logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + nextpro.AfterNodeSetting.NodeNo);
|
|
|
|
|
|
}
|
|
|
|
|
|
else//1号仓内
|
|
|
|
|
|
{
|
|
|
|
|
|
car.IsOver = 1;
|
|
|
|
|
|
car.LocatorId = 0;
|
|
|
|
|
|
car.LocatorArea = null;
|
|
|
|
|
|
car.IsOutLocator = 0;
|
|
|
|
|
|
car.CurrNodeId = this.ScanPoint.Id;
|
|
|
|
|
|
car.CurrNodeSetting = this.ScanPoint;
|
|
|
|
|
|
//car.LocatorNodeId = this.ScanPoint.Id;
|
|
|
|
|
|
//car.LocatorNodeSetting = this.ScanPoint;
|
|
|
|
|
|
car.OptDt = DateTime.Now;
|
|
|
|
|
|
DBService.ModifyRealCarinfoRecord(car);
|
|
|
|
|
|
lock (StaticData.OutCarLock)
|
|
|
|
|
|
{
|
|
|
|
|
|
StaticData.IsOutCarGo = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
NodePrecuss nextpro = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == this.ScanPoint.Id && t.NodeValue == 1005);
|
|
|
|
|
|
this.plcHelper.Write(this.ScanPoint.PlcSetting4, nextpro.AfterNodeSetting.NodeNo);
|
|
|
|
|
|
///回写plc状态处理完成,plc会清理数据
|
|
|
|
|
|
this.plcHelper.Write(this.ScanPoint.PlcSetting5, 1);
|
|
|
|
|
|
|
|
|
|
|
|
// this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, 0);
|
|
|
|
|
|
//IsPlcRead = true;
|
|
|
|
|
|
logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + nextpro.AfterNodeSetting.NodeNo);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
DBService.AddSystemLog(this.ScanPoint.NodeNo, car);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
StaticData.IsOutCarGo = true;
|
|
|
|
|
|
logger.Log("未匹配出库物料的小车");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}//小车移动中指定点位后,并且到位了
|
|
|
|
|
|
else if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(carrun) == 1 && Convert.ToInt32(wcsend) == 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScanPoint.CarNo = "";
|
|
|
|
|
|
lock (StaticData.OutCarLock)
|
|
|
|
|
|
{
|
|
|
|
|
|
StaticData.IsOutCarGo = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
//IsPlcRead = false;
|
|
|
|
|
|
//IsRuning = false;
|
|
|
|
|
|
//CarRealInfo ocar = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault();
|
|
|
|
|
|
//if (ocar != null)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// car.IsOver = 1;
|
|
|
|
|
|
logger.Log(" 小车离开了 [" + this.LineNo + "]号上件点");
|
|
|
|
|
|
|
|
|
|
|
|
///回写plc状态,,plc会清理数据
|
|
|
|
|
|
this.plcHelper.Write(this.ScanPoint.PlcSetting4, 0);
|
|
|
|
|
|
///回写plc状态处理完成,plc会清理数据
|
|
|
|
|
|
this.plcHelper.Write(this.ScanPoint.PlcSetting5, 0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//if (!IsRuning)
|
|
|
|
|
|
//{
|
|
|
|
|
|
///读取小车号
|
|
|
|
|
|
object outlocatorno = this.plcHelper.Read(this.OutLocatorPoint.PlcSetting1);
|
|
|
|
|
|
//小车是否到位 ,点位取消
|
|
|
|
|
|
object outlocatorstate = this.plcHelper.Read(this.OutLocatorPoint.PlcSetting2);
|
|
|
|
|
|
//查找符合条件的小车,,根据出库队列查找
|
|
|
|
|
|
OffLineMaterialList offmaterialnew = null;
|
|
|
|
|
|
CarRealInfo preoffcar = null;
|
|
|
|
|
|
// if (Convert.ToInt32(outlocatorno) == 0)
|
|
|
|
|
|
if (Convert.ToInt32(outlocatorstate) == 0 && Convert.ToInt32(outlocatorno) == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
int isoutCarNumber = StaticData.CarRealList.Where(t => t.IsProOutLocator == 1).Count();
|
|
|
|
|
|
if (isoutCarNumber < 40)
|
|
|
|
|
|
{
|
|
|
|
|
|
//手动设置出库或者拉回 , 进入下件点 IsProOutLocator>0; 1 下件 ,2 拉回
|
|
|
|
|
|
preoffcar = StaticData.CarRealList.OrderBy(t => t.CreateDt).FirstOrDefault(t => t.IsProOutLocator > 0 && t.IsOutLocator == 0 && t.IsOver == 0 && t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo);
|
|
|
|
|
|
CarRealInfo LocatorCar = null;
|
|
|
|
|
|
//重新启动之后,或者手动指定出库
|
|
|
|
|
|
if (preoffcar != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
//preoffcar.OffMaterialId = 0;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
lock (StaticData.offMaterialCarLock)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
//调度出库指令
|
|
|
|
|
|
offmaterialnew = StaticData.OffMaterialList.FirstOrDefault(t => t.Number > 0 && t.IsOver == 0);
|
|
|
|
|
|
if (offmaterialnew != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.Log("当前扫描物料码:" + offmaterialnew.MaterialNo + " " + offmaterialnew.MaterialDes + " " + offmaterialnew.ProductBarNo);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CarRealInfo outcars = null;
|
|
|
|
|
|
lock (StaticData.OutLocatorCarLock)
|
|
|
|
|
|
{
|
|
|
|
|
|
//查找出库队列最后一个小车物料和当前出库的是否是相同的, 相同如果数量一样则扣减
|
|
|
|
|
|
var last_outcar = StaticData.CarRealList.Where(t => t.IsProOutLocator == 1).OrderBy(t => t.CreateDt).LastOrDefault();
|
|
|
|
|
|
|
|
|
|
|
|
if (last_outcar != null && last_outcar.HadNumber > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
//如果当前预出库物料时,,如果最后一辆小车,的数量>0,那么判断,是不是和当前预出库物料相同
|
|
|
|
|
|
//如果相同,扣减一,不出新车, 如果不相同,把最后一辆小车数量置零,寻找其他小车出库
|
|
|
|
|
|
if ( last_outcar.MaterialNo == offmaterialnew.MaterialNo )
|
|
|
|
|
|
{
|
|
|
|
|
|
outcars = last_outcar;
|
|
|
|
|
|
|
|
|
|
|
|
offmaterialnew.Number -= 1;
|
|
|
|
|
|
offmaterialnew.CarCode = outcars.CarNo;
|
|
|
|
|
|
outcars.IsProOutLocator = 1;
|
|
|
|
|
|
outcars.HadNumber -= 1;
|
|
|
|
|
|
DBService.UpdateOffLineMaterialList(offmaterialnew);
|
|
|
|
|
|
DBService.ModifyRealCarinfoRecord(outcars);
|
|
|
|
|
|
logger.Log("出库小车被匹配到的箱体扣减可用数量");
|
|
|
|
|
|
|
|
|
|
|
|
}else
|
|
|
|
|
|
{
|
|
|
|
|
|
last_outcar.HadNumber = 0;
|
|
|
|
|
|
DBService.ModifyRealCarinfoRecord(last_outcar);
|
|
|
|
|
|
logger.Log("出库队列最后一辆车的物料和当前不相同,并且数量>0 ,则将小车剩余数量置0");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (outcars == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
//再匹配库区内的安排出库
|
|
|
|
|
|
var Locators = StaticData.CarRealList.Where(t => t.MaterialNo == offmaterialnew.MaterialNo && t.HadNumber > 0 && t.IsOutLocator == 0 && t.LocatorId > 0 && t.IsProOutLocator == 0 && t.LocatorArea != null && this.LineNo == t.LocatorArea.LineNo).GroupBy(t => t.LocatorId).Select(g => g.OrderBy(f => g.Count())).OrderBy(t => t.Count()).FirstOrDefault();
|
|
|
|
|
|
preoffcar = Locators == null ? null : Locators.OrderBy(t => t.OptDt).FirstOrDefault();
|
|
|
|
|
|
if (preoffcar != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
offmaterialnew.Number -= 1;
|
|
|
|
|
|
offmaterialnew.CarCode = preoffcar.CarNo;
|
|
|
|
|
|
preoffcar.IsProOutLocator = 1;
|
|
|
|
|
|
preoffcar.HadNumber -= 1;
|
|
|
|
|
|
DBService.UpdateOffLineMaterialList(offmaterialnew);
|
|
|
|
|
|
|
|
|
|
|
|
//记录第一个匹配到小车的物料 号, 用于判定下一个物料和上一个是否相同 ,如果相同则算同一个车出库
|
|
|
|
|
|
// StaticData.Last_scanMaterial = preoffcar.MaterialNo;
|
|
|
|
|
|
// DBService.SetSystemConfigItem("last_scanmaterial", StaticData.Last_scanMaterial);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//出库队列如果在库位内没有找到匹配,自动算作放弃,匹配下一个
|
|
|
|
|
|
if (outcars == null && preoffcar == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.Log("[" + this.LineNo + "]号库区没有匹配到响应的库区物料信息" + offmaterialnew.MaterialNo + " " + offmaterialnew.MaterialDes + " " + offmaterialnew.ProductBarNo);
|
|
|
|
|
|
if (this.LineNo == "1")
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
offmaterialnew.LeftNoData = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
offmaterialnew.RightNoData = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (offmaterialnew.LeftNoData == 1 && offmaterialnew.RightNoData == 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.Log("两个库区都没有找到匹配的该物料,该出库箱体作废");
|
|
|
|
|
|
offmaterialnew.IsOver = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
DBService.UpdateOffLineMaterialList(offmaterialnew);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (preoffcar != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
//取当前和找到小车同一个库位的小车队列,第一个 ,判定是否是预备出库小车, ,直到找到为止
|
|
|
|
|
|
LocatorCar = StaticData.CarRealList.OrderBy(t => t.OptDt).FirstOrDefault(t => t.LocatorId == preoffcar.LocatorId && t.IsOutLocator == 0 && t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo);
|
|
|
|
|
|
if (LocatorCar != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
////是要准备出的小车,正常出库的小车
|
|
|
|
|
|
if (LocatorCar.CarNo == preoffcar.CarNo)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.Log(" 当前出库小车相同:" + LocatorCar.CarNo + " 预设出库小车" + preoffcar.CarNo);
|
|
|
|
|
|
LocatorCar.HadNumber = preoffcar.HadNumber;
|
|
|
|
|
|
LocatorCar.IsProOutLocator = preoffcar.IsProOutLocator;
|
|
|
|
|
|
//LocatorCar.OffMaterialId = offmaterialnew == null ? 0 : offmaterialnew.Id;
|
|
|
|
|
|
}
|
|
|
|
|
|
else//挡在要出库前面的那些个小车
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.Log(" 当前出库小车不同:" + LocatorCar.CarNo + " 预设出库小车" + preoffcar.CarNo);
|
|
|
|
|
|
LocatorCar.IsProOutLocator = 2;
|
|
|
|
|
|
LocatorCar.OffMaterialId = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//如果没有需要出库的库位小车,就出一个空车 ,如果当前是2号库区,则判定 1003的小车空车数量不足,,进行叫空车
|
|
|
|
|
|
if (LocatorCar == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
//上件点呼叫空车预存,,2号等需要呼叫的时候,才放空车, 1号库区,有机会就放
|
|
|
|
|
|
bool isOutCar = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (this.LineNo == "1")
|
|
|
|
|
|
{
|
|
|
|
|
|
object needState1 = this.plcHelper.Read(this.otherLocatorPoint1.PlcSetting3);
|
|
|
|
|
|
object needState2 = this.plcHelper.Read(this.otherLocatorPoint2.PlcSetting3);
|
|
|
|
|
|
var areaemp = StaticData.CarRealList.Count(t => t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo && t.MaterialNo == "");
|
|
|
|
|
|
if (areaemp > 0 && (needState1 != null && Convert.ToInt32(needState1) > 0))
|
|
|
|
|
|
{
|
|
|
|
|
|
isOutCar = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (areaemp > 0 && (needState2 != null && Convert.ToInt32(needState2) > 0))
|
|
|
|
|
|
{
|
|
|
|
|
|
isOutCar = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (this.LineNo == "2")
|
|
|
|
|
|
{
|
|
|
|
|
|
object needState1 = this.plcHelper.Read(this.otherLocatorPoint1.PlcSetting3);
|
|
|
|
|
|
object needState2 = this.plcHelper.Read(this.otherLocatorPoint2.PlcSetting3);
|
|
|
|
|
|
//1号库 空车数量
|
|
|
|
|
|
var areaemp1 = StaticData.CarRealList.Count(t => t.LocatorArea != null && t.LocatorArea.LineNo == "1" && t.MaterialNo == "");
|
|
|
|
|
|
//2号库区空车数量
|
|
|
|
|
|
var areaemp2 = StaticData.CarRealList.Count(t => t.LocatorArea != null && t.LocatorArea.LineNo == "2" && t.MaterialNo == "");
|
|
|
|
|
|
if (areaemp2 > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
//////1号没有空车了,并且要空车, 或者2号上件口需要空车,2号库区就出空车 ,容易堵死
|
|
|
|
|
|
//if ((areaemp1 <= 0 && needState1 != null && Convert.ToInt32(needState1) > 0) || (needState2 != null && Convert.ToInt32(needState2) > 0))
|
|
|
|
|
|
//{
|
|
|
|
|
|
// isOutCar = true;
|
|
|
|
|
|
//}
|
|
|
|
|
|
//只有一号库区没有空车的时候, 并且要空车,才会2号库区才会出空车
|
|
|
|
|
|
if ((areaemp1 <= 0 && needState1 != null && Convert.ToInt32(needState1) > 0))
|
|
|
|
|
|
{
|
|
|
|
|
|
isOutCar = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if ((areaemp1 <= 0 && areaemp2 >0&& needState2 != null && Convert.ToInt32(needState2) > 0))
|
|
|
|
|
|
{
|
|
|
|
|
|
isOutCar = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// if (this.LineNo == "1")
|
|
|
|
|
|
//{
|
|
|
|
|
|
//object needState1 = this.plcHelper.Read(this.otherLocatorPoint1.PlcSetting3);
|
|
|
|
|
|
//object needState2 = this.plcHelper.Read(this.otherLocatorPoint2.PlcSetting3);
|
|
|
|
|
|
////1号库区的1002点空车逻辑
|
|
|
|
|
|
////计算2库区的小车占比 小于30,分配到2库
|
|
|
|
|
|
//var areaemp2 = StaticData.CarRealList.Count(t => t.LocatorArea != null && t.LocatorArea.LineNo == "2" && t.MaterialNo == "");
|
|
|
|
|
|
//var areaemp1 = StaticData.CarRealList.Count(t => t.LocatorArea != null && t.LocatorArea.LineNo == "1" && t.MaterialNo == "");
|
|
|
|
|
|
////进入2号库区
|
|
|
|
|
|
//if (areaemp1 > 0 && ((needState1 != null && Convert.ToInt32(needState1) > 0)) || ((areaemp2 <= 0 && (needState2 != null && Convert.ToInt32(needState2) > 0))))
|
|
|
|
|
|
//{
|
|
|
|
|
|
// isOutCar = true;
|
|
|
|
|
|
//}
|
|
|
|
|
|
// }
|
|
|
|
|
|
//else
|
|
|
|
|
|
//{
|
|
|
|
|
|
//object needState2 = this.plcHelper.Read(this.OutLocatorPoint.PlcSetting3);
|
|
|
|
|
|
//object needState1 = this.plcHelper.Read(this.otherLocatorPoint1.PlcSetting3);
|
|
|
|
|
|
|
|
|
|
|
|
////计算1库区的小车数量==0 ,2号库区有车则支援一下
|
|
|
|
|
|
//var areaemp1 = StaticData.CarRealList.Count(t => t.LocatorArea != null && t.LocatorArea.LineNo == "1" && t.MaterialNo == "");
|
|
|
|
|
|
//var areaemp2 = StaticData.CarRealList.Count(t => t.LocatorArea != null && t.LocatorArea.LineNo == "2" && t.MaterialNo == "");
|
|
|
|
|
|
//if (areaemp2 > 0 && (needState2 != null && Convert.ToInt32(needState2) > 0) || (Convert.ToInt32(needState1) > 0 && areaemp1 <= 0))
|
|
|
|
|
|
//{
|
|
|
|
|
|
// isOutCar = true;
|
|
|
|
|
|
//}
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
if (isOutCar)
|
|
|
|
|
|
{
|
|
|
|
|
|
// //根据库位分组, 获取空车数量最少的库位
|
|
|
|
|
|
var Locators = StaticData.CarRealList.Where(t => t.MaterialNo == "" && t.IsOutLocator == 0 && t.LocatorId > 0 && t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo).GroupBy(t => t.LocatorId).Select(g => g.OrderBy(f => g.Count())).OrderBy(t => t.Count()).FirstOrDefault();
|
|
|
|
|
|
var empoutCar = Locators != null ? Locators.OrderBy(t => t.OptDt).FirstOrDefault() : null;
|
|
|
|
|
|
if (empoutCar != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
LocatorCar = StaticData.CarRealList.OrderBy(t => t.OptDt).FirstOrDefault(t => t.LocatorId == empoutCar.LocatorId && t.IsOver == 0 && t.IsOutLocator == 0 && t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo);
|
|
|
|
|
|
if (LocatorCar != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
////是要准备出的小车,正常出库的小车
|
|
|
|
|
|
if (LocatorCar.CarNo == empoutCar.CarNo)
|
|
|
|
|
|
{
|
|
|
|
|
|
LocatorCar.IsProOutLocator = 0;
|
|
|
|
|
|
LocatorCar.OffMaterialId = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
else//挡在要出库前面的那些个小车
|
|
|
|
|
|
{
|
|
|
|
|
|
LocatorCar.IsProOutLocator = 2;
|
|
|
|
|
|
LocatorCar.OffMaterialId = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//库位号越大, locatorid 越小,所以,空车叫从大库区号叫空车
|
|
|
|
|
|
//var empoutCar = StaticData.CarRealList.OrderByDescending(t => t.LocatorId).ThenBy(t => t.OptDt).FirstOrDefault(t => t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo && t.MaterialNo == "");
|
|
|
|
|
|
////取空车逻辑: 每一行库位的第一个是空车的往外出 :废弃
|
|
|
|
|
|
////var Locators = StaticData.CarRealList.OrderBy(t => t.OptDt).Where(t => t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo).GroupBy(t => t.LocatorId).Select(g => g.OrderBy(t => t.OptDt).FirstOrDefault()); //取当前和找到小车同一个库位的小车队列,第一个 ,判定是否是预备出库小车, ,直到找到为止
|
|
|
|
|
|
// if (empoutCar != null)
|
|
|
|
|
|
// {
|
|
|
|
|
|
//LocatorCar = StaticData.CarRealList.OrderBy(t => t.OptDt).FirstOrDefault(t => t.LocatorId == empoutCar.LocatorId && t.IsOver == 0 && t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo);
|
|
|
|
|
|
//if (LocatorCar != null)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// ////是要准备出的小车,正常出库的小车
|
|
|
|
|
|
// if (LocatorCar.CarNo == empoutCar.CarNo)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// LocatorCar.IsProOutLocator = 0;
|
|
|
|
|
|
// LocatorCar.OffMaterialId = 0;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// else//挡在要出库前面的那些个小车
|
|
|
|
|
|
// {
|
|
|
|
|
|
// LocatorCar.IsProOutLocator = 2;
|
|
|
|
|
|
// LocatorCar.OffMaterialId = 0;
|
|
|
|
|
|
// }
|
|
|
|
|
|
//}
|
|
|
|
|
|
// }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
//有需要出库的 库位小车
|
|
|
|
|
|
if (LocatorCar != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DBService.AddSystemLog(LocatorCar.LocatorArea.AreaNo, LocatorCar);
|
|
|
|
|
|
|
|
|
|
|
|
//同时库区 ,同一时间,只有一个 isOutLocator 正在出库的小车
|
|
|
|
|
|
logger.Log(this.LineNo + "安排出库小车号" + LocatorCar.CarNo + "携带物料[" + LocatorCar.MaterialNo + ",状态:" + LocatorCar.IsProOutLocator + ",进行库位:" + LocatorCar.LocatorArea.AreaNo + "]");
|
|
|
|
|
|
LocatorCar.IsOutLocator = 1;
|
|
|
|
|
|
LocatorCar.IsOver = 0;
|
|
|
|
|
|
LocatorCar.CreateDt = DateTime.Now;
|
|
|
|
|
|
DBService.ModifyRealCarinfoRecord(LocatorCar);
|
|
|
|
|
|
///如果当前是最后一个小车 ,清空物料设定的规格
|
|
|
|
|
|
int locatornumber = StaticData.CarRealList.Count(t => t.LocatorId == LocatorCar.LocatorId & t.IsOutLocator == 0);
|
|
|
|
|
|
if (locatornumber <= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
LocatorCar.LocatorArea.MaterialNo = "";
|
|
|
|
|
|
DBService.SetLocatorMaterial(LocatorCar.LocatorId, "", "");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, LocatorCar.LocatorArea.AreaNo);
|
|
|
|
|
|
//IsRuning = false;
|
|
|
|
|
|
DBService.AddSystemLog(LocatorCar.LocatorArea.AreaNo, LocatorCar);
|
|
|
|
|
|
|
|
|
|
|
|
logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + LocatorCar.LocatorArea.AreaNo);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.Log("待出库小车数量超过40台,暂停出库");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (Convert.ToInt32(outlocatorstate) == 1 && Convert.ToInt32(outlocatorno) > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, 0);
|
|
|
|
|
|
logger.Log("出库操作点编号清理");
|
|
|
|
|
|
//IsRuning = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
// }
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
logger.Error("Logic1003OutLocator异常:" + this.ScanPoint.NodeNo + " :" + ex.Message + ex.StackTrace);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Thread.Sleep(2000);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|