[倍福] 基于TwinCAT3的多圈绝对值编码器回零

[复制链接]
查看60069 | 回复0 | 2024-9-13 12:54:06 | 显示全部楼层 |阅读模式
问    题

近日,通过Beckhoff PLC控制ABB Microflex e190伺服,在对多圈绝对值编码器伺服电机回零时,发现了一个问题。执行MC_Home回零后,当前值(fAx1ActPos)可以更改成零。但当重新激活配置或重新上电后,当前值(fAx1ActPos)又恢复到执行MC_Home前的值。即,PLC中只能读取到编码器的绝对计数值。即便对SDO:(1010:01)进行了操作也不行(参见下文)。



试验配置如下:



其中Microflexe 190连接的伺服电机为多圈绝对值编码器。单圈位数17位,多圈位数16位。



多圈绝对值编码器说明

众所周知,多圈绝对值编码器,可以记下伺服电机单圈内的角度以及伺服电机转过的圈数。单圈内角度可通过光电码盘直接读取,圈数由电池保存。由于多圈绝对值编码器可记住很大范围内电机轴的绝对位置,因此,多圈绝对值的伺服电机一般不用每次上电回零。

与之对应,增量式编码器每次上电后读数都为零,因此每次上电后都需要回零。单圈绝对值编码器每次上电后,读数都为-0.5圈到0.5圈内的数值。比如断电前的计数为12.7(单位为圈),再次上电后的读数为-0.3,因此单圈绝对值编码器每次上电也需要回零。

基准零点

多圈编码器伺服电机,读数范围为-232~+232,此读数为编码器的绝对位置读数。首次投入使用时,其绝对位置读数(x0)是随机的,可能是一个很大的数。



实际的机械轴可能只是在一个小范围内运动(红色线段区域)。如使编码器绝对读数,会很不方便。如希望把x0作为编程的基准零点。在伺服轴首次投入使用之前,一般会对执行一次回零,以把x0确定为基准零点。





在驱动器中,有一个参数为POSOFFSET。当需要把x0作为基准零点时,会把POSOFFSET设置为-x0。POSOFFSET通过SDO:(5044)映射到PLC侧。在PLC侧,通过对SDO: (1010:01)的操作,把相关参数(-x0)写入POSOFFSET,即SDO:(5044),并使之生效。

操作说明及解决方法

常规操作应当是:执行MC_Home功能块,把HomingMode设置为MC_Direct。即不执行轴的动作,直接将当前值x0设为0(把-x0赋值给POSOFFSET)。执行完后,把“16#65766173”写入SDO:(1010:01),即可把x0点设置为基准零点。

注:16#65766173对应“EVAS”的ASCII码,即“SAVE”的倒序!

这种方式在ABB PLC或LS PLC中都可把x0修改为基准零点,但在Beckhoff PLC中,始终修改不成功。

反复测试,发现当在BeckhoffPLC中执行完MC_Home后,POSOFFSET(SDO:5044)中的值并未更新,即-X0并未更新到SDO:5044中去。因此,需要通过PLC编程更新SDO:5044。

此时需要用到SDO读写功能块,各个PLC厂家都会提供SDO读写的功能块。TwinCAT3提供了库文件:TC2_EtherCAT。其中包含对SDO读写的功能块。







功能块管脚定义请参考官方说明文件。

POSOFFSET的计算及更新

那么,通过PLC如何更新POSOFFSET呢?首先看一下更新的POSOFFSET的计算。

进一步说明一点,多圈绝对值编码器首次上电时的读数为x0,但x0是随机的,有可能不是理想的基准零点,理想的基准零点有可能是在x0点附近的x1点。因此,下述讲述,都是按需要把x1设为基准零点展开的。



执行MC_Home之前,POSOFFSET中有可能是有数值的。在此POSOFFSET前提下的基准零点为x0。此时,若伺服轴的实际读数为y0。即y0是以x0为基准零点的读数y0:=x1-x0。

如果伺服驱动器恢复了出厂设置,则初始POSOFFSET读数为0,基准零点即编码器的绝对零点。

当前的读数y0可通过当前位置读取功能块读取,如下截图,y0=105。此时,对应编码器的绝对读数为x1。



在当前POSOFFSET对应为x0时,如要把x1设置为基准零点,则:

POSOFFSET(x1) = POSOFFSET(x0)+ y0

POSOFFSET(x0)可通过如下功能块读取,并把POSOFFSET(x0)读入变量“nRealValue”中。如伺服驱动器为出厂设置,则nRealValue=0:



而y0的值保存在变量fAx1ActPos中。可通过如下功能块计算POSOFFSET(x1),并存入nSAVE2中:



因我们默认的用户单位为圈,因此fAx1ActPos要乘以131072,并且要取反。

计算完成以后,要通过SDO写功能块,将nSave2写入SDO:5044:



写完成后,要把nSave的值写入SDO:(1010:01):





写完成后,即可把驱动器中的PosOffset更新为“-x1”。

POSOFFSET更新完成后,执行MC_Home,就可以把当前值设置成MC_Home功能块设置的“Position”,此时默认为0,并且断电上电后,当前值都是基于基准零点(x1)进行计数。



备注:要先更新POSOFFSET(其值为-x1),后执行MC_Home。否则,如先执行MC_Home会提前把y0更改成0。

另:在调用SDO读写及MC_Home功能块时,不要使能伺服轴,这样通过功能块读取的y0值无跳动,读数更准确。

总    结

当把任意一点设为基准零点时,这一点对应的POSOFFSET为其编码器绝对读数取反。并需把此POSOFFSET写到SDO:5044中去。通过给SDO(1010:01)赋值“16#65766173”使刷新的SDO参数生效。

TwinCAT3的SDO读写功能块在TC2_EtherCAT库中。不同品牌PLC都有相应的SDO读写功能块。

Beckhoff的POSOFFSET需通过PLC编程计算刷新(如有其它方法或理解错误的,再另文说明)。有的品牌的PLC如ABB和LS的则不需要!

多圈绝对值编码器伺服电机,只是在首次投入使用时需确定基准零点,不用每次上电都做回零。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则