实时协议函数protocol_execute_realtime() - beginner-lei/GRBL GitHub Wiki

执行实时协议函数protocol_execute_realtime()。 程序运行protocol_execute_realtime(); //运行实时命令。

//执行运行时间命令,在需要时。这就是所谓的从各种主程序要检查站,主要是那里可能是一个while循环等待缓冲区空间或任何执行时间从过去的止点可以超过几分之一秒。

//这是一种异步执行实时命令(又名多任务)grbl的刀位点解析和规划功能。 这个函数也可以作为一个接口,用于中断设置系统实时的旗帜,只有主程序处理,消除的需要定义更多的计算昂贵volatile变量。这也提供了一种控制方法执行某些任务不相同的两个或多个实例的任务,比如计划重新计算缓冲feedhold或覆盖。

注意:sys_rt_exec_state变量标志设置任何过程,步骤或串行中断,插脚引线,限位开关或主程序。

void protocol_execute_realtime() { // Temp variable to avoid calling volatile multiple times. // 临时变量来避免多次调用不稳定。 uint8_t rt_exec; do{

  if (rt_exec) { // 有标志位置位进入
    sys.state = STATE_ALARM; // 设置系统为报警状态
     report_alarm_message(ALARM_HARD_LIMIT_ERROR); //报告报警信息为接近极限值
    } else if (rt_exec & EXEC_ALARM_SOFT_LIMIT) { //报告执行软件限位报警
     report_alarm_message(ALARM_SOFT_LIMIT_ERROR); //报告出现软件限位报警
    } else if (rt_exec & EXEC_ALARM_ABORT_CYCLE) { //执行停止循环报警     
     report_alarm_message(ALARM_ABORT_CYCLE); //出现终止循环报警
    } else if (rt_exec & EXEC_ALARM_PROBE_FAIL) { //执行探查失败报警
     report_alarm_message(ALARM_PROBE_FAIL); //出现探查失败报警
    } else if (rt_exec & EXEC_ALARM_HOMING_FAIL) { //执行返回原点失败报警
     report_alarm_message(ALARM_HOMING_FAIL); //出现返回原点失败报警
    }
    // Halt everything upon a critical event flag. Currently hard and soft limits flag this.
    // 停止一切在一个关键事件标志。目前硬和软限制标志
    if (rt_exec & EXEC_CRITICAL_EVENT) { //如果系统是循环事件进入
     report_feedback_message(MESSAGE_CRITICAL_EVENT); //报告反馈信息
     bit_false_atomic(sys_rt_exec_state,EXEC_RESET); //清除目前的复位状态

bit_false_atomic(sys_rt_exec_alarm,0xFF); // 清除所有报警标志 }

上面代码将rt_exec = sys_rt_exec_alarm ,如果rt_exec为真,打印不同报警信息和限位保护信息,然后清除报警状态

没有报警进行执行下面代码,执行了终止命令,串口打印命令

  // Check amd execute realtime commands 校验和执行实时命令
  rt_exec = sys_rt_exec_state; // Copy volatile sys_rt_exec_state

if (rt_exec) { // 输入标志是正确的执行

    // Execute system abort. 执行系统终止命令
    if (rt_exec & EXEC_RESET) {
    sys.abort = true;  // Only place this is set true.
     return; // Nothing else to do but exit.

}

    // Execute and serial print status 执行和串口打印状态
    if (rt_exec & EXEC_STATUS_REPORT) { 
     report_realtime_status(); //报告实时状态
    bit_false_atomic(sys_rt_exec_state,EXEC_STATUS_REPORT); //清除报告状态清零
    }

下面代码

//执行状态。

//注意:所涉及的数学计算持有应该足够低对大多数人来说,即使不是全部,操作场景。一旦启动,系统进入暂停状态

//主程序流程,直到重置或恢复。待办事项:检查模式?如何处理呢?可能没有,因为它只会在空闲,然后重置Grbl。状态检查容许状态的方法。

//如果全局各自报警标志位其中(执行取消动作) | (执行进给保持) | (执行安全门)任意一位为真进入

    if (rt_exec & (EXEC_MOTION_CANCEL | EXEC_FEED_HOLD | EXEC_SAFETY_DOOR)) {
       //如果是循环状态执行暂停状态

if (sys.state == STATE_CYCLE) { st_update_plan_block_parameters(); //通知stepper module验算减速。 sys.suspend = SUSPEND_ENABLE_HOLD; // 开始暂停标志

       }

// 如果,Grbl空闲不在运动。简单的指示暂停就绪状态。

       if (sys.state == STATE_IDLE) { sys.suspend = SUSPEND_ENABLE_READY; }

//执行和标志和减速运动取消并返回空闲。主要由探测使用周期,停止和取消剩余的运动。

       if (rt_exec & EXEC_MOTION_CANCEL) {
         if (sys.state == STATE_CYCLE) { sys.state = STATE_MOTION_CANCEL; }
         sys.suspend |= SUSPEND_MOTION_CANCEL; 
       }

// 只在循环时执行进给保持减速 if (rt_exec & EXEC_FEED_HOLD) { //只有安全门为1才执行保持进给状态赋值

         if (bit_isfalse(sys.state,STATE_SAFETY_DOOR)) { sys.state = STATE_HOLD; }
       }
       if (rt_exec & EXEC_SAFETY_DOOR) {
        report_feedback_message(MESSAGE_SAFETY_DOOR_AJAR); 

/ /如果已经活跃,准备好重新开始,CYCLE_STOP标志设置为强制断开。

/ /注意:只是暂时设置“rt_exec”变量,不是动荡的“rt_exec_state”变量。

         if (sys.suspend & SUSPEND_ENABLE_READY) { bit_true(rt_exec,EXEC_CYCLE_STOP); }
         sys.suspend |= SUSPEND_ENERGIZE;
         sys.state = STATE_SAFETY_DOOR;
       }

bit_false_atomic(sys_rt_exec_state,(EXEC_MOTION_CANCEL | EXEC_FEED_HOLD | EXEC_SAFETY_DOOR));

} 以上代码执行了

1.如果全局各自报警标志位其中(执行取消动作) | (执行进给保持) | (执行安全门)任意一位为真进入

2.系统为闲着状态, 开始循环状态, 回原点状态, 控制取消状态, 开始保持状态, 开始安全门状态时进入

3.如果是循环状态执行暂停状态

4.如果系统闲置状态执行暂停就绪状态

5.执行动作取消

6.如果是保持进给状态,执行保持进给状态

7.执行安全门状态

8.最后执行bit_false_atomic清标志清除(执行取消动作)(执行进给保持)(执行安全门)标志位

      if (!(rt_exec & (EXEC_FEED_HOLD | EXEC_MOTION_CANCEL | EXEC_SAFETY_DOOR))) {  //状态机如果不是保持进给,运动取消,和安全的门。 
       // Cycle start only when IDLE or when a hold is complete and ready to resume.
       // NOTE: SAFETY_DOOR is implicitly blocked. It reverts to HOLD when the door is closed.

//循环开始时只有当闲置或持有完成并准备简历。 //注意:SAFETY_DOOR是隐式地屏蔽。它返回的时候门是关闭的。

// 如果系统状态为闲着状态,系统状态为开始进给或运动取消,暂停标志为位重新开始

       if ((sys.state == STATE_IDLE) || ((sys.state & (STATE_HOLD | STATE_MOTION_CANCEL)) && (sys.suspend & SUSPEND_ENABLE_READY))) {
         // Re-energize powered components, if disabled by SAFETY_DOOR.
         // 由SAFETY_DOOR重振组件供电,如果禁用。
         if (sys.suspend & SUSPEND_ENERGIZE) { 
           // Delayed Tasks: Restart spindle and coolant, delay to power-up, then resume cycle.
          //延迟任务:重新启动主轴和冷却剂,延迟升高,然后恢复周期。
           if (gc_state.modal.spindle != SPINDLE_DISABLE) {  //主轴模式不是失能进入
            spindle_set_state(gc_state.modal.spindle, gc_state.spindle_speed); //设置状态和速度
            //待办事项:阻塞函数调用。最终需要一个非阻塞。

delay_ms(SAFETY_DOOR_SPINDLE_DELAY); // TODO: Blocking function call. Need a non-blocking one eventually.

           }
           if (gc_state.modal.coolant != COOLANT_DISABLE) { 
           coolant_set_state(gc_state.modal.coolant); 
            delay_ms(SAFETY_DOOR_COOLANT_DELAY); // TODO: Blocking function call. Need a non-blocking one eventually.
           }
           // TODO: Install return to pre-park position.
         }
 //只有在队列马达存在规定的缓冲,并且动机没有让取消,才会循环
 
         if (plan_get_current_block() && bit_isfalse(sys.suspend,SUSPEND_MOTION_CANCEL)) {
           sys.state = STATE_CYCLE;
          st_prep_buffer(); // Initialize step segment buffer before beginning cycle.初始化步开始循环之前
          st_wake_up();
         } else { // Otherwise, do nothing. Set and resume IDLE state.否则,什么也不做,设置和复位空闲模式
           sys.state = STATE_IDLE;
         }
         sys.suspend = SUSPEND_DISABLE; // Break suspend state.
       }
      }    
     bit_false_atomic(sys.rt_exec_state,EXEC_CYCLE_START);
    }

//重新启动后循环计划和步进系统的进给保持简历。通过实时命令执行主程序,确保安全计划重新计划。 //注意:画线算法变量仍保持通过规划师和步进循环仅步进路径应该继续,好像什么都没发生一样。 //注意:EXEC_CYCLE_STOP由步进子系统周期或进给保持时完成。

    if (rt_exec & EXEC_CYCLE_STOP) { //如果是循环停止状态进入
      if (sys.state & (STATE_HOLD | STATE_SAFETY_DOOR)) {
       // Hold complete. Set to indicate ready to resume.  Remain in HOLD or DOOR states until user
       // has issued a resume command or reset.

//保存完整。设置为指示准备简历。继续持有或门状态,直到用户 //已发布了一份简历命令或重置。

  }
  // Overrides flag byte (sys.override) and execution should be installed here, since they 
  // are realtime and require a direct and controlled interface to the main stepper program.
  //重写标志字节(sys.override)和执行应该安装在这里,因为他们实时和需要直接和控制接口的主要步进程序。
  // Reload step segment buffer 重新加载步段缓冲
  if (sys.state & (STATE_CYCLE | STATE_HOLD | STATE_MOTION_CANCEL | STATE_SAFETY_DOOR | STATE_HOMING)) { st_prep_buffer(); } 

//如果安全的门被打开,积极检查当安全门关闭,准备简历。 //注意:这解锁SAFETY_DOOR状态保持状态,这样CYCLE_START可以激活一个简历。

  if (sys.state == STATE_SAFETY_DOOR) { //安全门状态进入
    if (bit_istrue(sys.suspend,SUSPEND_ENABLE_READY)) { 
      if (!(system_check_safety_door_ajar())) {
       sys.state = STATE_HOLD; // Update to HOLD state to indicate door is closed and ready to resume. 更新保存状态指示门关闭,准备简历。
     }
    }
  }


}

⚠️ **GitHub.com Fallback** ⚠️