LineSolderingRobot.cs 12.3 KB

using URSoldering.Common;
using URSoldering.LoadCSVLibrary;
using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Timers;

namespace URSoldering.DeviceLibrary
{
    public partial class URSolderingRobot : RobotBean
    {
        private AlarmType alarmType = AlarmType.None;
        public string WareCode = "";  
        public SolderingRobotConfig Config;
        public LineStepBean LineStep = new LineStepBean();
        public URSolderingRobot(SolderingRobotConfig config)
        {
            RobotName = "焊接机器人";
            baseConfig = config;
            this.Config = config;
            WeldRobotBean.InitData(config);
            InitTimer(); 
            EpsonDevice.Init(config.Epson_IP);
            ////初始化摄像机
            //string nameStr = ConfigAppSettings.GetValue(Setting_Init.CameraName);
            //string codeStr = ConfigAppSettings.GetValue(Setting_Init.CodeType);
            //HDevelopExport.LoadConfig(nameStr, codeStr); 
        } 
        public bool StartRun()
        {
            return RobotReset();
        }
      
        public bool RobotReset()
        {
            
            alarmType = AlarmType.None;
            mainTimer.Enabled = false;
            ledTimer.Enabled = false;
            IsInSuddendown = false;
            //WaitScanResult = false;
            //CanScan = false;
            WarnMsg = "";

            if (!ShuddenOK())
            {
                WarnMsg = "急停未开";
                return false;
            }
            if (KNDIOValue(IO_Type.AirCheck_Single).Equals(IO_VALUE.LOW))
            {
                WarnMsg = "没有气压信号";
                return false;
            }

            //焊接机器人复位
            string solderingStr = "";
            if (Status > RobotStatus.Wait)
            {
                StopMove();
                solderingStr = WeldRobotBean.GoHome();
            }
            else
            {
                solderingStr = WeldRobotBean.StartRun();
            }
            if (!solderingStr.Equals(""))
            {
                WarnMsg = solderingStr;
                return false;
            }

            //MesUtil.SolderInit(MesIp, MesPort);
            Status = RobotStatus.Reset;
            //HDevelopExport.OpenAllCamera();
            KNDIOMove(IO_Type.AutoRunSingle, IO_VALUE.HIGH);
            KNDIOMove(IO_Type.AlarmSingle, IO_VALUE.LOW);
            KNDIOMove(IO_Type.WaitSingle, IO_VALUE.LOW);
            KNDIOMove(IO_Type.DeviceRunON, IO_VALUE.LOW);
            //InitLineSpeed();
            //阻挡气缸上升
            StopCylinderUp();

            IsInProcess = false;
            ledTimer.Enabled = true;
            mainTimer.Enabled = true;
            return true;
        }
        public void StopCylinderUpAndWait()
        {
            KNDIOMove(IO_Type.StopCylinder_Up, IO_VALUE.HIGH);
            KNDIOMove(IO_Type.StopCylinder_Down, IO_VALUE.LOW);
            LineStep.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.StopCylinder_Down, IO_VALUE.LOW));
            LineStep.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.StopCylinder_Up, IO_VALUE.HIGH));
        }
        public void StopCylinderDownAndWait()
        {
            KNDIOMove(IO_Type.StopCylinder_Up, IO_VALUE.LOW);
            KNDIOMove(IO_Type.StopCylinder_Down, IO_VALUE.HIGH);
            LineStep.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.StopCylinder_Down, IO_VALUE.HIGH));
            LineStep.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.StopCylinder_Up, IO_VALUE.LOW));
        }
        public void StopCylinderUp()
        {
            KNDIOMove(IO_Type.StopCylinder_Up, IO_VALUE.HIGH);
            KNDIOMove(IO_Type.StopCylinder_Down, IO_VALUE.LOW);
        }
        public void StopCylinderDown()
        {

            KNDIOMove(IO_Type.StopCylinder_Up, IO_VALUE.LOW);
            KNDIOMove(IO_Type.StopCylinder_Down, IO_VALUE.HIGH);
        }
        /// <summary>
        /// 急停 处理
        /// </summary>
        private void SuddendownProcess()
        {
            WarnMsg = "收到急停信号,设备急停"; 
            LogUtil.error(RobotName + WarnMsg);
            IsInSuddendown = true;
            Alarm(AlarmType.SuddenStop);
            
        }
        private bool IsInProcess = false;
        protected override void mainTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            if (IsInProcess) {
                return;
            }
            IsInProcess = true;
            try
            {
                //判断急停信号
                if (KNDIOValue(IO_Type.SuddenStop_Single).Equals(IO_VALUE.LOW))
                {
                    if (IsInSuddendown.Equals(false))
                    {
                        SuddendownProcess();
                    }
                }
                else if (IsInSuddendown)
                {
                }
                else
                {
                    if (Status.Equals(RobotStatus.Wait))
                    {
                    }
                    else if (Status.Equals(RobotStatus.Reset))
                    {
                        if (WeldRobotBean.WeldMoveStep.moveType.Equals(MoveType.None)
                            && KNDIOValue(IO_Type.SendWire_Up).Equals(IO_VALUE.HIGH))
                        {
                            LogUtil.info(RobotName + "复位完成");
                            Status = RobotStatus.Runing;
                            KNDIOMove(IO_Type.AutoRunSingle, IO_VALUE.HIGH);
                            KNDIOMove(IO_Type.AlarmSingle, IO_VALUE.LOW);
                            KNDIOMove(IO_Type.WaitSingle, IO_VALUE.LOW);
                            KNDIOMove(IO_Type.DeviceRunON, IO_VALUE.HIGH);
                        }
                    }
                    else if (Status.Equals(RobotStatus.Runing))
                    {
                        IOTimeOutProcess();
                        StartLineCheck();
                    }
                    else if (Status.Equals(RobotStatus.Busy))
                    { 
                        BusyProcess();
                    }
                    else if (Status.Equals(RobotStatus.LineMove))
                    {
                        LineMoveProcess();
                    } 
                }
            }catch(Exception ex)
            {
                LogUtil.error(RobotName+"定时器出错:"+ex.ToString());
            }
            IsInProcess = false; 
        }
        /// <summary>
        /// io检测异常,如果所有的步骤已经完成,表示信号超时异常已经结束
        /// </summary>
        private DateTime preIoTimerOutTime = DateTime.Now;
        private void IOTimeOutProcess()
        {
            try
            {
                TimeSpan span = DateTime.Now - preIoTimerOutTime;
                if (span.TotalSeconds > 1)
                {
                    preIoTimerOutTime = DateTime.Now;
                    if (IsInSuddendown)
                    {
                        return;
                    }
                    if (alarmType.Equals(AlarmType.IoSingleTimeOut) || alarmType.Equals(AlarmType.StepTimeOut))
                    {
                        if (LineStep.IsInWait == false)
                        {
                            LogUtil.info(RobotName + "之前有IO超时异常,清理信号超时异常!");
                            WarnMsg = "";
                            alarmType = AlarmType.None;
                            //RobotBean.KNDIOMove(IO_Type.Device_NG, IO_VALUE.HIGH);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogUtil.error(LOGGER, "IOTimeOutProcess出错:" + ex.ToString());
            }
        }
        private void LineMoveProcess()
        {
            if (LineStep.IsInWait)
            {
                CheckWait();
            }
            if (LineStep.IsInWait)
            {
                return;
            }
            if (LineStep.moveStep.Equals(MoveStep.L00_CylinderUp))
            {
                LineLog("流水线转动:阻挡气缸上升到位,转动流水线");
                LineStep.NextMoveStep(MoveStep.L01_StartLineMove);
                LineStep.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LineWeldCheck, IO_VALUE.HIGH));
                //LineStartMove();
            }
            else if (LineStep.moveStep.Equals(MoveStep.L01_StartLineMove))
            {
                LineLog("流水线转动:收到焊接信号,等待1秒钟");
                LineStep.NextMoveStep(MoveStep.L02_GetWeldSingle);

                LineStep.WaitList.Add(WaitResultInfo.WaitTime(1000));

            }
            else if (LineStep.moveStep.Equals(MoveStep.L02_GetWeldSingle))
            {
                //LineStopMove();
                LineStep.NextMoveStep(MoveStep.L03_GetCode);
                LineStep.WaitList.Add(WaitResultInfo.WaitTime(500));

            }
            else if (LineStep.moveStep.Equals(MoveStep.L03_GetCode))
            {
                LineStep.NextMoveStep(MoveStep.L04_BeginWeld);
                GetCodeFun?.Invoke();
                Thread.Sleep(100);

            }
            else if (LineStep.moveStep.Equals(MoveStep.L04_BeginWeld))
            {
                TimeSpan span = DateTime.Now - LineStep.LastSetpTime;
                if (WareCode.Equals("").Equals(false) || span.TotalSeconds > 15)
                {
                    string str = WeldRobotBean.StartWeld();
                    if (str.Equals(""))
                    {
                        WeldRobotBean.IsInWeld = true;
                        LineLog("流水线转动:检测到焊接信号,停止流水线,启动焊接成功");
                    }
                    else
                    {
                        WeldRobotBean.IsInWeld = false ;
                        LineLog("流水线转动:启动焊接失败:" + str);
                    }
                    LastStartWeldTime = DateTime.Now;
                    IsWeld = true;
                    LineStep.NewMove(MoveType.WeldEndMove);
                    LineStep.NextMoveStep(MoveStep.BUSY01_Weld);
                    Status = RobotStatus.Busy;
                }
            }         
        }

        private void StartLineCheck()
        {
            //开始转动
            if (KNDIOValue(IO_Type.LineInCheck).Equals(IO_VALUE.HIGH) && KNDIOValue(IO_Type.LineOutCheck).Equals(IO_VALUE.LOW))
            {
                if (WeldRobotBean.WeldMoveStep.moveType.Equals(MoveType.None))
                {
                    KNDIOMove(IO_Type.AlarmSingle, IO_VALUE.LOW);
                    LogUtil.info("检测到入料口信号,阻挡气缸上升");
                    Status = RobotStatus.LineMove;
                    LineStep.NewMove(MoveType.LineMove);
                    LineStep.NextMoveStep(MoveStep.L00_CylinderUp);
                    StopCylinderUpAndWait();
                }
            }
        }
       
        /// <summary>
        /// 收到启动信号,开始转动转台
        /// </summary>
        private void StartTurn()
        { 
            if (WareCode.Equals(""))
            {
                WarnMsg = "还未扫描OK";
                return;
            } 
           //TODO 开始转动
            KNDIOMove(IO_Type.WaitSingle, IO_VALUE.LOW);
            Status = RobotStatus.LineMove;

        }
       
        private void StopMove()
        {
            //IsWaitCode = false;
            //IsWaitCheck = false;
            //WaitScanResult = false;
            //CanScan = false;
            //LineStopMove();
            KNDIOMove(IO_Type.DeviceRunON, IO_VALUE.LOW);
            //HDevelopExport.CloseAllCamera(); 
            WeldRobotBean.StopMove();
            
            this.Status = RobotStatus.Runing;
        }
        public void StopRun()
        {
            ledTimer.Enabled = false;
            mainTimer.Enabled = false;
            StopMove();
            WeldRobotBean.StopRun();
            KNDIOMove(IO_Type.AutoRunSingle, IO_VALUE.LOW);
            KNDIOMove(IO_Type.AlarmSingle, IO_VALUE.LOW);
            KNDIOMove(IO_Type.WaitSingle, IO_VALUE.LOW);
            KNDIOMove(IO_Type.DeviceRunON, IO_VALUE.LOW);
            //KNDIOMove(IO_Type.DoorStatus, IO_VALUE.HIGH);
            //MesUtil.Close();
            this.Status = RobotStatus.Wait;
            LogUtil.info(RobotName + "停止运行");
        }
    }
}