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 { /// /// 预执行任务号 /// public int WaitExecTaskNo { get; set; } /// /// 预执行上料点 /// public string WaitExecOnMatPosNo { get; set; } /// /// 预执行下料点 /// 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 { /// /// 预执行信息 /// protected WaitExecInfo WaitExecTask = new WaitExecInfo(); #region Constructor public Base_Rgv() : base() { } #endregion; #region 属性 /// /// RGV当前位置 /// 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; } } /// /// RGV上下料列表 /// protected List 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(); } } /// /// RGV上料点列表 /// protected virtual List RGVOnPosList { get { var _onPosList = RGVOnUpPosList.Where(v => v.RGVOUTIN_ISSTOP == false && (v.RGVOUTIN_OUTINTYPE == "OnMat" || v.RGVOUTIN_OUTINTYPE == "OnUpMat")).ToList(); return _onPosList; } } /// /// RGV下料点列表 /// protected virtual List RGVUpPosList { get { var _upPosList = RGVOnUpPosList.Where(v => v.RGVOUTIN_ISSTOP == false && (v.RGVOUTIN_OUTINTYPE == "UpMat" || v.RGVOUTIN_OUTINTYPE == "OnUpMat")).ToList(); return _upPosList; } } #endregion; #region 方法 /// /// 写入任务到穿梭车 /// /// Rgv写入信号 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().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)); } } } } /// /// 写入任务信息 /// /// 写入的信息 protected void WriteTaskToBuffer(WCSWriteToRgvSignal rgvwrite) { List list = new List(); //写入任务号 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)); } } /// /// 修改任务信息 /// protected virtual void UpdateRgvTaskStatus(SqlSugarClient db, WCSWriteToRgvSignal rgvwrite) { } #endregion; } public struct WCSWriteToRgvSignal { /// /// 工位 /// public RgvPosEnum RgvPos; public PLC Plc; /// /// DB名称 /// public int DBName; /// /// RGV编号 /// public string RgvNo; /// /// 写入信号起始地址 /// public int WriteStartAddress; /// /// 任务号 /// public int Tasknum; /// /// 1取货、2放货、3移动、4码盘、5拆盘 、6、变更放货站台、7变更取货站台(环穿、双工位使用) /// public int TaskType; /// /// 起始地址 /// public int StartPosition; /// /// 目标地址 /// public int DestPosition; /// /// 优先级 /// public int Priority; public int RES1; public int RES2; /// /// WCS写入1,plc清零 /// public int Trigger; } //public class RGVList //{ // /// // /// Rgv运行 // /// // public static void RgvRun() // { // try // { // foreach (var rgv in Current.RgvSet) // { // ThreadHelper.TaskThread(rgv.RgvRun); // } // } // catch (Exception ex) // { // Log4netHelper.Logger_Error.ErrorFormat(ex.ToString()); // } // } //} }