LabelMachine.partial.cs 18.9 KB
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CodeLibrary;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
namespace DeviceLibrary
{
    public partial class LabelMachine
    {
        //保存贴标位置调试图像
        public bool saveLabelDebugBmp = true;
        public void test() {
            Console.WriteLine(preReelParam);
        }
        double labelRAxisPos = 0;
        Point p1;
        bool ReverseLabel=false;
        //是否允许进入贴标线体
        public bool TrayCanIN()
        {
            return IOValue(IO_Label_Type.Tray_Check).Equals(IO_VALUE.LOW) && IOValue(IO_Label_Type.TrayStop_Down).Equals(IO_VALUE.HIGH);
            //return IOValue(IO_Label_Type.Line_HasTray_Check).Equals(IO_VALUE.LOW);
            
        }
        //贴标入口料盘到位检测
        public IO_VALUE Tray_Check
        {
            //阻挡检测
            get=> IOValue(IO_Label_Type.Tray_Check);
            //对射检测
            //get=> IOValue(IO_Label_Type.Line_HasTray_Check);
        }
        Task printTask = null;
        int reelcount = 0;
        void WorkProcess()
        {
            if (CheckWait(MoveInfo))
                return;

            switch (MoveInfo.MoveStep)
            {
                case MoveStep.Lbl_01_Wait_ATray:
                    var Label_TaryStop_Check = IOValue(IO_Label_Type.Label_TaryStop_Check);
                    //LogUtil.OutputDebugString($"Tray_Check:{IOValue(IO_Label_Type.Tray_Check)},Label_TaryStop_Check:{Label_TaryStop_Check},preReelParam:{preReelParam!=null}");

                    if (Tray_Check.Equals(IO_VALUE.HIGH) && Label_TaryStop_Check.Equals(IO_VALUE.LOW) && preReelParam != null)
                    {
                        MoveInfo.NextMoveStep(MoveStep.Lbl_02_StopUP);
                        MoveInfo.ReelParam = preReelParam;
                        preReelParam = null;
                        MoveInfo.log("检测到料盘 ReelParam:" + MoveInfo.ReelParam.ToStr());

                    }
                    //else if (Tray_Check.Equals(IO_VALUE.HIGH) && MoveInfo.IsTimeOut(30))
                    //{
                    //    MoveInfo.NextMoveStep(MoveStep.Lbl_02_StopUP);
                    //    MoveInfo.ReelParam.IsNg = true;
                    //    MoveInfo.ReelParam.NgMsg = "超时NG:没有等到料盘信息";
                    //    MoveInfo.log("检测到料盘 超时NG:没有等到料盘信息");
                    //}
                    else if (Tray_Check.Equals(IO_VALUE.HIGH)) {
                        Msg.add($"已检测到料盘, 等待料盘数据信息到位", MsgLevel.info);

                    }
                    else if (Label_TaryStop_Check.Equals(IO_VALUE.HIGH))
                    {
                        Msg.add("贴标区有料未送出", MsgLevel.warning);
                        MoveInfo.log("贴标区有料未送出");
                        MoveInfo.NextMoveStep(MoveStep.Lbl_01_Wait_ATray);
                    }
                    else
                    {
                        Msg.add($"等待上料区进入料盘", MsgLevel.info);
                        MoveInfo.log("等待上料区进入料盘");
                        MoveInfo.NextMoveStep(MoveStep.Lbl_01_Wait_ATray);
                    }
                    break;
                case MoveStep.Lbl_02_StopUP:
                    
                    if (MoveInfo.ReelParam.IsNg)
                    {
                        MoveInfo.NextMoveStep(MoveStep.Lbl_BeginOut);
                        CylinderMove(MoveInfo, IO_Label_Type.TrayStop_Down, IO_Label_Type.TrayStop_Up, IO_VALUE.HIGH);
                        CylinderMove(MoveInfo, IO_Label_Type.Label_Stop_Down, IO_Label_Type.Label_Stop_Up, IO_VALUE.HIGH);
                        MoveInfo.log("NG盘直接通过");
                        return;
                    }
                    
                    MoveInfo.NextMoveStep(MoveStep.Lbl_03_LineRun);
                    MoveInfo.log("上料区阻挡上升,贴标区阻挡下降");
                    CylinderMove(MoveInfo, IO_Label_Type.TrayStop_Down, IO_Label_Type.TrayStop_Up, IO_VALUE.HIGH);
                    CylinderMove(MoveInfo, IO_Label_Type.Label_Stop_Down, IO_Label_Type.Label_Stop_Up, IO_VALUE.LOW);
                    ReelLocation reelLocation;
                    if (RobotManage.offlinemode)
                    {
                        reelLocation = RobotManage.offlinereelLocation;
                        //printTask = DoPrint(MoveInfo.ReelParam, false);
                    }
                    else
                    {
                        reelLocation = ServerConn.DetermineReelStorageLocation(MoveInfo.ReelParam.WareCode);
                    }

                    if (reelLocation == null)
                    {
                        MoveInfo.NextMoveStep(MoveStep.Lbl_BeginOut);
                        MoveInfo.ReelParam.IsNg = true;
                        MoveInfo.ReelParam.NgMsg = "获取料盘目的地失败";
                        MoveInfo.ReelParam.logresult();
                        MoveInfo.log("获取料盘目的地失败");
                    }
                    else
                    {

                        if (!string.IsNullOrEmpty(reelLocation.isTower))
                        {
                            MoveInfo.ReelParam.ReelDest = ReelDest.String;
                        }
                        else if (!string.IsNullOrEmpty(reelLocation.isVTTower))
                        {
                            MoveInfo.ReelParam.ReelDest = ReelDest.Paper;
                        }
                        else if (!string.IsNullOrEmpty(reelLocation.isVacuum))
                        {
                            MoveInfo.ReelParam.ReelDest = ReelDest.MSD;
                        }
                        else
                        {
                            MoveInfo.NextMoveStep(MoveStep.Lbl_BeginOut);
                            MoveInfo.ReelParam.IsNg = true;
                            MoveInfo.ReelParam.NgMsg = "服务器没有返回明确目标";
                            MoveInfo.ReelParam.logresult();
                            MoveInfo.log("服务器没有返回明确目标");
                        }
                        if (RobotManage.offlinemode && !MoveInfo.ReelParam.IsNg)
                        {
                            printTask = DoPrint(MoveInfo.ReelParam, false);
                        }
                    }
                    break;
                case MoveStep.Lbl_03_LineRun:
                    MoveInfo.NextMoveStep(MoveStep.Lbl_03_StopDown_and_wait);
                    MoveInfo.log("线体1,2开始运行");
                    IOMove(IO_Label_Type.Line1_Run, IO_VALUE.HIGH);
                    IOMove(IO_Label_Type.Line2_Run, IO_VALUE.HIGH);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
                    break;
                case MoveStep.Lbl_03_StopDown_and_wait:
                    MoveInfo.NextMoveStep(MoveStep.Lbl_04_LineStopWait);
                    MoveInfo.log("等待区阻挡下降");
                    CylinderMove(MoveInfo, IO_Label_Type.TrayStop_Down, IO_Label_Type.TrayStop_Up, IO_VALUE.LOW);                  
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Label_Type.Label_TaryStop_Check, IO_VALUE.HIGH));                  
                    break;
                case MoveStep.Lbl_04_LineStopWait:
                    MoveInfo.NextMoveStep(MoveStep.Lbl_04_LineStop);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                    break;
                case MoveStep.Lbl_04_LineStop:
                    MoveInfo.NextMoveStep(MoveStep.Lbl_05_ScanCode);
                    MoveInfo.log($"线体1,2停止运行,阻挡上升,并拍照 Label_TaryStop_Check:{IOValue(IO_Label_Type.Label_TaryStop_Check)}");
                    IOMove(IO_Label_Type.Line1_Run, IO_VALUE.LOW);
                    IOMove(IO_Label_Type.Line2_Run, IO_VALUE.LOW);
                    CylinderMove(MoveInfo, IO_Label_Type.TrayStop_Down, IO_Label_Type.TrayStop_Up, IO_VALUE.LOW) ;
                    CylinderMove(MoveInfo, IO_Label_Type.Label_Stop_Down, IO_Label_Type.Label_Stop_Up, IO_VALUE.HIGH);                                 
                    break;
                case MoveStep.Lbl_05_ScanCode:
                    MoveInfo.NextMoveStep(MoveStep.Lbl_06_Get_Reelinfo);
                    ScanTask = ScanCode();
                    break;
                case MoveStep.Lbl_06_Get_Reelinfo:
                    if (ScanTask.IsCompleted)
                    {
                        var (sr,bitmap) = ScanTask.Result;
                        if (sr.Count == 0)
                        {
                            MoveInfo.NextMoveStep(MoveStep.Lbl_WaitCheckLabel);
                            MoveInfo.log($"未识别到有效二维码");
                        }
                        else
                        {
                            if (MoveInfo.ReelParam.WareCode != sr[0].CodeStr)
                            {
                                MoveInfo.NextMoveStep(MoveStep.Lbl_BeginOut);
                                Msg.add($"扫描到的Reelid与发出打印的不一致,系统:{MoveInfo.ReelParam.WareCode},实际:{sr[0].CodeStr}", MsgLevel.warning);
                                MoveInfo.log($"扫描到的Reelid与发出打印的不一致,系统:{MoveInfo.ReelParam.WareCode},实际:{sr[0].CodeStr}");
                                MoveInfo.ReelParam.IsNg = true;
                                MoveInfo.ReelParam.NgMsg = "扫描到的Reelid与发出打印的不一致";
                                MoveInfo.ReelParam.logresult();

                            }
                            else {
                                MoveInfo.NextMoveStep(MoveStep.Lbl_Printted);
                                MoveInfo.ReelParam.codeInfos = sr;
                                MoveInfo.log($"已完成扫码, Count={sr.Count}");
                                MoveInfo.ReelParam.logresult();
                            }
                            
                            MoveInfo.ReelParam.logresult();
                            //标签坐标
                            Point Label_Pix_Point = new Point(MoveInfo.ReelParam.codeInfos[0].X, MoveInfo.ReelParam.codeInfos[0].Y);
                            //照片坐标反转180度
                            var x = 5472 - Label_Pix_Point.X;
                            var y = 3648 - Label_Pix_Point.Y;
                            Label_Pix_Point.X = x;
                            Label_Pix_Point.Y = y;
                            //图像也旋转180度
                            bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);

                            (p1, labelRAxisPos, ReverseLabel) = ClacLabel2(Label_Pix_Point,bitmap, MoveInfo.ReelParam);
                        }
                    }
                    else if (MoveInfo.IsTimeOut(20))
                    {
                        MoveInfo.NextMoveStep(MoveStep.Lbl_04_LineStop);
                        MoveInfo.log($"等待扫码超时,重新扫码");
                    }
                    break;
                case MoveStep.Lbl_Printted:
                    //bool isPrintOk = LastPrintStatus.Equals(Asa.PrintLabel.PrinterStatus.Idle);
                    if (IOValue(IO_Label_Type.Label_Cylinder_Check).Equals(IO_VALUE.HIGH))
                    {
                        MoveInfo.NextMoveStep(MoveStep.Lbl02);
                        Label_Z_Axis.AbsMove(MoveInfo, Config.Label_Z_P3, Config.Label_Z_P3_speed);
                        IOMove(IO_Label_Type.LabelCylinder_Work, IO_VALUE.HIGH);
                        MoveInfo.log("标签打印完毕,取标气缸下降,开始吸气.");
                    }
                    else if (MoveInfo.IsTimeOut(25))
                    {
                        Msg.add($"标签打印超时{MoveInfo.TimeOutSeconds}秒", MsgLevel.warning);
                        MoveInfo.log("标签打印超时, 放弃贴标NG处理");
                        MoveInfo.ReelParam.IsNg = true;
                        MoveInfo.ReelParam.NgMsg = "标签打印超时";
                        MoveInfo.ReelParam.logresult();

                    }
                    else if (MoveInfo.IsTimeOut(15)) { 
                        Msg.add($"标签打印超时{MoveInfo.TimeOutSeconds}秒",MsgLevel.warning);
                        MoveInfo.log("标签打印超时");
                    }
                    break;
                case MoveStep.Lbl02:
                    MoveInfo.NextMoveStep(MoveStep.Lbl03);
                    //MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1500));
                    MoveInfo.log("等待.");
                    break;
                case MoveStep.Lbl03:
                    MoveInfo.NextMoveStep(MoveStep.Lbl10);
                    Label_Z_Axis.AbsMove(MoveInfo, Config.Label_Z_P2, Config.Label_Z_P2_speed);
                    MoveInfo.log("标签打印完毕,取标气缸上升,取起标签.");
                    break;
                case MoveStep.Lbl10:
                    MoveInfo.NextMoveStep(MoveStep.Lbl11_wait);
                    Label_X_Axis.AbsMove(MoveInfo, p1.X, Config.Label_X_Base_speed);
                    Label_Y_Axis.AbsMove(MoveInfo, p1.Y, Config.Label_X_Base_speed);                    
                    Label_Z_Axis.AbsMove(MoveInfo, Config.Label_Z_P4, Config.Label_Z_P4_speed);
                    //MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                    MoveInfo.log("Label_XYZ转到贴标点.");
                    break;
                case MoveStep.Lbl11_wait:
                    MoveInfo.NextMoveStep(MoveStep.Lbl11);
                    Label_R_Axis.AbsMove(MoveInfo, (int)labelRAxisPos, Config.Label_R_P2_speed);
                    //MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    MoveInfo.log("等待.");
                    break;
                case MoveStep.Lbl11:
                    MoveInfo.NextMoveStep(MoveStep.Lbl12);
                    var p5 = Config.Label_Z_P5;
                    p5 = p5 - (MoveInfo.ReelParam.PlateH - 8) * Config.Label_Z_Axis_ChangeValue;
                    Label_Z_Axis.AbsMove(MoveInfo, p5, Config.Label_Z_P5_speed);
                    MoveInfo.log("取标气缸下降.");
                    break;
                case MoveStep.Lbl12:
                    MoveInfo.NextMoveStep(MoveStep.Lbl13);                    
                    //MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    break;
                case MoveStep.Lbl13:
                    MoveInfo.NextMoveStep(MoveStep.Lbl_BeginOut);
                    IOMove(IO_Label_Type.LabelCylinder_Work, IO_VALUE.LOW);
                    MoveInfo.log("关闭吸气.");
                    Label_Z_Axis.AbsMove(null, Config.Label_Z_P2, Config.Label_Z_P2_speed);
                    MoveInfo.log("取标气缸上升.");
                    break;
                case MoveStep.Lbl_WaitCheckLabel:
                    Msg.add("未识别到有效二维码", MsgLevel.warning);
                    if (IOValue(IO_Label_Type.Reset_BTN).Equals(IO_VALUE.HIGH)) {
                        MoveInfo.NextMoveStep(MoveStep.Lbl_BeginOut);
                        IOMove(IO_Label_Type.Line2_Run, IO_VALUE.HIGH);
                        MoveInfo.log("人工完成贴标.");
                    }
                    break;
                case MoveStep.Lbl_BeginOut:
                    MoveInfo.NextMoveStep(MoveStep.Lbl15);
                    Label_X_Axis.AbsMove(null, Config.Label_X_P2, Config.Label_X_P2_speed);
                    Label_Y_Axis.AbsMove(null, Config.Label_Y_P2, Config.Label_Y_P2_speed);
                    Label_R_Axis.AbsMove(null, Config.Label_R_P2, Config.Label_Z_P2_speed);
                    if (MoveInfo.ReelParam.IsNg)
                    {
                        IOMove(IO_Label_Type.Line1_Run, IO_VALUE.HIGH);
                        IOMove(IO_Label_Type.Line2_Run, IO_VALUE.HIGH);
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
                    }
                    MoveInfo.log("Label_XYR转到取标点,待机");
                    break;
                case MoveStep.Lbl15:
                    if (MoveInfo.ReelParam.WareCode=="testlabel") {
                        MoveInfo.NextMoveStep(MoveStep.L30_LabelFinish);
                        MoveInfo.log("贴标测试结束.");
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(MoveStep.Lbl16);
                        CylinderMove(MoveInfo, IO_Label_Type.Label_Stop_Down, IO_Label_Type.Label_Stop_Up, IO_VALUE.HIGH);
                        MoveInfo.log("贴标阻挡上升.");
                    }
                    break;
                case MoveStep.Lbl16:
                    CylinderMove(MoveInfo, IO_Label_Type.TrayStop_Down, IO_Label_Type.TrayStop_Up, IO_VALUE.LOW);
                    if (RobotManage.filterMachine.isWaitReel)
                    {
                        MoveInfo.NextMoveStep(MoveStep.L30_LabelFinish);
                        RobotManage.filterMachine.preReelParam = MoveInfo.ReelParam;                        
                        IOMove(IO_Label_Type.Line2_Run, IO_VALUE.HIGH);
                        RobotManage.filterMachine.LineRun();
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(4000));
                        MoveInfo.log("送出料盘.");
                    }
                    else if (MoveInfo.IsTimeOut(30))
                    {
                        Msg.add($"等待分盘线超时{MoveInfo.TimeOutSeconds}秒", MsgLevel.warning);
                        MoveInfo.log("等待分盘线超时");
                    }
                    break;
                case MoveStep.L30_LabelFinish:
                    if (RobotManage.filterMachine.Tray_Check.Equals(IO_VALUE.HIGH))
                    {
                        MoveInfo.NewMove(MoveStep.Lbl_01_Wait_ATray);
                        IOMove(IO_Label_Type.Line2_Run, IO_VALUE.LOW);
                        MoveInfo.log("完成贴标.");
                    }
                    else if (MoveInfo.IsTimeOut(30))
                    {
                        MoveInfo.NewMove(MoveStep.Lbl_01_Wait_ATray);
                        IOMove(IO_Label_Type.Line2_Run, IO_VALUE.LOW);
                        MoveInfo.log("等待料盘到达分盘线超时.完成贴标.");
                    }
                    else {
                        Msg.add($"等待到达分盘线", MsgLevel.warning);
                        MoveInfo.log("等待到达分盘线");
                    }
                    break;
            }
        }
        public void LabelTest(){
            MoveInfo.NextMoveStep(MoveStep.Lbl_04_LineStop);
            MoveInfo.log("开始打印贴标测试.");
            MoveInfo.ReelParam = new ReelParam("testlabel", 7, 8);
            MoveInfo.ReelParam.QTY = 9999;
            //DoPrint(MoveInfo.ReelParam);
            
        }
    }
}