MainMachine _RightProcess.cs 16.9 KB
using OnlineStore;
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
    {
        public bool RightShelfNoTray = false;
        int RightCount = 0;
        public volatile bool SafeReleaseRightShelf = false;
        void RightProcess()
        {
            if (CheckWait(RightMoveInfo))
                return;
            //常规上料扫码流程
            switch (RightMoveInfo.MoveStep)
            {
                case MoveStep.R01:
                    RightCount = 0;
                    RightShelfNoTray = false;
                    RightMoveInfo.NextMoveStep(MoveStep.R02);
                    CylinderMove(null, IO_Type.RightStopDown, IO_Type.RightStopUP);
                    RightBatchAxisToP2(true);
                    RightMoveInfo.log($"批量轴上升到P2位置,第一次提升,RightStartMovePosition={RightStartMovePosition}");
                    break;
                case MoveStep.R02:
                    RightMoveInfo.NextMoveStep(MoveStep.R03);
                    RightBatchAxisToP2(false);
                    RightMoveInfo.log($"批量轴上升到P2位置,二次提升,RightStartMovePosition={RightStartMovePosition}");
                    break;
                case MoveStep.R03:
                    if (IOValue(IO_Type.RightOverHead_Check).Equals(IO_VALUE.HIGH))
                    {
                        RightMoveInfo.NextMoveStep(MoveStep.R02);
                        Right_Batch_Axis.AbsMove(RightMoveInfo, RightStartMovePosition, Config.Right_Batch_P2_speed);
                        RightMoveInfo.log($"批量轴上升过头,下降到:RightStartMovePosition={RightStartMovePosition}");
                    }
                    else
                    {
                        RightMoveInfo.NextMoveStep(MoveStep.R04);
                    }
                    break;
                case MoveStep.R04:
                    if (IOValue(IO_Type.RightTop_Check).Equals(IO_VALUE.HIGH) && RightShelfNoTray.Equals(false))
                    {
                        if (MiddleMoveInfo.MoveStep >= MoveStep.M09 || MiddleMoveInfo.MoveStep < MoveStep.M02)
                        {
                            RightMoveInfo.NextMoveStep(MoveStep.R06_GettedReelHigh);
                            GetHeight();
                            ScanCode();
                            RightMoveInfo.log($"开始扫码,并获取上一盘料高度,LastHeight={LastHeight}");
                        }
                    }
                    else
                    {
                        if (RightShelfNoTray.Equals(false))
                        {
                            //判断当前位置是否在指定的位置
                            int currP = Right_Batch_Axis.GetAclPosition();
                            int chaz = Math.Abs(currP - Config.Right_Batch_P2);
                            if (chaz > Right_Batch_Axis.Config.CanErrorCountMax)
                            {
                                //RightMoveInfo.NextMoveStep(MoveStep.R02);
                                RightMoveInfo.log("CheckHasTray:上料轴开始慢速上升到P2[" + Config.Right_Batch_P2 + "],等待检测到料盘");
                                
                                RightBatchAxisToP2(false);
                                return;
                            }
                        }
                        //无料盘
                        //RightShelfNoTray = true;
                        RightMoveInfo.NextMoveStep(MoveStep.R12_ShelfNoTray);
                        RightMoveInfo.log($"批量轴已上升到顶,料串已空.");
                    }
                    break;
                case MoveStep.R06_GettedReelHigh:
                    if (RightScanTask.IsCompleted)
                    {
                        var (x,s) = RightScanTask.Result;
                        if (x.Count == 0)
                        {
                            RightMoveInfo.log($"未识别到有效二维码,转入NG箱");
                            RightMoveInfo.MoveParam.IsNg = true;
                        }
                        else
                        {

                            RightMoveInfo.MoveParam.IsNg = false;
                            RightMoveInfo.MoveParam.codeInfos = x;
                            RightMoveInfo.MoveParam.bitmapfilename = s;
                            if (!Common.codeProcess(RightMoveInfo.MoveParam,out string debugmsg))
                            {
                                RightMoveInfo.log($"未识别到有效码,转入NG箱"+ debugmsg);
                                RightMoveInfo.log(JsonHelper.SerializeObject(x));
                                RightMoveInfo.MoveParam.IsNg = true;
                            }else
                                RightMoveInfo.log($"已完成扫码,等待料盘被取走 Count={x.Count}");
                        }
                        RightMoveInfo.NextMoveStep(MoveStep.R10_WaitReelLeave);
                    }
                    else if (RightMoveInfo.IsTimeOut(10))
                    {
                        RightMoveInfo.log($"等待扫码超时");
                    }
                    break;
                case MoveStep.R10_WaitReelLeave:
                    Msg.add(crc.GetString("Res0012","等待料盘取走"), MsgLevel.info);
                    break;
                case MoveStep.R11_NextReel:
                    RightCount++;
                    if (SafeReleaseRightShelf) {
                        SafeReleaseRightShelf = false;
                        
                        RightMoveInfo.NextMoveStep(MoveStep.R12_ShelfNoTray);
                        RightMoveInfo.log($"用户请求释放料架.");
                    }
                    else
                    {
                        RightMoveInfo.NextMoveStep(MoveStep.R02);
                        RightMoveInfo.log($"料盘已取走,开始准备下一盘料");
                        RightMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    }
                    break;
                case MoveStep.R12_ShelfNoTray:
                    RightShelfNoTray = true;
                    RightMoveInfo.NextMoveStep(MoveStep.REND);
                    Right_Batch_Axis.AbsMove(RightMoveInfo, Config.Right_Batch_P1, Config.Right_Batch_P1_speed);
                    RightMoveInfo.log($"料串已取完, 批量轴下降到P1");
                    break;
                case MoveStep.REND:
                    RightMoveInfo.log($"结束运动");
                    RightMoveInfo.EndMove();
                    break;
            //}
            //料串出料流程
            //switch (RightMoveInfo.MoveStep)
            //{
                case MoveStep.R30_OutShelf:
                    RightMoveInfo.NextMoveStep(MoveStep.R31);
                    Right_Batch_Axis.AbsMove(RightMoveInfo, Config.Right_Batch_P1, Config.Right_Batch_P1_speed);
                    RightMoveInfo.log($"批量轴下降到P1位置");
                    break;
                case MoveStep.R31:
                    RightMoveInfo.NextMoveStep(MoveStep.R32);
                    CylinderMove(null, IO_Type.RightStopUP, IO_Type.RightStopDown);
                    RightMoveInfo.log($"阻挡下降");
                    break;
                case MoveStep.R32:
                    RightMoveInfo.NextMoveStep(MoveStep.R33);
                    IOMove(IO_Type.RightMoto_Reverse, IO_VALUE.LOW);
                    IOMove(IO_Type.RightMoto_Run, IO_VALUE.HIGH, false);
                    MiddleMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.RightEnd_Check, IO_VALUE.LOW));
                    RightMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
                    RightMoveInfo.log($"电滚筒向外滚动");
                    break;
                case MoveStep.R33:
                    RightMoveInfo.NextMoveStep(MoveStep.R34);
                    MiddleMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.RightFornt_Check, IO_VALUE.LOW));
                    RightMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
                    RightMoveInfo.OneWaitCanEndStep = true;
                    RightMoveInfo.log($"等待前置检测拉低");
                    break;
                case MoveStep.R34:
                    RightMoveInfo.NextMoveStep(MoveStep.REND);
                    IOMove(IO_Type.RightMoto_Run, IO_VALUE.HIGH, false, 500);
                    RightMoveInfo.log($"电滚停止");
                    break;
            //}
            //料串入料流程
            //switch (RightMoveInfo.MoveStep)
            //{
                case MoveStep.R40_InShelf:
                    RightMoveInfo.NextMoveStep(MoveStep.R41);
                    Right_Batch_Axis.AbsMove(RightMoveInfo, Config.Right_Batch_P1, Config.Right_Batch_P1_speed);
                    RightMoveInfo.log($"批量轴下降到P1位置");
                    break;
                case MoveStep.R41:
                    RightMoveInfo.NextMoveStep(MoveStep.R42);
                    CylinderMove(null, IO_Type.RightStopUP, IO_Type.RightStopDown);
                    RightMoveInfo.log($"阻挡下降");
                    break;
                case MoveStep.R42:
                    RightMoveInfo.NextMoveStep(MoveStep.R43);
                    IOMove(IO_Type.RightMoto_Reverse, IO_VALUE.HIGH);
                    IOMove(IO_Type.RightMoto_Run, IO_VALUE.HIGH, false);
                    RightMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.RightEnd_Check, IO_VALUE.HIGH));
                    RightMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(6000));
                    RightMoveInfo.OneWaitCanEndStep = true;
                    RightMoveInfo.log($"等待料串到位");
                    break;
                case MoveStep.R43:
                    RightMoveInfo.NextMoveStep(MoveStep.R44);
                    RightMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    break;
                case MoveStep.R44:
                    RightMoveInfo.NextMoveStep(MoveStep.R45);
                    IOMove(IO_Type.RightMoto_Run, IO_VALUE.HIGH, false,500);
                    CylinderMove(null, IO_Type.RightStopDown, IO_Type.RightStopUP);
                    RightMoveInfo.log($"电滚筒停止,阻挡上升");
                    break;  
                case MoveStep.R45:
                    if (IOValue(IO_Type.RightEnd_Check).Equals(IO_VALUE.HIGH))
                    {
                        RightMoveInfo.NewMove(MoveStep.R01);
                        RightMoveInfo.log($"料串进入开始上料");
                    }
                    else
                    {
                        RightMoveInfo.NextMoveStep(MoveStep.REND);
                        RightMoveInfo.log($"料串进入失败");
                    }                    
                    break;
                default:
                    RightMoveInfo.log($"未找到对应步骤:{RightMoveInfo.MoveStep}");
                    break;
            }
        }
        string RightState() {
            string state = "";
            if (IOValue(IO_Type.RightEnd_Check).Equals(IO_VALUE.HIGH))
            {
                state += $"有料串,已提取{RightCount}张料盘";
                if (RightShelfNoTray)
                    state += crc.GetString("Res0034",",料串已清空. ");
                else
                    state += ".";

                state += crc.GetString("Res0045","当前ReelID:")+ RightMoveInfo.MoveParam.WareCode;
            }
            else
            {
                return crc.GetString("Res0046","无料串");
            }

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

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

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

        }

        int RightStartMovePosition = 0;
        void RightBatchAxisToP2(bool isFirstMove = true)
        {
            int targetP2 = Config.Right_Batch_P2;
            int targetSpeed = Config.Right_Batch_P2_speed;
            if (!isFirstMove)
            {
                int currPosition = Right_Batch_Axis.GetAclPosition();
                if (currPosition != -1)
                {
                    //targetP2 = currPosition + Config.Right_Batch_ChangeValue * 80;
                    if (targetP2 > Config.Right_Batch_P2)
                    {
                        targetP2 = Config.Right_Batch_P2;
                    }
                    RightMoveInfo.log("BatchAxisToP2 目标P2: " + targetP2 + "(" + currPosition + ")");
                }
                //targetSpeed = Config.BatchAxis_P3Speed / 2;
            }
            RightMoveInfo.TimeOutSeconds = 200;
            RightMoveInfo.CanWhileCount = 0;
            //  需要增加定时器,获取验证信号并停止伺服
            RightStartMovePosition = Right_Batch_Axis.GetAclPosition();
            RightMoveInfo.WaitList.Add(WaitResultInfo.WaitBatchAxisMove(Config.Right_Batch_Axis, targetP2, targetSpeed));
            Config.Right_Batch_Axis.TargetPosition = targetP2;
            Right_Batch_Axis.AbsMove(null, targetP2, targetSpeed);
            //开始检测信号
            Right_Batch_Axis.BatchAxisStartCheck(IO_Type.RightTop_Check, IO_VALUE.HIGH);
        }
        int RightEndMovePosition = 0;
        int LastHeight = 0;
        int LastHeightPos = 0;
        private int GetHeight()
        {
            LastHeight = 0;
            LastHeightPos = 0;
            int AxisChangeValue = Config.Right_Batch_ChangeValue;
            //计算高度
            RightEndMovePosition = Right_Batch_Axis.GetAclPosition();
            bool isLast = false;
            int chaz = Math.Abs(RightEndMovePosition - Config.Right_Batch_P2);
            if (chaz < Right_Batch_Axis.Config.CanErrorCountMax)
            {
                isLast = true;
            }
            float height = (float)Math.Ceiling(1F * Math.Abs(RightEndMovePosition - RightStartMovePosition) / AxisChangeValue);
            LastHeightPos = Math.Abs(RightEndMovePosition - RightStartMovePosition);
            string buchongStr = "";
            if (isLast)
            {
                buchongStr = $"(最后一盘料已补充5)";
                height += 5;
            }

            //如果检测出<=15,都按照8计算
            if (height <= 15)
            {
                LastHeight = 8;
            }
            else
            {
                List<int> heightList = new List<int> { 8, 12, 16, 20 };
                heightList = (from m in heightList orderby m descending select m).ToList<int>();
                float minCha = height;
                foreach (int h in heightList)
                {
                    //取差值最小的接近值
                    float cha = Math.Abs(h - (height - 4));
                    if (cha < minCha)
                    {
                        LastHeight = h;
                        minCha = cha;
                    }
                }
            }
            if (LastHeight <= 8) { LastHeight = 8; }
            string msg = Name + $" 计算盘高:上升前 [{RightStartMovePosition}]实时[{RightEndMovePosition}]差值[{(RightEndMovePosition - RightStartMovePosition)}]系数[{ AxisChangeValue}] 计算后{ buchongStr }[{ height }],归类为【{ LastHeight }mm】";
            LogUtil.info(msg);
            return LastHeight;
        }



    }
}