MainMachine _MiddleProcess.cs 16.9 KB
using OnlineStore;
using CodeLibrary;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using OnlineStore.Common.util;
using Newtonsoft.Json;

namespace DeviceLibrary
{
    partial class MainMachine
    {
        void MiddleProcess()
        {
            if (CheckWait(MiddleMoveInfo))
                return;

            switch (MiddleMoveInfo.MoveStep)
            {
                case MoveStep.M_Standby:
                    //如果右侧可取料那么那么移动轴到p2点,夹爪释放。获取右侧的标签信息,右侧标签信息复位,否则等待
                    if (RightMoveInfo.MoveStep == MoveStep.R10_WaitReelLeave)
                    {
                        PlwHight = 0;
                        MiddleMoveInfo.NextMoveStep(MoveStep.M02);
                        Take_Middle_Axis.AbsMove(MiddleMoveInfo, Config.Take_Middle_P2, Config.Take_Middle_P2_speed);
                        Take_UpDown_Axis.AbsMove(MiddleMoveInfo, Config.Take_UpDown_P2, Config.Take_UpDown_P2_speed);
                        clampTool.Release();
                        //复制右侧料盘信息
                        MiddleMoveInfo.MoveParam = RightMoveInfo.MoveParam.clone();
                        addParam(MiddleMoveInfo.MoveParam);
                        RightMoveInfo.MoveParam = new LabelParam() { PreUID = MiddleMoveInfo.MoveParam.UID};
                        MiddleMoveInfo.log($"右侧可以取料,旋转轴/上下轴转到P2点:{JsonConvert.SerializeObject(MiddleMoveInfo.MoveParam)}");
                        //MiddleMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.RightArm_Check, IO_VALUE.HIGH));
                    }
                    else if (MiddleMoveInfo.IsTimeOut(60))
                    {
                        MiddleMoveInfo.log("等待右侧可以取料");
                    }
                    break;
                //z轴移动到p3点,抓取,返回p2点
                case MoveStep.M02:
                    MiddleMoveInfo.NextMoveStep(MoveStep.M03);
                    Take_UpDown_Axis.AbsMove(MiddleMoveInfo, Config.Take_UpDown_P3, Config.Take_UpDown_P3_speed);
                    MiddleMoveInfo.log("右侧可以取料,上下轴转到P3点,开始取料");
                    break;
                case MoveStep.M03:
                    if (clampTool.Clamp())
                    {
                        MiddleMoveInfo.NextMoveStep(MoveStep.M04);
                        MiddleMoveInfo.log("取料气缸夹紧");
                    }
                    break;
                case MoveStep.M04:
                    MiddleMoveInfo.NextMoveStep(MoveStep.M05);
                    Take_UpDown_Axis.AbsMove(MiddleMoveInfo, Config.Take_UpDown_P2, Config.Take_UpDown_P2_speed);
                    MiddleMoveInfo.log("上下轴返回P2点");
                    break;
                //如果抓取完成或者定位低电平,进入下一步,右侧进行下一盘;如果左侧空闲,存在NG或抓取失败人工处理,如果右侧进料确认右侧进入继续取料步骤,如果中间ng轴会p1点否则继续下一个流程
                case MoveStep.M05:
                    if (clampTool.IsClamp() || IOValue(IO_Type.RightTop_Check).Equals(IO_VALUE.LOW))
                    {
                        bool isclamp = clampTool.IsClamp();
                        bool che = IOValue(IO_Type.RightTop_Check).Equals(IO_VALUE.LOW);
                        MiddleMoveInfo.log($"取起物料状态{isclamp};io状态{che}");
                        MiddleMoveInfo.NextMoveStep(MoveStep.M06);
                        RightMoveInfo.NextMoveStep(MoveStep.R11_NextReel);
                        MiddleMoveInfo.MoveParam.PlateW = GetTrayWidth();
                        MiddleMoveInfo.log($"通知右侧料串,料已取走,获取盘宽{MiddleMoveInfo.MoveParam.PlateW}");
                        //Task.Run(() => {
                        //    CodeManager.NS100Service(MiddleMoveInfo, MiddleMoveInfo.MoveParam.BitmapBase64, MiddleMoveInfo.MoveParam.codeInfos, MiddleMoveInfo.MoveParam.PlateW);
                        //}).ContinueWith((t) => {
                        //    MiddleMoveInfo.NextMoveStep(MoveStep.M06);
                        //});

                    }
                    else if (LeftMoveInfo.MoveStep == MoveStep.L10_WaitReelPut)
                    {
                        if (MiddleMoveInfo.MoveParam.IsNg)
                        {
                            Msg.add(crc.GetString("Res0096", "抓料失败请手动处理,请将料盘放入:NG箱,按右侧按钮继续"), MsgLevel.alarm);
                            MiddleMoveInfo.log("抓料失败请手动处理,请将料盘放入:NG箱,按右侧按钮继续");
                        }
                        else
                        {
                            Msg.add(crc.GetString("Res0097", "抓料失败请手动处理,请将料盘放入: 左侧料串,按右侧按钮继续"), MsgLevel.alarm);
                            MiddleMoveInfo.log("抓料失败请手动处理,请将料盘放入: 左侧料串,按右侧按钮继续");
                        }

                        if (IOValue(IO_Type.Right_BTN).Equals(IO_VALUE.HIGH))
                        {
                            RightMoveInfo.NextMoveStep(MoveStep.R11_NextReel);
                            if (MiddleMoveInfo.MoveParam.IsNg)
                            {
                                MiddleMoveInfo.NextMoveStep(MoveStep.M_ReturnToP1);
                            }
                            else
                            {
                                MiddleMoveInfo.NextMoveStep(MoveStep.M06);
                            }
                        }
                    }
                    else if (MiddleMoveInfo.IsTimeOut(60))
                    {
                        MiddleMoveInfo.log("抓料失败,等待左侧允许放料");
                    }
                    break;
                //NG料进入NG流程,正常入正常流程
                case MoveStep.M06_Wait:
                    break;
                case MoveStep.M06:
                    if (MiddleMoveInfo.MoveParam.IsNg)
                    {
                        MiddleMoveInfo.NextMoveStep(MoveStep.M20_ToNgBox);
                        MiddleMoveInfo.log("判断为NG料");
                    }
                    //等待右侧料串计算盘高
                    //else if (RightMoveInfo.MoveStep >= MoveStep.R06_GettedReelHigh && RightMoveInfo.MoveStep <= MoveStep.R10_WaitReelLeave)
                    else //if (LastHeightPos > 0)
                    {
                        MiddleMoveInfo.NextMoveStep(MoveStep.M07);
                        MiddleMoveInfo.log($"开始往左侧料串移栽,{MiddleMoveInfo.MoveParam.ToStr()}");
                    }
                    //else if (MiddleMoveInfo.IsTimeOut(60))
                    //{
                    //    MiddleMoveInfo.log("等待计算盘高");
                    //}
                    break;
                case MoveStep.M07:
                    if (!Take_Middle_Axis.IsSafe(Config.Take_Middle_P3, out string msg))
                    {
                        Msg.add(msg, MsgLevel.info);
                    }
                    //左侧空闲,等待贴标流程为打印标签,复制信息给标签流程,进入下一步,移动旋转轴到p3
                    else if (LeftMoveInfo.MoveStep == MoveStep.L10_WaitReelPut)
                    {
                        if (clampTool.IsClamp())
                        {
                            if (!LabelMoveInfo.IsStep(MoveStep.Lbl_WaitPrintInfo))
                            {
                                MiddleMoveInfo.log("等待贴标流程空闲");
                                return;
                            }
                            MiddleMoveInfo.NextMoveStep(MoveStep.M08);
                            CurrentPrintInfo = MiddleMoveInfo.MoveParam.clone();
                            LabelMoveInfo.NextMoveStep(MoveStep.Lbl_PrintLabel);
                            LabelMoveInfo.MoveParam = MiddleMoveInfo.MoveParam.clone();
                            Take_Middle_Axis.AbsMove(MiddleMoveInfo, Config.Take_Middle_P3, Config.Take_Middle_P3_speed);
                            MiddleMoveInfo.log($"左侧允许放料,旋转轴P3");
                        }
                        else
                        {
                            Msg.add(crc.GetString("Res0097", "抓料失败请手动处理,请将料盘放入: 左侧料串,按右侧按钮继续"), MsgLevel.alarm);
                            if (IOValue(IO_Type.Right_BTN).Equals(IO_VALUE.HIGH))
                            {
                                RightMoveInfo.NextMoveStep(MoveStep.R11_NextReel);
                                MiddleMoveInfo.NextMoveStep(MoveStep.M09);
                                CurrentPrintInfo = MiddleMoveInfo.MoveParam.clone();
                                LabelMoveInfo.NextMoveStep(MoveStep.Lbl_PrintLabel);
                                LabelMoveInfo.MoveParam = MiddleMoveInfo.MoveParam.clone();
                                MiddleMoveInfo.log("用户按下右侧Reset,继续贴标");
                            }
                            else
                            {

                                bool isclamp = clampTool.IsClamp();
                                bool che = IOValue(IO_Type.RightTop_Check).Equals(IO_VALUE.LOW);
                                MiddleMoveInfo.log($"物料掉落, 取起物料状态{isclamp};io状态{che}");
                            }
                        }

                    }
                    else if (MiddleMoveInfo.IsTimeOut(60))
                    {
                        MiddleMoveInfo.log("等待左侧允许放料");
                        Msg.add(crc.GetString("Res0098", "等待左侧允许放料"), MsgLevel.info);
                    }
                    break;
                //z轴到p4
                case MoveStep.M08:
                    MiddleMoveInfo.NextMoveStep(MoveStep.M08_01);
                    if (MiddleMoveInfo.MoveParam.PlateW > 7)
                    {
                        MiddleMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1500));
                        MiddleMoveInfo.log($"尺寸:{MiddleMoveInfo.MoveParam.PlateW},停留1500ms");
                    }
                    else
                    {
                        MiddleMoveInfo.log($"尺寸:{MiddleMoveInfo.MoveParam.PlateW},不停留");
                    }
                    break;
                case MoveStep.M08_01:
                    MiddleMoveInfo.NextMoveStep(MoveStep.M09);
                    Take_UpDown_Axis.AbsMove(MiddleMoveInfo, Config.Take_UpDown_P4, Config.Take_UpDown_P4_speed);
                    MiddleMoveInfo.log("左侧允许放料,上下轴到P4");
                    break;
                //夹爪释放复制信息给左侧流程,左侧进入到收到料流程
                case MoveStep.M09:
                    if (clampTool.Release())
                    {
                        MiddleMoveInfo.NextMoveStep(MoveStep.M10);
                        LeftMoveInfo.MoveParam = MiddleMoveInfo.MoveParam.clone();
                        LeftMoveInfo.NextMoveStep(MoveStep.L11_ReelPutted);
                        MiddleMoveInfo.log("取料夹爪放松,通知左侧料串已放入,左侧等待1秒");
                        LeftMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    }
                    else if (MiddleMoveInfo.IsTimeOut(10))
                    {
                        MiddleMoveInfo.NextMoveStep(MoveStep.M09);
                        MiddleMoveInfo.log("等待夹爪放松");
                    }
                    Msg.add(crc.GetString("Res0050", "等待夹爪放松"), MsgLevel.info);
                    break;
                //待机流程
                case MoveStep.M10:
                    MiddleMoveInfo.NextMoveStep(MoveStep.M_ReturnToP1);
                    Take_UpDown_Axis.AbsMove(MiddleMoveInfo, Config.Take_UpDown_P1, Config.Take_UpDown_P1_speed);
                    MiddleMoveInfo.log("放料完成,上下轴返回待机点");
                    break;
                case MoveStep.M_ReturnToP1:
                    //检查是否在拍照,避免干涉 R06_GettedReelInfo
                    if (RightMoveInfo.IsStep(MoveStep.R06_GettedReelInfo))
                    {
                        MiddleMoveInfo.log("等待右侧拍照完成,避免干涉");
                        return;
                    }
                    MiddleMoveInfo.NextMoveStep(MoveStep.M_Standby);
                    Take_Middle_Axis.AbsMove(MiddleMoveInfo, Config.Take_Middle_P1, Config.Take_Middle_P1_speed);
                    MiddleMoveInfo.log("放料完成,旋转轴返回待机点");
                    break;
                //NG流程
                case MoveStep.M20_ToNgBox:
                    if (PlwHight > 65 * 1000)
                    {
                        Msg.add(crc.GetString("Res0166.2bf72810", "NG物料厚度超过72mm无法放入NG箱"), MsgLevel.alarm);


                    }
                    else if (PlwHight > 0)
                    {
                        MiddleMoveInfo.NextMoveStep(MoveStep.M20_1_ToNgBox);
                        Take_UpDown_Axis.AbsMove(MiddleMoveInfo, Config.Take_UpDown_P1, Config.Take_UpDown_P1_speed);
                        MiddleMoveInfo.log("NG时上下轴转到P1");
                    }
                    else
                    {
                        Msg.add(crc.GetString("Res0182.2def73c9", "NG物料, 等待测高"), MsgLevel.info);
                        MiddleMoveInfo.log("NG物料, 等待测高");
                    }
                    break;
                case MoveStep.M20_ToNgBox_72HRelease:
                    if (IOValue(IO_Type.GratingSignal_Check).Equals(IO_VALUE.HIGH))
                    {
                        MiddleMoveInfo.NextMoveStep(MoveStep.M_ReturnToP1);
                        MiddleMoveInfo.log("光栅恢复,回待机点");
                    }
                    break;
                case MoveStep.M20_1_ToNgBox:

