MainMachine_Labeling.cs 14.1 KB
using CodeLibrary;
using OnlineStore;
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;

namespace DeviceLibrary
{
    partial class MainMachine
    {
        Task<(bool, string)> PrintTask = null;
        int ScanTimes = 0;
        List<CodeInfo> CodeList;
        void LabelingProcess()
        {
            if (CheckWait(LabelingMoveInfo))
                return;
            //常规上料扫码流程
            switch (LabelingMoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    break;
                case MoveStep.Labeling01:
                    LabelingMoveInfo.NextMoveStep(MoveStep.Labeling02);
                    FlipEquip.LiftDown(LabelingMoveInfo);
                    LabelingMoveInfo.log("翻转机构下降");
                    CylinderMove(LabelingMoveInfo, IO_Type.Label_Dock_Down, IO_Type.Label_Dock_Up, IO_VALUE.LOW);
                    break;
                case MoveStep.Labeling02:
                    LabelingMoveInfo.NextMoveStep(MoveStep.Labeling03);
                    CylinderMove(LabelingMoveInfo, IO_Type.Tin_Dock_Left, IO_Type.Tin_Dock_Right, IO_VALUE.HIGH);
                    CylinderMove(LabelingMoveInfo, IO_Type.Label_Dock_Back, IO_Type.Label_Dock_Front, IO_VALUE.HIGH);
                    LabelingMoveInfo.log("锡膏横移到右侧");
                    ScanTimes = 0;
                    CodeList = new List<CodeInfo>();
                    LabelingMoveInfo.MoveParam = new ReelParam();
                    break;
                case MoveStep.Labeling03:
                    LabelingMoveInfo.NextMoveStep(MoveStep.Labeling04);
                    RotateEquip.TurnDegree(36);
                    //LabelingMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                    LabelingMoveInfo.log("滚动锡膏");                    
                    break;
                case MoveStep.Labeling04:
                    if (RotateEquip.TurnWork.IsCompleted) {
                        LabelingMoveInfo.NextMoveStep(MoveStep.Labeling05);
                        //LabelingMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                        ScanCode();
                    }
                    break;
                case MoveStep.Labeling05:
                    if (IsScanFinish) {
                        var xx = ScanTask.Result;
                        if (xx!=null && xx.Count > 0)
                        {
                            LabelingMoveInfo.log($"扫到部分条码:"+ string.Join(",", xx.Select(x => x.CodeType + ":" + x.CodeStr).ToArray()));
                            CodeList.AddRange(xx);

                            if (HasRightCode(xx.ToArray(), LabelingMoveInfo.MoveParam))
                            {
                                LabelingMoveInfo.MoveParam.IsNg = false;
                                LabelingMoveInfo.NextMoveStep(MoveStep.Labeling06);
                                //ServerCM.SendInStoreRequest(new string[] { LabelingMoveInfo.MoveParam.SN }, LabelingMoveInfo.MoveParam, true);
                                return;
                            }
                        }
                        if (demomode && false)
                        {
                            LabelingMoveInfo.MoveParam.IsNg = false;
                            LabelingMoveInfo.MoveParam.WareCode = "Demo";
                            LabelingMoveInfo.NextMoveStep(MoveStep.Labeling06);
                            return;
                        }
                        ScanTimes++;
                        if (ScanTimes >= 10)
                        {
                            LabelingMoveInfo.NextMoveStep(MoveStep.Labeling06);
                            LabelingMoveInfo.log($"未识别到有效二维码,送到NG口");
                            LabelingMoveInfo.MoveParam.IsNg = true;
                            LabelingMoveInfo.MoveParam.NgMsg = crc.GetString(L.not_detect_reel_code, "未识别到有效二维码");
                        }
                        else { 
                            LabelingMoveInfo.NextMoveStep(MoveStep.Labeling03);
                            LabelingMoveInfo.log("继续扫码");
                        }
                    }
                    break;
                case MoveStep.Labeling06:
                    LabelingMoveInfo.NextMoveStep(MoveStep.Labeling07);
                    RotateEquip.TurnDegree(-36);
                    LabelingMoveInfo.log("滚动锡膏");
                    break;
                case MoveStep.Labeling07:
                    if (RotateEquip.TurnWork.IsCompleted)
                    {
                        LabelingMoveInfo.NextMoveStep(MoveStep.Labeling06);
                        var hc = CameraPointTest.ScanRectangle();
                        LabelingMoveInfo.log("检测到绿色宽度:"+hc);
                        if (demomode && false)
                        {
                            LabelingMoveInfo.NextMoveStep(MoveStep.Labeling08);
                            return;
                        }
                        if (hc)
                        {
                            LabelingMoveInfo.NextMoveStep(MoveStep.Labeling08);
                        }
                    }
                    break;
                case MoveStep.Labeling08:   
                    LabelingMoveInfo.NextMoveStep(MoveStep.Labeling09);
                    RotateEquip.TurnToEnd(false);
                    LabelingMoveInfo.log("滚动回位");
                    break;
                case MoveStep.Labeling09:
                    if (RotateEquip.WaitStatus(null))
                    {
                        if (LabelingMoveInfo.MoveParam.IsNg)
                        {
                            LabelingMoveInfo.NextMoveStep(MoveStep.Labeling50);
                            LabelingMoveInfo.log("物料NG直接退出");
                        }
                        else {
                            LabelingMoveInfo.NextMoveStep(MoveStep.Labeling10);
                        }
                    }
                    break;
                case MoveStep.Labeling10:
                    LabelingMoveInfo.NextMoveStep(MoveStep.Labeling11);
                    PrintTask = RobotManage.printerHelper.PrintLabel(LabelingMoveInfo.MoveParam);
                    Setting_Init.Runtime_Step = Runtime_StepE.Printed;
                    LabelingMoveInfo.log("检测到打印任务开始打印:" + LabelingMoveInfo.MoveParam.ToDetailStr());
                    break;
                case MoveStep.Labeling11:
                    if (PrintTask.IsCompleted)
                    {
                        var (result, msg) = PrintTask.Result;
                        if (result)
                        {
                            LabelingMoveInfo.NextMoveStep(MoveStep.Labeling12);
                            LabelingMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                            LabelingMoveInfo.log("打印成功,等待标签被取走");
                        }
                        else
                        {
                            Msg.add(crc.GetString("Res0106","打印机反馈:") + msg, MsgLevel.alarm);
                            RobotManage.UserPause(crc.GetString("Res0106","打印机反馈:") + msg);
                            LabelingMoveInfo.NextMoveStep(MoveStep.Labeling10);
                            LabelingMoveInfo.log("打印失败,再次打印");
                        }
                    }
                    break;
                case MoveStep.Labeling12:
                    LabelingMoveInfo.NextMoveStep(MoveStep.Labeling13);
                    CylinderMove(LabelingMoveInfo, IO_Type.Label_Dock_Down, IO_Type.Label_Dock_Up, IO_VALUE.HIGH);
                    LabelingMoveInfo.log("接标台上升");
                    break;
                case MoveStep.Labeling13:
                    LabelingMoveInfo.NextMoveStep(MoveStep.Labeling14);
                    CylinderMove(LabelingMoveInfo, IO_Type.Label_Dock_Back, IO_Type.Label_Dock_Front, IO_VALUE.LOW);
                    LabelingMoveInfo.log("接标台左移动");
                    break;
                case MoveStep.Labeling14:
                    LabelingMoveInfo.NextMoveStep(MoveStep.Labeling15);
                    IOMove(IO_Type.Label_Vacuum, IO_VALUE.HIGH);
                    CylinderMove(null, IO_Type.Labeling_Down, IO_Type.Labeling_Up, IO_VALUE.LOW);
                    Setting_Init.Runtime_Step = Runtime_StepE.LabelGot;
                    LabelingMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    LabelingMoveInfo.log("吸标下降");
                    break;
                case MoveStep.Labeling15:
                    LabelingMoveInfo.NextMoveStep(MoveStep.Labeling16);
                    LabelingMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    break;
                case MoveStep.Labeling16:
                    LabelingMoveInfo.NextMoveStep(MoveStep.Labeling50);
                    CylinderMove(null, IO_Type.Labeling_Down, IO_Type.Labeling_Up, IO_VALUE.HIGH);
                    LabelingMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    LabelingMoveInfo.log("吸标上升");
                    break;
                case MoveStep.Labeling50:
                    LabelingMoveInfo.NextMoveStep(MoveStep.Labeling51);
                    CylinderMove(LabelingMoveInfo, IO_Type.Labeling_Left, IO_Type.Labeling_Right, IO_VALUE.LOW);
                    //LabelingMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    break;
                case MoveStep.Labeling51:
                    LabelingMoveInfo.NextMoveStep(MoveStep.Labeling52);
                    CylinderMove(null, IO_Type.Labeling_Down, IO_Type.Labeling_Up, IO_VALUE.LOW);
                    LabelingMoveInfo.log("贴标下降");
                    Setting_Init.Runtime_Step = Runtime_StepE.LabelPaste;
                    LabelingMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    break;
                case MoveStep.Labeling52:
                    LabelingMoveInfo.NextMoveStep(MoveStep.Labeling53);
                    IOMove(IO_Type.Label_Vacuum, IO_VALUE.LOW);
                    RotateEquip.TurnDouble();
                    break;
                case MoveStep.Labeling53:
                    if (RotateEquip.TurnWork.IsCompleted)
                    {
                        LabelingMoveInfo.NextMoveStep(MoveStep.Labeling54);
                        Setting_Init.Runtime_Step = Runtime_StepE.LabelPasteFinish;
                        LabelingMoveInfo.log("滚动回位");
                    }
                    break;
                case MoveStep.Labeling54:
                    LabelingMoveInfo.NextMoveStep(MoveStep.Labeling55);
                    CylinderMove(null, IO_Type.Labeling_Down, IO_Type.Labeling_Up, IO_VALUE.HIGH);
                    LabelingMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    break;
                case MoveStep.Labeling55:
                    LabelingMoveInfo.NextMoveStep(MoveStep.Labeling56);
                    
                    CylinderMove(LabelingMoveInfo, IO_Type.Labeling_Left, IO_Type.Labeling_Right, IO_VALUE.HIGH);
                    CylinderMove(LabelingMoveInfo, IO_Type.Tin_Dock_Left, IO_Type.Tin_Dock_Right, IO_VALUE.LOW);
                    //CylinderMove(LabelingMoveInfo, IO_Type.Label_Dock_Back, IO_Type.Label_Dock_Front, IO_VALUE.LOW);
                    LabelingMoveInfo.log("锡膏横移到左侧");
                    break;
                case MoveStep.Labeling56:
                    LabelingMoveInfo.NextMoveStep(MoveStep.Wait);
                    FlipEquip.LiftUp(LabelingMoveInfo);
                    LabelingMoveInfo.log("翻转机构上升");
                    break;            
                default:
                    LabelingMoveInfo.log($"未找到对应步骤:{StoreMoveInfo.MoveStep}");
                    break;
            }
        }
        string LabelingState() {
            string state = crc.GetString("Res0107","空闲中");
            if (LabelingMoveInfo.MoveStep >= MoveStep.StoreOut10)
            {
                state = $"{"出库中"},{"出库中"}:{StoreMoveInfo.MoveParam.PosID}";
            }
            else if (LabelingMoveInfo.MoveStep >= MoveStep.Labeling01)
            {
                state = $"{"入库中"},{"出库中"}:{StoreMoveInfo.MoveParam.PosID}";
            }

            return state;
        }

