#申请原创# #技术资源#
1、功能说明 EtherCAT从站模块需要支持自定义设置从站节点地址的功能,即通过8位拨码开关进行设置: 2、功能探索
从Microchip的ESC芯片LAN9252的数据手册上找到了和从站节点地址(以下简称站地址)相关的内核CSR寄存器: 其中: 已配置站寄存器只能通过主站(ECAT类型为R/W)进行写操作,从站(PDI类型为RO)只能读操作; 已配置站别名寄存器只能通过从站(PDI类型为R/W)进行写操作,主站(ECAT类型为RO)只能读操作;
实际仿真操作了一下,从站确实可以正常读到已配置站寄存器的值: 即通过主站可以进行站地址的设置,站地址占两字节,范围为1~65535: 然后查找ETG2000等资料,也找到了相关信息: 也就是说,从站可以通过设置已配置站别名寄存器的值来实现自定义站地址的功能,主要代码如下: 当然如果要想使用激活已配置站寄存器的使用,先要将DL控制寄存器的bit24位设置为1: 而该位默认处于Deactive未激活状态,且只能通过主站对其进行设置。 综上来看,要想实现自定义站地址的功能,主要涉及的ESC寄存器主要包括DL控制寄存器和已配置站别名寄存器。
然后与专业人士沟通和了解后,得到更多信息,即还需要设置站别名信息: 另外,还需要勾选“Check Identification”: 勾选之后,EtherCAT界面就可以显示地址信息: 然后通过Wireshark抓包,上电初始化运行时,也会看到地址信息: 也说明功能操作成功。
这个地址数据必须要和从站按照拨码开关的值写入已配置站别名寄存器的数据一样,否则运行会报错: 3、功能开发
在从站的程序开发上相对比较简单,只要在每次上电EtherCAT协议栈初始化的时候,通过MCU读取一下拨码开关的设置值,并将设置值通过SPI总线写入ESC芯片的已配置站别名寄存器就可以,主要代码如下所示: - #define ESC_SLAVE_ALIAS_ADDRESS_OFFSET 0x0012
- UINT16 ecatAddr1 = get_dipswitch_value();
- UINT16 ecatAddr2 = 0;
- HW_EscWriteWord(ecatAddr1, ESC_SLAVE_ALIAS_ADDRESS_OFFSET);
- HW_EscReadWord(ecatAddr2, ESC_SLAVE_ALIAS_ADDRESS_OFFSET);
- if(ecatAddr1 != ecatAddr2)
- {
- //add error hadnle
- }
在主站配置上,如果是使用TwinCAT软件,可以参考前文的配置描述。 如果是使用codesys软件,则可以按照以下方法进行配置: 假设我们将8位拨码开关的值设置为10101010,即十进制170,十六进制0xAA;
此时配置的站别名地址就是170,这里一定要先勾选“可选的”,否则配置操作不会生效: 然后需要将配置地址写入EEPROM进行保存,运行后可操作: 写入后重启生效。 4、功能验证
重新上电后,在codesys里面执行扫描操作,就可以看到此模块显示的别名地址为170,即所配置的从站地址: 且此时模块可以进入OP正常运行,“实际地址”一栏里面才会显示正确的站地址: 然后我把此模块的地址手动修改为其他值: 再运行测试,此时模块就无法进入OP,运行异常了: “实际地址”一栏也无法显示正确地址170了: 至此,自定义从站节点地址的功能开发,调试及验证完毕。
|