MainMachine _IN.cs 11.4 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.Tasks;

namespace DeviceLibrary
{
    partial class MainMachine
    {
        /// <summary>
        /// InMoveInfo.MoveStep == MoveStep.InWaitServerCallback
        /// </summary>
        public bool IsInStoreReady {
            get=> InMoveInfo.MoveStep == MoveStep.InWaitServerCallback;
        }
        /// <summary>
        /// if (InMoveInfo.MoveStep == MoveStep.InWaitServerCallback)
        /// </summary>
        /// <param name="jobInfo"></param>
        /// <returns></returns>
        public bool StartInStore(JobInfo jobInfo) {
            if (IsInStoreReady)
            {
                InMoveInfo.MoveParam.WareCode = jobInfo.WareNum;
                InMoveInfo.MoveParam.PosID = jobInfo.PosId;
                InMoveInfo.NextMoveStep(MoveStep.StartInStore);
                return true;
            }
            return false;
        }
        double CurrentWeight
        {
            get
            {
                var weight = OKLEController.queryData(Config.WeightSensorPort);
                return weight - Config.WeightSensorBase;
            }
        }
        void InProcess()
        {
            if (CheckWait(InMoveInfo))
                return;
            
            switch (InMoveInfo.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))
                    {
                        InMoveInfo.log($"踩下启动脚踏");
                        InMoveInfo.NextMoveStep(MoveStep.InPre01);
                    }else if (IOValue(IO_Type.InStopMaterial_Check).Equals(IO_VALUE.HIGH))
                    {
                        InMoveInfo.NextMoveStep(MoveStep.In01);
                        InMoveInfo.log($"检测到周转箱到位信号");
                    }
                    break;
                case MoveStep.InPre01:
                    InMoveInfo.NextMoveStep(MoveStep.InPre02);
                    if (IOValue(IO_Type.InStopMaterial_Check).Equals(IO_VALUE.HIGH))
                    {
                        InMoveInfo.NextMoveStep(MoveStep.InPre02);
                    }
                    else
                    {
                        InMoveInfo.log($"线体运转5秒");
                        LineIn.LineRun("prework", 5);
                    }            
                    break;
                case MoveStep.InPre02:
                    if (IOValue(IO_Type.InStopMaterial_Check).Equals(IO_VALUE.HIGH))
                    {
                        InMoveInfo.log($"检测到周转箱到位信号,线体运转2秒");
                        LineIn.LineRun("prework", 2);
                        InMoveInfo.NextMoveStep(MoveStep.In01);
                    }
                    else 
                    {
                        InMoveInfo.NextMoveStep(MoveStep.Wait);
                        InMoveInfo.log($"没有检测到周转箱到位信号");
                    }
                    break;
                case MoveStep.In01:
                    InMoveInfo.NextMoveStep(MoveStep.In02);
                    if (CurrentWeight <= Config.StoreWeightLimited)
                    {
                        InMoveInfo.log($"开始拍照扫码");
                        ScanCode();
                    }
                    else
                    {
                        Msg.add("周转箱超重", MsgLevel.warning);
                        InMoveInfo.log($"周转箱超重");
                        InMoveInfo.NextMoveStep(MoveStep.Wait);
                    }
                    break;
                case MoveStep.In02:
                    if (InScanTask.IsCompleted)
                    {
                        var x = InScanTask.Result;
                        if (x.Count == 0)
                        {
                            InMoveInfo.NextMoveStep(MoveStep.In01);
                            InMoveInfo.log($"未识别到有效二维码,重新拍照");
                            return;
                        }
                        else
                        {
                            InMoveInfo.NextMoveStep(MoveStep.InWaitServerCallback);
                            InMoveInfo.log($"已完成扫码,等待服务器反馈库位 Count={x.Count}");
                            InMoveInfo.MoveParam.IsNg = false;
                            InMoveInfo.MoveParam.codeInfos = x;
                            var cc = x.Select((a) =>a.CodeStr);
                            ServerCM.SendInStoreRequest(cc.ToArray());
                        }                        
                    }
                    else if (InMoveInfo.IsTimeOut(10))
                    {
                        InMoveInfo.NextMoveStep(MoveStep.In01);
                        InMoveInfo.log($"等待扫码超时,重新扫码");
                    }
                    break;
                case MoveStep.InWaitServerCallback:
                    if (InMoveInfo.IsTimeOut(5))
                        Msg.add("等待服务器返回库位", MsgLevel.info);
                    else if (InMoveInfo.IsTimeOut(15))
                    {
                        InMoveInfo.NextMoveStep(MoveStep.Wait);
                        InMoveInfo.log($"等待服务器返回库位超时");
                    }
                    break;
                case MoveStep.StartInStore:
                    InMoveInfo.NextMoveStep(MoveStep.In06);
                    CylinderMove(InMoveInfo, IO_Type.InStop_Down, IO_Type.InStop_Up,IO_VALUE.LOW);
                    InSideLift.LiftUp(InMoveInfo);
                    InMoveInfo.log($"放下入料阻挡");
                    break;
                case MoveStep.In06:
                    InMoveInfo.NextMoveStep(MoveStep.In07);
                    LineIn.LineRun("work", 999);
                    CylinderMove(InMoveInfo, IO_Type.InMaterialLocation_Bck, IO_Type.InMaterialLocation_Fwd,  IO_VALUE.HIGH);
                    InMoveInfo.log($"料箱定位前进");
                    break;
                case MoveStep.In07:
                    if (IOValue(IO_Type.InOverHead_Check).Equals(IO_VALUE.HIGH)) {
                        LineIn.LineStop("work");
                        InMoveInfo.log($"检测到物料超高,停止滚筒");
                        InMoveInfo.NextMoveStep(MoveStep.InOverHead);
                        ServerCM.cancelPutInTask("", InMoveInfo.MoveParam.WareCode);
                        return;
                    }
                    //IOValue(IO_Type.InEndMaterialTop_Check).Equals(IO_VALUE.HIGH) && 
                    if(IOValue(IO_Type.InEndMaterialBottom_Check).Equals(IO_VALUE.HIGH))
                    {
                        InMoveInfo.NextMoveStep(MoveStep.In08);
                        CylinderMove(InMoveInfo, IO_Type.InStop_Down, IO_Type.InStop_Up, IO_VALUE.HIGH);
                        LineIn.LineRun("work", 3);
                        InMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                    }
                    else if (InMoveInfo.IsTimeOut(10))
                    {
                        Msg.add("周转箱进入超时", MsgLevel.warning);
                        InMoveInfo.log($"周转箱进入超时");
                    }
                    break;
                case MoveStep.In08:
                    InMoveInfo.NextMoveStep(MoveStep.In09);
                    CylinderMove(InMoveInfo, IO_Type.InMaterialLocation_Bck, IO_Type.InMaterialLocation_Fwd, IO_VALUE.LOW);
                    InMoveInfo.log("料箱定位后退");
                    break;
                case MoveStep.In09:
                    InMoveInfo.NextMoveStep(MoveStep.InWaitBoxLeave);
                    InSideLift.LiftUp(InMoveInfo);
                    InMoveInfo.log("顶升上升,等待周转箱到位");
                    InMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.InEndMaterialTop_Check, IO_VALUE.HIGH));
                    break;
                case MoveStep.InWaitBoxLeave:
                    Msg.add("周转箱等待入库", MsgLevel.info);
                    ServerCM.storeStatus = StoreStatus.InStoreExecute;
                    break;
                case MoveStep.InBoxLeaved:
                    InMoveInfo.NextMoveStep(MoveStep.Wait);
                    InSideLift.LiftDown(InMoveInfo);
                    CylinderMove(InMoveInfo, IO_Type.InStop_Down, IO_Type.InStop_Up, IO_VALUE.HIGH);
                    InMoveInfo.log("周转箱已取走,顶升下降");
                    break;
                case MoveStep.InOverHead:
                    Msg.add("物料超高,请取出周转箱", MsgLevel.warning);
                    if (IOMonitor.IODebound(IO_Type.InStopMaterial_Check, Config, IO_VALUE.LOW)) {
                        CylinderMove(InMoveInfo, IO_Type.InStop_Down, IO_Type.InStop_Up, IO_VALUE.HIGH);
                        InMoveInfo.NextMoveStep(MoveStep.Wait);
                    }
                    break;
                default:
                    InMoveInfo.log($"未找到对应步骤:{InMoveInfo.MoveStep}");
                    break;
            }
        }
        string InState() {
            string state = "";
            if (InMoveInfo.MoveStep >= MoveStep.In02)
            {
                return InMoveInfo.MoveParam.ToStr();
            }
            else if (InMoveInfo.MoveStep >= MoveStep.Wait)
            {
                state = "空闲中";
            }
            else if (InMoveInfo.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() {
            InMoveInfo.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, LastCodeList2;
                    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);
            }
        }
    }
}