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