MainMachine _LabelProcess.cs 20.8 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403
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) || 
                        (Config.DOList.ContainsKey(IO_Type.RightBackDoor_Check) && 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) && 
                       (!Config.DOList.ContainsKey(IO_Type.RightBackDoor_Check) || IOValue(IO_Type.RightBackDoor_Check).Equals(IO_VALUE.HIGH)))
                    {
                        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, labelAngle);
                        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;
                    LabelMoveInfo.log($"贴标角度脉冲{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);
                    LabelMoveInfo.log($"贴标XY脉冲差:X:{xDiff}={Label_p3.X}*{Config.Cam_Pixel_X_Ratio}, Y:{yDiff}={Label_p3.Y}*{Config.Cam_Pixel_Y_Ratio},");
                    if (false && 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;
        }
    }
}