开源改变世界

重置时触发步进器启用 #150

推推 grbl 2年前 (2023-02-08) 175次浏览
打开
Tsillen 打开了这个问题 2022 年 6 月 17 日 · 17条评论
打开

重置时触发步进器启用#150

Tsillen 打开了这个问题 2022 年 6 月 17 日 · 17条评论

评论

重置时触发步进器启用 #150

我的用例:IHSV57 伺服的警报连接到我的急停电路。
在出现警报的情况下,急停输入拉低。
为了重置这个电源循环伺服(不理想)或 troggle 驱动器启用。

令我惊讶的是,当您重置电路板时,此驱动器启用/禁用不会发生。仅当您更改设置(在 IO SENDER 中)时才会发生。

理想情况下,您会在某处看到一个选项,可以在初始化/重置时切换启用/禁用步进器/伺服。

重置时触发步进器启用 #150
贡献者

插件可以通过挂钩代码并hal.driver_reset在插件 init 函数中注册要在启动时调用的函数来做到这一点。下面是使用这些方法的示例

可以通过调用hal.stepper.enable()来切换启用信号。

重置时触发步进器启用 #150
作者

所以如果我理解正确
`static void on_driver_reset (void)
{

hal.stepper.enable(0xFF);
1 sec delay
hal.stepper.enable(0x00);
driver_reset();

if(power_state != Power_On)
    check_power_restored();

}
`

重置时触发步进器启用 #150
贡献者

您必须将论点转换为hal.stepper.enable这样的:
hal.stepper.enable((axes_signals_t){AXES_BITMASK});

hal.stepper.enable(s(axes_signals_t){0});

1秒延迟是hal.delay_ms(1000, NULL);

重置时触发步进器启用 #150
作者

太棒了,我试试

重置时触发步进器启用 #150
作者
齐伦 评论了 2022 年 6 月 17 日  

ssr.c(可能不需要这些包含的一半)

#include "driver.h"

#if SERVO_RESET_ENABLE // Declared in my_machine.h - you must add in the section with the included plugins
#include "grbl/protocol.h"
#include "grbl/hal.h"
#include "grbl/state_machine.h"
#include "grbl/system.h"
#include "grbl/alarms.h"
#include "grbl/nuts_bolts.h"         // For delay_sec non-blocking timer function


// Declarations
static driver_reset_ptr driver_reset;
// DRIVER RESET
static void driverReset (void)
{
    hal.stepper.enable((axes_signals_t){0}); //disable drives
    hal.delay_ms(1000, NULL); // wait a second
    hal.stepper.enable((axes_signals_t){1}); //enable drives
    driver_reset();
}

// INIT FUNCTION - CALLED FROM plugins_init.h()
// void my_plugin_init() {
void ssr_init() 
{

    driver_reset = hal.driver_reset;                    // Subscribe to driver reset event
    hal.driver_reset = driverReset;

    
 }
#endif

plugins_init.h 添加:

#if SERVO_RESET_ENABLE
    extern void ssr_init (void);
    ssr_init();
#endif

my_machine.h 添加:
#define SERVO_RESET_ENABLE 1

我有点惊讶它发现我的 ssr.c 无处可去,我让它知道它在 /ssr/ 文件夹中,但它似乎可以编译。
现在让我们看看它是否有效。

重置时触发步进器启用 #150
作者

是的,这有效。

当我的伺服器进入警报状态时 -> 拉动急停 -> 在 iosender 中按下重置现在拉动驱动器启用并清除伺服器警报。

重置时触发步进器启用 #150
作者
齐伦 评论了 2022 年 6 月 17 日  

好吧,做了一些奇怪的事情。如果伺服警报响起 -> 拉急停 -> 我看到伺服上没有警报灯。当我检查状态(通过 RS232 直接进入伺服)时,它显示 drive_enable 很低。似乎它会自动触发和重置,这不是预期的目标。

目标是在我按下大重置按钮时重置它:
重置时触发步进器启用 #150

似乎 hal.driver_reset 在急停处于活动状态时自动调用。

重置时触发步进器启用 #150
贡献者

似乎 hal.driver_reset 在急停处于活动状态时自动调用。

正确,您必须检查急停是否处于活动状态并延迟操作直到它被清除?

if (!hal.control.get_state().e_stop)
    toggle enable
重置时触发步进器启用 #150
作者

在急停期间,驱动程序可以保持启用状态。清除此代码后,我应该切换启用。

重置时触发步进器启用 #150
作者
#include "driver.h"

#if SERVO_RESET_ENABLE // Declared in my_machine.h - you must add in the section with the included plugins
#include "grbl/protocol.h"
#include "grbl/hal.h"
#include "grbl/state_machine.h"
#include "grbl/system.h"
#include "grbl/alarms.h"
#include "grbl/nuts_bolts.h"         // For delay_sec non-blocking timer function


// Declarations
static driver_reset_ptr driver_reset;
uint8_t holdbit = 0; //holdbit for servo enable toggle
// DRIVER RESET
static void driverReset (void)
{
    if (holdbit == 1)
    {
        hal.stepper.enable((axes_signals_t){0}); //disable drives
        hal.delay_ms(1000, NULL); // wait a second 
        hal.stepper.enable((axes_signals_t){1}); //enable drives
        holdbit = 0; //reset holdbit
    }
    driver_reset();
}

// INIT FUNCTION - CALLED FROM plugins_init.h()
// void my_plugin_init() {
void ssr_init() 
{

    driver_reset = hal.driver_reset;                    // Subscribe to driver reset event
    hal.driver_reset = driverReset;
 }
