• EtherCAT与RTEX驱动器轴回零的配置与实现


    上节课程,正运动小助手给大家分享了运动控制器提供的回零模式配置与实现。本节课程主要介绍控制器实现EtherCAT与RTEX驱动器的回零及其配置。

    01 总线驱动器回零模式

    正运动控制器提供自己的回零模式,也支持使用EtherCAT总线驱动器提供的回零模式,或RTEX总线驱动器的提供的回零模式,均可使用DATUM指令实现回零,但采用的回零模式和配置方法与控制器提供的回零方式有所区别。

    以上两类总线驱动器回零模式采用21,回零模式由总线驱动器提供,参见驱动器手册说明。

    语法:DATUM(21,驱动器提供的回零模式)

    总线驱动器回零时,除了模式需要采用驱动器提供的,原点开关、正/负限位开关需要接入驱动器的IO端子上,一般驱动器IO端子有指定的HOME、POT,NOT用于回零,引脚需查看驱动器手册说明。

    1.EtherCAT总线驱动器

    可使用EtherCAT总线驱动器回零功能,DATUM(21,mode2),此时mode2有效,mode2为EtherCAT总线驱动器6098h提供的原点回归模式。

    在这里插入图片描述

    使用此模式需要参考驱动器手册的说明,找到手册对应的章节,如上图,配置驱动器回零PDO所需要的功能,按照驱动器手册提供的信号接线方式完成开关信号的接线,将原点和正/负限位信号接在驱动器IO指定的HOME、POT,NOT端子上,等待DATUM触发回零即可。

    在这里插入图片描述

    示例:初始化完成后再运行驱动器回零程序。

    BASE(iAxis)  '按驱动器轴号逐个回零
    AXIS_STOPREASON = 0
    SPEED = 100 '回零速度
    CREEP = 10  '反找速度
    ACCEL = 1000
    DATUM(21,2) '驱动器回零模式value=2
    WAIT IDLE
    IF AXIS_STOPREASON = 0 THEN
        ?"回零成功"
    ELSE
        ?"回零失败"  ,"停止原因:",AXIS_STOPREASON,"状态字0X",HEX(DRIVE_STATUS)
    ENDIF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.RTEX总线驱动器

    此模式下可使用RTEX总线驱动器回零功能,此时mode2有效,回零模式查看驱动器手册即可(如下表)。
    使用此模式原点和正负限位信号接在驱动器指定IO上,等待DATUM触发回零即可。
    在这里插入图片描述

    02 EtherCAT总线驱动器回零方式

    使用EtherCAT总线驱动器提供的回零,需要将原点信号接入驱动器指定IO上,不同的厂商的使用要求略有差异,需要阅读驱动器手册之后再进行配置。

    参考步骤如下:

    1.硬件接线:以下以某个驱动器为例,将原点等信号接入下图指定引脚即可,无需映射,并且按要求给驱动器的IO端子供电。

    在这里插入图片描述

    使用控制器OP输出模拟IO信号输入,控制器OUT0口接到驱动器控制端子8引脚,模拟原点信号,控制器OUT6口接到驱动器控制端子9引脚,模拟负限位信号,控制器OUT5口接到驱动器控制端子10引脚,模拟正限位信号。

    2.驱动器配置要求:根据驱动器手册说明配置回零所需要的功能,例如下方配置说明中,6040h和6041是必须模式,其他模式均为选配,故DRIVE_PROFILE配置驱动器PDO时,需要包含必须模式才可完成回零操作。

    在这里插入图片描述

    3.总线初始化:运动下方初始化模板程序,合理配置DRIVE_PROFILE,使能总线驱动器。

    4.驱动器回零:初始化成功方可执行回零程序,设置合理的总线轴参数,配置回零的找原点速度SPEED和反找速度CREEP,发送DATUM(21,mode2)驱动器开始找原点运动,例程使用模式如下,回零成功停止运动,DPOS和MPOS自动清零。

    在这里插入图片描述

    程序分为两部分执行,先总线初始化,再回零。

    1.总线初始化参考程序

    '*******************************************************ECAT总线初始化
    global CONST BUS_TYPE = 0        '总线类型。可用于上位机区分当前总线类型
    global CONST MAX_AXISNUM = 16      '最大轴数
    global CONST Bus_Slot  = 0        '槽位号0(单总线控制器缺省0global CONST PUL_AxisStart   = 0    '本地脉冲轴起始轴号
    global CONST PUL_AxisNum   = 0    '本地脉冲轴轴数量
    global CONST Bus_AxisStart   = 0      '总线轴起始轴号
    global CONST Bus_NodeNum   = 1      '总线配置节点数量,用于判断实际检测到的从站数量是否一致
    global Bus_InitStatus      '总线初始化完成状态
    Bus_InitStatus = -1
    global Bus_TotalAxisnum    '检查扫描的总轴数
    delay(3000)        '延时3S等待驱动器上电,不同驱动器自身上电时间不同,具体根据驱动器调整延时
    ?"总线通讯周期:",SERVO_PERIOD,"us"
    Ecat_Init()      '初始化ECAT总线 
    while (Bus_InitStatus = 0)
        Ecat_Init()
    wend
    end
    '***************************ECAT总线初始化*****************************
    '初始流程: slot_scan(扫描总线) ->   从站节点映射轴/io  ->  SLOT_START(启动总线) -> 初始化成功
    '**********************************************************************
    global sub Ecat_Init()
        local Node_Num,Temp_Axis,Drive_Vender,Drive_Device,Drive_Alias
        RAPIDSTOP(2)
        for i=0 to MAX_AXISNUM - 1              '初始化还原轴类型
            AXIS_ENABLE(i) = 0
            atype(i)=0  
            AXIS_ADDRESS(i) =0
            DELAY(10)                    '防止所有驱动器全部同时切换使能导致瞬间电流过大
        next
        Bus_InitStatus = -1
        Bus_TotalAxisnum = 0  
        SLOT_STOP(Bus_Slot)        
        delay(200)
        slot_scan(Bus_Slot)                  '扫描总线
        if return then 
            ?"总线扫描成功","连接从站设备数:"NODE_COUNT(Bus_Slot)
            if NODE_COUNT(Bus_Slot) <> Bus_NodeNum then    '判断总线检测数量是否为实际接线数量
                ?""  
                ?"扫描节点数量与程序配置数量不一致!" ,"配置数量:"Bus_NodeNum,"检测数量:"NODE_COUNT(Bus_Slot)
                Bus_InitStatus = 0    '初始化失败。报警提示
                return
            endif   
            '"开始映射轴号"
            for Node_Num=0 to NODE_COUNT(Bus_Slot)-1'遍历扫描到的所有从站节点
                Drive_Vender = NODE_INFO(Bus_Slot,Node_Num,0)  '读取驱动器厂商
                Drive_Device = NODE_INFO(Bus_Slot,Node_Num,1)  '读取设备编号
                Drive_Alias = NODE_INFO(Bus_Slot,Node_Num,3)  '读取设备拨码ID
                if NODE_AXIS_COUNT(Bus_Slot,Node_Num) <> 0  the  '判断当前节点是否有电机
                    for j=0 to NODE_AXIS_COUNT(Bus_Slot,Node_Num)-1      '根据节点带的电机数量循环配置轴参数(针对一拖多驱动器)      
                        Temp_Axis = Bus_AxisStart + Bus_TotalAxisnum    '轴号按NODE顺序分配
                        'Temp_Axis = Drive_Alias        '轴号按驱动器设定的拨码分配(一拖多需要特殊处理)          
                        base(Temp_Axis)
                        AXIS_ADDRESS= Bus_TotalAxisnum+1    '映射轴号
                        ATYPE=65                '设置控制模式 65-位置 66-速度 67-转矩 
                        DRIVE_PROFILE = 1
                        disable_group(Temp_Axis)        '每轴单独分组
                        Bus_TotalAxisnum=Bus_TotalAxisnum+1    '总轴数+1
                    next      
                endif
            next
            ?"轴号映射完成","连接总轴数:"Bus_TotalAxisnum
            DELAY 200
            SLOT_START(Bus_Slot)        '启动总线
            if return then 
                wdog=1              '使能总开关
                '?"开始清除驱动器错误"
                for i= Bus_AxisStart to Bus_AxisStart + Bus_TotalAxisnum - 1 
                    BASE(i)
                    DRIVE_CLEAR(0)
                    DELAY 50
                    '?"驱动器错误清除完成"
                    datum(0)            '清除控制器轴状态错误"
                    DELAY 100  
                    '"轴使能"
                    AXIS_ENABLE=1
                next
                Bus_InitStatus  = 1
                ?"轴使能完成"
                '本地脉冲轴配置
                for i = 0 to PUL_AxisNum - 1
                    base(PUL_AxisStart + i)
                    AXIS_ADDRESS  = (-1<<16) + i
                    ATYPE = 4
                next
                ?"总线开启成功"
                run "Basic1",1    '开启回零任务
            else
                ?"总线开启失败"
                Bus_InitStatus = 0
            endif  
        else
            ?"总线扫描失败"
            Bus_InitStatus = 0
        endif
    end sub
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96

    2.驱动器回零程序

    ?"开始回零"
    TABLE(0)=0
    BASE(0)
    UNITS=(8388608/360) '脉冲当量
    SPEED=50 '找原点速度
    CREEP=10 '反找速度 
    ACCEL=1000 
    DECEL=1000 
    DELAY(100)
    DATUM(21,19) '开始回零,模式19
    WHILE 1
        WAIT IDLE
        TABLE(0)=DRIVE_STATUS    '读取6041h状态字判断回零状态
        IF READ_BIT2(15,TABLE(0)) THEN
            ?"回零完成"
            EXIT WHILE
        ENDIF
    WEND
    END
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    示波器采用回零成功波形如下:采用模式19,采用OP模拟原点信号,驱动器感应到原点后低速反找,离开原点时停止运动,清空位置信息。
    在这里插入图片描述

    回零时碰到限位开关停止运动,AXISSTATUS轴状态显示40h正在回零中,回零完成状态为0h。
    在这里插入图片描述

    本次,正运动技术EtherCAT与RTEX驱动器轴回零的配置与实现,就分享到这里。

    更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师。

    本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。

  • 相关阅读:
    记录本地Nginx发布vue项目
    力扣:1854. 人口最多的年份
    【洛谷】P5662 纪念品
    在pycharm中创建python模板文件
    zookeeper入门到精通08——服务器节点动态上下线案例实战
    2022年MySQL最新面试题
    godoc安装
    行情分析——加密货币市场大盘走势(10.25)
    MySQL 锁机制
    E Parity Split (江西CCPC省赛)题解
  • 原文地址:https://blog.csdn.net/weixin_57350300/article/details/127888168