LineSolderingRobot.cs 7.5 KB

using URSoldering.Common;
using URSoldering.LoadCSVLibrary; 
using System; 
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(); 
            URRobotControl.InitConfig(config.UR_IP);
         
        } 
        public bool StartRun()
        {
            return RobotReset();
        }
      
        public bool RobotReset()
        { 
            alarmType = AlarmType.None;
            mainTimer.Enabled = false;
            ledTimer.Enabled = false;
            IsInSuddendown = false; 
            WarnMsg = "";
             
            if (!ShuddenOK())
            {
                WarnMsg = "急停未开";
                return false;
            }
            if (!IsFixtureClamp())
            {
                WarnMsg = "夹具未夹紧";
                return false;
            }
            //焊接机器人复位
            string solderingStr = "";
            if (Status > RobotStatus.Wait)
            {
                StopMove();
                solderingStr = WeldRobotBean.GoHome();
            }
            else
            {
                solderingStr = WeldRobotBean.StartRun();
            }
            if (!solderingStr.Equals(""))
            {
                WarnMsg = solderingStr;
                return false;
            }
             
            Status = RobotStatus.Reset;
            WeldRobotBean.IsInWeld = false;
           IsInProcess = false;
            ledTimer.Enabled = true;
            mainTimer.Enabled = true;
            return true;
        }
        
        private void SuddendownProcess()
        {
            WarnMsg = "收到急停信号,设备急停"; 
            LogUtil.error(RobotName + WarnMsg);
            IsInSuddendown = true;
            Alarm(AlarmType.SuddenStop); 
        }
        private void FixtureRelaxProcess()
        {
            WarnMsg = "夹具未夹紧,设备急停";
            LogUtil.error(RobotName + WarnMsg);
            IsInSuddendown = true;
            Alarm(AlarmType.SuddenStop);
        }
        public string StartWeld()
        {

            string msg = "";
            //如果开始焊接,开始焊接
            if (Status.Equals(RobotStatus.Runing) && WeldRobotBean.WeldMoveStep.moveType.Equals(MoveType.None))
            {
                msg = WeldRobotBean.StartWeld();
                if (msg.Equals(""))
                {
                    Status = RobotStatus.Busy;
                }
            }
            else
            {
                msg = "无法开始焊接";
            }
            return msg;
        }
        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 (IsFixtureClamp().Equals(false))
                {
                    if (alarmType.Equals(AlarmType.None))
                    {
                        FixtureRelaxProcess();
                    }
                }
                else
                {
                    if (Status.Equals(RobotStatus.Wait))
                    {
                    }
                    else if (Status.Equals(RobotStatus.Reset))
                    {
                        if (WeldRobotBean.WeldMoveStep.moveType.Equals(MoveType.None)
                            && KNDIOValue(IO_Type.SendWire_Work).Equals(IO_VALUE.HIGH))
                        {
                            LogUtil.info(RobotName + "复位完成");
                            Status = RobotStatus.Runing;
                        }
                    }
                    else if (Status.Equals(RobotStatus.Runing))
                    {
                    }
                    else if (Status.Equals(RobotStatus.Busy))
                    {
                        BusyProcess();
                    }
                    else if (Status.Equals(RobotStatus.LineMove))
                    {
                    } 
                }
            }catch(Exception ex)
            {
                LogUtil.error(RobotName+"定时器出错:"+ex.ToString());
            }
            IsInProcess = false; 
        }
      
   
        private void StopMove()
        {  
            WeldRobotBean.StopMove(); 
            this.Status = RobotStatus.Runing;
        }
        public void StopRun()
        {
            ledTimer.Enabled = false;
            mainTimer.Enabled = false;
            StopMove();
            WeldRobotBean.StopRun(); 
            this.Status = RobotStatus.Wait;
            LogUtil.info(RobotName + "停止运行");
        }
        public DateTime LastStartWeldTime = DateTime.Now;
        public DateTime LastEndWeldTime = DateTime.Now;
        public bool IsWeld = false;
        public delegate void GetCode();
        public event GetCode GetCodeFun; 
        public bool IsAutoRun = false;

        private void BusyProcess()
        {
            if (LineStep.moveStep.Equals(MoveStep.Wait))
            {
                if (WeldRobotBean.IsInWeld.Equals(false))
                {
                    LastEndWeldTime = DateTime.Now;
                    TimeSpan span = LastEndWeldTime - LastStartWeldTime;
                    if (BoardManager.CurrBoard.WeldTime.TotalSeconds <= 0)
                    {
                        BoardManager.CurrBoard.WeldTime = span;
                    }
                    else
                    {
                        BoardManager.CurrBoard.WeldTime = new TimeSpan(0, 0, (int)(BoardManager.CurrBoard.WeldTime.TotalSeconds + span.TotalSeconds) / 2);
                    }
                    BoardManager.Update(BoardManager.CurrBoard);
                    LogUtil.info("Busy处理:" + "焊接结束,焊接耗时" + FormUtil.GetSpanStr(span) + ",累积平均耗时" + FormUtil.GetSpanStr(BoardManager.CurrBoard.WeldTime) + "");
                    LineStep.EndMove();
                    Status = RobotStatus.Runing;
                }
            }
        }
         
        /// <summary>
        /// 判断是否还有未完成的工作
        /// </summary>
        public bool NeedWork()
        {
            if (Status > RobotStatus.Wait)
            {
                if (WeldRobotBean.WeldMoveStep.moveType.Equals(MoveType.Weld))
                {
                    return true;
                }
            }
            return false;
        }

        private void Alarm(AlarmType alarmType)
        {
            this.alarmType = alarmType;
            if (AlarmType.SuddenStop.Equals(alarmType))
            { 
                WarnMsg = "收到急停信号";
                WeldRobotBean.Alarm(AlarmType.SuddenStop); 
                StopMove();
            }
        }
    }
}