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.

314 lines
11 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 Logic3001OffLine
{ /// <summary>
/// plc 正在读取
/// </summary>
bool IsPlcRead { get; set; }
Thread OffMaterialThriftThread;
PlcHelper plcHelper;
string LineNo { get; set; }
int Thriftpoint { get; set; }
NodeSetting ScanPoint { get; set; }
/// <summary>
/// 箱体出库操作点
/// </summary>
NodeSetting BoxOutPoint { get; set; }
/// <summary>
/// 物料到位后,推送给客户端
/// </summary>
Thread OffClientThread { get; set; }
/// <summary>
/// 当前到位的小车物料
/// </summary>
string OffMaterialId { get; set; }
/// <summary>
/// 是否运行发车中
/// </summary>
bool IsRuning { get; set; }
public Logic3001OffLine(PlcHelper plc, string nodeno, string outboxno, int thrifthport)
{
try {
this.ScanPoint = StaticData.NodeSettingList.FirstOrDefault(t => t.NodeNo == nodeno);
this.BoxOutPoint = StaticData.NodeSettingList.FirstOrDefault(t => t.NodeNo == outboxno);
this.Thriftpoint = thrifthport;
if (this.ScanPoint != null)
{
this.LineNo = this.ScanPoint.LineCatchArea != null ? this.ScanPoint.LineCatchArea.LineNo : "1";
}
else
{
Logger logger = new Logger();
logger.Log("创建线体,未找到扫描点位");
}
this.LineNo = LineNo;
this.plcHelper = plc;
this.plcHelper.Write(this.ScanPoint.PlcSetting4, 0);
this.plcHelper.Write(this.ScanPoint.PlcSetting5, 0);
this.plcHelper.Write(this.BoxOutPoint.PlcSetting2, 0);
// this.plcHelper.Write(this.OpteratePoint.PlcSetting2, 0);
//}
}
catch (Exception ex)
{
Console.WriteLine("站点" + nodeno + " 初始化数据异常" + ex.Message);
Logger logger = new Logger();
logger.Error("站点" + nodeno + " 初始化数据异常" + ex.Message);
}
}
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();
var scanmaterial = StaticData.OffMaterialList.LastOrDefault();
string lastmaterialno = "";
if (scanmaterial != null)
{
lastmaterialno = scanmaterial.ProductBarNo;
}
while (true)
{
try
{
object materialno = this.plcHelper.Read(this.BoxOutPoint.PlcSetting1);
string materialstr = materialno.ToString();
string readstate = materialstr.Substring(63, 6).ToUpper();
if (readstate == "NOREAD")
{
//无条码
}
else
{
lock (StaticData.offMaterialCarLock)
{
string materialserialno = materialstr.Substring(63, 24).ToUpper();
string material = materialstr.Substring(63, 9).ToUpper();
logger.Log("扫描物料信息" + materialserialno + " [" + material + "]");
if (lastmaterialno != material)
{
OffLineMaterialList scan = new OffLineMaterialList();
scan.MaterialNo = material.ToUpper();
var materialinfo = StaticData.MateriaList.FirstOrDefault(t => t.MaterialNo == scan.MaterialNo);
if (materialinfo != null)
{
scan.MaterialDes = materialinfo.MaterialNm;
}
scan.IsOver = 0;
scan.CreateTime = DateTime.Now;
int id = DBService.AddOffLineMaterialList(scan);
scan.Id = id;
StaticData.OffMaterialList.Add(scan);
}
}
}
///读取小车号
object carobj = this.plcHelper.Read(this.ScanPoint.PlcSetting1);
string carno = Common.getCarNoByPlcPoint(carobj);
//小车是否到位
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);
// 1 已下件 , ,0 未下件
//this.plcHelper.Write(this.OpteratePoint.PlcSetting1, 0);
if (carno != null && carstate != null && carrun != null && wcsstate != null && wcsend != null)
{
if (Convert.ToInt32(wcsend) == 0 && Convert.ToInt32(wcsstate) == 0 && Convert.ToInt32(carstate) == 1 && Convert.ToInt32(carrun) == 0 && Convert.ToInt32(carno) > 0)
{
string carNo = carno.ToString();
var car = StaticData.CarRealList.FirstOrDefault(t => t.CarNo == carNo);
if (car != null)
{
car.CurrNodeId = this.ScanPoint.Id;
car.IsOutLocator = 0;
car.IsOver = 0;
car.IsProOutLocator = 0;
car.LineAreaNo = "";
car.LocatorArea = null;
car.LocatorId = 0;
car.LocatorNodeId = 0;
car.MaterialBarNo = "";
car.MaterialInfo = null;
car.MaterialNo = "";
car.Number = 0;
car.OptDt = DateTime.Now;
car.ProLocatorArea = null;
if (car.OffMaterialId > 0)
{
var offmaterial = StaticData.OffMaterialList.FirstOrDefault(t => t.Id == car.OffMaterialId);
if (offmaterial != null)
{
offmaterial.IsDeleted = 1;
DBService.UpdateOffLineMaterialList(offmaterial);
}
}
//清除小车门体对应的产品列表
DBService.DeleteCarMaterialByCarNo(car.CarNo);
//清除小车上的门体数据列表
DBService.DeleteCarProductByCarNo(car.CarNo);
car.LoadingMaterial.Clear();
car.LoadingProduct.Clear();
car.OffMaterialId = 0;
DBService.ModifyRealCarinfoRecord(car);
this.plcHelper.Write(this.ScanPoint.PlcSetting4, 1);
this.plcHelper.Write(this.ScanPoint.PlcSetting5, 1);
}
else
{
logger.Log("下件点小车号[" + carno + "]未找到小车");
}
}
else if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(carrun) == 1 && Convert.ToInt32(wcsend) == 1)
{
//下件完成 ,小车离开
// IsPlcRead = false;
var car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault();
if (car != null)
{
this.plcHelper.Write(this.ScanPoint.PlcSetting4, 0);
this.plcHelper.Write(this.ScanPoint.PlcSetting5, 0);
}
}
}
}
catch (Exception ex)
{
logger.Error("小车下件到位通知异常:" + ex.Message + ex.StackTrace);
IsRuning = false;
// 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();
business.SendOutLocatorBarcodeEvent += ScanOutLocatorBarCode;
XGL.Thrift.ThriftCommon thriftCommon = new XGL.Thrift.ThriftCommon();
thriftCommon.Start(business, point);
}
private string ScanOutLocatorBarCode(string barcode)
{
string lastmaterialno = "";
Logger logger = new Logger();
lock (StaticData.offMaterialCarLock)
{
string material = barcode.Substring(0, 9).ToUpper();
logger.Log("扫描物料信息" + barcode + " [" + material + "]");
if (lastmaterialno != material)
{
OffLineMaterialList scan = new OffLineMaterialList();
scan.MaterialNo = material.ToUpper();
var materialinfo = StaticData.MateriaList.FirstOrDefault(t => t.MaterialNo == scan.MaterialNo);
if (materialinfo != null)
{
scan.MaterialDes = materialinfo.MaterialNm;
}
scan.Number = 1;
scan.IsOver = 0;
scan.CreateTime = DateTime.Now;
int id = DBService.AddOffLineMaterialList(scan);
scan.Id = id;
StaticData.OffMaterialList.Add(scan);
}
}
return "";
}
}
}