MainMachine _IN.cs 13.7 KB
using CodeLibrary;
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>
        /// InMoveInfo.MoveStep == MoveStep.InWaitServerCallback
        /// </summary>
        public bool IsInStoreReady {
            get=> StringMoveInfo.MoveStep == MoveStep.InWaitServerCallback;
        }
        /// <summary>
        /// if (InMoveInfo.MoveStep == MoveStep.InWaitServerCallback)
        /// </summary>
        /// <param name="jobInfo"></param>
        /// <returns></returns>
        public bool StartInStore(JobInfo jobInfo) {
            if (IsInStoreReady)
            {
                StringMoveInfo.MoveParam.WareCode = jobInfo.WareNum;
                StringMoveInfo.MoveParam.PosID = jobInfo.PosId;
                StringMoveInfo.NextMoveStep(MoveStep.StartInStore);
                return true;
            }
            return false;
        }
        double CurrentWeight
        {
            get
            {   if (RobotManage.StoreType == StoreType.TypeA)
                {
                    for(int i=0;i<5;i++)
                    {
                        if (OKLEController.queryData(Config.WeightSensorPort, out double weight))
                        {
                            return weight - Config.WeightSensorBase;
                        }
                        Thread.Sleep(1000);
                    }
                    LogUtil.info("读取重量超时");
                    return double.MaxValue;
                }
                else
                    return 0;
            }
        }
        void InProcess()
        {
            if (CheckWait(StringMoveInfo))
                return;
            
            switch (StringMoveInfo.MoveStep)
            {
                case MoveStep.Wait:

                    if (CurrentWeight > Config.StoreWeightLimited)
                    {
                        Msg.add($"周转箱超重,当前重量:{CurrentWeight}kg,最大限重{Config.StoreWeightLimited}kg", MsgLevel.warning);
                    }else if (IOValue(IO_Type.InStart_BTN).Equals(IO_VALUE.HIGH))
                    {
                        StringMoveInfo.log($"踩下启动脚踏");
                        StringMoveInfo.NextMoveStep(MoveStep.InPre01);
                    }else if (IOValue(IO_Type.InStopMaterial_Check).Equals(IO_VALUE.HIGH))
                    {
                        StringMoveInfo.NextMoveStep(MoveStep.In01);
                        StringMoveInfo.log($"检测到周转箱到位信号");
                    }
                    break;
                case MoveStep.InPre01:
                    StringMoveInfo.NextMoveStep(MoveStep.InPre02);
                    if (IOValue(IO_Type.InStopMaterial_Check).Equals(IO_VALUE.HIGH))
                    {
                        StringMoveInfo.NextMoveStep(MoveStep.InPre02);
                    }
                    else
                    {
                        StringMoveInfo.log($"线体运转5秒");
                        LineIn.LineRun("prework", 5);
                    }            
                    break;
                case MoveStep.InPre02:
                    if (IOValue(IO_Type.InStopMaterial_Check).Equals(IO_VALUE.HIGH))
                    {
                        StringMoveInfo.log($"检测到周转箱到位信号,线体运转2秒");
                        LineIn.LineRun("prework", 2);
                        StringMoveInfo.NextMoveStep(MoveStep.In01);
                        StringMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                    }
                    else 
                    {
                        StringMoveInfo.NextMoveStep(MoveStep.Wait);
                        StringMoveInfo.log($"没有检测到周转箱到位信号");
                    }
                    break;
                case MoveStep.In01:
                    StringMoveInfo.NextMoveStep(MoveStep.In02);
                    var boxCurrentWeight = CurrentWeight;
                    if (boxCurrentWeight <= Config.StoreWeightLimited)
                    {
                        StringMoveInfo.log($"开始拍照扫码,重量:{boxCurrentWeight}kg");
                        if (RobotManage.InoutDebugMode)
                        {
                            StringMoveInfo.NextMoveStep(MoveStep.InWaitServerCallback);
                        }
                        else ScanCode();
                    }
                    else
                    {
                        Msg.add("周转箱超重", MsgLevel.warning);
                        StringMoveInfo.log($"周转箱超重 重量:{boxCurrentWeight}");
                        StringMoveInfo.NextMoveStep(MoveStep.Wait);
                    }
                    break;
                case MoveStep.In02:
                    if (InScanTask.IsCompleted)
                    {
                        var x = InScanTask.Result;
                        if (x.Count == 0)
                        {
                            StringMoveInfo.NextMoveStep(MoveStep.In01);
                            StringMoveInfo.log($"未识别到有效二维码,重新拍照");
                            return;
                        }
                        else
                        {
                            StringMoveInfo.NextMoveStep(MoveStep.InWaitServerCallback);
                            StringMoveInfo.log($"已完成扫码,等待服务器反馈库位 Count={x.Count}");
                            StringMoveInfo.MoveParam.IsNg = false;
                            StringMoveInfo.MoveParam.codeInfos = x;
                            var cc = x.Select((a) =>a.CodeStr);
                            ServerCM.SendInStoreRequest(cc.ToArray());
                        }
                    }
                    else if (StringMoveInfo.IsTimeOut(10))
                    {
                        StringMoveInfo.NextMoveStep(MoveStep.In01);
                        StringMoveInfo.log($"等待扫码超时,重新扫码");
                    }
                    break;
                case MoveStep.InWaitServerCallback:
                    if (RobotManage.InoutDebugMode)
                    {
                        Msg.add("等待手动选择入库库位", MsgLevel.info);

                    }
                    else if (StringMoveInfo.IsTimeOut(5))
                        Msg.add("等待服务器返回库位", MsgLevel.info);
                    else if (StringMoveInfo.IsTimeOut(15))
                    {
                        StringMoveInfo.NextMoveStep(MoveStep.Wait);
                        StringMoveInfo.log($"等待服务器返回库位超时");
                    }
                    break;
                case MoveStep.StartInStore:
                    StringMoveInfo.NextMoveStep(MoveStep.In06);
                    CylinderMove(StringMoveInfo, IO_Type.InStop_Down, IO_Type.InStop_Up,IO_VALUE.LOW);
                    InSideLift.LiftDown(StringMoveInfo);
                    StringMoveInfo.log($"放下入料阻挡");
                    break;
                case MoveStep.In06:
                    StringMoveInfo.NextMoveStep(MoveStep.In07);
                    LineIn.LineRun("work", 999);
                    //if (RobotManage.StoreType == StoreType.TypeA)
                    //{
                    //    CylinderMove(InMoveInfo, IO_Type.InMaterialLocation_Bck, IO_Type.InMaterialLocation_Fwd, IO_VALUE.HIGH);
                    //    InMoveInfo.log($"料箱定位前进");
                    //}
                    break;
                case MoveStep.In07:
                    if (RobotManage.StoreType == StoreType.TypeA && IOValue(IO_Type.InOverHead_Check).Equals(IO_VALUE.LOW)) {
                        LineIn.LineStop("work");
                        StringMoveInfo.log($"X18检测到物料超高,停止滚筒");
                        StringMoveInfo.NextMoveStep(MoveStep.InOverHead);
                        ServerCM.cancelPutInTask("", StringMoveInfo.MoveParam.WareCode);
                        return;
                    }
                    //IOValue(IO_Type.InEndMaterialTop_Check).Equals(IO_VALUE.HIGH) && 
                    if(IOValue(IO_Type.InEndMaterialBottom_Check).Equals(IO_VALUE.HIGH))
                    {
                        StringMoveInfo.NextMoveStep(MoveStep.In09);
                        CylinderMove(StringMoveInfo, IO_Type.InStop_Down, IO_Type.InStop_Up, IO_VALUE.HIGH);
                        LineIn.LineRun("work", 1);
                        StringMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                    }
                    else if (StringMoveInfo.IsTimeOut(10))
                    {
                        Msg.add("周转箱进入等待X26信号超时", MsgLevel.warning);
                        StringMoveInfo.log($"周转箱进入超时");
                    }
                    break;
                case MoveStep.In08:
                    StringMoveInfo.NextMoveStep(MoveStep.In09);
                    //if (RobotManage.StoreType == StoreType.TypeA)
                    //{
                    //    CylinderMove(InMoveInfo, IO_Type.InMaterialLocation_Bck, IO_Type.InMaterialLocation_Fwd, IO_VALUE.LOW);
                    //    InMoveInfo.log("料箱定位后退");
                    //}
                    break;
                case MoveStep.In09:
                    StringMoveInfo.NextMoveStep(MoveStep.In10);
                    InSideLift.LiftUp(StringMoveInfo);
                    StringMoveInfo.log("顶升上升,等待周转箱到位");
                    StringMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.InEndMaterialTop_Check, IO_VALUE.HIGH));
                    break;
                case MoveStep.In10:
                    StringMoveInfo.NextMoveStep(MoveStep.InWaitBoxLeave);
                    break;
                case MoveStep.InWaitBoxLeave:
                    Msg.add("周转箱等待入库", MsgLevel.info);
                    ServerCM.storeStatus = StoreStatus.InStoreExecute;
                    break;
                case MoveStep.InBoxLeaved:
                    StringMoveInfo.NextMoveStep(MoveStep.Wait);
                    InSideLift.LiftDown(StringMoveInfo);
                    CylinderMove(StringMoveInfo, IO_Type.InStop_Down, IO_Type.InStop_Up, IO_VALUE.HIGH);
                    StringMoveInfo.log("周转箱已取走,顶升下降");
                    break;
                case MoveStep.InOverHead:
                    Msg.add("X18检测到物料超高,请取出周转箱", MsgLevel.warning);
                    if (IOMonitor.IODebound(IO_Type.InStopMaterial_Check, Config, IO_VALUE.LOW)) {
                        CylinderMove(StringMoveInfo, IO_Type.InStop_Down, IO_Type.InStop_Up, IO_VALUE.HIGH);
                        StringMoveInfo.NewMove(MoveStep.Wait);
                    }
                    break;
                case MoveStep.InReset:
                    CylinderMove(StringMoveInfo, IO_Type.InStop_Down, IO_Type.InStop_Up, IO_VALUE.HIGH);
                    CylinderMove(StringMoveInfo, IO_Type.InMaterialLocation_Bck, IO_Type.InMaterialLocation_Fwd, IO_VALUE.LOW);
                    InSideLift.LiftDown(StringMoveInfo);
                    LineIn.LineStop("work");
                    StringMoveInfo.NewMove(MoveStep.Wait);
                    StringMoveInfo.log("入库线体状态重置");
                    break;
                default:
                    StringMoveInfo.log($"未找到对应步骤:{StringMoveInfo.MoveStep}");
                    break;
            }
        }
        string InState() {
            string state = "";
            if (StringMoveInfo.MoveStep >= MoveStep.In02)
            {
                return StringMoveInfo.MoveParam.ToStr();
            }
            else if (StringMoveInfo.MoveStep >= MoveStep.Wait)
            {
                state = "空闲中";
            }
            else if (StringMoveInfo.MoveStep < MoveStep.In02)
            {
                state = "入库扫描";
            }

                return state;
        }
        public bool IsScanRunning() {
            if (InScanTask == null)
                return false;

            return !InScanTask.IsCompleted;
        }
        /// <summary>
        /// 扫码线程
        /// </summary>
        Task<List<CodeInfo>> InScanTask;
        void ScanCode() {
            StringMoveInfo.log("开始扫码");
            //RightMoveInfo.OneWaitCanEndStep = true;
            //RightMoveInfo.WaitList.Add(WaitResultInfo.WaitScanCode());
            //RightMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
            try
            {
                InScanTask = Task.Run(new Func<List<CodeInfo>>(()=>
                {
                    IOMove(IO_Type.Camera_Led, IO_VALUE.HIGH);
                    Task.Delay(10).Wait();
                    List<CodeInfo> LastCodeList;
                    LastCodeList = CodeManager.CameraScan(new List<string> { Config.CameraName });
                    //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);
            }
        }
    }
}