You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

487 lines
24 KiB
C#

using CentralControl.BaseData;
using CommonFunc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using XGL.Thrift;
namespace CentralControl.App_Code
{
public class LogicLineSiteUp
{
// Thread UpMaterialThread;
PlcHelper plcHelper;
string LineNo { get; set; }
NodeSetting ScanPoint { get; set; }
/// <summary>
/// 是否运行发车中
/// </summary>
bool IsRuning { get; set; }
public LogicLineSiteUp(PlcHelper plc, string LineNo)
{
NodeSetting linenode1 = StaticData.NodeSettingList.FirstOrDefault(t => t.LineCatchArea != null && t.LineCatchArea.LineNo == LineNo && t.LineCatchArea.AreaType == 1);
if (linenode1 != null)
{
this.ScanPoint = linenode1;
}
else
{
Logger logger = new Logger();
logger.Log("创建线体,未找到扫描点位");
}
plcHelper = plc;
}
///// <summary>
///// 启动上件扫描监听
///// </summary>
//public void StartUpMateril(string lineNo)
//{
// StaticData.OffLineLockObjDic.Add(lineNo,new object());
// List<UpLineMaterialList> uplinemateriallist = StaticData.UpMaterialAreaList.Where(t => t.LineNo == lineNo).ToList();
// StaticData.InLineMaterialsDic.Add(lineNo, uplinemateriallist);
// UpMaterialThread = new Thread(new ParameterizedThreadStart(StaticData.UpmaterialMethod));
// UpMaterialThread.Start(lineNo);
//}
/// <summary>
/// 启动小车扫描监听队列
/// </summary>
public void StartScanThriftLogic(int point)
{
this.LineNo = this.LineNo;
XGL.Thrift.ThriftServiceImp business = new XGL.Thrift.ThriftServiceImp();
business.DischargeCarEvent += SendCar;
XGL.Thrift.ThriftCommon thriftCommon = new XGL.Thrift.ThriftCommon();
thriftCommon.Start(business, point);
}
/// <summary>
/// 下位机点击发车
/// </summary>
/// <param name="carlist"></param>
/// <returns></returns>
private string SendCar(List<string> carlist)
{
if (!IsRuning)
{
IsRuning = true;
Logger logger = new Logger();
try
{
List<UpLineScanCarList> mlist = StaticData.InLineScanCarDic[this.LineNo];
foreach (string carno in carlist)
{
logger.Log("挂件信息 [" + LineNo + "]:" + carno);
string[] carinfo = carno.Split('*');
UpLineScanCarList uplinmater = new UpLineScanCarList();
uplinmater.CarNo = carinfo[0];
uplinmater.MaterialNo = carinfo[1];
uplinmater.Number = Convert.ToInt32(carinfo[2]);
uplinmater.LineNo = this.LineNo;
mlist.Add(uplinmater);
DBService.AddUpLineScancar(uplinmater);
}
while (true)
{
UpLineScanCarList carInfo = mlist[0];
if (!string.IsNullOrEmpty(carInfo.MaterialNo) && carInfo.MaterialInfo != null)
{
//小车是否到位
object carstate = plcHelper.Read(ScanPoint.PlcSetting1);
//小车是否离开
object carrun = plcHelper.Read(ScanPoint.PlcSetting2);
///读取小车号
object carno = plcHelper.Read(ScanPoint.PlcSetting3);
///上位机写入岔道信息
object wcsstate = plcHelper.Read(ScanPoint.PlcSetting4);
///回写plc状态处理完成,plc会清理数据
object wcsend = plcHelper.Read(ScanPoint.PlcSetting5);
if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(wcsend) == 0 && Convert.ToInt32(wcsstate) == 0 && Convert.ToInt32(carstate) == 1)
{
logger.Log("[" + carno + "]小车到了 [" + this.LineNo + "]号上件点");
//中一系统 在点位配置维护的时候, 一个节点的子级 不需要维护多个,只需要把特定线路的点维护,然后根据线体去找到库位口位置
ScanPoint.CarNo = carno.ToString();
int locatorid = 0;
///获取预设 物料分配的库位
LineCatchArea area = StaticData.LineCatchAreaList.Where(t => t.MaterialNo == carInfo.MaterialNo).FirstOrDefault();
//当前物料之后已经存在库内,如果存在,返回位置
if (area != null)
{
//增加判断 满减存储区是否有位置, 没有的话,就暂时不发车
//判断库区内小车数量
var locatorNum = StaticData.CarRealList.Where(t => t.LocatorNodeId == area.Id).Count();
if (locatorNum < area.MaxNumber)
{
//未满
locatorid = area.Id;
}
else
{
//满了
}
}
//如果单个的库位满了, 或者没有设定单库,进入混合库区
if (locatorid == 0)
{
//增加判断 满减存储区是否有位置, 没有的话,就暂时不发车
var mixtureArea = StaticData.LineCatchAreaList.Where(t => t.AreaStorageType == 0 && t.AreaType == 4);
foreach (var locator in mixtureArea)
{
//判断库区内小车数量
var locatorNum = StaticData.CarRealList.Where(t => t.LocatorNodeId == area.Id).Count();
if (locatorNum < locator.MaxNumber)
{
area = locator;
//未满
locatorid = Convert.ToInt32(locator.AreaNo);
break;
}
}
}
if (locatorid > 0)
{
//判断小车号是否存在 ,使用内存记录
// CarRealInfo car = DBService.GetCarModel(carno.ToString());
CarRealInfo car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault();
if (car == null)
{
//小车不存在了, 就插入初始化数据
car.CarNo = carno.ToString();
car.CurrNodeId = this.ScanPoint.Id;
car.CurrNodeSetting = this.ScanPoint;
NodeSetting nextnode = null;
if (area.LineNo == "1")
{
nextnode = StaticData.NodeSettingList.FirstOrDefault(t => t.NodeNo == "1002");
}
else if (area.LineNo == "2")
{
nextnode = StaticData.NodeSettingList.FirstOrDefault(t => t.NodeNo == "1003");
}
car.LocatorNodeId = nextnode.Id;
car.LocatorNodeSetting = nextnode;
car.LocatorId = locatorid;
car.MaterialNo = carInfo.MaterialNo;
car.LocatorArea = area;
car.OptDt = DateTime.Now;
car.IsOver = 0;
DBService.AddCarRealRecord(car);
}
else
{
//小车存在了, 就修改初始化数据
car.CarNo = carno.ToString();
car.CurrNodeId = this.ScanPoint.Id;
car.CurrNodeSetting = this.ScanPoint;
NodeSetting nextnode = StaticData.NodeSettingList.FirstOrDefault(t => t.NodeNo == "1002");
if (area.LineNo == "2")
{
nextnode = StaticData.NodeSettingList.FirstOrDefault(t => t.NodeNo == "1004");
}
car.LocatorNodeId = nextnode.Id;
car.LocatorNodeSetting = nextnode;
car.LocatorId = locatorid;
car.LocatorArea = area;
car.MaterialNo = carInfo.MaterialNo;
car.OptDt = DateTime.Now;
car.IsOver = 0;
DBService.ModifyRealCarinfoRecord(car);
}
Productinfo producthistory = new Productinfo();
producthistory.CreateTime = DateTime.Now;
producthistory.IsDeleted = 0;
producthistory.MaterialNo = carInfo.MaterialNo;
// producthistory.ProductBarno = Product.ProductBarNo;
///记录产品信息
DBService.AddProductInfo(producthistory);
//删除上件工件队列
DBService.DeleteUpLineMaterial(carInfo.Id);
//添加小车记录表
DBService.AddCarHistoryRecord(car);
//记录小车已经离开.
// DBService.UpdateCarOverState(car.Id, 1);
//同步内存表小车数据
StaticData.CarRealList.Add(car);
//点位记录小车编号
ScanPoint.CarNo = car.CarNo;
///回写plc状态,起点的分支线路为1
plcHelper.Write(ScanPoint.PlcSetting4, car.LocatorNodeSetting.NodeNo);
///回写plc状态处理完成,plc会清理数据
plcHelper.Write(ScanPoint.PlcSetting5, 1);
}
}//小车移动中指定点位后,并且到位了
else if (Convert.ToInt32(carno) == 0 && Convert.ToInt32(carstate) == 0 && Convert.ToInt32(carrun) == 1)
{
string ocarno = ScanPoint.CarNo;
CarRealInfo car = StaticData.CarRealList.Where(t => t.CarNo == ocarno).FirstOrDefault();
if (car != null)
{
car.CurrNodeId = null;
car.CurrNodeSetting = null;
DBService.ModifyRealCarinfoRecord(car);
///回写plc状态,,plc会清理数据
plcHelper.Write(ScanPoint.PlcSetting4, 0);
///回写plc状态处理完成,plc会清理数据
plcHelper.Write(ScanPoint.PlcSetting5, 0);
}
else
{
logger.Log("[" + this.LineNo + "] 小车已离开,反馈未找到小车");
}
}
}
else
{
logger.Log("[" + this.LineNo + "] 带上件门体,上件完毕");
return "小车已离开";
}
Thread.Sleep(1000);
}
IsRuning = false;
}
catch (Exception ex)
{
logger.Error("发车操作异常:" + ex.Message + ex.StackTrace);
IsRuning = false;
return "系统异常";
}
}
else
{
Console.WriteLine("正在发车中,等待plc反馈中");
return "正在发车中,等待plc反馈中";
}
}
/// <summary>
/// 前端点击放行,放行小车队列
/// </summary>
/// <param name="lineNo"></param>
/// <param name="materials"></param>
public void StartCarCanR(string lineNo, int carnumber)
{
Logger logger = new Logger();
while (carnumber <= 0)
{
try
{
List<UpLineScanCarList> mlist = StaticData.InLineScanCarDic[lineNo];
if (mlist.Count > 0)
{
UpLineScanCarList carInfo = mlist[0];
if (!string.IsNullOrEmpty(carInfo.MaterialNo) && carInfo.MaterialInfo != null)
{
//小车是否到位
object carstate = plcHelper.Read(StaticData.getPlcInfoByCode("incarstate_p" + lineNo));
//小车是否离开
object carrun = plcHelper.Read(StaticData.getPlcInfoByCode("incarover_p" + lineNo));
///读取小车号
object carno = plcHelper.Read(StaticData.getPlcInfoByCode("incarno_p" + lineNo));
///上位机写入岔道信息
object wcsstate = plcHelper.Read(StaticData.getPlcInfoByCode("incaradapter_w" + lineNo));
///回写plc状态处理完成,plc会清理数据
object wcsend = plcHelper.Read(StaticData.getPlcInfoByCode("incarclear_w" + lineNo));
if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(wcsend) == 0 && Convert.ToInt32(wcsstate) == 0 && Convert.ToInt32(carstate) == 1)
{
logger.Log("[" + carno + "]小车到了 [" + lineNo + "]号上件点");
//中一系统 在点位配置维护的时候, 一个节点的子级 不需要维护多个,只需要把特定线路的点维护,然后根据线体去找到库位口位置
//获取当前上件区线的第一个点信息,前置点位信息
NodeSetting nodeFirst = StaticData.NodeSettingList.Where(t => t.NodeType == 1 && t.LineCatchArea.LineNo == lineNo).FirstOrDefault();
int locatorid = 0;
//增加判断 满减存储区是否有位置, 没有的话,就暂时不发车
LineCatchArea area = StaticData.LineCatchAreaList.Where(t => t.MaterialNo == carInfo.MaterialNo).FirstOrDefault();
if (area != null)
{
//判断库区内小车数量
var locatorNum = StaticData.CarRealList.Where(t => t.LocatorNodeId == area.Id).Count();
if (locatorNum < area.MaxNumber)
{
//未满
locatorid = area.Id;
}
else
{
//满了
}
}
//如果单个的库位满了, 或者没有设定单库,进入混合库区
if (locatorid == 0)
{
//增加判断 满减存储区是否有位置, 没有的话,就暂时不发车
var mixtureArea = StaticData.LineCatchAreaList.Where(t => t.AreaStorageType == 0);
foreach (var locator in mixtureArea)
{
//判断库区内小车数量
var locatorNum = StaticData.CarRealList.Where(t => t.LocatorNodeId == area.Id).Count();
if (locatorNum < locator.MaxNumber)
{
area = locator;
//未满
locatorid = locator.Id;
break;
}
}
}
//判断小车号是否存在 ,使用内存记录
// CarRealInfo car = DBService.GetCarModel(carno.ToString());
CarRealInfo car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault();
if (car == null)
{
//小车不存在了, 就插入初始化数据
car = new CarRealInfo();
car.CarNo = carno.ToString();
car.CurrNodeId = nodeFirst.Id;
car.CurrNodeSetting = nodeFirst;
car.LocatorNodeId = nodeFirst.Id;
car.LocatorNodeSetting = nodeFirst;
//car.MaterialBarNo = Product.ProductBarNo;
//car.MaterialInfo = Product.MaterialInfo;
car.MaterialNo = carInfo.MaterialNo;
car.OptDt = DateTime.Now;
//car.OrderPlanId = orderplanId;
//car.OrderPlan = currPlan;
car.IsOver = 0;
DBService.AddCarRealRecord(car);
}
else
{
//小车存在了, 就修改初始化数据
car.CarNo = carno.ToString();
car.CurrNodeId = nodeFirst.Id;
car.CurrNodeSetting = nodeFirst;
car.LocatorNodeId = nodeFirst.Id;
car.LocatorNodeSetting = nodeFirst;
//car.MaterialBarNo = Product.ProductBarNo;
//car.MaterialInfo = Product.MaterialInfo;
car.MaterialNo = carInfo.MaterialNo;
//car.OrderPlanId = orderplanId;
//car.OrderPlan = currPlan;
car.OptDt = DateTime.Now;
car.IsOver = 0;
DBService.ModifyRealCarinfoRecord(car);
}
Productinfo producthistory = new Productinfo();
producthistory.CreateTime = DateTime.Now;
producthistory.IsDeleted = 0;
producthistory.MaterialNo = carInfo.MaterialNo;
// producthistory.ProductBarno = Product.ProductBarNo;
///记录产品信息
DBService.AddProductInfo(producthistory);
//删除上件工件队列
DBService.DeleteUpLineMaterial(carInfo.Id);
//添加小车记录表
DBService.AddCarHistoryRecord(car);
//记录小车已经离开.
// DBService.UpdateCarOverState(car.Id, 1);
//同步内存表小车数据
StaticData.CarRealList.Add(car);
///回写plc状态,起点的分支线路为1
plcHelper.Write(StaticData.getPlcInfoByCode("incaradapter_w" + lineNo), 1);
///回写plc状态处理完成,plc会清理数据
plcHelper.Write(StaticData.getPlcInfoByCode("incarclear_w" + lineNo), 1);
}//小车移动中指定点位后,并且到位了
else if (Convert.ToInt32(lineNo) == 0 && Convert.ToInt32(carstate) == 0 && Convert.ToInt32(carrun) == 1)
{
//CarRealInfo car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault();
//if (car != null)
//{
logger.Log(" 小车离开了 [" + lineNo + "]号上件点");
///回写plc状态,,plc会清理数据
plcHelper.Write(StaticData.getPlcInfoByCode("incaradapter_w" + lineNo), 0);
///回写plc状态处理完成,plc会清理数据
plcHelper.Write(StaticData.getPlcInfoByCode("incarclear_w" + lineNo), 0);
///回写plc状态处理完成,plc会清理数据
// plcHelper.Write(getPlcInfoByCode("inlineoutwcs_" + lineno), 1);
/////回写plc状态处理完成,plc会清理数据
//plcHelper.Write(getPlcInfoByCode("inlinestate_" + lineno), 1);
//}
//else
//{
// logger.Log("线体[" + lineno + "]小车信息[" + carno + "]从内存记录中没有找到");
//}
}
}
else
{
logger.Log("[" + lineNo + "]小车到位,但是工件队列是空的");
}
}
}
catch (Exception ex)
{
}
}
}
}
}