| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393 | using System;using System.Collections.Generic;using System.Text;using WCS.Data;using System.Linq;using WCS.Data.Models;using SqlSugar;using System.Threading;using WCS.PLC.Model.Equipment;namespace WCS.PLC{    public enum RgvPosEnum    {        一号工位 = 1,        二号工位 = 2,    }    public class WaitExecInfo    {        /// <summary>        /// 预执行任务号        /// </summary>        public int WaitExecTaskNo { get; set; }        /// <summary>        /// 预执行上料点        /// </summary>        public string WaitExecOnMatPosNo { get; set; }        /// <summary>        /// 预执行下料点        /// </summary>        public string WaitExecUpMatPosNo { get; set; }        public bool IsNotEmpty()        {            if (WaitExecTaskNo > 0 &&               (string.IsNullOrWhiteSpace(WaitExecOnMatPosNo) == false) &&               (string.IsNullOrWhiteSpace(WaitExecUpMatPosNo) == false))            {                return true;            }            else            {                return false;            }        }        public void SetInfo(int waiteExecTaskNo, string waitExecOnMatPosNo, string waitExecUpMatPosNo)        {            WaitExecTaskNo = waiteExecTaskNo;            WaitExecOnMatPosNo = waitExecOnMatPosNo;            WaitExecUpMatPosNo = waitExecUpMatPosNo;        }        public void Clear()        {            WaitExecTaskNo = 0;            WaitExecOnMatPosNo = string.Empty;            WaitExecUpMatPosNo = string.Empty;        }    }    public abstract class Base_Rgv : Base_EquPlc    {        /// <summary>        /// 预执行信息        /// </summary>        protected WaitExecInfo WaitExecTask = new WaitExecInfo();        #region Constructor        public Base_Rgv() : base() { }        #endregion;        #region 属性         /// <summary>        /// RGV当前位置        /// </summary>        protected string RgvCurrentSition        {            get            {                //RGV当前地址                string curPosNo = string.Empty;                if (Rgv.DB521_ToSition_1) curPosNo = Rgv.DB521_DestPosition_1.ToString();                else if (Rgv.DB521_ToSition_2) curPosNo = Rgv.DB521_DestPosition_2.ToString();                if (string.IsNullOrWhiteSpace(curPosNo))                {                    var tempList = Current.WCS_RGVOutInInfoSet.Where(v => v.RGVOUTIN_RGVNO == PlcName).ToList();                    curPosNo = tempList[0].RGVOUTIN_CONVNO;                }                return curPosNo;            }        }        protected PLC RgvPlc        {            get            {                return WCS_PLCItem.Plc;            }        }        protected WCS_EQUIPMENTINFO RgvData        {            get            {                return WCS_PLCItem.WCS_EquipmentInfoSet[0];            }        }        public RGVSignal Rgv        {            get            {                return WCS_PLCItem.WCS_EquipmentInfoSet[0].EquSignal_Rgv;            }        }        /// <summary>        /// RGV上下料列表        /// </summary>        protected List<WCS_RGVOutInInfo> RGVOnUpPosList        {            get            {                var tempList = Current.WCS_RGVOutInInfoSet.Where(v => v.RGVOUTIN_RGVNO == PlcName).ToList();                var curItem = tempList.FirstOrDefault(v => v.RGVOUTIN_CONVNO == RgvCurrentSition);                if (curItem != null)                {                    foreach (var item in tempList)                    {                        int difference = item.RGVOUTIN_SEQUENCE - curItem.RGVOUTIN_SEQUENCE;                        item.RGVCURRENT_SEQUENCE = Math.Abs(difference);                    }                }                return tempList.OrderBy(v => v.RGVCURRENT_SEQUENCE).ToList();            }        }        /// <summary>        /// RGV上料点列表        /// </summary>        protected virtual List<WCS_RGVOutInInfo> RGVOnPosList        {            get            {                var _onPosList = RGVOnUpPosList.Where(v => v.RGVOUTIN_ISSTOP == false && (v.RGVOUTIN_OUTINTYPE == "OnMat" || v.RGVOUTIN_OUTINTYPE == "OnUpMat")).ToList();                return _onPosList;            }        }        /// <summary>        /// RGV下料点列表        /// </summary>        protected virtual List<WCS_RGVOutInInfo> RGVUpPosList        {            get            {                var _upPosList = RGVOnUpPosList.Where(v => v.RGVOUTIN_ISSTOP == false && (v.RGVOUTIN_OUTINTYPE == "UpMat" || v.RGVOUTIN_OUTINTYPE == "OnUpMat")).ToList();                return _upPosList;            }        }        #endregion;        #region 方法        /// <summary>        /// 写入任务到穿梭车        /// </summary>        /// <param name="rgvwrite">Rgv写入信号</param>        protected virtual void WriteTaskToRgv(WCSWriteToRgvSignal rgvwrite)        {            if (CheckTaskInfo(Rgv, rgvwrite))            {                WaitExecTask.Clear();                string result = TryCachHelper.TryTranExecute((db) =>                {                    UpdateRgvTaskStatus(db, rgvwrite);                    WriteTrigger(Rgv, rgvwrite);                });                if (!string.IsNullOrWhiteSpace(result))                    throw new Exception(string.Format("任务[{0}]RGV执行失败,原因:[{1}]", rgvwrite.Tasknum, result));            }            else            {                WriteTaskToBuffer(rgvwrite);            }        }        protected void WriteTask(WCSWriteToRgvSignal rgvwrite)        {            string cacheAreaName = rgvwrite.Tasknum.ToString();            var cacheInfo = SugarBase.DB.Queryable<WCS_CacheInfo>().First(v => v.Cache_ConvNo == rgvwrite.DestPosition.ToString());            if (cacheInfo != null)            {                cacheAreaName = cacheInfo.Cache_AreaName;            }            string errorMsg = WriteTaskToRgv(rgvwrite, cacheAreaName);            if (!string.IsNullOrWhiteSpace(errorMsg)) throw new Exception(errorMsg);        }        protected string WriteTaskToRgv(WCSWriteToRgvSignal rgvwrite, string cacheAreaName)        {            using (var mutex = new Mutex(false, cacheAreaName))            {                string resultMsg = string.Empty;                try                {                    if (mutex.WaitOne(-1, false))                    {                        WriteTaskToRgv(rgvwrite);                    }                }                catch (Exception ex)                {                    resultMsg = ex.Message;                }                finally                {                    mutex.ReleaseMutex();                }                return resultMsg;            }        }        private bool CheckTaskInfo(RGVSignal rgvSignal, WCSWriteToRgvSignal rgvwrite)        {            bool result = false;            if (rgvwrite.RgvPos == RgvPosEnum.一号工位)            {                if (rgvSignal.DB520_TaskID_1 == rgvwrite.Tasknum &&                    rgvSignal.DB520_TaskType_1 == rgvwrite.TaskType &&                    rgvSignal.DB520_StartPosition_1 == rgvwrite.StartPosition &&                    rgvSignal.DB520_DestPosition_1 == rgvwrite.DestPosition &&                    rgvSignal.DB520_Priority_1 == rgvwrite.Priority &&                    rgvSignal.DB520_Res1_1 == rgvwrite.RES1 &&                    rgvSignal.DB520_Res2_1 == rgvwrite.RES2)                {                    result = true;                }                else                {                    result = false;                }            }            else if (rgvwrite.RgvPos == RgvPosEnum.二号工位)            {                if (rgvSignal.DB520_TaskID_2 == rgvwrite.Tasknum &&                    rgvSignal.DB520_TaskType_2 == rgvwrite.TaskType &&                    rgvSignal.DB520_StartPosition_2 == rgvwrite.StartPosition &&                    rgvSignal.DB520_DestPosition_2 == rgvwrite.DestPosition &&                    rgvSignal.DB520_Priority_2 == rgvwrite.Priority &&                    rgvSignal.DB520_Res1_2 == rgvwrite.RES1 &&                    rgvSignal.DB520_Res2_2 == rgvwrite.RES2)                {                    result = true;                }                else                {                    result = false;                }            }            return result;        }        private void WriteTrigger(RGVSignal rgvSignal, WCSWriteToRgvSignal rgvwrite)        {            if (rgvwrite.RgvPos == RgvPosEnum.一号工位)            {                if (rgvSignal.DB520_Trigger_1 != 1)                {                    if (rgvwrite.Plc.WriteSignal((ushort)rgvwrite.DBName, 16, 2, 1))                    {                        WaitExecTask.Clear();                         Log4netHelper.Logger_Info.InfoFormat(string.Format("任务[{0}]穿梭车[{1}]写入触发信号成功!", rgvwrite.Tasknum, PlcName));                    }                    else                    {                        throw new Exception(string.Format("任务[{0}]穿梭车[{1}]写入触发信号失败!", rgvwrite.Tasknum, PlcName));                    }                }            }            else if (rgvwrite.RgvPos == RgvPosEnum.二号工位)            {                if (rgvSignal.DB520_Trigger_2 != 1)                {                    if (rgvwrite.Plc.WriteSignal((ushort)rgvwrite.DBName, 34, 2, 1))                    {                        Log4netHelper.Logger_Info.InfoFormat(string.Format("任务[{0}]穿梭车[{1}]写入触发信号成功!", rgvwrite.Tasknum, PlcName));                    }                    else                    {                        throw new Exception(string.Format("任务[{0}]穿梭车[{1}]写入触发信号失败!", rgvwrite.Tasknum, PlcName));                    }                }            }        }        /// <summary>        /// 写入任务信息        /// </summary>        /// <param name="rgvwrite">写入的信息</param>        protected void WriteTaskToBuffer(WCSWriteToRgvSignal rgvwrite)        {            List<byte> list = new List<byte>();            //写入任务号            list.AddRange(ExtendsUtil.UintToByte((uint)rgvwrite.Tasknum).ToList());            //类型            list.AddRange(ExtendsUtil.UshortToByte((ushort)rgvwrite.TaskType).ToList());            //写入起点地址            list.AddRange(ExtendsUtil.UshortToByte((ushort)rgvwrite.StartPosition).ToList());            //写入目标地址            list.AddRange(ExtendsUtil.UshortToByte((ushort)rgvwrite.DestPosition).ToList());            //优先级            list.AddRange(ExtendsUtil.UshortToByte((ushort)rgvwrite.Priority).ToList());            list.AddRange(ExtendsUtil.UshortToByte((ushort)rgvwrite.RES1).ToList());            list.AddRange(ExtendsUtil.UshortToByte((ushort)rgvwrite.RES2).ToList());            bool result = rgvwrite.Plc.Write((ushort)rgvwrite.DBName, (ushort)(rgvwrite.WriteStartAddress), list.ToArray());            if (result)            {                WaitExecTask.SetInfo(rgvwrite.Tasknum, rgvwrite.StartPosition.ToString(), rgvwrite.DestPosition.ToString());                Log4netHelper.Logger_Info.InfoFormat(string.Format("RGV[{0}]写入任务[{1}]起点地址[{2}]目标地址[{3}]是否托盘异常退回[{4}]成功。", rgvwrite.RgvNo, rgvwrite.Tasknum, rgvwrite.StartPosition, rgvwrite.DestPosition, rgvwrite.RES1));            }            else            {                throw new Exception(string.Format("RGV[{0}]写入任务[{1}]起点地址[{2}]目标地址[{3}]失败。", rgvwrite.RgvNo, rgvwrite.Tasknum, rgvwrite.StartPosition, rgvwrite.DestPosition));            }        }        /// <summary>        /// 修改任务信息        /// </summary>        protected virtual void UpdateRgvTaskStatus(SqlSugarClient db, WCSWriteToRgvSignal rgvwrite) { }        #endregion;    }    public struct WCSWriteToRgvSignal    {        /// <summary>        /// 工位        /// </summary>       public RgvPosEnum RgvPos;        public PLC Plc;        /// <summary>        /// DB名称        /// </summary>        public int DBName;        /// <summary>        /// RGV编号        /// </summary>        public string RgvNo;        /// <summary>        /// 写入信号起始地址        /// </summary>        public int WriteStartAddress;        /// <summary>        /// 任务号        /// </summary>        public int Tasknum;        /// <summary>        /// 1取货、2放货、3移动、4码盘、5拆盘 、6、变更放货站台、7变更取货站台(环穿、双工位使用)         /// </summary>        public int TaskType;        /// <summary>        /// 起始地址         /// </summary>        public int StartPosition;        /// <summary>        /// 目标地址        /// </summary>        public int DestPosition;        /// <summary>        /// 优先级        /// </summary>        public int Priority;        public int RES1;        public int RES2;        /// <summary>        /// WCS写入1,plc清零        /// </summary>        public int Trigger;    }    //public class RGVList    //{    //    /// <summary>    //    /// Rgv运行    //    /// </summary>    //    public static void RgvRun()    //    {    //        try    //        {    //            foreach (var rgv in Current.RgvSet)    //            {    //                ThreadHelper.TaskThread(rgv.RgvRun);    //            }    //        }    //        catch (Exception ex)    //        {    //            Log4netHelper.Logger_Error.ErrorFormat(ex.ToString());    //        }    //    }    //}}
 |