| 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());
 
-     //        }
 
-     //    }
 
-     //}
 
- }
 
 
  |