TrayStop.cs 16.9 KB
using OnlineStore;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DeviceLibrary
{
    public class TrayStop : DeviceBase, IDevice
    {
        public static Dictionary<string, TrayStop> DeviceList = new Dictionary<string, TrayStop>();

        public static void Init(Robot_Config config, Dictionary<string, DeviceGroup> devices,out string msg) {
            msg = "";
            foreach (var key in devices.Keys) {
                if (!devices[key].DeviceType.StartsWith("RT"))
                    continue;
                TrayStop sideMove = new TrayStop(devices[key],out string m);
                DeviceList.Add(devices[key].GroupName, sideMove);
                msg += m;
            }
        }
        DeviceGroup DeviceGroup;
        MoveInfo MoveInfo;
        public PuYueRFID_C2S RFID_1 = null;
        CylinderManger Location;
        public AxisBean axis;
        public AxisBean axis2;

        public TrayStop(DeviceGroup device,out string msg) {
            msg = "";
            Name = device.Name+"("+ device.GroupName + ")";
            DeviceGroup = device;
            GroupName = DeviceGroup.GroupName;
            Msg = new MsgService(GroupName);
            MoveInfo = new MoveInfo(GroupName);
            if (!string.IsNullOrEmpty(DeviceGroup.RFID_1))
            {
                RFID_1 = new PuYueRFID_C2S(DeviceGroup.RFID_1);
                if (!RFID_1.Open()) {
                    msg += DeviceGroup.GroupName + " RFID 1:" + DeviceGroup.RFID_1 +","+crc.GetString("Res0183","打开失败")+ "\r\n";
                }
            }
            Location = new CylinderManger($"托盘顶升", GroupName, IO_Type.MI_Location_Up, IO_Type.MI_Location_Down);

            var axisc = RobotManage.Config.moveAxisList.Find(ma => ma.GetAxisValue() == RobotManage.DeviceGroup[GroupName].AxisID);
            if (axisc != null)
            axis = new AxisBean(axisc, GroupName);
            axisc = RobotManage.Config.moveAxisList.Find(ma => ma.GetAxisValue() == RobotManage.DeviceGroup[GroupName].Axis2ID);
            if (axisc != null)
                axis2 = new AxisBean(axisc, GroupName);
        }
        public DeviceStateE DeviceState { get; set; }
        public void Start()
        {
            OpenAllServo();
            DeviceState = DeviceStateE.HomeReset;
            MoveInfo.NewMove(MoveStep.H01_HomeReset);
            MoveInfo.log("开始回原");
        }

        public void Stop()
        {
            DeviceState = DeviceStateE.Stop;
            MoveInfo.log("停止运行");
        }
        public void Process()
        {
            if (DeviceState == DeviceStateE.HomeReset)
                ResetProcess();
            else if (DeviceState == DeviceStateE.Run)
            {
                 OneWayProcess();
            }
        }
        int isalivetrytimes = 0;
        int StopBufDelayMS = 500;
        int StopDelayMS = 1500;
        public void OneWayProcess()
        {
            if (CheckWait(MoveInfo))
                return;

            switch (MoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    if (IOValue(IO_Type.MI_In_Check).Equals(IO_VALUE.HIGH))
                    {
                        MoveInfo.log("中间检测到托盘");
                        MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
                        Location.ToLow(MoveInfo);
                    }
                    else if (IOValue(IO_Type.MI_Front_Check).Equals(IO_VALUE.HIGH))
                    {
                        MoveInfo.NextMoveStep(MoveStep.TrayStop_01);
                        Location.ToLow(MoveInfo);
                        MoveInfo.log("入口检测到托盘");
                    }
                    else {
                        //Msg.add(crc.GetString("Res0184","空闲中"), MsgLevel.info);
                    }
                    break;
                case MoveStep.TrayStop_01:
                    MoveInfo.NextMoveStep(MoveStep.TrayStop_02);
                    IOMove(IO_Type.AMH_Front_Stop, IO_VALUE.HIGH, IO_Type.AMH_Front_Check, IO_VALUE.LOW, StopDelayMS);                    
                    break;
                case MoveStep.TrayStop_02:
                    if (IOValue(IO_Type.MI_In_Check).Equals(IO_VALUE.HIGH))
                    {
                        MoveInfo.NextMoveStep(MoveStep.TrayStop_03);
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                        MoveInfo.CanWhileCount = 3;
                        //Location.ToHigh(MoveInfo);
                    } else if (MoveInfo.IsTimeOut(10)){
                        MoveInfo.log("没有检测到托盘");
                        MoveInfo.NextMoveStep(MoveStep.Wait);
                    }
                    break;
                case MoveStep.TrayStop_03:
                    if (RFID_1.ReadByte(0x20, 16, out byte[] data, out string errmsg))
                    {
                        CurrrentRFID = Common.RfidFilter(data);
                        TrayManager.Process(MoveInfo, CurrrentRFID, DeviceGroup.addr_1, out TrayInfo trayInfo);
                        var stop = TrayManager.TryGetTrayRequest(GroupName, CurrrentRFID, out _);
                        MoveInfo.log($"CurrrentRFID:{CurrrentRFID},HasLoad:{trayInfo.HasLoad},MI_Reel_Check:{IOValue(IO_Type.MI_Reel_Check)},NeedStop:{stop}");
                        #region 张东亮处理
                        if (GroupName == "AMH-MI1" || GroupName == "AMH-MI2")
                        {
                            /*
                             * 请求一个空托盘
                                RemoteLoad remoteLoad = new RemoteLoad();
                                remoteLoad.GroupName = "AMH-MI1";
                                remoteLoad.RequestLoadInfo = new RequestLoadInfo();
                                remoteLoad.RequestLoadInfo.DeviceGroupName = "AMH-MI1";
                                remoteLoad.RequestLoadInfo.IsEmpty = true;
                                remoteLoad.RequestLoadInfo.TrayType = TrayTypeE.MTP1.ToString();
                                TrayManager.SetTrayRequest(remoteLoad);
                            */
                            /*物料出库
                            RemoteLoad remoteLoad = new RemoteLoad();
                            remoteLoad.GroupName = "AMH-MI1";
                            remoteLoad.RequestLoadInfo = new RequestLoadInfo();
                            remoteLoad.RequestLoadInfo.DeviceGroupName = "AMH-ML5-2";
                            remoteLoad.RequestLoadInfo.IsEmpty = false;
                            remoteLoad.RequestLoadInfo.TrayType = TrayTypeE.MTP1.ToString();
                            remoteLoad.RequestLoadInfo.LoadParam = new ReelParam();// 填充料盘信息
                            TrayManager.TrayRelease(remoteLoad); //这条会自动放行托盘并且写入托盘目的地
                            */
                            //伺服,压紧和旋转,
                            //  TrayStop.DeviceList["AMH-MI1"].axis;
                            //  TrayStop.DeviceList["AMH-MI1"].axis2;
                            //物料信息: trayInfo.TrayParam.clone()
                            //托盘直接放行: MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
                            //托盘处理完放行,全局方法: TrayStop.DeviceList["AMH-MI1"].TrayRelease();
                            if (stop && !trayInfo.HasLoad && IOValue(IO_Type.MI_Reel_Check).Equals(IO_VALUE.LOW))
                            {
                                MoveInfo.NextMoveStep(MoveStep.TrayStop_07);
                                //请求的空托盘到达时
                                
                            }
                            else if (trayInfo.DestinationAddr == DeviceGroup.addr_1 && trayInfo.HasLoad && IOValue(IO_Type.MI_Reel_Check).Equals(IO_VALUE.HIGH))
                            {
                                MoveInfo.NextMoveStep(MoveStep.TrayStop_07);
                                //抵达了一个有物料的托盘等待处理

                                var device = MI.DeviceList[trayInfo.Destination];
                                if (!device.IsFree())
                                    MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
                                else {
                                    device.StartInStore(trayInfo.TrayParam);
                                }
                            }
                            else
                                MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
                            return;
                        }
                        #endregion
                        if (stop && !trayInfo.HasLoad && IOValue(IO_Type.MI_Reel_Check).Equals(IO_VALUE.LOW))
                        {
                            MoveInfo.NextMoveStep(MoveStep.TrayStop_07);
                            RemoteLoad remoteLoad = new RemoteLoad();
                            remoteLoad.Action = "TrayReady";
                            remoteLoad.RequestLoadInfo = new RequestLoadInfo();
                            remoteLoad.RequestLoadInfo.TrayType = trayInfo.TrayType.ToString();
                            if (trayInfo.TrayParam!=null)
                                remoteLoad.RequestLoadInfo.LoadParam = trayInfo.TrayParam.clone();
                            remoteLoad.RequestLoadInfo.IsEmpty = true;

                            MoveInfo.remoteLoad = remoteLoad;
                            if (RemoteService.SendAndWait(GroupName, remoteLoad)!=RemoteResult.True)
                                MoveInfo.NextMoveStep(MoveStep.TrayStop_04);

                            SRec.info("托盘挡停", GroupName, "空托盘","准备接料", CurrrentRFID);
                            if (trayInfo.TrayParam != null)
                                ServerCommunication.UpdateRobotStatus(trayInfo.TrayParam.WareCode, RobotStatusE.INROBOT, MoveInfo.MoveParam.RFID);
                            return;
                        }
                        else if (trayInfo.DestinationAddr == DeviceGroup.addr_1 && trayInfo.HasLoad && IOValue(IO_Type.MI_Reel_Check).Equals(IO_VALUE.HIGH))
                        {
                            MoveInfo.NextMoveStep(MoveStep.TrayStop_07);
                            RemoteLoad remoteLoad = new RemoteLoad();
                            remoteLoad.Action = "TrayReady";
                            remoteLoad.RequestLoadInfo = new RequestLoadInfo();
                            remoteLoad.RequestLoadInfo.TrayType = trayInfo.TrayType.ToString();
                            remoteLoad.RequestLoadInfo.LoadParam = trayInfo.TrayParam.clone();
                            remoteLoad.RequestLoadInfo.IsEmpty = false;
                            MoveInfo.remoteLoad = remoteLoad;
                            var result = RemoteService.SendAndWait(GroupName, remoteLoad);
                            if (result != RemoteResult.True)
                            {
                                MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
                                MoveInfo.log($"{GroupName} 请求出库失败:{result}");
                            }
                            else
                            {
                                SRec.info("托盘挡停", GroupName, "载物托盘", "等待物料被接走", CurrrentRFID, remoteLoad.RequestLoadInfo.LoadParam.WareCode);
                                MoveInfo.log($"{GroupName} 请求出库成功");
                            }
                            return;
                        }
                        else
                            MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
                    }
                    else if (MoveInfo.CanWhileCount > 0)
                    {
                        MoveInfo.CanWhileCount--;
                        MoveInfo.log($"RFid读取失败,重试第{3 - MoveInfo.CanWhileCount}次");
                        MoveInfo.log("RFIDerr:" + errmsg);
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitMsg(crc.GetString("Res0016", "RFid读取失败"), MsgLevel.warning));
                    }
                    else
                    {
                        MoveInfo.log("RFid读取失败,直接通过");
                        MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
                    }
                    Location.ToLow(MoveInfo);
                    break;
                case MoveStep.TrayStop_04:
                    MoveInfo.NextMoveStep(MoveStep.TrayStop_05);
                    Location.ToLow(MoveInfo);
                    break;
                case MoveStep.TrayStop_05:
                    MoveInfo.NextMoveStep(MoveStep.TrayStop_06);
                    IOMove(IO_Type.AMH_Tray_Stop, IO_VALUE.HIGH, IO_Type.MI_In_Check, IO_VALUE.LOW, StopDelayMS);
                    break;
                case MoveStep.TrayStop_06:
                    if (IOValue(IO_Type.MI_In_Check).Equals(IO_VALUE.LOW))
                    {
                        MoveInfo.NextMoveStep(MoveStep.Wait);
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                        MoveInfo.log("托盘已放行");
                    }
                    else if (MoveInfo.IsTimeOut(10))
                    {
                        MoveInfo.log("托盘放行失败, 重新放行");
                        MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
                    }
                    break;
                case MoveStep.TrayStop_07:
                    MoveInfo.NextMoveStep(MoveStep.TrayStop_WaitLoadProcess);
                    Location.ToHigh(MoveInfo);
                    isalivetrytimes = 0;
                    break;
                case MoveStep.TrayStop_WaitLoadProcess:
                    Msg.add("等待处理载荷",MsgLevel.info);
                    if (GroupName != "AMH-MI1" && GroupName != "AMH-MI2" && GroupName != "CI")
                    {                        
                        if (IOValue(IO_Type.MI_Reel_Check).Equals(IO_VALUE.HIGH))
                        {
                            Msg.add("托盘上有无信息物料", MsgLevel.info);
                        }
                        else
                        {
                            var remoteLoad = new RemoteLoad();
                            remoteLoad.Action = "IsAlive";
                            remoteLoad.RequestLoadInfo = new RequestLoadInfo();
                            var result = RemoteService.SendAndWait(GroupName, remoteLoad);
                            if (result != RemoteResult.True)
                            {
                                isalivetrytimes++;
                                if (isalivetrytimes > 4)
                                {
                                    MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
                                    MoveInfo.log($"{GroupName} 料仓状态不明:{result}");
                                }
                            }
                            else
                            {
                                isalivetrytimes = 0;
                            }
                        }
                    }
                    break;
                case MoveStep.TrayStop_LoadProcessed:
                    MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
                    Location.ToLow(MoveInfo);
                    MoveInfo.log("载荷离开, 顶升下降");
                    SRec.info("托盘挡停", GroupName, "载物托盘", "处理结束", CurrrentRFID);
                    break;
            }
        }
        /// <summary>
        /// 释放托盘
        /// </summary>
        public void TrayRelease() {
            MoveInfo.log("释放托盘");
            MoveInfo.NextMoveStep(MoveStep.TrayStop_LoadProcessed);
        }
        public void ResetProcess()
        {
            if (CheckWait(MoveInfo))
                return;

            switch (MoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    MoveInfo.NextMoveStep(MoveStep.H01_HomeReset);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                    break;
                case MoveStep.H01_HomeReset:
                    MoveInfo.NextMoveStep(MoveStep.H02_HomeReset);
                    Location.ToLow(MoveInfo);                
                    break;
                case MoveStep.H02_HomeReset:
                    MoveInfo.NextMoveStep(MoveStep.H03_HomeReset);
                    IOMove(IO_Type.AMH_Tray_Stop, IO_VALUE.HIGH, IO_Type.MI_In_Check, IO_VALUE.LOW, StopDelayMS);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1500));
                    break;
                case MoveStep.H03_HomeReset:
                    MoveInfo.EndMove();
                    DeviceState = DeviceStateE.Run;
                    break;
            }
        }

        public bool IsFree()
        {
            throw new NotImplementedException();
        }
    }
}