MainMachine_Clamp.cs 17.7 KB
using CodeLibrary;
using OnlineStore;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace DeviceLibrary
{
    partial class MainMachine
    {
        /// <summary>
        /// 正在等待服务器反馈库位
        /// </summary>
        public bool IsInStoreReady
        {
            get => ClampMoveInfo.MoveStep == MoveStep.InWaitServerCallback;
        }
        /// <summary>
        /// 料盘已获取库位在翻板门处准备好入库
        /// </summary>
        public bool IsWaitInStore
        {
            get => ClampMoveInfo.MoveStep == MoveStep.WaitInStore && !string.IsNullOrEmpty(ClampMoveInfo.MoveParam.PosID);
        }
        void ReelTaked()
        {
            ClampMoveInfo.NextMoveStep(MoveStep.ReelTaked);
        }
        void NGPuted(string msg)
        {
            ClampMoveInfo.NextMoveStep(MoveStep.NGOUT_01);
            ClampMoveInfo.MoveParam.NgMsg = msg;
            ClampMoveInfo.MoveParam.IsNg = true;
        }
        /// <summary>
        /// if (InMoveInfo.MoveStep == MoveStep.InWaitServerCallback)
        /// </summary>
        /// <param name="jobInfo"></param>
        /// <returns></returns>
        public bool StartInStore(JobInfo jobInfo)
        {
            if (IsInStoreReady)
            {
                ClampMoveInfo.MoveParam.WareCode = jobInfo.WareNum;
                ClampMoveInfo.MoveParam.PosID = jobInfo.PosId;
                ClampMoveInfo.MoveParam.PlateH = jobInfo.plateH;
                ClampMoveInfo.MoveParam.PlateW = jobInfo.plateW;
                ClampMoveInfo.NextMoveStep(MoveStep.WaitInStore);
                ClampMoveInfo.log($"料盘等待入库:{ClampMoveInfo.MoveParam.ToStr()}");
                return true;
            }
            return false;
        }
        void SetReelHeight(int height)
        {
            if (ClampMoveInfo.MoveStep != MoveStep.ReelClamp_WaitGaugeHeight)
            {
                ClampMoveInfo.log($"不再等待测高的步骤们无法设置盘高:{height}");
                return; }
            ClampMoveInfo.NextMoveStep(MoveStep.ReelClamp_GetHeight);
            ClampMoveInfo.MoveParam.PlateH = height;
            ClampMoveInfo.log($"设置盘高:{height}");

        }
        int ClampErrorCount = 0;
        void ClampProcess()
        {
            if (CheckWait(ClampMoveInfo))
                return;
            
            switch (ClampMoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    if (IsGetReelReady) {
                        ClampMoveInfo.NewMove(MoveStep.ReelClamp_01);
                        OpenFlipDoor(ClampMoveInfo);
                    }
                    break;
                case MoveStep.ReelClamp_01:
                    ClampMoveInfo.NextMoveStep(MoveStep.ReelClamp_02);
                    ClampMoveInfo.log($"取料夹爪下降");
                    Clamp_Axis.AbsMove(ClampMoveInfo,Config.Clamp_P2,Config.Clamp_P2_speed);
                    break;
                case MoveStep.ReelClamp_02:
                    ClampMoveInfo.NextMoveStep(MoveStep.ReelClamp_03);
                    ClampMoveInfo.log($"取料夹爪张开");
                    CylinderMove(ClampMoveInfo, IO_Type.Clamping_Relax, IO_Type.Clamping_Work, IO_VALUE.HIGH);
                    break;
                case MoveStep.ReelClamp_03:
                    ClampMoveInfo.NextMoveStep(MoveStep.ReelClamp_04);
                    ClampMoveInfo.log($"取料夹爪退回待机点");
                    Clamp_Axis.AbsMove(ClampMoveInfo, Config.Clamp_P1, Config.Clamp_P1_speed);
                    break;
                case MoveStep.ReelClamp_04:
                    ClampMoveInfo.NextMoveStep(MoveStep.ReelClamp_05);
                    ClampMoveInfo.log($"检测盘宽");
                    //CylinderMove(ClampMoveInfo, IO_Type.StringPosChecker_Home, IO_Type.StringPosChecker_Work, IO_VALUE.HIGH);
                    ClampMoveInfo.MoveParam.PlateW = GetWidth();
                    CloseFlipDoor(ClampMoveInfo);
                    break;
                case MoveStep.ReelClamp_05:
                    ClampMoveInfo.NextMoveStep(MoveStep.ReelClamp_WaitGaugeHeight);
                    if (ClampMoveInfo.MoveParam.PlateW == 0)
                    {
                        ClampErrorCount++;
                        ClampMoveInfo.MoveParam.IsNg = true;
                        ClampMoveInfo.MoveParam.NgMsg = crc.GetString(L.not_detect_reel_height, "未检测到盘宽");
                        ReelGetted(false);
                        //RobotManage.UserPause("未检测到盘", true);
                    }
                    else
                    {
                        ClampErrorCount = 0;
                        ReelGetted();
                        ClampMoveInfo.log($"检测到盘,盘宽:{ClampMoveInfo.MoveParam.PlateW},通知料串料已取走");
                    }
                    break;
                case MoveStep.ReelClamp_WaitGaugeHeight:
                    //ClampMoveInfo.NextMoveStep(MoveStep.StringLoad_12);
                    ClampMoveInfo.log($"等待测高");
                    Msg.add(crc.GetString(L.wait_detect_reel_height, "等待料盘测高"), MsgLevel.info);
                    //BatchAxisToP2(ClampMoveInfo);
                    break;
                case MoveStep.ReelClamp_GetHeight:
                    ClampMoveInfo.NextMoveStep(MoveStep.ReelClamp_07);
                    ClampMoveInfo.log($"取料夹爪下降到翻板门");
                    //if (ClampMoveInfo.MoveParam.IsNg)
                    var cappos = Config.Clamp_P3 - (ClampMoveInfo.MoveParam.PlateH - 8) * Config.Clamp_PoToMM;
                    Clamp_Axis.AbsMove(ClampMoveInfo, cappos, Config.Clamp_P3_speed);
                    break;
                case MoveStep.ReelClamp_07:
                    ClampMoveInfo.NextMoveStep(MoveStep.ReelClamp_08);
                    ClampMoveInfo.log($"取料夹爪释放");
                    CylinderMove(ClampMoveInfo, IO_Type.Clamping_Relax, IO_Type.Clamping_Work, IO_VALUE.LOW);
                    break;
                case MoveStep.ReelClamp_08:
                    ClampMoveInfo.NextMoveStep(MoveStep.ReelClamp_09);
                    ClampMoveInfo.log($"取料夹爪上升到待机点");
                    Clamp_Axis.AbsMove(ClampMoveInfo, Config.Clamp_P1, Config.Clamp_P1_speed);
                    break;
                case MoveStep.ReelClamp_09:
                    ClampMoveInfo.NextMoveStep(MoveStep.ReelClamp_10);
                    if (RobotManage.InoutDebugMode)
                    {
                        ClampMoveInfo.log($"自动出入库模式,跳过拍照扫码");
                        ClampMoveInfo.NextMoveStep(MoveStep.InWaitServerCallback);
                    }
                    else if (ClampMoveInfo.MoveParam.IsNg)
                    {
                        ClampMoveInfo.NextMoveStep(MoveStep.NGOUT_01);
                        ClampMoveInfo.log($"料盘数据NG:{ClampMoveInfo.MoveParam.NgMsg}");
                    }
                    else
                    {
                        ClampMoveInfo.log($"拍照扫码");
                        ScanCode();
                    }
                    break;
                case MoveStep.ReelClamp_10:
                    if (ScanTask.IsCompleted)
                    {
                        var x = ScanTask.Result;
                        if (x.Count == 0)
                        {
                            ClampMoveInfo.NextMoveStep(MoveStep.NGOUT_01);
                            ClampMoveInfo.log($"未识别到有效二维码,送到NG口");
                            ClampMoveInfo.MoveParam.IsNg = true;
                            ClampMoveInfo.MoveParam.NgMsg = crc.GetString(L.not_detect_reel_code, "未识别到有效二维码");
                            return;
                        }
                        else
                        {
                            ClampMoveInfo.NextMoveStep(MoveStep.InWaitServerCallback);
                            ClampMoveInfo.log($"已完成扫码,等待服务器反馈库位 Count={x.Count}");
                            ClampMoveInfo.MoveParam.IsNg = false;
                            ClampMoveInfo.MoveParam.codeInfos = x;
                            var cc = x.Select((a) => a.CodeStr);
                            LastCode = String.Join("##",cc);
                            ServerCM.SendInStoreRequest(cc.ToArray(), ClampMoveInfo.MoveParam,true);
                        }
                    }
                    else if (ClampMoveInfo.IsTimeOut(20))
                    {
                        ClampMoveInfo.NextMoveStep(MoveStep.NGOUT_01);
                        ClampMoveInfo.MoveParam.IsNg = false;
                        ClampMoveInfo.MoveParam.NgMsg = crc.GetString(L.scan_code_timeout, "扫码超时");
                        ClampMoveInfo.log($"等待扫码超时,NG口送出");
                    }
                    break;
                case MoveStep.InWaitServerCallback:
                    if (RobotManage.InoutDebugMode)
                    {
                        Msg.add(crc.GetString(L.wait_user_select_pos, "等待手动选择入库库位"), MsgLevel.warning);

                    }
                    else if (ClampMoveInfo.IsTimeOut(20))
                    {
                        ClampMoveInfo.NextMoveStep(MoveStep.NGOUT_01);
                        ClampMoveInfo.MoveParam.IsNg = true;
                        ClampMoveInfo.MoveParam.NgMsg = crc.GetString(L.wait_server_response_pos_timeout, "服务器返回库位超时");
                        ClampMoveInfo.log($"等待服务器返回库位超时");
                    }
                    else if (ClampMoveInfo.IsTimeOut(5))
                        Msg.add(crc.GetString(L.wait_server_response_pos, "等待服务器返回库位"), MsgLevel.info);
                    
                    break;
                case MoveStep.WaitInStore:
                    Msg.add(crc.GetString(L.reel_wait_in_store, "料盘等待入库"), MsgLevel.info);
                    break;
                case MoveStep.ReelTaked:
                    ClampMoveInfo.NextMoveStep(MoveStep.Wait);
                    ClampMoveInfo.log($"料盘已取走");
                    OpenFlipDoor(ClampMoveInfo);
                    break;
                case MoveStep.NGOUT_00:
                    ClampMoveInfo.NextMoveStep(MoveStep.NGOUT_01);
                    //ClampMoveInfo.log("打开单料口门");
                    CloseFlipDoor(ClampMoveInfo);
                    break;
                case MoveStep.NGOUT_01:
                    ClampMoveInfo.NextMoveStep(MoveStep.NGOUT_02);
                    ClampMoveInfo.log("打开单料口门");
                    CylinderMove(ClampMoveInfo, IO_Type.NGDoor_Close, IO_Type.NGDoor_Open, IO_VALUE.HIGH);
                    break;
                case MoveStep.NGOUT_02:
                    ClampMoveInfo.NextMoveStep(MoveStep.NGOUT_03);
                    if (IOValue(IO_Type.NGDoor_Tray_Check).Equals(IO_VALUE.LOW))
                    {
                        Msg.add(crc.GetString(L.x29_low_no_reel, "传感器X29未检测到单料口料盘."), MsgLevel.alarm);
                        Msg.add(ClampMoveInfo.MoveParam.NgMsg, MsgLevel.warning);
                        RobotManage.UserPause("传感器X29未检测到单料口料盘");
                    }
                    break;
                case MoveStep.NGOUT_03:
                    if (IOValue(IO_Type.NGDoor_Tray_Check).Equals(IO_VALUE.HIGH))
                    {
                        Msg.add(crc.GetString(L.please_take_ngdoor_reel, "等待取走单口料盘"), MsgLevel.alarm);
                        Msg.add(ClampMoveInfo.MoveParam.NgMsg, MsgLevel.warning);
                        RobotManage.UserPause("等待取走单口料盘");
                    }
                    else
                    {
                        ClampMoveInfo.NextMoveStep(MoveStep.NGOUT_04);
                        ClampMoveInfo.log("料盘已取走");
                    }
                    break;
                case MoveStep.NGOUT_04:
                    if (IOValue(IO_Type.SafetyLightCurtains).Equals(IO_VALUE.LOW))
                    {
                        Msg.add(crc.GetString(L.wait_put_reel_into_ngdoor, "等待阻挡物离开光栅"), MsgLevel.warning);
                    }
                    else
                    {
                        ClampMoveInfo.NextMoveStep(MoveStep.NGOUT_05);
                    }
                    break;
                case MoveStep.NGOUT_05:
                    if (IOValue(IO_Type.SafetyLightCurtains).Equals(IO_VALUE.HIGH) && IOValue(IO_Type.NGDoor_Tray_Check).Equals(IO_VALUE.HIGH))
                    {
                        ClampMoveInfo.log("NG口还是检测到料盘");
                        ClampMoveInfo.NextMoveStep(MoveStep.NGOUT_03);
                    }
                    else if (IOValue(IO_Type.SafetyLightCurtains).Equals(IO_VALUE.HIGH) && IOValue(IO_Type.NGDoor_Tray_Check).Equals(IO_VALUE.LOW))
                    {
                        ClampMoveInfo.NextMoveStep(MoveStep.Wait);
                        ClampMoveInfo.log("关门NG口门");
                        CylinderMove(ClampMoveInfo, IO_Type.NGDoor_Close, IO_Type.NGDoor_Open, IO_VALUE.LOW);
                        OpenFlipDoor(ClampMoveInfo);
                    }
                    else
                    {
                        Msg.add(crc.GetString(L.wait_put_reel_into_ngdoor, "等待阻挡物离开光栅"), MsgLevel.warning);
                    }
                    break;
                case MoveStep.SingleIn:
                    ClampMoveInfo.NextMoveStep(MoveStep.SingleIn_01);
                    ClampMoveInfo.log("开始单盘入库, 合拢托盘");
                    CloseFlipDoor(ClampMoveInfo);
                    break;
                case MoveStep.SingleIn_01:
                    ClampMoveInfo.NextMoveStep(MoveStep.SingleInReady);
                    ClampMoveInfo.log("开始单盘入库, 打开紧急料口");
                    CylinderMove(ClampMoveInfo, IO_Type.NGDoor_Close, IO_Type.NGDoor_Open, IO_VALUE.HIGH);
                    break;
                case MoveStep.SingleInReady:
                    Msg.add(crc.GetString(L.wait_put_reel_into_ngdoor, "等待放入单盘入库料盘"), MsgLevel.warning);
                    break;
                case MoveStep.SingleInRun:
                    ClampMoveInfo.NextMoveStep(MoveStep.ReelClamp_09);
                    CylinderMove(ClampMoveInfo, IO_Type.NGDoor_Close, IO_Type.NGDoor_Open, IO_VALUE.LOW);
                    ClampMoveInfo.MoveParam.PlateW = 7;
                    ClampMoveInfo.MoveParam.PlateH = 100;
                    break;
                default:
                    ClampMoveInfo.log($"未找到对应步骤:{ClampMoveInfo.MoveStep}");
                    break;
            }
        }

        private int GetWidth()
        {
            if(IOManager.IOValue(IO_Type.WidthCheck_15).Equals(IO_VALUE.HIGH))
            {
                return 15;
            }
            else if(IOManager.IOValue(IO_Type.WidthCheck_13).Equals(IO_VALUE.HIGH))
            {
                return 13;
            }
            else if (IOManager.IOValue(IO_Type.WidthCheck_7).Equals(IO_VALUE.HIGH))
            {
                return 7;
            }
            return 0;
        }

        string ClampState()
        {
            string state = "";
            if (ClampMoveInfo.MoveStep == MoveStep.Wait)
            {
                return crc.GetString(L.free,"空闲中");
            }
            else if (ClampMoveInfo.MoveStep > MoveStep.NGOUT_01)
            {
                state = crc.GetString(L.ngdoor, "单料口:") +ClampMoveInfo.MoveParam.NgMsg;
            }
            else if (ClampMoveInfo.MoveStep >= MoveStep.ReelClamp_09)
            {
                return crc.GetString(L.scanning_code, "扫码中");
            }
            else if (ClampMoveInfo.MoveStep >= MoveStep.ReelClamp_01)
            {
                return crc.GetString(L.taking_code, "取料中");
            }
            return state;
        }
        public bool IsScanRunning() {
            if (ScanTask == null)
                return false;

            return !ScanTask.IsCompleted;
        }
        /// <summary>
        /// 扫码线程
        /// </summary>
        Task<List<CodeInfo>> ScanTask;
        public void ScanCode() {
            ClampMoveInfo.log("开始扫码");
            //RightMoveInfo.OneWaitCanEndStep = true;
            //RightMoveInfo.WaitList.Add(WaitResultInfo.WaitScanCode());
            //RightMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
            try
            {
                ScanTask = Task.Run(new Func<List<CodeInfo>>(()=>
                {
                    IOMove(IO_Type.Camera_Led, IO_VALUE.HIGH);
                    //Task.Delay(10).Wait();
                    List<CodeInfo> LastCodeList;
                    
                    LastCodeList = CodeManager.CameraScan(CodeManager.hikNameList);
                    //BoxParam labelParam = new BoxParam();
                    //labelParam.codeInfos = new List<CodeInfo>(LastCodeList);
                    
                    //if (!Common.codeProcess(labelParam, out _))
                    //{
                    //    Task.Delay(500).Wait();
                    //    LastCodeList2 = CodeManager.CameraScan(new List<string> { Config.CameraName });
                    //    LastCodeList.AddRange(LastCodeList2);
                    //}
                    //IOMove(IO_Type.Camera_Led, IO_VALUE.LOW);

                    return LastCodeList;
                }));
            }
            catch (Exception ex)
            {
                LogUtil.error("FI_13_ScanCode扫码出错:", ex);
            }
        }



    }
}