⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 motor_state_check.c

📁 这是一个在电动机运行状态的逻辑运算中常用的状态检测原理的例程。它根据电动机负载的大小和外部开关状态共同判断当前电动机的状态。
💻 C
📖 第 1 页 / 共 3 页
字号:
                      start_counter=0;
                      jitter_counter=0;                 //去抖定时器
                      startcount_permit=0;
                    }
                }break;
      case(0x02):  //正运行态
                {
                  //正转位置无效&&反转位置无效&&Imax<0.25In=正停车态
                  if((motor_positive_posit==0x00)&&(motor_negative_posit==0x00)&&(i_over<YX*In))
                    {
                      motor_state=0x03;  //正停车态
                      start_counter=0;
                      startcount_permit=0;
                      err_state=0x00;  //清报警继电器RL3
                      err_counter=0x00;
                      return;
                    }

                  
				  //正转位置有效&&反转位置无效&&Imax>=0.25In=正转运行态
                  if((motor_positive_posit==0xff)&&(motor_negative_posit==0x00)&&(i_over>=YX*In))
                    {
                      motor_state=0x02;  //正运行状态
                      start_counter=0;
                      startcount_permit=0;
                      if(err_counter>240) {err_state=0x00; err_counter=0x00;}//电机从异常运行态返回
                      else                {err_state=0xaa; err_counter=0x00;}//电机一直处于正常运行态,计数器清零
                      return;
                    }

                  //======================================================================
                  //在以上状态以外的状态,电机异常运行
                  err_counter++;
                  if(err_counter>=240) //如果连续10个周波均出现辅助触点失灵的问题
                    {
                      err_state=0xff;  //运行界面RUN to ERR,发告警信号,RL3
                      err_counter=241; //防止err_counter溢出,保持电机运行错误的标志,当电机进入正常态时返回
                    }
                  else
                    {
                      err_state=0xaa;  //电机处于正常运行态
                    }
                }break;
      case(0x03):  //正停车态
                {
                  start_counter=start_counter+0.000833;
                  if(start_counter>=stop_time)   //延时时间到,进入停止态
                    {
					  //正转位置无效&&Imax<0.1In=停止态
                      if((motor_positive_posit==0x00)&&(i_over<TC*In))
                        {  
                          motor_state=0x00;   //停止态
                          start_counter=0;
                          startcount_permit=0;
                        }
					  //正转位置无效&&0.1In<=Imax<0.25In=停车失败
                      else if((motor_positive_posit==0x00)&&(i_over>=TC*In)&&(i_over<YX*In))
                        {
                          motor_state=0x88;   //停车错误态
                          start_counter=0;
                          start_fail=0x00;                  //启动失败清零
                          jitter_counter=0;                 //去抖定时器
                        }
					  else{//重新回到正运行态
                          motor_state=0x02;  //正运行状态
                          start_counter=0;
                          startcount_permit=0;
                          if(err_counter>240) {err_state=0x00; err_counter=0x00;}//电机从异常运行态返回
                          else                {err_state=0xaa; err_counter=0x00;}//电机一直处于正常运行态,计数器清零
                          return;
					  }
                    }
                }break;
      case(0xff):  //反启动
                {
                  //如果启动失败,不进行以下程序处理,知道启动失败的处理完成(start_fail==0x00)
                  if(start_fail==0xff)   //启动失败,退RL2,投RL1
                    {
                      motor_state=0x00;
                      start_counter=0;
                      startcount_permit=0;    
                      return;            //返回
                    }

                  if(i_over<=YX*In) //如果Imax<=0.25In
                    {
                      jitter_counter=jitter_counter+0.000833; //去抖定时器
                      if(jitter_counter>=start_time) //如果一直小于0.25In,进入停止态
                        {
                          motor_state=0x00;  //停止态
                          start_counter=0;
                          jitter_counter=0;  //去抖定时器
                          startcount_permit=0;
                          start_fail=0xff;   //启动失败,退RL2,投RL1
                          return;
                        }
                    }
                  else   //如果Imax>0.25In,去抖时间置零
                    {
                      jitter_counter=0;                 //去抖定时器
                    }

                  start_counter=start_counter+0.000833; //延时833us
                  if(start_counter>=start_time)
                    {
                      motor_state=0xfe;                 //反运行态
                      start_fail=0x00;                  //启动失败清零
                      start_counter=0;
                      jitter_counter=0;                 //去抖定时器
                      startcount_permit=0;
                    }
                }break;
      case(0xfe):  //反运行态
                {
				  //反转位置无效&&正转位置无效&&Imax<0.25In=反停车态
                  if((motor_negative_posit==0x00)&&(motor_positive_posit==0x00)&&(i_over<YX*In))
                    {
                      motor_state=0xfd;  //反停车态
                      start_counter=0;
                      startcount_permit=0;
                      err_state=0x00;  //清报警继电器RL3
                      err_counter=0x00;
                      return;
                    }

				  //反转位置有效&&正转位置无效&&Imax>=0.25In=反转运行态
                  if((motor_negative_posit==0xff)&&(motor_positive_posit==0x00)&&(i_over>=YX*In))
                    {
                      motor_state=0xfe;  //反运行状态
                      start_counter=0;
                      startcount_permit=0;
                      if(err_counter>240) {err_state=0x00; err_counter=0x00;}//电机从异常运行态返回
                      else                {err_state=0xaa; err_counter=0x00;}//电机一直处于正常运行态,计数器清零
                      return;
                    }

                  //======================================================================
                  //在以上状态以外的状态,电机异常运行
                  err_counter++;
                  if(err_counter>=240) //如果连续10个周波均出现辅助触点失灵的问题
                    {
                      err_state=0xff;  //运行界面RUN to ERR,发告警信号,RL3
                      err_counter=241; //防止err_counter溢出,保持电机运行错误的标志,当电机进入正常态时返回
                    }
                  else
                    {
                      err_state=0xaa;  //电机处于正常运行态
                    }
                }break;
      case(0xfd):  //反停车态
                {
                  start_counter=start_counter+0.000833;
                  if(start_counter>=stop_time)   //延时时间到,进入停止态
                    {
					  //反转位置无效&&Imax<0.1In=停止态
                      if((motor_negative_posit==0x00)&&(i_over<TC*In))
                        {  
                          motor_state=0x00;   //停止态
                          start_counter=0;
                          startcount_permit=0;
                        }
					  //反转位置无效&&0.1In<=Imax<0.25In=停车失败
                      else if((motor_negative_posit==0x00)&&(i_over>=TC*In)&&(i_over<YX*In))
                        {
                          motor_state=0x88;   //停车错误态
                          start_counter=0;
                          start_fail=0x00;                  //启动失败清零
                          jitter_counter=0;                 //去抖定时器
                        }
					  else{//重新回到反运行态
                          motor_state=0xfe;  //反运行状态
                          start_counter=0;
                          startcount_permit=0;
                          if(err_counter>240) {err_state=0x00; err_counter=0x00;}//电机从异常运行态返回
                          else                {err_state=0xaa; err_counter=0x00;}//电机一直处于正常运行态,计数器清零
                          return;
					  }
                    }
                }break;
      case(0x88):  //停车错误态
                {
                  err_state=0xff;   //报警继电器动作
                  if((i_over<TC*In)&&(motor_positive_posit==0x00)&&(motor_negative_posit==0x00))
                    {
                      motor_state=0x00;   //停止态
                      err_state=0x00;     //返回告警继电器
                      start_counter=0;
                      startcount_permit=0;
                    }
                }break;
      default:  //如果不是以上集中状态,则重新判断电机所处的状态
                {
                  Judge_MotorState_Double();
                }
    }
}

