MainMachine _LabelProcess.cs 20.5 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;
using System.Threading;
using System.Timers;
using System.IO;
using OnlineStore.Common.util;

namespace DeviceLibrary
{
    partial class MainMachine
    {
        Point Label_p3;

        LabelParam CurrentPrintInfo = null;
        double size_7_radiusratio = ConfigHelper.Config.Get<double>("Labeling_size_7_radiusratio", 0.7);


        enum LabelFailReason
        {
            PrintFailure,
            SuckerFailure
        }
        LabelFailReason labelFailReason = LabelFailReason.PrintFailure;
        void LabelProcess()
        {
            if (CheckWait(LabelMoveInfo))
                return;

            switch (LabelMoveInfo.MoveStep)
            {
                //取标签流程,等待打印标签
                case MoveStep.Lbl01:
                    LabelMoveInfo.NextMoveStep(MoveStep.Lbl02);
                    Label_X_Axis.AbsMove(LabelMoveInfo, Config.Label_X_P1, Config.Label_X_P1_speed);
                    //Label_Z_Axis.AbsMove(LabelMoveInfo, Config.Label_Z_P2, Config.Label_Z_P2_speed);
                    Label_Z_Axis.AbsMove(LabelMoveInfo, Config.Label_Z_P1, Config.Label_Z_P2_speed);
                    LabelMoveInfo.log("Label_X到待机点,Label_Z到待机点");
                    break;
                case MoveStep.Lbl02:
                    LabelMoveInfo.NextMoveStep(MoveStep.Lbl02_1);
                    Label_Y_Axis.AbsMove(LabelMoveInfo, Config.Label_Y_P2, Config.Label_Y_P2_speed);
                    Label_R_Axis.AbsMove(LabelMoveInfo, Config.Label_R_P2, Config.Label_Z_P2_speed);
                    LabelMoveInfo.log("Label_YR转到取标点");
                    break;
                case MoveStep.Lbl02_1:
                    LabelMoveInfo.NextMoveStep(MoveStep.Lbl02_2);
                    Label_X_Axis.AbsMove(LabelMoveInfo, Config.Label_X_P2, Config.Label_X_P2_speed);
                    Label_Z_Axis.AbsMove(LabelMoveInfo, Config.Label_Z_P2, Config.Label_Z_P2_speed);
                    LabelMoveInfo.log("Label_X转到取标点,Label_Z转到取标点,等待标签打印完毕");
                    break;
                case MoveStep.Lbl02_2:
                    //补一个空白流程, 防止提前检测到Lbl_WaitPrintInfo步骤
                    LabelMoveInfo.NextMoveStep(MoveStep.Lbl_WaitPrintInfo);
                    LabelMoveInfo.log("等待标签打印完毕");
                    break;
                //在中间步骤跳出,中间步骤进入到旋转轴到p3
                case MoveStep.Lbl_WaitPrintInfo:
                    LabelMoveInfo.log("等待打印标签信息");
                    break;
                //中间步骤旋转轴到p3接收打印信息后,开始打印
                case MoveStep.Lbl_PrintLabel:
                    if (CurrentPrintInfo == null)
                    {
                        LabelMoveInfo.log("等待接收打印标签信息");
                        return;
                    }
                    string newversion2 = ConfigHelper.Config.Get("HardwareversionofAGV", "V2");
                    if (newversion2 == "V2")
                    {
                        if (IOValue(IO_Type.HasPrinter).Equals(IO_VALUE.HIGH))
                        {
                            LabelMoveInfo.log("标签没取走不打印标签");
                            return;
                        }
                    }


                    var kv = CurrentPrintInfo.Keyword.Select(k => $"{k.Key}={k.Value}").ToArray();
                    LabelMoveInfo.log("调用 PrintLabel 打印标签 StartPrintLabel  ,[" + string.Join(", ", kv) + "]  开始");
                    string labelName = ConfigHelper.Config.Get(Setting_Init.LabelName);
                    if (RobotManage.printerHelper.Print(labelName, CurrentPrintInfo.Keyword, out string msg))
                    {
                        LabelMoveInfo.NextMoveStep(MoveStep.Lbl_WaitPrint);
                        LabelMoveInfo.log("PrintLabel 打印标签 StartPrintLabel 结束  " + msg);
                        UnifiedDataHandler.RecordPrintNg(false, true, out string[] strarrys);
                        //数据保存到共享文件夹
                        DataUploadUtil.LabelUpload(CurrentPrintInfo.Keyword);
                    }
                    else
                    {
                        LabelMoveInfo.log("PrintLabel 失败  " + msg);
                        LabelMoveInfo.NextMoveStep(MoveStep.Lbl_PrintFail);
                        labelFailReason = LabelFailReason.PrintFailure;
                    }
                    break;
                //等待打印完成,v2靠传感器检测,其他的靠方法返回
                case MoveStep.Lbl_WaitPrint:
                    string version = ConfigHelper.Config.Get("Hardwareversion", "V2");
                    string newversion = ConfigHelper.Config.Get("HardwareversionofAGV", "V2");
                    bool detectLabel = false;
                    if (version == "V2")
                    {
                        if (IOValue(IO_Type.HasPrinter).Equals(IO_VALUE.HIGH))
                            detectLabel = true;
                    }
                    else if (newversion == "V2")
                    {
                        if (IOValue(IO_Type.HasPrinter).Equals(IO_VALUE.HIGH))
                            detectLabel = true;
                    }
                    else
                    {
                        var isPrinted = RobotManage.printerHelper.IsLabelOnPeeler();
                        isPrinted.Wait();
                        if (isPrinted.Result.Item1)
                            detectLabel = true;
                    }

                    if (detectLabel)
                    {
                        LabelMoveInfo.NextMoveStep(MoveStep.Lbl_Printted);
                        LabelMoveInfo.errlog("标签打印完成");
                    }
                    else if (LabelMoveInfo.IsTimeOut(15))
                    {
                        LabelMoveInfo.NextMoveStep(MoveStep.Lbl_PrintFail);
                        labelFailReason = LabelFailReason.PrintFailure;
                        LabelMoveInfo.errlog("标签打印超时");
                    }
                    else
                    {
                        //Msg.add("等待标签打印", MsgLevel.info);
                        LabelMoveInfo.log("等待标签打印");
                    }
                    break;
                //打印失败
                case MoveStep.Lbl_PrintFail:
                    if (labelFailReason == LabelFailReason.SuckerFailure)
                        Msg.add(crc.GetString("Res0129.0e13d0de", "标签打印失败,请检查打印机状态,关门后将自动重试"), MsgLevel.alarm);
                    else if (labelFailReason == LabelFailReason.SuckerFailure)
                        Msg.add(crc.GetString("Res0130.c3836615", "标签吸取失败,请检查,关门后将自动重试"), MsgLevel.alarm);
                    if (IOValue(IO_Type.LeftBackDoor_Check).Equals(IO_VALUE.LOW) || IOValue(IO_Type.RightBackDoor_Check).Equals(IO_VALUE.LOW))
                    {
                        LabelMoveInfo.NextMoveStep(MoveStep.Lbl_PrintFail_02);
                        LabelMoveInfo.log("维护门已打开");
                    }
                    break;
                case MoveStep.Lbl_PrintFail_02:
                    if (labelFailReason == LabelFailReason.SuckerFailure)
                        Msg.add(crc.GetString("Res0129.0e13d0de", "标签打印失败,请检查打印机状态,关门后将自动重试"), MsgLevel.warning);
                    else if (labelFailReason == LabelFailReason.SuckerFailure)
                        Msg.add(crc.GetString("Res0130.c3836615", "标签吸取失败,请检查,关门后将自动重试"), MsgLevel.warning);
                    if (IOValue(IO_Type.LeftBackDoor_Check).Equals(IO_VALUE.HIGH) && IOValue(IO_Type.RightBackDoor_Check).Equals(IO_VALUE.LOW))
                    {
                        LabelMoveInfo.NextMoveStep(MoveStep.Lbl_PrintLabel);
                        LabelMoveInfo.log("维护门已关闭");
                    }
                    break;
                //打印成功,在轴到p3点取标签,到p2点
                case MoveStep.Lbl_Printted:
                    LabelMoveInfo.NextMoveStep(MoveStep.Lbl03);
                    IOMove(IO_Type.LabelCylinder_Work, IO_VALUE.HIGH);
                    Label_Z_Axis.AbsMove(LabelMoveInfo, Config.Label_Z_P3, Config.Label_Z_P3_speed);
                    //CylinderMove(LabelMoveInfo, IO_Type.LabelCylinder_Bck, IO_Type.LabelCylinder_Fwd);
                    LabelMoveInfo.log("标签打印完毕,取标气缸下降,开始吸气.");
                    break;
                case MoveStep.Lbl03:
                    LabelMoveInfo.NextMoveStep(MoveStep.Lbl04);
                    LabelMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                    break;
                case MoveStep.Lbl04:
                    LabelMoveInfo.NextMoveStep(MoveStep.Lbl05);
                    Label_Z_Axis.AbsMove(LabelMoveInfo, Config.Label_Z_P2, Config.Label_Z_P2_speed);
                    //CylinderMove(LabelMoveInfo, IO_Type.LabelCylinder_Fwd, IO_Type.LabelCylinder_Bck);                    
                    LabelMoveInfo.log("标签打印完毕,取标气缸上升,取起标签.");
                    break;
                //靠传感器或方法判断取标签
                case MoveStep.Lbl05:
                    string versions = ConfigHelper.Config.Get("Hardwareversion", "V2");
                    string newversions = ConfigHelper.Config.Get("HardwareversionofAGV", "V2");
                    bool IsLabelLeave;
                    if (versions == "V2")
                    {
                        IsLabelLeave = IOValue(IO_Type.HasPrinter).Equals(IO_VALUE.LOW);
                    }
                    else if (newversions == "V2")
                    {
                        IsLabelLeave = IOValue(IO_Type.HasPrinter).Equals(IO_VALUE.LOW);
                    }
                    else
                    {
                        var ip = RobotManage.printerHelper.IsLabelOnPeeler();
                        ip.Wait();
                        IsLabelLeave = !ip.Result.Item1;
                    }

                    if (IsLabelLeave)
                    {
                        LabelMoveInfo.NextMoveStep(MoveStep.Lbl10);
                        CurrentPrintInfo = null;
                        LabelMoveInfo.log("标签已经被取走");
                    }
                    else
                    {
                        LabelMoveInfo.NextMoveStep(MoveStep.Lbl_PrintFail);
                        labelFailReason = LabelFailReason.SuckerFailure;
                        LabelMoveInfo.log("取标失败");
                        Msg.add(crc.GetString("Res0122.62c858d3", "标签取起失败!"), MsgLevel.alarm);
                    }
                    break;
                //计算贴标位置,贴标完成回去
                case MoveStep.Lbl10:
                    if (!Label_Y_Axis.IsSafe(Config.Label_Y_P3, out msg))
                    {
                        Msg.add(msg, MsgLevel.warning);
                        return;
                    }
                    if (LabelMoveInfo.MoveParam.codeInfos == null || LabelMoveInfo.MoveParam.codeInfos.Count == 0)
                    {
                        LabelMoveInfo.log("没有贴标信息");
                        return;
                    }
                    Point p = new Point(LabelMoveInfo.MoveParam.codeInfos[0].X, LabelMoveInfo.MoveParam.codeInfos[0].X);
                    int labelAngle = 0;
                    //照片中料盘中心点像素位置
                    Point Right_Batch_Point = new Point(RobotManage.Config.Right_Batch_X, RobotManage.Config.Right_Batch_Y);
                    bool isthiscount = ConfigHelper.Config.Get<bool>("Labeling_isthiscount", false);
                    if (isthiscount)
                    {
                        //不同尺寸料盘需要在照片上便宜的贴标像素
                        int widthOffset = Config.Label_Offset_Pixel_7;
                        switch (LabelMoveInfo.MoveParam.PlateW)
                        {
                            case 13:
                                widthOffset = Config.Label_Offset_Pixel_13;
                                break;
                            case 15:
                                widthOffset = Config.Label_Offset_Pixel_15;
                                break;
                        }
                        //计算照片中贴标的像素位置

                        bool isOverlaylabel = ConfigHelper.Config.Get<bool>("Labeling_isOverlaylabel", true);
                        if (isOverlaylabel)
                        {
                            //bool isCustom = ConfigHelper.Config.Get<bool>("Labeling_isCustom", false);
                            //if (isCustom)
                            //{
                            //    p = Common.Customlabeling(LabelMoveInfo.MoveParam, Right_Batch_Point, out labelAngle);
                            //}
                            //else
                            //{ }
                            LabelMoveInfo.MoveParam.NewXYAngle.TryGetValue("IsCodeUsed", out int idnex);
                            if (idnex == -1)
                            {
                                idnex = 0;
                            }
                            p = Common.Overlaylabel(LabelMoveInfo.MoveParam, Right_Batch_Point, idnex, out labelAngle);
                        }
                        else
                        {
                            p = Common.CalcLabelPoint(LabelMoveInfo.MoveParam, Right_Batch_Point, Config.Label_R_Offset, Config.Label_R_Angle_Diff, out labelAngle);
                        }
                        LogUtil.info($"NS200计算贴标位置{p};角度={labelAngle}");
                    }
                    else
                    {
                        var newpoint = LabelMoveInfo.MoveParam.NewXYAngle;
                        if (newpoint.TryGetValue("PointX", out var pointX) && newpoint.TryGetValue("PointY", out var pointY))
                        {
                            p = new Point(pointX, pointY);
                            LogUtil.info($"PointX:[{pointX}],PointY:[{pointY}]");
                        }
                        if (newpoint.TryGetValue("Angle", out var Angle))
                        {
                            labelAngle = Angle;
                        }
                        Common.RenderedImage(LabelMoveInfo.MoveParam, Right_Batch_Point, p);
                        LogUtil.info($"NS200接收贴标位置{p};角度={labelAngle}");
                    }

                    if (labelAngle > 350 && labelAngle < 355)
                        labelAngle = 350;
                    else if (labelAngle > 355)
                        labelAngle = 0;

                    //计算贴标角度的脉冲值
                    int labelAxisPos = Config.Label_R_360 / 350 * labelAngle;
                    LogUtil.info($"完整贴标脉冲{labelAxisPos}");
                    //计算像素点位与中心点的差
                    Label_p3 = new Point(p.X - Right_Batch_Point.X, p.Y - Right_Batch_Point.Y);
                    
                    //计算像素*脉冲像素比得到脉冲值+中心点基准脉冲
                    int xDiff = (int)(Label_p3.X * Config.Cam_Pixel_X_Ratio);
                    int yDiff = (int)(Label_p3.Y * Config.Cam_Pixel_Y_Ratio);
                    if (LabelMoveInfo.MoveParam.PlateW == 7)
                    {
                        LabelMoveInfo.log("当前盘为7寸");
                        double x = xDiff;
                        double y = yDiff;
                        int radiusDistance=(int)Math.Sqrt(x * x + y * y);
                        LabelMoveInfo.log($"贴标点到圆心距离为{radiusDistance}");
                        if (radiusDistance > 88900 * size_7_radiusratio)
                        {
                            Label_p3.X = (int)(Label_p3.X * size_7_radiusratio);
                            Label_p3.Y = (int)(Label_p3.Y * size_7_radiusratio);
                            xDiff = (int)(Label_p3.X * Config.Cam_Pixel_X_Ratio);
                            yDiff = (int)(Label_p3.Y * Config.Cam_Pixel_Y_Ratio);
                            LabelMoveInfo.log($"由于{LabelMoveInfo.MoveParam.PlateW}寸贴标可能超出边缘缩小坐标");
                        }
                    }
                    Label_p3.X = xDiff + Config.Label_X_P3;
                    Label_p3.Y = yDiff + Config.Label_Y_P3;
                    if (Label_p3.Y > 710000)
                    {
                        LabelMoveInfo.log($"计算Y轴脉冲:{Label_p3.Y};");
                        Label_p3.Y = 710000;
                    }
                    if (Label_p3.X < -40000)
                    {
                        LabelMoveInfo.log($"计算Y轴脉冲:{Label_p3.X},超过负极限-40000,更改为-40000");
                        Label_p3.X = -40000;
                    }
                    //labelAxisPos += 85700;
                    LabelMoveInfo.log($"计算贴标像素点位为{p},轴点位为{Label_p3},X脉冲差值={xDiff},Y脉冲差值={yDiff},角度{labelAngle},R轴{labelAxisPos},盘宽{LabelMoveInfo.MoveParam.PlateW};角度脉冲{labelAxisPos}");
                    LabelMoveInfo.NextMoveStep(MoveStep.Lbl10_1);
                    Label_X_Axis.AbsMove(LabelMoveInfo, Config.Label_X_P1, Config.Label_X_P1_speed);
                    Label_R_Axis.AbsMove(LabelMoveInfo, labelAxisPos, Config.Label_R_P2_speed);
                    Label_Z_Axis.AbsMove(LabelMoveInfo, Config.Label_Z_P4, Config.Label_Z_P4_speed);
                    LabelMoveInfo.log("Label_X到待机点,Z转到贴标点.");
                    break;
                case MoveStep.Lbl10_1:
                    if (LeftMoveInfo.MoveStep == MoveStep.L20_WaitLabel)
                    {
                        LabelMoveInfo.NextMoveStep(MoveStep.Lbl10_2);
                        Label_Y_Axis.AbsMove(LabelMoveInfo, Label_p3.Y, Config.Label_Y_P3_speed);
                        LabelMoveInfo.log("Label_Y到贴标点.");
                    }
                    else if (LabelMoveInfo.IsTimeOut(60))
                    {
                        LabelMoveInfo.log("等待左侧料串可贴标.");
                    }
                    break;
                case MoveStep.Lbl10_2:
                    LabelMoveInfo.NextMoveStep(MoveStep.Lbl11);
                    Label_X_Axis.AbsMove(LabelMoveInfo, Label_p3.X, Config.Label_X_P3_speed);
                    LabelMoveInfo.log("Label_X到贴标点.");
                    break;
                case MoveStep.Lbl11:
                    LabelMoveInfo.NextMoveStep(MoveStep.Lbl12);
                    Label_Z_Axis.AbsMove(LabelMoveInfo, Config.Label_Z_P5, Config.Label_Z_P5_speed);
                    LabelMoveInfo.log("下降.");
                    break;
                case MoveStep.Lbl12:
                    LabelMoveInfo.NextMoveStep(MoveStep.Lbl13);
                    IOMove(IO_Type.LabelCylinder_Work, IO_VALUE.LOW);
                    LabelMoveInfo.log("关闭吸气.");
                    break;
                case MoveStep.Lbl13:
                    LabelMoveInfo.NextMoveStep(MoveStep.Lbl14);
                    Label_Z_Axis.AbsMove(LabelMoveInfo, Config.Label_Z_P4, Config.Label_Z_P4_speed);
                    LabelMoveInfo.log("上升.");
                    break;
                case MoveStep.Lbl14:
                    LeftMoveInfo.NextMoveStep(MoveStep.L30_LabelFinish);
                    LabelMoveInfo.NextMoveStep(MoveStep.Lbl01);
                    LabelMoveInfo.log("完成贴标.");
                    break;
                default:
                    LabelMoveInfo.log($"未找到对应步骤:{LabelMoveInfo.MoveStep}");
                    break;
            }
        }
        string LabelState()
        {
            string state = "";
            if (LabelMoveInfo.MoveStep >= MoveStep.Lbl_Printted)
            {
                state += crc.GetString("Res0072", "标签已打印,当前ReelID:") + LabelMoveInfo.MoveParam.WareCode;
            }
            if (LabelMoveInfo.MoveStep == MoveStep.Lbl_WaitPrintInfo)
            {
                state += crc.GetString("Res0073", "等待标签打印");
            }
            if (LabelMoveInfo.MoveStep == MoveStep.Wait)
            {
                state += crc.GetString("Res0074", "等待中");
            }
            return state;
        }
    }
}