TransplantMove.cs 11.2 KB
using OnlineStore;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

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

        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("SISO"))
                    continue;
                TransplantMove sideMove = new TransplantMove(devices[key],config,out string m);
                DeviceList.Add(devices[key].GroupName, sideMove);
                msg += m;
            }
        }
        Robot_Config Config;
        DeviceGroup DeviceGroup;
        MoveInfo MoveInfo;
        MoveInfo MoveInfo2;
        public PuYueRFID_C2S RFID_1 = null;
        AxisBean axis;
        CylinderManger Location;
        CylinderManger Transplant;
        public DeviceStateE DeviceState { get ; set ; }

        public TransplantMove(DeviceGroup device, Robot_Config config, out string msg) {
            msg = "";
            Name = device.Name+"("+ device.GroupName + ")";
            Config = config;
            DeviceGroup = device;
            GroupName = DeviceGroup.GroupName;
            Msg = new MsgService(GroupName);
            MoveInfo = new MoveInfo(GroupName);
            MoveInfo2 = new MoveInfo(GroupName,false);
            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.AMH_Location_Up, IO_Type.AMH_Location_Down);
            Transplant = new CylinderManger($"移栽", GroupName, IO_Type.AMH_Trans_Fwd, IO_Type.AMH_Trans_Bwd);
            var axisc = RobotManage.Config.moveAxisList.Find(ma => ma.GetAxisValue() == RobotManage.DeviceGroup[GroupName].AxisID);
            axis = new AxisBean(axisc, GroupName);
        }
        public void Start()
        {
            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();
                SecondProcess();
            }
        }
        int StopBufDelayMS = 500;
        int StopDelayMS = 1000;
        public void OneWayProcess()
        {
            if (CheckWait(MoveInfo))
                return;

            switch (MoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    if (IOValue(IO_Type.AMH_Front_Check).Equals(IO_VALUE.HIGH))
                    {
                        MoveInfo.NextMoveStep(MoveStep.TransplantMove_01);
                        Location.ToLow(MoveInfo);
                    }
                    else
                    {
                        Msg.add(crc.GetString("Res0184", "空闲中"), MsgLevel.info);
                    }
                    break;
                case MoveStep.TransplantMove_01:
                    MoveInfo.NextMoveStep(MoveStep.TransplantMove_02);
                    IOMove(IO_Type.AMH_Front_Stop, IO_VALUE.HIGH, StopDelayMS);
                    MoveInfo.CanWhileCount = 3;
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.MI_In_Check, IO_VALUE.HIGH));
                    MoveInfo.log($"前阻挡放行");
                    break;
                case MoveStep.TransplantMove_02:
                    if (RFID_1.ReadByte(0x20, 16, out byte[] data))
                    {
                        var rfid = Encoding.ASCII.GetString(data).Trim();
                        var through = TrayManager.Process(rfid, DeviceGroup.addr_1, out TrayInfo trayInfo);
                        if (through)
                            MoveInfo.NextMoveStep(MoveStep.TransplantMove_03);
                        else if (IOValue(IO_Type.AMH_Reel_Check).Equals(IO_VALUE.HIGH))
                            MoveInfo.NextMoveStep(MoveStep.TransplantMove_10);
                        else
                            MoveInfo.NextMoveStep(MoveStep.TransplantMove_30);
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                    }
                    else if (MoveInfo.CanWhileCount > 0)
                    {
                        MoveInfo.CanWhileCount--;
                        MoveInfo.log($"RFid读取失败,重试第{3 - MoveInfo.CanWhileCount}次");
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitMsg(crc.GetString("Res0016","RFid读取失败"), MsgLevel.warning));
                    }
                    else
                    {
                        MoveInfo.log("RFid读取失败,直接通过");
                        MoveInfo.NextMoveStep(MoveStep.TransplantMove_03);
                    }
                    break;
                case MoveStep.TransplantMove_03:
                    MoveInfo.NextMoveStep(MoveStep.TransplantMove_04);
                    IOMove(IO_Type.AMH_Tray_Stop, IO_VALUE.HIGH, StopDelayMS);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.MI_In_Check, IO_VALUE.LOW));
                    MoveInfo.log($"后阻挡放行");
                    break;
                case MoveStep.TransplantMove_04:
                    MoveInfo.NextMoveStep(MoveStep.Wait);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                    MoveInfo.log("托盘已放行");
                    break;
                case MoveStep.TransplantMove_10:
                    MoveInfo.NextMoveStep(MoveStep.TransplantMove_11);
                    Location.ToHigh(MoveInfo);
                    axis.AbsMove(MoveInfo, Config.AMH_TS_P1, Config.AMH_TS_P1_speed);
                    Transplant.ToLow(MoveInfo);
                    MoveInfo.log("顶升上升,取料轴到P1,移栽气缸回位");
                    break;
                case MoveStep.TransplantMove_11:
                    MoveInfo.NextMoveStep(MoveStep.TransplantMove_12);
                    var AMH_TS_P2 = Config.AMH_TS_P2 - (MoveInfo.MoveParam.PlateH - 8) * Config.AMH_TS_PoToMM;
                    axis.AbsMove(MoveInfo, AMH_TS_P2, Config.AMH_TS_P1_speed);
                    IOMove(IO_Type.AMH_Sucker, IO_VALUE.HIGH);
                    MoveInfo.log($"PlateH:{MoveInfo.MoveParam.PlateH},AMH_TS_P2:{AMH_TS_P2}");
                    break;
                case MoveStep.TransplantMove_12:
                    MoveInfo.NextMoveStep(MoveStep.TransplantMove_13);
                    break;
                case MoveStep.TransplantMove_13:
                    MoveInfo.NextMoveStep(MoveStep.TransplantMove_14);
                    axis.AbsMove(MoveInfo, Config.AMH_TS_P1, Config.AMH_TS_P1_speed);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.AMH_Reel_Check,IO_VALUE.LOW));
                    break;
                case MoveStep.TransplantMove_14:
                    MoveInfo.NextMoveStep(MoveStep.TransplantMove_15);
                    MoveInfo2.NewMove(MoveStep.TransplantMove_01);
                    Location.ToLow(MoveInfo);
                    MoveInfo.log("料盘已取走,放行托盘, 子流程开始移栽入库");
                    break;
                case MoveStep.TransplantMove_15:
                    MoveInfo.NextMoveStep(MoveStep.TransplantMove_16);
                    IOMove(IO_Type.AMH_Tray_Stop, IO_VALUE.HIGH, StopDelayMS);
                    break;
                case MoveStep.TransplantMove_16:
                    MoveInfo.NextMoveStep(MoveStep.TransplantMove_17);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    break;
                case MoveStep.TransplantMove_17:
                    MoveInfo.NewMove(MoveStep.Wait);
                    MoveInfo.log("托盘放行结束");
                    break;

                case MoveStep.TransplantMove_30:
                    MoveInfo.NextMoveStep(MoveStep.Wait);
                    Location.ToLow(MoveInfo);
                    MoveInfo.log("载荷离开, 顶升下降");
                    break;
            }
        }
        public void SecondProcess()
        {
            if (CheckWait(MoveInfo2))
                return;

            switch (MoveInfo2.MoveStep)
            {
                case MoveStep.Wait:
                    break;
                case MoveStep.TransplantMove_01:
                    MoveInfo2.NextMoveStep(MoveStep.TransplantMove_02);
                    Transplant.ToHigh(MoveInfo);
                    MoveInfo2.log("移栽气缸的前进");
                    break;
                case MoveStep.TransplantMove_02:
                    MoveInfo2.NextMoveStep(MoveStep.TransplantMove_03);
                    var AMH_TS_P2 = Config.AMH_TS_P2 - (MoveInfo.MoveParam.PlateH - 8) * Config.AMH_TS_PoToMM;
                    axis.AbsMove(MoveInfo2, AMH_TS_P2, Config.AMH_TS_P2_speed);
                    MoveInfo2.log($"PlateH:{MoveInfo.MoveParam.PlateH},AMH_TS_P2:{AMH_TS_P2}");
                    break;
                case MoveStep.TransplantMove_03:
                    MoveInfo2.NextMoveStep(MoveStep.TransplantMove_04);
                    IOMove(IO_Type.AMH_Sucker, IO_VALUE.LOW);
                    break;
                case MoveStep.TransplantMove_04:
                    MoveInfo2.NextMoveStep(MoveStep.TransplantMove_05);
                    axis.AbsMove(MoveInfo2, Config.AMH_TS_P1, Config.AMH_TS_P1_speed);
                    break;
                case MoveStep.TransplantMove_05:
                    MoveInfo2.NewMove(MoveStep.Wait);
                    MoveInfo.log("从线体到料仓移栽结束");
                    break;
            }
        }
        public void ResetProcess()
        {
            if (CheckWait(MoveInfo))
                return;

            switch (MoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    MoveInfo.NextMoveStep(MoveStep.SideMove_01);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                    break;
                case MoveStep.SideMove_01:
                    MoveInfo.NextMoveStep(MoveStep.SideMove_02);
                    CylinderMove(MoveInfo, IO_Type.MI_Location_Down, IO_Type.MI_Location_Up, IO_VALUE.LOW);
                    break;
                case MoveStep.SideMove_02:
                    MoveInfo.NextMoveStep(MoveStep.SideMove_03);
                    IOMove(IO_Type.AMH_Tray_Stop, IO_VALUE.HIGH, StopDelayMS);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1500));
                    break;
                case MoveStep.SideMove_03:
                    MoveInfo.EndMove();
                    DeviceState = DeviceStateE.Run;
                    break;
            }
        }
    }
}