LineSolderingRobot.cs 6.6 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 (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;
            }
             
            Status = RobotStatus.Reset; 
            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);
             
            IsInProcess = false;
            ledTimer.Enabled = true;
            mainTimer.Enabled = true;
            return true;
        }
       
        /// <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_Work).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(); 
                    }
                    else if (Status.Equals(RobotStatus.Busy))
                    { 
                        BusyProcess();
                    }
                    else if (Status.Equals(RobotStatus.LineMove))
                    { 
                    } 
                }
            }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; 
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogUtil.error(LOGGER, "IOTimeOutProcess出错:" + ex.ToString());
            }
        }
   
        private void StopMove()
        { 
            KNDIOMove(IO_Type.DeviceRunON, IO_VALUE.LOW); 
            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);
           
            this.Status = RobotStatus.Wait;
            LogUtil.info(RobotName + "停止运行");
        }
    }
}