#endif


if (hal.control.get_state().e_stop) //estop event
{
    holdbit = 1; //set holdbit
}
重置时触发步进器启用 #150
作者

我认为这样的事情应该有效。需要检查我可以把 estop 事件代码放在哪里

重置时触发步进器启用 #150
贡献者

需要检查我可以把 estop 事件代码放在哪里

它不是事件回调,hal.control.get_state().e_stop调用直接从输入中读取状态。

重置时触发步进器启用 #150
作者

重置时触发步进器启用 #150
Iosender 不允许我在急停处于活动状态时重置(来自伺服系统的警报)

我试过这个:
但我无法在当前状态下发送重置,所以它有点卡住了。除了添加额外的按钮等之外,不知道如何处理这种行为。

#include "driver.h"

#if SERVO_RESET_ENABLE // Declared in my_machine.h - you must add in the section with the included plugins
#include "grbl/protocol.h"
#include "grbl/hal.h"
#include "grbl/state_machine.h"
#include "grbl/system.h"
#include "grbl/alarms.h"
#include "grbl/nuts_bolts.h"         // For delay_sec non-blocking timer function


// Declarations
static driver_reset_ptr driver_reset;
uint8_t holdbit = 0; //holdbit for servo enable toggle

// DRIVER RESET
static void driverReset (void)
{
    if (holdbit == 1) //should i check if e-stop is still high?
    {
        hal.stepper.enable((axes_signals_t){0}); //disable drives
        hal.delay_ms(1000, NULL); // wait a second 
        hal.stepper.enable((axes_signals_t){1}); //enable drives
        holdbit = 0; //reset holdbit
    } 
    else if (hal.control.get_state().e_stop) //if e-stop pin is high
    {
        holdbit = 1; //set holdbit
    }
    
    driver_reset();
}

// INIT FUNCTION - CALLED FROM plugins_init.h()
// void my_plugin_init() {
void ssr_init() 
{

    driver_reset = hal.driver_reset;                    // Subscribe to driver reset event
    hal.driver_reset = driverReset;
}
#endif
重置时触发步进器启用 #150
贡献者

如果你想捕获急停事件,你可以将你的代码附加到hal.control.interrupt_callback,就像你为hal.driver_reset. 这是回调的核心处理程序:

核心/系统.c

第 92 至 139 行 45b0e10

//引脚命令的引脚更改中断,即循环启动、进给保持和复位。套
//只有实时命令执行变量让主程序执行这些时
//准备好了。当被选中时,这与基于字符的实时命令完全一样
//直接来自传入的数据流。
ISR_CODE void ISR_FUNC (control_interrupt_handler)( control_signals_t signals)
{
如果(信号。取消断言
返回//现在…
如果(信号。){
系统。最后一个事件控制价值=信号。价值
if ((signals.reset || signals.e_stop || signals.motor_fault) && state_get() != STATE_ESTOP)
mc_reset();
else {
#ifndef NO_SAFETY_DOOR_SUPPORT
if (signals.safety_door_ajar && hal.signals_cap.safety_door_ajar) {
if(settings.safety_door.flags.ignore_when_idle) {
// Only stop the spindle (laser off) when idle or jogging,
// this to allow positioning the controlled point (spindle) when door is open.
// NOTE: at least for lasers there should be an external interlock blocking laser power.
if(state_get() != STATE_IDLE && state_get() != STATE_JOG)
system_set_exec_state_flag(EXEC_SAFETY_DOOR);
if(sys.mode == Mode_Laser) // Turn off spindle immediately (laser) when in laser mode
hal.spindle.set_state((spindle_state_t){0}, 0.0f);
} else
system_set_exec_state_flag(EXEC_SAFETY_DOOR);
}
#endif
if (signals.probe_triggered) {
if(sys.probing_state == Probing_Off && (state_get() & (STATE_CYCLE|STATE_JOG))) {
system_set_exec_state_flag(EXEC_STOP);
sys.alarm_pending = Alarm_ProbeProtect;
} else
hal.probe.configure(false, false);
} else if (signals.probe_disconnected) {
if(sys.probing_state == Probing_Active && state_get() == STATE_CYCLE) {
system_set_exec_state_flag(EXEC_FEED_HOLD);
sys.alarm_pending = Alarm_ProbeProtect;
}
} else if ( signals.feed_hold )
system_set_exec_state_flag (EXEC_FEED_HOLD);
否则 如果(信号。cycle_start
system_set_exec_state_flag (EXEC_CYCLE_START);
}
}
}

 

重置时触发步进器启用 #150
贡献者

Iosender 不允许我在急停处于活动状态时重置(来自伺服系统的警报)

grblHAL 阻止了这个——伺服警报应该触发电机故障信号?如果您使用的驱动程序有辅助输入,您可以申请一个并使用它来触发信号。

重置时触发步进器启用 #150
作者

您好,我正在使用 grblhal2k:
https ://github.com/Expatria-Technologies/grblhal_2000_PrintNC

我相信它有辅助输入。将进一步调查

重置时触发步进器启用 #150
作者

现在使用此代码,效果很好。
#150(评论)

在某些时候,我可能会使用电机故障输入。

免费注册 在 GitHub 上加入此对话。已有帐户? 登录评论
标签
还没有
项目

还没有

发展

没有分支机构或拉取请求

2名参加者
重置时触发步进器启用 #150重置时触发步进器启用 #150

喜欢 (0)