MainMachine _RightProcess.cs 17.7 KB
using CodeLibrary;
using Newtonsoft.Json;
using OnlineStore;
using OnlineStore.Common;
using OnlineStore.Common.util;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
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);
                    Uppre = Right_Batch_Axis.GetAclPosition();
                    step = 1;
                    RightBatchAxisToP2(false);
                    RightMoveInfo.log($"批量轴上升到P2位置,二次提升,RightStartMovePosition={RightStartMovePosition}");
                    break;
                case MoveStep.R03:
                    RightMoveInfo.NextMoveStep(MoveStep.R04);
                    Uplast = Right_Batch_Axis.GetAclPosition();
                    step = 2;
                    RightMoveInfo.log($"批量轴上升到P2位置到位,当前位置{Uplast}");
                    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_GettedReelInfo);
                            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;
                //正常扫码流程,获取扫码信息,标记是否NG,进入取盘流程
                case MoveStep.R06_GettedReelInfo:
                    if (RightScanTask.IsCompleted)
                    {
                        //返回扫码信息,关键字,图片路径,坐标
                        var (x, k, s, b) = RightScanTask.Result;
                        if (ConfigHelper.Config.Get(Setting_Init.SaveReelPhoto, false))
                        {
                            string d = ConfigHelper.Config.Get(Setting_Init.ReelPhotoSaveDir);
                            string fn = Path.GetFileName(s);
                            string df = Path.Combine(d, fn);
                            File.Copy(s, df);
                        }
                        int pointX = -1; int pointY = -1;
                        b.TryGetValue("PointX", out pointX);
                        b.TryGetValue("PointY", out pointY);
                        if (x.Count == 0 || pointX <= 0 || pointY <= 0)
                        {
                            RightMoveInfo.log($"未识别到有效二维码,转入NG箱;pointX={pointX};pointY={pointY}");
                            RightMoveInfo.MoveParam.IsNg = true;
                            if (ServerCommunication.EnableHttpServer)
                            {
                                if (Monitor.TryEnter(ServerCM.serverclock, TimeSpan.FromSeconds(5)))
                                {
                                    ServerCM.SendNGInfo(crc.GetString("Res0128.e5d9ef10", "模版匹配失败"));
                                }
                                else
                                {
                                    RightMoveInfo.log($"上传服务器NG状态超时");
                                }
                            }
                            UnifiedDataHandler.RecordPrintNg(false, false, out string[] strarrys);

                        }
                        else
                        {
                            RightMoveInfo.MoveParam.IsNg = false;
                            RightMoveInfo.MoveParam.codeInfos = x;
                            RightMoveInfo.MoveParam.Keyword = k;
                            RightMoveInfo.MoveParam.bitmapfilename = s;
                            RightMoveInfo.MoveParam.NewXYAngle = b;
                            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},{JsonConvert.SerializeObject(RightMoveInfo.MoveParam)}");
                        }
                        RightMoveInfo.NextMoveStep(MoveStep.R10_WaitReelLeave);
                    }
                    else if (RightMoveInfo.IsTimeOut(300))
                    {
                        RightMoveInfo.log($"等待扫码超时");
                    }
                    break;
                //等待中间流程跳出这个步骤
                case MoveStep.R10_WaitReelLeave:
                    Msg.add(crc.GetString("Res0099", "等待料盘取走"), 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;
                //无料流程,轴下降到P1点,如果用AGV运输料串那么进料口阻挡下降,进入到结束流程(会进入到出料串流程)
                case MoveStep.R12_ShelfNoTray:
                    RightShelfNoTray = true;
                    ConfigHelper.Config.Set(Setting_Init.SaveReelPhoto, false);
                    RightMoveInfo.NextMoveStep(MoveStep.REND);
                    Right_Batch_Axis.AbsMove(RightMoveInfo, Config.Right_Batch_P1, Config.Right_Batch_P1_speed);
                    if (ConfigHelper.Config.Get("UseAGVTransferShelf", false))//是否用AGV运输料串
                    {
                        RightMoveInfo.log($"料串已取完, 批量轴下降到P1");
                    }
                    else
                    {
                        CylinderMove(LeftMoveInfo, IO_Type.RightStopUP, IO_Type.RightStopDown);
                        RightMoveInfo.log($"料串已取完, 批量轴下降到P1,阻挡下降");
                    }
                    break;
                case MoveStep.REND:
                    RightMoveInfo.log($"结束运动");
                    RightMoveInfo.EndMove();
                    break;
                //}
                //料串出料流程,下降到P1点,阻挡下降,滚筒反转,等待到位后端检测为低电平延时3秒,等待到位前端检测为低电平延时3秒,延时0.5秒反转停止,进入结束步骤
                //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_Run, IO_VALUE.LOW);
                    IOMove(IO_Type.RightMoto_Reverse, IO_VALUE.HIGH);
                    RightMoveInfo.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);
                    RightMoveInfo.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.R35);
                    RightMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
                    break;
                case MoveStep.R35:
                    RightMoveInfo.NextMoveStep(MoveStep.REND);
                    IOMove(IO_Type.RightMoto_Reverse, IO_VALUE.HIGH, false, 500);
                    RightMoveInfo.log($"电滚停止");
                    break;
                //}
                //料串入料流程,轴下降到P1点,阻挡下降,滚筒正转,等待后端到位检测高电平延时5秒,0.5秒后滚筒正转停,阻挡上升,进入上料料流程
                //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.LOW);
                    IOMove(IO_Type.RightMoto_Run, IO_VALUE.HIGH);
                    RightMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.RightEnd_Check, IO_VALUE.HIGH));
                    RightMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(5 * 1000));
                    //RightMoveInfo.TimeOutSeconds = 60;
                    //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 += string.Format(crc.GetString("Res0123.d86f0192", "有料串,已提取{0}张料盘"), RightCount);
                if (RightShelfNoTray)
                    state += crc.GetString("Res0100", ",料串已清空. ") + "\r\n";
                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>, Dictionary<string, string>, string, Dictionary<string, int>)> RightScanTask;
        void ScanCode()
        {
            RightMoveInfo.log("开始扫码");
            try
            {
                RightScanTask = Task.Run(new Func<(List<CodeInfo>, Dictionary<string, string>, string, Dictionary<string, int>)>(() =>
                {
                    IOMove(IO_Type.Camera_Led, IO_VALUE.HIGH);
                    string filename;
                    Task.Delay(10).Wait();
                    List<CodeInfo> LastCodeList;
                    Dictionary<string, string> keyword;
                    Dictionary<string, int> newpointangle;
                    int plantw = GetTrayWidth();
                    (LastCodeList, keyword, filename, newpointangle) = CodeManager.CameraScan(new List<string> { Config.RightCameraName }, plantw);

                    return (LastCodeList, keyword, filename, newpointangle);
                }));
            }
            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.Right_Batch_P2_speed / 10;
            }
            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;
    }
}