using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using WCS.Data;
using WCS.Data.Models;
using WCS.Data.Utils;
using WCS.PLC;
namespace WCS.Workflow
{
public class ConveyorPlc01 : Base_Conv
{
#region 只读变量
private readonly string Conv_1002 = "1002";
private readonly string Conv_1004 = "1004";
private readonly string Conv_1013 = "1013";
private readonly string Conv_1023 = "1023";
private readonly string Conv_1009 = "1009";
private readonly string Conv_1454 = "1454";
private readonly string Conv_1455 = "1455";
private readonly string Conv_1456 = "1456";
private readonly string Conv_1441 = "1441";
private readonly string Conv_1440 = "1440";
private readonly string Conv_1442 = "1442";
private readonly string Conv_1445 = "1445";
private readonly string Conv_1447 = "1447";
private readonly string Conv_1449 = "1449";
private readonly string Conv_1451 = "1451";
#endregion;
#region 重载实现
///
/// 调度PLC执行任务
///
public override void Run()
{
//刷新任务数据
WCSWorkflow.RefreshData();
//扫码执行任务
Conv_ScanBarCodeExeTask();
//电控无扫码执行任务
Conv_NoScanExeTask();
//堆垛机出口任务执行
SrmOutConvExeTask();
//出口任务完成
ConvTaskFinish();
//输送机执行任务
ConveyorWriteTaskExecute();
}
#endregion;
#region 多线程调用
#endregion;
#region 模块调用
private void Conv_NoScanExeTask()
{
Conv_NotScannExeTask(Conv_1013, string.Empty);
//ThreadHelper.TaskThread(Conv_NotScannExeTask_1013);
//ThreadHelper.TaskThread(Conv_NotScannExeTask_1004);
//Conv_NotScannExeTask(Conv_1004, string.Empty, false, 1);
}
private static int _conv_NotScannExeTask = 0;
///
/// 1013请求入库
///
public void Conv_NotScannExeTask_1013()
{
if (Interlocked.Exchange(ref _conv_NotScannExeTask, 1) == 0)
{
Conv_NotScannExeTask(Conv_1013, string.Empty, false, 0);
Interlocked.Exchange(ref _conv_NotScannExeTask, 0);
}
}
//public void Conv_NotScannExeTask_1004()
//{
// if (Interlocked.Exchange(ref _conv_NotScannExeTask, 1) == 0)
// {
// Conv_NotScannExeTask(Conv_1004, string.Empty, false, 0);
// Interlocked.Exchange(ref _conv_NotScannExeTask, 0);
// }
//}
private void ConvTaskFinish()
{
ConveyorTaskFinish(PlcName, Conv_1454);
ConveyorTaskFinish(PlcName, Conv_1455);
ConveyorTaskFinish(PlcName, Conv_1456, false, true);
ConveyorTaskFinish(PlcName, Conv_1445, false, true);
ConveyorTaskFinish(PlcName, Conv_1447, false, true);
ConveyorTaskFinish(PlcName, Conv_1449, false, true);
}
///
/// 扫码执行任务
///
private void Conv_ScanBarCodeExeTask()
{
Conv_Scanning_1456();
Conv_ScanningRequestIn(Conv_1451, Conv_1451);
Conv_ScanningRequest(Conv_1004, Current.WareHouseId, Conv_1002);
}
///
/// WCS写入输送线执行任务
///
private void ConveyorWriteTaskExecute()
{
ConveyorWriteTaskExecute(Conv_1009);
ConveyorWriteTaskExecute(Conv_1023);
}
private void SrmOutConvExeTask()
{
SrmOutConvExeTask(PlcName, Conv_1454, true);
SrmOutConvExeTask(PlcName, Conv_1455, true);
SrmOutConvExeTask(PlcName, Conv_1456, true);
SrmOutConvExeTask(PlcName, Conv_1441, false);
SrmOutConvExeTask(PlcName, Conv_1442, true);
}
#endregion;
#region 功能实现
private void Conv_ScanningRequestIn(string convNo, string exitNo, bool iscurPosNo = true)
{
try
{
var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
var cs = conveyor.EquSignal_Conv;
if (!cs.DB521_Request) return;
if (cs.DB520_Confirm) return;
WCS_TASK task = QueryTaskByBarcode(cs, convNo);
if (task == null)
{
var param = new GetInTaskParam()
{
ContainerBarCode = cs.BarCodeStr,
ContainerType = cs.DB521_Goodstype > 0 ? cs.DB521_Goodstype : 1,
MatBarCode = string.Empty,
WareHouseId = Current.Pvchouseputong,
EquipmentNo = convNo,
EndPostion = srm,
Memo2 = exitNo
};
task = ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param);
}
if (task == null) return;
//判断任务是否已经执行
if (task.TASK_WKSTATUS >= 2) return;
bool notask = false;
int goodsend = 0;
if (task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回)
{
notask = true;
goodsend = Convert.ToInt32(exitNo);
}
else
{
if (iscurPosNo)
{
goodsend = Convert.ToInt32(convNo);
}
else
{
var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO);
var route = routeSet.FirstOrDefault(v => v.ROUTE_STARTPOS == convNo);
goodsend = Convert.ToInt32(route.ROUTE_SONPOS);
}
}
if (goodsend == 0) return;
var converywrite = new WCSWriteToConveyorSignal()
{
Plc = plc.Plc,
DBName = plc.WriteDBName,
ConveyorNo = convNo,
WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox,
Tasknum = task.TASK_NO,
Goodstype = 1,
Goodssize = 0,//
Goodsstart = Convert.ToInt32(convNo),
Goodsend = goodsend,
Notask = notask
};
if (convNo == Conv_1451)
{
LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]任务[{1}]条码[{2}]外检高度[{3}](零值默认为1)。", convNo, task.TASK_NO, cs.BarCodeStr, cs.DB521_Goodstype), true, LogLevelEnum.INFO.ToString());
}
WriteInfoToConv(cs, converywrite);
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
protected override WCS_TASK ScanningCallWmsInterface(GetInTaskParam param)
{
//if (param.EquipmentNo == Conv_1004)
//{
// param.Memo1 = "1";
//}
return base.ScanningCallWmsInterface(param);
}
///
/// 输送线扫码执行
///
private void Conv_Scanning_1456()
{
try
{
var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_1456);
var cs = conveyor.EquSignal_Conv;
if (!cs.DB521_Request) return;
if (cs.DB520_Confirm) return;
if (cs.DB521_Tasknum <= 0) return;
//if (cs.DB521_BCR_Noread) throw new Exception(string.Format("输送线[{0}]报读码错误,但是存在请求。", Conv_1456));
//if (string.IsNullOrWhiteSpace(cs.BarCodeStr)) throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", Conv_1456));
//if (cs.BarCodeStr.ToUpper().Contains("ERROR") ||
// cs.BarCodeStr.ToUpper().Contains("N") ||
// cs.BarCodeStr.Contains("?"))
//{
// throw new Exception(string.Format("输送线[{0}]存在请求信号,但条码是:[{1}]存在报错,PLC应该报条码错误信号", Conv_1456, cs.BarCodeStr));
//}
var converywrite = new WCSWriteToConveyorSignal();
converywrite.Plc = plc.Plc;
converywrite.DBName = plc.WriteDBName;
converywrite.ConveyorNo = Conv_1456;
converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
var tasktemp = Current.TaskSet.FirstOrDefault(v => v.TASK_POSIDTO == Conv_1456 && v.TASK_WKSTATUS > 1 && v.TASK_COMTYPE == 2);
if (tasktemp != null)
{
converywrite.Notask = true;
string msg = string.Format("出入口[{0}]存在出库任务[{1}]不能执行入库", Conv_1456, tasktemp.TASK_NO);
BaseWorkflow.AddLedErrorMsg(Conv_1456, msg, 1);
}
else
{
var task = QueryTaskByBarcode(cs, Conv_1456);
//var task = Current.TaskSet.FirstOrDefault(v => v.TASK_BOXBARCODE == cs.BarCodeStr);
if (task == null)
{
var param = new GetInTaskParam()
{
ContainerBarCode = cs.BarCodeStr,
ContainerType = 1,
MatBarCode = string.Empty,
WareHouseId = Current.Pvchouseputong,
EquipmentNo = Conv_1456,
EndPostion = srm,
Memo1 = "1",
Memo2 = Conv_1456
};
task = ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param);
}
if (task == null) return;
//判断任务是否已经执行
if (task.TASK_WKSTATUS >= 2) return;
if (task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回)
{
converywrite.Notask = true;
}
converywrite.Tasknum = task.TASK_NO;
converywrite.Goodstype = 1;
converywrite.Goodssize = 0;//
converywrite.Goodsstart = Convert.ToInt32(Conv_1456);
converywrite.Goodsend = converywrite.Goodsstart;
}
//WriteInfoToConveyor(cs, converywrite);
WriteInfoToConv(cs, converywrite);
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
///
/// 输送线无扫码执行任务
///
/// 扫码输送线
/// 扫码异常退出口
/// 目标地址是否当前输送线
/// PLC索引
private void Conv_NotScannExeTask(string convNo, string exitNo, bool endPosIsCurConv = false, int plcindex = 0)
{
try
{
var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
var cs = conveyor.EquSignal_Conv;
if (cs.DB523_Fault) return;
if (!cs.DB521_Request) return;
var task = Current.TaskSet.FirstOrDefault(v => v.TASK_POSIDFROM == convNo && v.TASK_POSIDCUR == convNo && v.TASK_POSIDNEXT == convNo && v.TASK_WKSTATUS <= 1);
if (task == null)
{
throw new Exception(string.Format("输送线[{0}]有请求未查询到任务信息", convNo));
}
var converywrite = new WCSWriteToConveyorSignal();
converywrite.Plc = plc.PlcInstanceSet[plcindex];//plc.Plc;
converywrite.DBName = plc.WriteDBName;
converywrite.ConveyorNo = convNo;
converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
converywrite.Tasknum = task.TASK_NO;
converywrite.Goodscode = 0;
converywrite.Goodstype = 0;
converywrite.Goodssize = 0;
converywrite.Goodsstart = Convert.ToInt32(convNo);
if (endPosIsCurConv)
{
converywrite.Goodsend = converywrite.Goodsstart;
}
else
{
//if (task.TASK_POSIDTO == srm)
//{
// ThreadHelper.TaskThread(BaseWorkflow.AssignSrm, task, 2000);
// return;
//}
var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO);
var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convNo).ToList();
if (routes.Count == 1)
{
converywrite.Goodsend = Convert.ToInt32(routes[0].ROUTE_SONPOS);
}
else
{
converywrite.Goodsend = ConveyorWriteTaskExecuteToMoreAddress(convNo, task, routes);
}
}
WriteInfoToConv(cs, converywrite);
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
///
/// 堆垛机出口输送线任务执行(任务目标地址的下个地址只支持单一地址)
///
private void SrmOutConvExeTask(string plcName, string convNo, bool endPosIsCurConv = false)
{
try
{
var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == plcName);
var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
var cs = conveyor.EquSignal_Conv;
if (!cs.DB521_Request) return;
if (cs.DB523_Fault) return;
var taskSet = Current.TaskSet.Where(v => v.TASK_POSIDNEXT == convNo).ToList();
var task = taskSet.SingleOrDefault(v => v.TASK_WKSTATUS == (int)WkStatus.堆垛机完成);
if (task == null)
{
throw new Exception(string.Format("堆垛机出口输送线[{0}]存在请求信号,但没查询到任务信息。", convNo));
}
var converywrite = new WCSWriteToConveyorSignal();
converywrite.Plc = plc.Plc;
converywrite.DBName = plc.WriteDBName;
converywrite.ConveyorNo = convNo;
converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
converywrite.Tasknum = task.TASK_NO;
converywrite.Goodscode = 0;
converywrite.Goodstype = 0;
converywrite.Goodssize = 0;
converywrite.Goodsstart = Convert.ToInt32(convNo);
if (endPosIsCurConv)
{
converywrite.Goodsend = converywrite.Goodsstart;
}
else
{
var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO);
var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convNo).ToList();
if (routes.Count == 1)
{
converywrite.Goodsend = Convert.ToInt32(routes[0].ROUTE_SONPOS);
}
else
{
throw new Exception(string.Format("输送线[{0}]任务[{1}]请求该函数不支持多个分支输送地址,请编写扩展函数。", convNo, task.TASK_NO));
}
}
//WriteInfoToConveyor(cs, converywrite);
WriteInfoToConv(cs, converywrite);
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
public override int ConveyorWriteTaskExecuteToMoreAddress(string convNo, WCS_TASK task, List routes)
{
int goodsend = 0;
if (convNo == Conv_1013 || convNo == Conv_1009)
{
if (task.TASK_EndTunnelNum == "1" && task.TASK_SRMNO == "srm01")
{
goodsend = 1027;
}
else if (task.TASK_EndTunnelNum == "2" && task.TASK_SRMNO == "srm01")
{
goodsend = 1026;
}
else
{
throw new Exception(string.Format("任务[{0}]堆垛机编号[{1}]目标巷道[{2}]不正确。", task.TASK_NO, task.TASK_SRMNO, task.TASK_EndTunnelNum));
}
}
else if (convNo == Conv_1023)
{
BaseWorkflow.AssignSrm(task);
if (task.TASK_EndTunnelNum == "1")
{
goodsend = 1027;
}
else if (task.TASK_EndTunnelNum == "2")
{
goodsend = 1026;
}
else
{
throw new Exception(string.Format("任务[{0}]分配巷道失败。", task.TASK_NO));
}
}
else
{
throw new Exception(string.Format("该函数不支持多个分支输送地址,请编写扩展接口。"));
}
return goodsend;
}
#endregion;
}
}