        public bool IsScanFinish
        {
            get
            {
                if (ScanTask == null)
                    return true;

                return ScanTask.IsCompleted;
            }
        }
        int scantrytimes = 0;
        /// <summary>
        /// 扫码线程
        /// </summary>
        Task<List<CodeInfo>> ScanTask;
        public void ScanCode()
        {
            LabelingMoveInfo.log("开始扫码");
            try
            {
                ScanTask = Task.Run(new Func<List<CodeInfo>>(() =>
                {
                    IOMove(IO_Type.Camera_Led, IO_VALUE.HIGH);
                    //Task.Delay(10).Wait();
                    var l = CodeManager.CameraScan(CodeManager.hikNameList);
                    //LastCodeList.AddRange(l);

                    return l;
                }));
            }
            catch (Exception ex)
            {
                LogUtil.error("FI_13_ScanCode扫码出错:", ex);
            }
        }

        public bool HasRightCode(CodeInfo[] codeInfos, ReelParam reelParam) {
            
            
            foreach (var c in codeInfos) {
                if (c.CodeStr.IndexOf("|") > 0) {
                    var cs = c.CodeStr.Split('|');
                    if (cs.Length == 7) {
                        reelParam.PN = cs[0].Substring(1);
                        reelParam.LOT = cs[3].Substring(1);
                        reelParam.EXP = cs[4].Substring(1);
                        reelParam.SN = cs[5].Substring(1);
                        reelParam.WareCode = reelParam.SN;
                        return true;
                    }
                }
            }
            return false;
        }
    }
}