                    MiddleMoveInfo.NextMoveStep(MoveStep.M21);
                    Take_Middle_Axis.AbsMove(MiddleMoveInfo, Config.Take_Middle_P5, Config.Take_Middle_P5_speed);
                    MiddleMoveInfo.log("旋转轴转到P5 NG位置");
                    break;
                case MoveStep.M21:
                    MiddleMoveInfo.NextMoveStep(MoveStep.M22);
                    Take_UpDown_Axis.AbsMove(MiddleMoveInfo, Config.Take_UpDown_P5, Config.Take_UpDown_P5_speed);
                    MiddleMoveInfo.log("上下轴转到P5 NG位置");
                    break;
                case MoveStep.M22:
                    if (clampTool.Release())
                    {
                        MiddleMoveInfo.NextMoveStep(MoveStep.M23);
                        clampTool.Release();
                        removeParam(MiddleMoveInfo.MoveParam.UID);
                        MiddleMoveInfo.log("取料夹爪放松,放料入NG位置.");
                    }
                    else if (MiddleMoveInfo.IsTimeOut(10))
                    {
                        MiddleMoveInfo.NextMoveStep(MoveStep.M22);
                        MiddleMoveInfo.log("等待夹爪放松");
                    }
                    Msg.add(crc.GetString("Res0050", "等待夹爪放松"), MsgLevel.info);
                    break;
                case MoveStep.M23:
                    //检查是否在拍照,避免干涉 R06_GettedReelInfo
                    if (RightMoveInfo.IsStep(MoveStep.R06_GettedReelInfo))
                    {
                        MiddleMoveInfo.log("等待右侧拍照完成,避免干涉");
                        return;
                    }
                    MiddleMoveInfo.NextMoveStep(MoveStep.M_ReturnToP1);
                    Take_UpDown_Axis.AbsMove(MiddleMoveInfo, Config.Take_UpDown_P2, Config.Take_UpDown_P5_speed);
                    MiddleMoveInfo.log("上下轴转到P2 位置");
                    break;
                default:
                    MiddleMoveInfo.log($"未找到对应步骤:{MiddleMoveInfo.MoveStep}");
                    break;
            }
        }

        private int GetTrayWidth()
        {
            if (IOValue(IO_Type.TraySize_15).Equals(IO_VALUE.HIGH))
                return 15;
            else if (IOValue(IO_Type.TraySize_13).Equals(IO_VALUE.HIGH))
                return 13;
            //else if (IOValue(IO_Type.TraySize_7).Equals(IO_VALUE.HIGH))
            //    return 7;
            else
                return 7;
        }

        string MiddleState()
        {
            string state = "";
            if (MiddleMoveInfo.MoveStep == MoveStep.M_Standby || MiddleMoveInfo.MoveStep == MoveStep.Wait)
                state += crc.GetString("Res0074", "等待中");
            else
                state += crc.GetString("Res0045", "当前ReelID:") + MiddleMoveInfo.MoveParam.WareCode;

            return state;
        }
    }
}