SideMove.cs 17.4 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 SideMove:DeviceBase, IDevice,ISafetyDevice
    {
        public static Dictionary<string,SideMove> SideMoves = new Dictionary<string, SideMove>();

        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 != "LS")
                    continue;
                SideMove sideMove = new SideMove(devices[key],out string m);

                SideMoves.Add(devices[key].GroupName, sideMove);
                msg += m;
            }
        }
        DeviceGroup DeviceGroup;
        MoveInfo LSAMoveInfo;
        MoveInfo LSBMoveInfo;
       
        PuYueRFID_C2S RFID_1 = null;
        PuYueRFID_C2S RFID_2 = null;
        public LineRunMonitor Line;
        LS_TypeE LS_Type = LS_TypeE.NoRfid;
        public SideMove(DeviceGroup device,out string msg) {
            msg = "";
            Name = device.Name+"("+ device.GroupName + ")";
            DeviceGroup = device;
            GroupName = DeviceGroup.GroupName;
            Msg = new MsgService(GroupName);
            LSAMoveInfo = new MoveInfo(GroupName + "_A");
            LSBMoveInfo = new MoveInfo(GroupName + "_B");
            SafetyDevice.AddDevice(this);
            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";
                }
            }
            if (!string.IsNullOrEmpty(DeviceGroup.RFID_2))
            {
                RFID_2 = new PuYueRFID_C2S(DeviceGroup.RFID_2);
                if (!RFID_2.Open())
                {
                    msg += DeviceGroup.GroupName + " RFID 2:" + DeviceGroup.RFID_2 + "," + crc.GetString("Res0183","打开失败") + "\r\n";
                }
            }
            if (RobotManage.Config.DOList[device.GroupName].ContainsKey(IO_Type.Ls_A_LineRwd))
                Line = new LineRunMonitor(GroupName, RobotManage.Config.DOList[GroupName][IO_Type.Ls_A_LineRwd].GetIOAddr(), RobotManage.Config.DOList[GroupName][IO_Type.Ls_A_LineRwd].GetIOAddr());
            else
                Line = new LineRunMonitor(GroupName, RobotManage.Config.DOList[GroupName][IO_Type.Ls_A_LineRun].GetIOAddr());
            if (RFID_1 == null && RFID_2 == null)
                LS_Type = LS_TypeE.NoRfid;
            else if (RFID_2 == null)
                LS_Type = LS_TypeE.OneWay;
            else
                LS_Type = LS_TypeE.TwoWay;
        }
        public DeviceStateE DeviceState { get; set; }
        public void Start()
        {
            DeviceState = DeviceStateE.HomeReset;
        }

        public void Stop()
        {
            DeviceState = DeviceStateE.Stop;
        }
        public void Process()
        {
            if (DeviceState == DeviceStateE.HomeReset)
                ResetProcess();
            else if (DeviceState == DeviceStateE.Run)
            {
                if (LS_Type == LS_TypeE.NoRfid)
                    NoRfidProcess();
                else {
                    OneWayProcess(LSAMoveInfo);
                    OneWayProcess(LSBMoveInfo);
                }
            }
        }
        int StopBufDelayMS = 500;
        int StopDelayMS = 1000;
        #region Rfid横移
        public void NoRfidProcess()
        {
            if (CheckWait(LSAMoveInfo))
                return;

            switch (LSAMoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    break;
                case MoveStep.SideMove_01:
                    LSAMoveInfo.NextMoveStep(MoveStep.SideMove_01);
                    if (IOValue(IO_Type.Ls_A_Front_Check).Equals(IO_VALUE.HIGH))
                    {
                        LSAMoveInfo.NextMoveStep(MoveStep.SideMove_02);
                        CylinderMove(LSAMoveInfo, IO_Type.Ls_A_Location_Up, IO_Type.Ls_A_Location_Down, IO_VALUE.LOW);
                        CylinderMove(LSAMoveInfo, IO_Type.Ls_B_Location_Up, IO_Type.Ls_B_Location_Down, IO_VALUE.LOW);
                    }                    
                    else
                    {
                        Msg.add(crc.GetString("Res0184", "空闲中"), MsgLevel.info);
                    }
                    break;
                case MoveStep.SideMove_02:
                    LSAMoveInfo.NextMoveStep(MoveStep.SideMove_03);
                    IOMove(IO_Type.Ls_A_Front_Stop, IO_VALUE.HIGH, StopDelayMS);
                    IOMove(IO_Type.Ls_A_BufStop_Fwd, IO_VALUE.HIGH, StopBufDelayMS);
                    LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Ls_A_Tray_Check, IO_VALUE.HIGH));
                    break;
                case MoveStep.SideMove_03:
                    LSAMoveInfo.NextMoveStep(MoveStep.SideMove_04);
                    IOMove(IO_Type.Ls_B_BufStop_Fwd, IO_VALUE.HIGH, 500);
                    LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                    break;
                case MoveStep.SideMove_04:
                    LSAMoveInfo.NextMoveStep(MoveStep.SideMove_05);
                    CylinderMove(LSAMoveInfo, IO_Type.Ls_A_Location_Up, IO_Type.Ls_A_Location_Down, IO_VALUE.HIGH);
                    CylinderMove(LSAMoveInfo, IO_Type.Ls_B_Location_Up, IO_Type.Ls_B_Location_Down, IO_VALUE.HIGH);
                    break;
                case MoveStep.SideMove_05:
                    LSAMoveInfo.NextMoveStep(MoveStep.SideMove_06);
                    IOMove(IO_Type.Ls_A_LineRun, IO_VALUE.HIGH);
                    break;
                case MoveStep.SideMove_06:
                    LSAMoveInfo.NextMoveStep(MoveStep.SideMove_07);
                    LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Ls_B_Tray_Check, IO_VALUE.HIGH));
                    break;
                case MoveStep.SideMove_07:
                    LSAMoveInfo.NextMoveStep(MoveStep.SideMove_08);
                    LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                    break;
                case MoveStep.SideMove_08:
                    LSAMoveInfo.NextMoveStep(MoveStep.SideMove_09);
                    IOMove(IO_Type.Ls_A_LineRun, IO_VALUE.LOW);
                    CylinderMove(LSAMoveInfo, IO_Type.Ls_A_Location_Up, IO_Type.Ls_A_Location_Down, IO_VALUE.LOW);
                    CylinderMove(LSAMoveInfo, IO_Type.Ls_B_Location_Up, IO_Type.Ls_B_Location_Down, IO_VALUE.LOW);
                    break;
                case MoveStep.SideMove_09:
                    LSAMoveInfo.NextMoveStep(MoveStep.SideMove_10);
                    LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Ls_B_Tray_Check, IO_VALUE.LOW));
                    break;
                case MoveStep.SideMove_10:
                    LSAMoveInfo.NextMoveStep(MoveStep.SideMove_11);
                    LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                    break;
                case MoveStep.SideMove_11:
                    LSAMoveInfo.NewMove(MoveStep.SideMove_01);
                    break;
            }
        }
        #endregion
        #region 单方向LS处理
        public void OneWayProcess(MoveInfo moveInfo)
        {
            var Minfo = moveInfo;
            if (CheckWait(Minfo))
                return;
            string side = Minfo== LSAMoveInfo? "A":"B";
            var Ls_A_Front_Check = $"Ls_{side}_Front_Check";
            var Ls_A_Location_Up = $"Ls_{side}_Location_Up";
            var Ls_A_Location_Down = $"Ls_{side}_Location_Down";
            var Ls_A_Front_Stop = $"Ls_{side}_Front_Stop";
            var Ls_A_Stop = $"Ls_{side}_Stop";
            var Ls_A_BufStop_Rwd = $"Ls_{side}_BufStop_Rwd";
            var Ls_A_Tray_Check = $"Ls_{side}_Tray_Check";
            var sideb = side == "A" ? "B" : "A";
            var Ls_B_Location_Up = $"Ls_{sideb}_Location_Up";
            var Ls_B_Location_Down = $"Ls_{sideb}_Location_Down";
            var Ls_B_Front_Stop = $"Ls_{sideb}_Front_Stop";
            var Ls_B_Stop = $"Ls_{sideb}_Stop";
            var Ls_B_BufStop_Fwd = $"Ls_{sideb}_BufStop_Fwd";
            var Ls_B_BufStop_Rwd = $"Ls_{sideb}_BufStop_Rwd";
            var Ls_B_Tray_Check = $"Ls_{sideb}_Tray_Check";
            var RFID = Minfo == LSAMoveInfo ? RFID_1 : RFID_2;
            var lsb = (Minfo == LSAMoveInfo ? LSBMoveInfo : LSAMoveInfo);
            switch (Minfo.MoveStep)
            {
                case MoveStep.Wait:
                    break;
                case MoveStep.SideMove_01:
                    Minfo.NextMoveStep(MoveStep.SideMove_01);
                    if (lsb.MoveStep >= MoveStep.SideMove_10) {
                        Msg.add(sideb+"侧穿越中", MsgLevel.info);
                    }
                    else if (IOValue(Ls_A_Front_Check).Equals(IO_VALUE.HIGH))
                    {
                        Minfo.NextMoveStep(MoveStep.SideMove_02);
                        CylinderMove(Minfo, Ls_A_Location_Up, Ls_A_Location_Down, IO_VALUE.LOW);
                        IOMove(IO_Type.Ls_A_Stop, IO_VALUE.LOW);
                    }
                    else
                    {
                        Msg.add(crc.GetString("Res0184", "空闲中"), MsgLevel.info);
                    }
                    break;
                case MoveStep.SideMove_02:
                    Minfo.NextMoveStep(MoveStep.SideMove_03);
                    Minfo.CanWhileCount = 3;
                    IOMove(Ls_A_Front_Stop, IO_VALUE.HIGH, StopDelayMS);
                    IOMove(Ls_A_BufStop_Rwd, IO_VALUE.HIGH, StopBufDelayMS);
                    Minfo.WaitList.Add(WaitResultInfo.WaitIO(Ls_A_Tray_Check, IO_VALUE.HIGH));
                    break;
                case MoveStep.SideMove_03:
                    if (LS_Type == LS_TypeE.OneWay)
                    {
                        Minfo.NextMoveStep(MoveStep.SideMove_04);
                        return;
                    }
                    
                    if (RFID.TryRead(out string rfid, out _) == 1)
                    {
                        if (rfid == "通过")
                            Minfo.NextMoveStep(MoveStep.SideMove_04);
                        else
                            Minfo.NextMoveStep(MoveStep.SideMove_10);
                        Minfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                    }
                    else if (Minfo.CanWhileCount > 0)
                    {
                        Minfo.CanWhileCount--;
                        Minfo.log($"RFid读取失败,重试第{3- Minfo.CanWhileCount}次");
                    }
                    else {
                        Minfo.log("RFid读取失败,直接通过");
                        Minfo.NextMoveStep(MoveStep.SideMove_04);
                    }
                    break;
                ///直接穿过流程
                case MoveStep.SideMove_04:
                    Minfo.NextMoveStep(MoveStep.SideMove_05);
                    IOMove(Ls_A_Stop, IO_VALUE.HIGH, StopDelayMS);
                    break;
                case MoveStep.SideMove_05:
                    Minfo.NextMoveStep(MoveStep.SideMove_06);
                    Minfo.WaitList.Add(WaitResultInfo.WaitIO(Ls_A_Tray_Check, IO_VALUE.LOW));
                    break;
                case MoveStep.SideMove_06:
                    Minfo.NextMoveStep(MoveStep.SideMove_01);
                    Minfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                    break;
                ///横移流程
                case MoveStep.SideMove_10:
                    
                    if (lsb.MoveStep == MoveStep.SideMove_01)
                    {
                        Minfo.NextMoveStep(MoveStep.SideMove_11);
                    }
                    else if (lsb.MoveStep >= MoveStep.SideMove_11) {
                        Minfo.NextMoveStep(MoveStep.SideMove_04);
                        Minfo.log($"{sideb}侧也在等待横移,本侧直接穿过");
                    }
                    else
                    {
                        Msg.add($"等待{sideb}侧空闲", MsgLevel.info);
                    }
                    break;
                case MoveStep.SideMove_11:
                    Minfo.NextMoveStep(MoveStep.SideMove_05);
                    CylinderMove(Minfo, Ls_A_Location_Up, Ls_A_Location_Down, IO_VALUE.HIGH);
                    CylinderMove(Minfo, Ls_B_Location_Up, Ls_B_Location_Down, IO_VALUE.HIGH);
                    IOMove(Ls_B_BufStop_Fwd, IO_VALUE.HIGH, StopBufDelayMS);
                    break;
                case MoveStep.SideMove_12:
                    Minfo.NextMoveStep(MoveStep.SideMove_06);
                    IOMove(IO_Type.Ls_A_LineRun, IO_VALUE.HIGH);
                    Minfo.WaitList.Add(WaitResultInfo.WaitIO(Ls_B_Tray_Check, IO_VALUE.HIGH));
                    break;
                case MoveStep.SideMove_13:
                    Minfo.NextMoveStep(MoveStep.SideMove_07);
                    Minfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                    break;
                case MoveStep.SideMove_14:
                    Minfo.NextMoveStep(MoveStep.SideMove_08);
                    IOMove(IO_Type.Ls_A_LineRun, IO_VALUE.LOW);
                    CylinderMove(Minfo, Ls_A_Location_Up, Ls_A_Location_Down, IO_VALUE.LOW);
                    CylinderMove(Minfo, Ls_B_Location_Up, Ls_B_Location_Down, IO_VALUE.LOW);
                    break;
                case MoveStep.SideMove_15:
                    Minfo.NextMoveStep(MoveStep.SideMove_09);
                    IOMove(Ls_B_Stop, IO_VALUE.HIGH, StopDelayMS);
                    break;
                case MoveStep.SideMove_16:
                    Minfo.NextMoveStep(MoveStep.SideMove_10);
                    Minfo.WaitList.Add(WaitResultInfo.WaitIO(Ls_B_Tray_Check, IO_VALUE.LOW));
                    break;
                case MoveStep.SideMove_17:
                    Minfo.NextMoveStep(MoveStep.SideMove_11);
                    Minfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                    break;
                case MoveStep.SideMove_18:
                    Minfo.NewMove(MoveStep.SideMove_01);
                    break;
            }
        }
        #endregion
        public void ResetProcess()
        {
            if (CheckWait(LSAMoveInfo))
                return;

            switch (LSAMoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    break;
                case MoveStep.H01_HomeReset:
                    LSAMoveInfo.NextMoveStep(MoveStep.H02_HomeReset);
                    IOMove(IO_Type.Ls_A_LineRun, IO_VALUE.LOW);
                    CylinderMove(LSAMoveInfo,  IO_Type.Ls_A_Location_Down, IO_Type.Ls_A_Location_Up, IO_VALUE.LOW);;
                    CylinderMove(LSAMoveInfo,  IO_Type.Ls_B_Location_Down, IO_Type.Ls_B_Location_Up, IO_VALUE.LOW);
                    break;
                case MoveStep.H02_HomeReset:
                    LSAMoveInfo.NextMoveStep(MoveStep.H03_HomeReset);
                    IOMove(IO_Type.Ls_A_Front_Stop, IO_VALUE.HIGH);
                    IOMove(IO_Type.Ls_A_BufStop_Fwd, IO_VALUE.HIGH,500);
                    LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                    break;
                case MoveStep.H03_HomeReset:
                    LSAMoveInfo.NextMoveStep(MoveStep.H04_HomeReset);
                    IOMove(IO_Type.Ls_B_BufStop_Fwd, IO_VALUE.HIGH, 500);
                    LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Ls_A_Tray_Check, IO_VALUE.HIGH));
                    break;
                case MoveStep.H04_HomeReset:
                    LSAMoveInfo.NextMoveStep(MoveStep.H05_HomeReset);
                    LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                    break;
                case MoveStep.H05_HomeReset:
                    LSAMoveInfo.NextMoveStep(MoveStep.H06_HomeReset);
                    CylinderMove(LSAMoveInfo, IO_Type.Ls_A_Location_Up, IO_Type.Ls_A_Location_Down, IO_VALUE.HIGH);
                    CylinderMove(LSAMoveInfo, IO_Type.Ls_B_Location_Up, IO_Type.Ls_B_Location_Down, IO_VALUE.HIGH);
                    break;
                case MoveStep.H06_HomeReset:
                    LSAMoveInfo.NextMoveStep(MoveStep.H07_HomeReset);
                    LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Ls_B_Tray_Check, IO_VALUE.HIGH));
                    break;
                case MoveStep.H07_HomeReset:
                    LSAMoveInfo.NextMoveStep(MoveStep.H08_HomeReset);
                    LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                    break;
                case MoveStep.H08_HomeReset:
                    LSAMoveInfo.NextMoveStep(MoveStep.HEND_HomeReset);
                    CylinderMove(LSAMoveInfo, IO_Type.Ls_A_Location_Up, IO_Type.Ls_A_Location_Down, IO_VALUE.LOW);
                    CylinderMove(LSAMoveInfo, IO_Type.Ls_B_Location_Up, IO_Type.Ls_B_Location_Down, IO_VALUE.LOW);
                    break;
                case MoveStep.HEND_HomeReset:
                    LSAMoveInfo.NewMove(MoveStep.SideMove_01);
                    DeviceState = DeviceStateE.Run;
                    break;
            }
        }

        public void Pause()
        {
            Line.Pause();
        }

        public void Resume()
        {
            Line.Resume();
        }

        enum LS_TypeE { 
            NoRfid,
            OneWay,
            TwoWay

        }
    }
}