| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475 | 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 重载实现        /// <summary>        /// 调度PLC执行任务        /// </summary>        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;        /// <summary>        /// 1013请求入库        /// </summary>        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);        }        /// <summary>        /// 扫码执行任务        /// </summary>        private void Conv_ScanBarCodeExeTask()        {            Conv_Scanning_1456();            Conv_ScanningRequestIn(Conv_1451, Conv_1451);            Conv_ScanningRequest(Conv_1004, Current.WareHouseId, Conv_1002);        }        /// <summary>        /// WCS写入输送线执行任务        /// </summary>        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);        }        /// <summary>        /// 输送线扫码执行        /// </summary>        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);            }        }        /// <summary>        /// 输送线无扫码执行任务        /// </summary>        /// <param name="convNo">扫码输送线</param>        /// <param name="exitNo">扫码异常退出口</param>        /// <param name="endPosIsCurConv">目标地址是否当前输送线</param>        /// <param name="plcindex">PLC索引</param>        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);            }        }        /// <summary>        /// 堆垛机出口输送线任务执行(任务目标地址的下个地址只支持单一地址)        /// </summary>        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<WCS_EQUIPMENTROUTE> 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;    }}
 |