X_RAY_Equip_Partial.cs 14.9 KB
using Asa;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;

namespace OnlineStore.DeviceLibrary
{
    partial class X_RAY_Equip
    {

        public delegate void  GetImage(Bitmap bitmap);
        public event GetImage GetImageEvent;
       
        #region Label 
        public override bool StartLabelling(WorkParam param)
        {
            return false;
        }
        protected override void LabellingProcess()
        {
        }
        private bool CountIsOk()
        {

            return false;
        }

        #endregion

        #region 工作 
        public override bool StartWorking(WorkParam param)
        {
            if (!MoveInfo.MoveType.Equals(RobotMoveType.None))
            {
                return false ;
            }
            //出口有料
            if (IOValue(IO_Type.X_ReelCheck).Equals(IO_VALUE.HIGH))
            {
                runStatus = RobotRunStatus.Busy;
                MoveInfo.NewMove(RobotMoveType.Working);
                MoveInfo.MoveParam.SetReelInfo(Work_ReelInfo);

                if (Work_ReelInfo.WareCount <= 0)
                {
                    MoveInfo.NextMoveStep(StepEnum.XW06_WaitTime);
                    WorkLog("扫描区有料["+Work_ReelInfo.ToStr()+"],还未进行点料,开始处理");
                    //IOMove(IO_Type.X_InLine_Run, IO_VALUE.HIGH);
                    IOMove(IO_Type.X_MLine_Run, IO_VALUE.HIGH);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.X_ReelCheck, IO_VALUE.HIGH));
                }
                else
                { 
                    MoveInfo.NextMoveStep(StepEnum.XW21_WaitOutNoReel);
                    WorkLog("扫描区有料[" + Work_ReelInfo.ToStr() + "],点料已完成,准备放出料盘"); 
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Out_TrayCheck, IO_VALUE.LOW));
                }
            }else if (IOValue(IO_Type.X_InLine_Check).Equals(IO_VALUE.HIGH))
            {
                runStatus = RobotRunStatus.Busy;
                MoveInfo.NewMove(RobotMoveType.Working);
                MoveInfo.MoveParam.SetReelInfo(In_ReelInfo);
                MoveInfo.NextMoveStep(StepEnum.XW01_WaitInReel);
                WorkLog("入口皮带线有料[" + In_ReelInfo.ToStr() + "],开始处理");
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.X_InLine_Check,IO_VALUE.HIGH));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.X_ReelCheck, IO_VALUE.LOW));

            }
            return false;
        }

        protected override void WorkingProcess()
        {
            if (MoveInfo.IsInWait)
            {
                CheckWait(MoveInfo);
            }
            if (MoveInfo.IsInWait)
            {
                return;
            }
            if (MoveInfo.IsStep(StepEnum.XW01_WaitInReel))
            {
                MoveInfo.NextMoveStep(StepEnum.XW02_InDoorOpen);
                WorkLog("料盘处理:左侧门打开,挡停下降");
                CylinderMove(MoveInfo, IO_Type.X_InDoor_Up, IO_Type.X_InDoor_Down);
                CylinderMove(MoveInfo, IO_Type.X_StopCylinder_Up, IO_Type.X_StopCylinder_Down);
            }
            else if (MoveInfo.IsStep(StepEnum.XW02_InDoorOpen))
            {
                //    MoveInfo.NextMoveStep(StepEnum.XW03_StopCylinderDown);
                //    WorkLog("料盘处理:挡停下降");
                //    CylinderMove(MoveInfo, IO_Type.X_StopCylinder_Up, IO_Type.X_StopCylinder_Down);
                //}
                //else if (MoveInfo.IsStep(StepEnum.XW03_StopCylinderDown))
                //{
                MoveInfo.NextMoveStep(StepEnum.XW04_InLineRun);
                WorkLog("料盘处理:入口和中间皮带线转动,");
                IOMove(IO_Type.X_InLine_Run, IO_VALUE.HIGH);
                IOMove(IO_Type.X_MLine_Run, IO_VALUE.HIGH);
            }
            else if (MoveInfo.IsStep(StepEnum.XW04_InLineRun))
            {
                MoveInfo.NextMoveStep(StepEnum.XW05_WaitMCheck);
                WorkLog("料盘处理:等待扫描区域信号检测");
                IOMove(IO_Type.X_InLine_Run, IO_VALUE.HIGH);
                IOMove(IO_Type.X_MLine_Run, IO_VALUE.HIGH);
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.X_ReelCheck, IO_VALUE.HIGH));
            }
            else if (MoveInfo.IsStep(StepEnum.XW05_WaitMCheck))
            {
                MoveInfo.NextMoveStep(StepEnum.XW06_WaitTime);
                Work_ReelInfo = In_ReelInfo.GetReelInfo();
                In_ReelInfo = new ReelInfo();
                WorkLog("料盘处理:更新Work_ReelInfo【" + Work_ReelInfo.ToStr() + "】,清空 In_ReelInfo,再转动2秒钟");

                IOMove(IO_Type.X_InLine_Run, IO_VALUE.HIGH);
                IOMove(IO_Type.X_MLine_Run, IO_VALUE.HIGH);
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.X_ReelCheck, IO_VALUE.HIGH));
            }
            else if (MoveInfo.IsStep(StepEnum.XW06_WaitTime))
            {
                MoveInfo.NextMoveStep(StepEnum.XW07_InLineStop);
                WorkLog("料盘处理:停止入口皮带线,中间皮带线");
                IOMove(IO_Type.X_InLine_Run, IO_VALUE.LOW);
                IOMove(IO_Type.X_MLine_Run, IO_VALUE.LOW);
            }
            else if (MoveInfo.IsStep(StepEnum.XW07_InLineStop))
            {
                if(Work_ReelInfo.PlateH<=0||String.IsNullOrEmpty(Work_ReelInfo.WareCode))
                {
                    Work_ReelInfo.IsNgReel = true;
                    MoveInfo.MoveParam.SetReelInfo(In_ReelInfo);
                }
                //判断是否需要点料
                if (Work_ReelInfo.IsNgReel)
                {
                    MoveInfo.NextMoveStep(StepEnum.XW21_WaitOutNoReel);
                    WorkLog("扫描区NG料 [" + Work_ReelInfo.ToStr() + "],直接放行料盘");
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Out_TrayCheck, IO_VALUE.LOW));
                }
                else
                {
                    MoveInfo.NextMoveStep(StepEnum.XW08_DoorClose);
                    WorkLog("料盘处理:左侧门关闭,右侧门关闭,准备开始点料");
                    CylinderMove(MoveInfo, IO_Type.X_InDoor_Down, IO_Type.X_InDoor_Up);
                    CylinderMove(MoveInfo, IO_Type.X_OutDoor_Down, IO_Type.X_OutDoor_Up);
                }
                //       MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.X_DoorLimit_Down, IO_VALUE.HIGH));
                //      MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.X_DoorLimit_Up, IO_VALUE.HIGH));
            }


            #region 点料处理

            else if (MoveInfo.IsStep(StepEnum.XW08_DoorClose))
            {
                if (IOValue(IO_Type.X_Lock_On).Equals(IO_VALUE.HIGH))
                {
                    MoveInfo.NextMoveStep(StepEnum.XW11_StartCount);
                    WorkLog("料盘处理:开始点料,等待X射线可以启动");
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    InXWork = true;
                }
                else if (MoveInfo.IsTimeOut(120))
                {
                    WarnMsg = MoveInfo.Name +"["+MoveInfo.MoveStep+"]"+ "等待 X互锁信号打开  超时[" + FormUtil.GetSpanStr(MoveInfo.StepSpan()) + "]";
                    LogUtil.error(WarnMsg, SecMoveInfo.ErrorLogType);
                    Alarm(AlarmType.IoSingleTimeOut);
                }
            }
            else if (MoveInfo.IsStep(StepEnum.XW11_StartCount))
            {
                if (xRayCanStart)
                {
                    MoveInfo.NextMoveStep(StepEnum.XW12_XRayStart);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    bool result = xRay.Start();
                    WorkLog("料盘处理:启动X射线["+result+"],等待1秒");

                }
                else if (MoveInfo.IsTimeOut(120))
                {
                    WarnMsg = MoveInfo.Name + "[" + MoveInfo.MoveStep + "]" + "等待 可以打开X射线  超时[" + FormUtil.GetSpanStr(MoveInfo.StepSpan()) + "]";
                    LogUtil.error(WarnMsg, SecMoveInfo.ErrorLogType);
                    Alarm(AlarmType.IoSingleTimeOut);
                }
            }
            else if (MoveInfo.IsStep(StepEnum.XW12_XRayStart))
            {
                MoveInfo.NextMoveStep(StepEnum.XW13_GetXRayImage);
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(8000));
                WorkLog("点料:开始获取X射线图形 ");

                string lastData = DateTime.Now.ToString("yyyy-MM-dd");
                ConfigAppSettings.SaveValue(Setting_Init.XRay_Data, lastData);

                carerayImage.GetImage();
                carerayImage.WindowWidth = Config.WindowWidth;
                carerayImage.WindowLevel = Config.WindowLevel;
                Bitmap bmp = carerayImage.Get48bImage();
                string fileP = Application.StartupPath + @"\XRAY\tif\" + DateTime.Now.ToString("HHmmss") + ".png";
                bmp.Save(fileP, System.Drawing.Imaging.ImageFormat.Png);
                WorkLog("点料:获取X射线图形,并保存到: " + fileP + ",记录时间"+ lastData + ",停止X射线");
                GetImageEvent?.Invoke(bmp);
                bool result = xRay.Stop();
                if (!result)
                {
                    LogUtil.error(" xRay.Stop()失败:" + result);
                }
                MoveInfo.EndStepWait();
            }
            else if (MoveInfo.IsStep(StepEnum.XW13_GetXRayImage))
            { 
                MoveInfo.NextMoveStep(StepEnum.XW15_GetResult);
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                if (xRay.IsRayOpen)
                {
                    xRay.Stop();
                }
                int count = 99999;
                countImage.GetCount(out count);
                InXWork = false;
                WorkLog("点料:获取点料结果,【" + count + "】,保存并上传结果");
                if (Work_ReelInfo.WareCount <= 0)
                {
                    MoveInfo.MoveParam.WareCount = count;
                    Work_ReelInfo.WareCount = count;
                }
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                Task.Factory.StartNew(delegate
                {
                    string msg = "暂不上传";
                    //   string msg=  SServerManager.Return_Material(Name, MoveInfo.MoveParam.WareCode, Work_ReelInfo.WareCount);
                    if (!String.IsNullOrEmpty(msg))
                    {
                        LogUtil.error(Name + "上传【" + MoveInfo.MoveParam.OutStr() + "】点料结果失败:" + msg);
                    }
                });
            }
            else if (MoveInfo.IsStep(StepEnum.XW15_GetResult))
            {
                MoveInfo.NextMoveStep(StepEnum.XW16_EndCount);
                WorkLog("料盘处理:点料结束,关闭X关机互锁信号");
                IOMove(IO_Type.X_Lock_On, IO_VALUE.LOW);
            }
            #endregion
            else if (MoveInfo.IsStep(StepEnum.XW16_EndCount))
            {
                MoveInfo.NextMoveStep(StepEnum.XW21_WaitOutNoReel);
                MoveInfo.TimeOutSeconds = 120;
                WorkLog("料盘处理:等待出口无料盘");
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Out_TrayCheck, IO_VALUE.LOW));
            }
            else if (MoveInfo.IsStep(StepEnum.XW21_WaitOutNoReel))
            {
                MoveInfo.NextMoveStep(StepEnum.XW22_OutDoorOpen);
                WorkLog("料盘处理:右侧门打开,挡停放行");
                CylinderMove(MoveInfo, IO_Type.X_OutDoor_Up, IO_Type.X_OutDoor_Down);
                CylinderMove(MoveInfo, IO_Type.X_StopCylinder_Down, IO_Type.X_StopCylinder_Up);
            }
            else if (MoveInfo.IsStep(StepEnum.XW22_OutDoorOpen))
            {
                MoveInfo.NextMoveStep(StepEnum.XW23_OutLineRun);
                WorkLog("料盘处理:中间皮带线,出口皮带线转动");
                IOMove(IO_Type.X_MLine_Run, IO_VALUE.HIGH);
                IOMove(IO_Type.X_OLine_Run, IO_VALUE.HIGH);
            }
            else if (MoveInfo.IsStep(StepEnum.XW23_OutLineRun))
            {
                MoveInfo.NextMoveStep(StepEnum.XW24_WaitOutCheck);
                WorkLog("料盘处理:等待出口皮带线检测到料盘");
                IOMove(IO_Type.X_MLine_Run, IO_VALUE.HIGH);
                IOMove(IO_Type.X_OLine_Run, IO_VALUE.HIGH);
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Out_TrayCheck, IO_VALUE.HIGH));
            }
            else if (MoveInfo.IsStep(StepEnum.XW24_WaitOutCheck))
            {
                MoveInfo.NextMoveStep(StepEnum.XW25_WaitTime);
                Out_ReelInfo = Work_ReelInfo.GetReelInfo();
                Work_ReelInfo = new ReelInfo();
                WorkLog("料盘处理:清空 Work_ReelInfo,更新Out_ReelInfo【" + Out_ReelInfo.ToStr() + "】  再转动3秒");

                IOMove(IO_Type.X_MLine_Run, IO_VALUE.HIGH);
                IOMove(IO_Type.X_OLine_Run, IO_VALUE.HIGH);
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Out_TrayCheck, IO_VALUE.HIGH));
            }

            else if (MoveInfo.IsStep(StepEnum.XW25_WaitTime))
            {
                MoveInfo.NextMoveStep(StepEnum.XW26_OutLineStop);
                WorkLog("料盘处理:中间皮带线,出口皮带线停止");
                IOMove(IO_Type.X_MLine_Run, IO_VALUE.LOW);
                IOMove(IO_Type.X_OLine_Run, IO_VALUE.LOW);
            }
            else if (MoveInfo.IsStep(StepEnum.XW26_OutLineStop))
            {
                MoveInfo.NextMoveStep(StepEnum.XW27_OutDoorClose);
                WorkLog("料盘处理:出口门关闭,挡停下降");
                CylinderMove(MoveInfo, IO_Type.X_OutDoor_Down, IO_Type.X_OutDoor_Up);
                CylinderMove(MoveInfo, IO_Type.X_StopCylinder_Up, IO_Type.X_StopCylinder_Down);
            }
            else if (MoveInfo.IsStep(StepEnum.XW27_OutDoorClose))
            {
                MoveInfo.EndMove();
                WorkLog("料盘处理:料盘处理结束");
                //       MoveInfo.NextMoveStep(StepEnum.XW28_EndPro);
            }
            else if (MoveInfo.IsStep(StepEnum.XW28_EndPro))
            {
                MoveInfo.EndMove();
            } 
           
        }
      
    

        private bool IsInStoreNeed()
        {
            return false;
        }
        #endregion



    }
}