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.

622 lines
28 KiB
C#

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;
using Thrift.Protocol;
using Thrift.Server;
using Thrift.Transport;
namespace CentralControl.App_Code
{
/// <summary>
/// 下件点扫描逻辑
/// </summary>
public class Logic1004OffLine
{ /// <summary>
/// plc 正在读取
/// </summary>
bool IsPlcRead { get; set; }
Thread OffMaterialThriftThread;
PlcHelper plcHelper;
string LineNo { get; set; }
int Thriftpoint { get; set; }
int UseButton { set; get; }
NodeSetting ScanPoint { get; set; }
/// <summary>
/// 出库操作点
/// </summary>
NodeSetting OpteratePoint { get; set; }
/// <summary>
/// 物料到位后,推送给客户端
/// </summary>
Thread OffClientThread { get; set; }
/// <summary>
/// 当前到位的小车物料
/// </summary>
string OffMaterialId { get; set; }
string offThriftIp { get; set; }
string offThriftPort { get; set; }
/// <summary>
/// 是否运行发车中
/// </summary>
bool IsRuning { get; set; }
public Logic1004OffLine(PlcHelper plc, string LineNo, int thriftpoint, int useBackButton)
{
this.UseButton = useBackButton;
NodeSetting linenode1 = StaticData.NodeSettingList.FirstOrDefault(t => t.LineCatchArea != null && t.LineCatchArea.LineNo == LineNo && t.LineCatchArea.AreaType == 2 && t.NodeType == 6);
//1号上件点 空车信号
this.OpteratePoint = StaticData.NodeSettingList.FirstOrDefault(t => t.NodeType == 7);
if (linenode1 != null)
{
this.ScanPoint = linenode1;
}
else
{
Logger logger = new Logger();
logger.Log("创建线体,未找到扫描点位");
}
this.LineNo = LineNo;
this.plcHelper = plc;
this.Thriftpoint = thriftpoint;
this.offThriftIp = System.Configuration.ConfigurationManager.AppSettings["offThriftIp"];
this.offThriftPort = System.Configuration.ConfigurationManager.AppSettings["offThriftport"];
///回写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);
// 1 已下件 , ,0 未下件
// this.plcHelper.Write(this.OpteratePoint.PlcSetting1, 0);
// 1 已下件 , ,0 未下件
// this.plcHelper.Write(this.OpteratePoint.PlcSetting2, 0);
//}
}
public void StartPoint()
{
///启动thrift线程监视
//OffMaterialThriftThread = new Thread(new ParameterizedThreadStart(StartScanThriftLogic));
//OffMaterialThriftThread.Start(this.Thriftpoint);
OffClientThread = new Thread(NoticeMaterialInfo);
OffClientThread.Start();
}
private void NoticeMaterialInfo()
{
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(ScanPoint.PlcSetting4);
///回写plc状态处理完成,plc会清理数据
object wcsend = this.plcHelper.Read(ScanPoint.PlcSetting5);
// 1 已下件 , ,0 未下件
//this.plcHelper.Write(this.OpteratePoint.PlcSetting1, 0);
if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(wcsend) == 0 && Convert.ToInt32(wcsstate) == 0 && Convert.ToInt32(carstate) == 1 && Convert.ToInt32(carrun) == 0 && IsPlcRead == false)
{
logger.Log("[" + carno + "]小车到了 [" + this.LineNo + "]号下件件点");
//中一系统 在点位配置维护的时候, 一个节点的子级 不需要维护多个,只需要把特定线路的点维护,然后根据线体去找到库位口位置
// ScanPoint.CarNo = carno.ToString();
//判断小车号是否存在 ,使用内存记录
// CarRealInfo car = DBService.GetCarModel(carno.ToString());
CarRealInfo car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault();
DBService.AddSystemLog(this.ScanPoint.NodeNo, car);
//正常下件
/*******测试数据***********/
//int? downmaterialstate = 1; //this.plcHelper.Read(this.OpteratePoint.PlcSetting1);
// int? backmaterialstate = 0;// this.plcHelper.Read(this.OpteratePoint.PlcSetting2);
object downmaterialstate = this.plcHelper.Read(this.OpteratePoint.PlcSetting1);
//拉回指令
object backmaterialstate = this.plcHelper.Read(this.OpteratePoint.PlcSetting2);
var canoutcar = false;
if (this.UseButton == 1 && backmaterialstate != null && Convert.ToInt32(backmaterialstate) == 1)
{
canoutcar = true;
}
else if (downmaterialstate != null && Convert.ToInt32(downmaterialstate) == 1)
{
if (car != null)
{
car.MaterialBarNo = "";
car.MaterialNo = "";
car.MaterialInfo = null;
//car.LocatorNodeId = null;
//car.LocatorNodeSetting = null;
car.IsOutLocator = 0;
car.IsOver = 0;
car.IsProOutLocator = 0;
car.LocatorId = 0;
car.LocatorArea = null;
car.CurrNodeId = this.ScanPoint.Id;
car.Number = 0;
car.HadNumber = 0;
car.CurrNodeSetting = this.ScanPoint;
DBService.ModifyRealCarinfoRecord(car);
////点位记录小车编号
//ScanPoint.CarNo = car.CarNo;
lock (StaticData.offMaterialCarLock)
{
OffLineMaterialList offfirst = StaticData.OffMaterialList.OrderBy(t=>t.CreateTime).FirstOrDefault(t => t.CarCode == car.CarNo);
if (offfirst != null)
{
logger.Log("下件到位 ,到位小车号 " + offfirst.Id + " 小车号:小车号:"+ car.CarNo + " 条码"+ offfirst.ProductBarNo);
offfirst.IsOver = 1;
offfirst.IsDeleted = 1;
offfirst.ModifyTime = DateTime.Now;
DBService.UpdateOffLineMaterialList(offfirst);
//移除当前下件的门体前的所有数据
List<OffLineMaterialList> offlinebefore = StaticData.OffMaterialList.Where(t => t.CreateTime < offfirst.CreateTime).ToList();
foreach (var off in offlinebefore)
{
off.IsOver = 1;
off.IsDeleted = 1;
off.ModifyTime = DateTime.Now;
DBService.UpdateOffLineMaterialList(off);
logger.Log("下件到位 ,删除前面得" + off.Id + " 小车号:小车号" + off.CarCode + " 条码号:" + off.ProductBarNo);
}
}
List<OffLineMaterialList> offline = StaticData.OffMaterialList.Where(t => t.CarCode == car.CarNo && t.Id != offfirst.Id).ToList();
foreach (var off in offline)
{
off.LineNo = "1";
DBService.UpdateOffLineMaterialList(off);
logger.Log("下件到位 ,修改出库信息变色 id "+ off .Id+ " 小车号:" + off.CarCode+" 条码号:"+off.ProductBarNo);
}
//else
//{
// logger.Log("下件到位 ,物料号不存在成品队列中");
//}
}
}
else
{
logger.Log("下件到位小车号不存在");
}
canoutcar = true;
}
if (canoutcar)
{
///回写plc状态,起点的分支线路为1
var processNode = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == ScanPoint.Id && t.NodeValue == 1001);
this.plcHelper.Write(ScanPoint.PlcSetting4, processNode.AfterNodeSetting.NodeNo);
///回写plc状态处理完成,plc会清理数据
this.plcHelper.Write(ScanPoint.PlcSetting5, 1);
// IsPlcRead = true;
DBService.AddSystemLog(this.ScanPoint.NodeNo, car);
logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + processNode.AfterNodeSetting.NodeNo);
}
}//小车移动中指定点位后,并且到位了
else if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(carrun) == 1 && Convert.ToInt32(wcsend) == 1)
{
///回写plc状态,,plc会清理数据
this.plcHelper.Write(ScanPoint.PlcSetting4, 0);
///回写plc状态处理完成,plc会清理数据
this.plcHelper.Write(ScanPoint.PlcSetting5, 0);
}
}
catch (Exception ex)
{
logger.Error("小车下件到位通知异常:" + ex.Message + ex.StackTrace);
IsRuning = false;
logger = null;
// return "系统异常";
}
Thread.Sleep(1000);
}
}
//private void NoticeMaterialInfo()
//{
// 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(ScanPoint.PlcSetting4);
// ///回写plc状态处理完成,plc会清理数据
// object wcsend = this.plcHelper.Read(ScanPoint.PlcSetting5);
// if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(wcsend) == 0 && Convert.ToInt32(wcsstate) == 0 && Convert.ToInt32(carstate) == 1 && Convert.ToInt32(carrun) == 0 && IsPlcRead == false)
// {
// CarRealInfo car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault();
// if (car == null)
// {
// var offmaterial = StaticData.OffMaterialAreaList.FirstOrDefault(t => t.Id == car.OffMaterialId);
// if (car.OffMaterialId > 0 && offmaterial != null)
// {
// TTransport transport = new TSocket(this.offThriftIp, Convert.ToInt32(this.offThriftPort));
// TProtocol protocol = new TBinaryProtocol(transport);
// ThriftService.Client client = new ThriftService.Client(protocol);
// transport.Open();
// string ret = client.GetUnloadMaterial(car.CarNo, car.MaterialNo, offmaterial.MaterialDes, offmaterial.OrderCode, offmaterial.ProductBarNo, offmaterial.MaterialNo, "");
// transport.Close();
// this.OffMaterialId = car.OffMaterialId.ToString();
// logger.Log("下件点小车到位了,通知客户端物料信息 id:" + car.OffMaterialId + " CarNo:" + car.CarNo + " MaterialNo:" + car.MaterialNo + " MaterialDes:" + offmaterial.MaterialDes + " OrderCode: " + offmaterial.OrderCode + " ProductBarNo:" + offmaterial.ProductBarNo + " MaterialNo:" + offmaterial.MaterialNo);
// }
// else
// {
// logger.Log("下件点小车到位了,但是没有匹配到下件物料信息:" + car.OffMaterialId);
// }
// }
// else
// {
// logger.Log("下件点小车到位了,但是没有匹配到小车信息");
// }
// }
// }
// catch (Exception ex)
// {
// logger.Error("小车下件到位通知异常:" + ex.Message + ex.StackTrace);
// IsRuning = false;
// logger = null;
// // return "系统异常";
// }
// Thread.Sleep(1000);
// }
//}
/// <summary>
/// 启动小车扫描监听队列
/// </summary>
private void StartScanThriftLogic(object thriftpoint)
{
int point = Convert.ToInt32(thriftpoint);
this.LineNo = this.LineNo;
XGL.Thrift.ThriftServiceImp business = new XGL.Thrift.ThriftServiceImp();
XGL.Thrift.ThriftCommon thriftCommon = new XGL.Thrift.ThriftCommon();
thriftCommon.Start(business, point);
}
/// <summary>
/// 下位机点击发车
/// </summary>
/// <param name="carlist"></param>
/// <returns></returns>
public string OffMaterialFromCar(string Temp)
{
List<UpLineScanCarList> mlist = new List<UpLineScanCarList>();
Logger logger = new Logger();
if (!IsRuning)
{
IsRuning = true;
try
{
while (true)
{
if (!string.IsNullOrEmpty(this.OffMaterialId))
{
///读取小车号
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(ScanPoint.PlcSetting4);
///回写plc状态处理完成,plc会清理数据
object wcsend = this.plcHelper.Read(ScanPoint.PlcSetting5);
if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(wcsend) == 0 && Convert.ToInt32(wcsstate) == 0 && Convert.ToInt32(carstate) == 1 && Convert.ToInt32(carrun) == 0 && IsPlcRead == false)
{
logger.Log("[" + carno + "]小车到了 [" + this.LineNo + "]号下件件点");
//中一系统 在点位配置维护的时候, 一个节点的子级 不需要维护多个,只需要把特定线路的点维护,然后根据线体去找到库位口位置
// ScanPoint.CarNo = carno.ToString();
//判断小车号是否存在 ,使用内存记录
// CarRealInfo car = DBService.GetCarModel(carno.ToString());
CarRealInfo car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault();
if (car != null)
{
car.MaterialBarNo = "";
car.MaterialNo = "";
car.MaterialInfo = null;
//car.LocatorNodeId = null;
//car.LocatorNodeSetting = null;
car.IsOutLocator = 0;
car.IsOver = 0;
car.IsProOutLocator = 0;
car.LocatorId = 0;
car.LocatorArea = null;
car.CurrNodeId = this.ScanPoint.Id;
car.CurrNodeSetting = this.ScanPoint;
DBService.ModifyRealCarinfoRecord(car);
}
////点位记录小车编号
//ScanPoint.CarNo = car.CarNo;
lock (StaticData.offMaterialCarLock)
{
OffLineMaterialList offline = StaticData.OffMaterialList.FirstOrDefault(t => t.Id == car.OffMaterialId);
if (offline != null)
{
logger.Log("匹配到下件信息,");
if (offline.Number == 0)
{
logger.Log("匹配到下件信息数量=0 ,删除队列信息,");
DBService.DeleteOffLineMaterial(offline.Id);
StaticData.OffMaterialList.Remove(offline);
}
}
}
///回写plc状态,起点的分支线路为1
var processNode = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == ScanPoint.Id && t.NodeValue == 1001);
this.plcHelper.Write(ScanPoint.PlcSetting4, processNode.AfterNodeSetting.NodeNo);
///回写plc状态处理完成,plc会清理数据
this.plcHelper.Write(ScanPoint.PlcSetting5, 1);
// IsPlcRead = true;
DBService.AddSystemLog(this.ScanPoint.NodeNo, car);
logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + processNode.AfterNodeSetting.NodeNo);
}//小车移动中指定点位后,并且到位了
else if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(carrun) == 1 && Convert.ToInt32(wcsend) == 1)
{
///回写plc状态,,plc会清理数据
this.plcHelper.Write(ScanPoint.PlcSetting4, 0);
///回写plc状态处理完成,plc会清理数据
this.plcHelper.Write(ScanPoint.PlcSetting5, 0);
IsRuning = false;
mlist = null;
// logger = null;
return "";
}
}
else
{
logger.Log("[" + this.LineNo + "] 请求下件的小车 物料信息不存在");
IsRuning = false;
//logger = null;
return "小车号错误";
}
Thread.Sleep(1000);
}
}
catch (Exception ex)
{
logger.Error("发车操作异常:" + ex.Message + ex.StackTrace);
IsRuning = false;
mlist = null;
//logger = null;
return "系统异常";
}
}
else
{
Console.WriteLine("小车运行中,等待plc反馈中");
// logger = null;
mlist = null;
return "小车运行中";
}
}
/// <summary>
/// 下位机点击拉回
/// </summary>
/// <param name="carlist"></param>
/// <returns></returns>
public string OffMaterialBackCar(List<string> materialcarno)
{
List<UpLineScanCarList> mlist = new List<UpLineScanCarList>();
Logger logger = new Logger();
if (!IsRuning)
{
IsRuning = true;
try
{
while (true)
{
if (!string.IsNullOrEmpty(this.OffMaterialId))
{
///读取小车号
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(ScanPoint.PlcSetting4);
///回写plc状态处理完成,plc会清理数据
object wcsend = this.plcHelper.Read(ScanPoint.PlcSetting5);
if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(wcsend) == 0 && Convert.ToInt32(wcsstate) == 0 && Convert.ToInt32(carstate) == 1 && Convert.ToInt32(carrun) == 0 && IsPlcRead == false)
{
logger.Log("[" + carno + "]小车到了 [" + this.LineNo + "]号下件件点");
CarRealInfo car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault();
if (car != null)
{
car.MaterialBarNo = "";
//car.LocatorNodeId = null;
//car.LocatorNodeSetting = null;
car.IsOutLocator = 0;
car.IsOver = 0;
car.IsProOutLocator = 0;
car.LocatorId = 0;
car.LocatorArea = null;
car.CurrNodeId = this.ScanPoint.Id;
car.CurrNodeSetting = this.ScanPoint;
DBService.ModifyRealCarinfoRecord(car);
}
////点位记录小车编号
//ScanPoint.CarNo = car.CarNo;
lock (StaticData.offMaterialCarLock)
{
OffLineMaterialList offline = StaticData.OffMaterialList.FirstOrDefault(t => t.Id == car.OffMaterialId);
if (offline != null)
{
offline.Number += 1;
logger.Log("拉回操作:匹配到下件信息数量+1 ,");
DBService.UpdateOffLineMaterialList(offline);
}
}
///回写plc状态,起点的分支线路为1
var processNode = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == ScanPoint.Id && t.NodeValue == 1001);
this.plcHelper.Write(ScanPoint.PlcSetting4, processNode.AfterNodeSetting.NodeNo);
///回写plc状态处理完成,plc会清理数据
this.plcHelper.Write(ScanPoint.PlcSetting5, 1);
// IsPlcRead = true;
DBService.AddSystemLog(this.ScanPoint.NodeNo, car);
logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + processNode.AfterNodeSetting.NodeNo);
}//小车移动中指定点位后,并且到位了
else if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(carrun) == 1 && Convert.ToInt32(wcsend) == 1)
{
///回写plc状态,,plc会清理数据
this.plcHelper.Write(ScanPoint.PlcSetting4, 0);
///回写plc状态处理完成,plc会清理数据
this.plcHelper.Write(ScanPoint.PlcSetting5, 0);
IsRuning = false;
mlist = null;
// logger = null;
return "";
}
}
else
{
logger.Log("[" + this.LineNo + "] 请求下件的小车 物料信息不存在");
IsRuning = false;
logger = null;
return "小车号错误";
}
Thread.Sleep(1000);
}
}
catch (Exception ex)
{
logger.Error("发车操作异常:" + ex.Message + ex.StackTrace);
IsRuning = false;
mlist = null;
logger = null;
return "系统异常";
}
}
else
{
Console.WriteLine("小车运行中,等待plc反馈中");
// logger = null;
mlist = null;
return "小车运行中";
}
}
}
}