void Check_MotorState_Single(void)     //检查电机状态
{
  if(test_position==0xff){ //如果在试验状态下有开关位置,则电流置为额定值,这样方便调试
     if((motor_positive_posit==0xff)||(motor_negative_posit==0xff))
	 i_over=In;
  }
  //motor_state
  //0x00=停止,0x88=停车错误态(停车错误态的处理未写)
  //0x01=正启动,0x02=正运行,0x03=正停车
  switch(motor_state)  //根据运行状态分别检查电机的运行情况
    {
      case(0x00):  //停止
	            if(startmode==0){ //单向电平控制方式
                  //如果启动失败,不进行以下程序处理,直到启动失败的处理完成(start_fail==0x00)
                  if(start_fail==0xff)   //启动失败,强行停车
                    {
                      motor_state=0x00;
                      startcount_permit=0;    
                      start_counter=0;
                      jitter_counter=0;       //去抖定时器
                      run_count_permit=0x00;  //运行计数器屏蔽
                      return;            //返回
                    }

                  //正转继电器有效&&正转位置有效=进入正启动态
                  if((run_count_permit==0x01)&&(motor_positive_posit==0xff)){
                      motor_state=0x01;
                      startcount_permit=0;
                      start_counter=0;
                      reset_change=1;                   //复位标志置1
                      start_fail=0x00;                  //启动失败清零
                      jitter_counter=0;                 //去抖定时器
                      run_count_permit=0x00;            //运行计数器屏蔽
                      return;
                  }

				   //正转继电器有效&&正转位置无效=等待15秒看是否有位置,有就启动,无则返回继电器
                  if((run_count_permit==0x01)&&(motor_positive_posit==0x00)){ 
                      start_counter=start_counter+0.000833; //去抖定时器
                      if(start_counter>=15)  run_count_permit=0xaa; //如果15秒钟内,开入还没有进入启动态,关闭该继电器
                      return;                //直接返回
                  }

				  //正转继电器无效&&正转位置有效=停止错误态
				  if((run_count_permit==0x00)&&(motor_positive_posit==0xff)){
                     motor_state=0x88;  //停止错误态
                     start_counter=0;
                     start_fail=0x00;      //启动失败清零
                     jitter_counter=0;     //去抖定时器
                     run_count_permit=0x00;//运行计数器屏蔽
				  }

				  //正转继电器无效&&正转位置无效&&Imax>=0.25In=停止错误态
				  if((run_count_permit==0x00)&&(motor_positive_posit==0x00)&&(i_over>=YX*In)){
                     motor_state=0x88;  //停止错误态
                     start_counter=0;
                     start_fail=0x00;      //启动失败清零
                     jitter_counter=0;     //去抖定时器
                     run_count_permit=0x00;//运行计数器屏蔽
				  }

				  //正转继电器无效&&正转位置无效&&Imax<0.25In=停止态
                  if((run_count_permit==0x00)&&(motor_positive_posit==0x00)&&(i_over<YX*In)) 
                    {
                      motor_state=0x00;
                      start_counter=0;
                      start_fail=0x00;                  //启动失败清零
                      jitter_counter=0;                 //去抖定时器
                      run_count_permit=0x00;            //运行计数器屏蔽
                      return;
                    }
                }
				else{ //单向脉冲控制方式
                  //如果启动失败,不进行以下程序处理,直到启动失败的处理完成(start_fail==0x00)
                  if(start_fail==0xff)   //启动失败,强行停车
                    {
                      motor_state=0x00;
                      startcount_permit=0;    
                      start_counter=0;
                      jitter_counter=0;       //去抖定时器
                      run_count_permit=0x00;  //运行计数器屏蔽
                      return;            //返回
                    }

                  //正转位置有效=进入正启动态
                  if(motor_positive_posit==0xff){
                      motor_state=0x01;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -