STM32与LAN9252构建EtherCAT从站(三):LAN9252的XML文件

  1. 一、 STM32与LAN9252构建EtherCAT从站(一):项目简介
  2. 二、 STM32与LAN9252构建EtherCAT从站(二):使用SSC生成EtherCAT协议栈和XML文件
  3. 三、 STM32与LAN9252构建EtherCAT从站(三):LAN9252的XML文件
  4. 四、 STM32与LAN9252构建EtherCAT从站(四):STM32配置SPI
  5. 五、 STM32与LAN9252构建EtherCAT从站(五):STM32与LAN9252适配
  6. 六、 STM32与LAN9252构建EtherCAT从站(六):TwinCAT2的使用和从站测试

STM32与LAN9252构建EtherCAT从站(三):LAN9252的XML文件

EtherCAT从站XML文件简介

每一个EtherCAT从站设备都需要有一个硬件描述的XML文件,用来给TwinCAT组态,XML文件中描述定义了通信时需要用到的各种数据。包括设备所属公司名,设备名,设备版本,LOGO等基础信息,亦包括通信时的点位,点位名称,大小,数量等信息,还包括一个非常特别的14ByteConfigData,这14个字节用来给PHY识别,像ET1100,LAN9252等芯片通过其来识别自身的工作方式,比如第一章STM32与LAN9252构建EtherCAT从站(一):项目简介中我们提到的LAN9252工作的四种方式就是通过这组数据进行确定的。

TwinCAT对设备进行组态时,首先通过其硬件网卡搜索网络上所有的EtherCAT设备,发现设备后可以将XML文件烧录至LAN9252连接的EEPROM中,此后设备上电时,PHY就能根据EEPROM中的数据对自身进行相应的配置。关于TwinCAT的使用,我们在第六章STM32与LAN9252构建EtherCAT从站(六):TwinCAT2的使用和从站测试详细介绍。

XML文件比较大,用普通的文本编辑器打开会显得有些凌乱,上下文结构也不能很好的体现。因此需要一些专门处理XML的工具来辅助编辑,推荐的有XMLSPY和XML Notepad,前者是收费的,破解版也很难找,后者是微软2007年出的,免费试用,但是年代有些久远,功能也不及前者多。

XML中的设备基础信息


如图使用XMLNotepad打开上一章STM32与LAN9252构建EtherCAT从站(二):使用SSC生成EtherCAT协议栈和XML文件生成的XML文件,可以粗略地观察到整个文档由两个节点组成,VendorDescriptions

Vendor下面的idname来自于EtherCAT会员企业信息,我这里不方便用我们公司的真实信息,暂且用#x1EtherCAT来替代。

Vendor下面的ImageData16x14节点,存储的是.bmp格式的16色深度的logo文件,可以使用微软画图或者Photoshop等软件制作,制作完成后使用任何16进制查看器(Notepad++和Sublime都有相关插件直接查看任何文件的16进制数据)将数据填入该节点。

Descriptions->Groups->Group节点下方的TypeName两个节点描述的设备类型的种类和名称,这里根据自己的想法自定义即可。ImageData16x14是设备类型图标,可以直接用上面的数据。

Descriptions->Devices->Device->Physics是以太网口类型,YY表示两个RJ45,一进一出,跟Y相对应的是K,表示EBUS网口,德国倍福的专用端口,不需要修改。

Descriptions->Devices->Device->Type节点下的ProductCodeRevisonNo表示的是硬件编号和版本号,这里取一些有意义的名称,产品迭代升级时不要忘记这里的版本号也应该做相应的升级。TwinCAT通过这两个字段确定XML的唯一性,也就是说你如果两份XML这两个字段一样,放到TwinCAT/IO/EtherCAT文件夹下,只能识别其中一个。

Descriptions->Devices->Device->Name设备名,任意取。

Descriptions->Devices->Device->Info节点存储了一些超时限制的数据,没有特殊情况不需要修改,这里设置好了以后在TwinCAT界面可以看到设备在各种状态切换时的超时限制。

Descriptions->Devices->Device->GroupType与上面Descriptions->Groups->Group->Type相对应。

至此,有关设备基础信息的部分就结束了。

XML中的字典和IO数据

这部分数据超级复杂,包括字典定义和IO点位描述,但这部分数据已经由SSC创建完成了,SSC通过我们填写的Excel自动生成的,如果没有SSC,这里的数据全都由我们自己填写,将是一件非常恐怖的事情,不仅编写起来工作量非常巨大,而且极易出错。我们这里仅做简单地浏览认识一下。

首先理解一下字典,所谓字典就是对数据结构的描述,XML里面每种数据集合都需要有它的类型定义,有些类型是简单的String,UINT等基本类型,有些类型是由多种基本类型组合而成的复合结构,在字典定义部分都需要对其进行定义。打开Descriptions->Devices->Device->Profile节点,里面有两个子节点DataTypeObjects,有点类似C语言中的typedef定义类型和int x定义变量,事实上在SSC生成的协议栈中的SSC-DeviceObjects.h文件也确实与这里的定义一一对应的,感兴趣的朋友可以提前去浏览一下,我们将会在STM32与LAN9252构建EtherCAT从站(五):STM32与LAN9252适配做详细介绍。

举个例子,如图所示,在Objects节点下有一个Object名叫Device name, 其index为#x1008,type为STRING(10),这个STRING(10)就要从上面的DataTypes节点里面找对应的子项了,果然我们会发现一个DataType子节点名叫STRING(10),它的BitSize定义的是80个bit,应该是个uchar[10]的数组,那么这个字符串内容是什么呢,还记得我们之前在硬件基础信息部分定义的Device Name吗,我们去看看,上面定义的是SSC-Device,数一数正好10个字节。

所以在XML中每一个元素都会有自己的数据结构,每一种数据结构都会在数据字典中定义,如果这之间的关系理得不顺,EtherCAT将无法建立连接,想要手工把这里面的关系搞定真的非常困难,SSC在之前帮我们全都搞定了。

IO点位数据就更加复杂了,在Descriptions->Devices->Device节点下有四个Sm节点,这个表示通道,我们通信时一共有四个通道,除了过程传输数据输出和输入以外,还有两个通道用来控制EtherCAT自身状态的,也是EtherCAT协议中非常重要的MailBox概念,分别叫做MBoxOutMBoxIn,这里不需要管它,只需要了解过程传输数据InputsOutputs两个通道,这两个通道内部的数据又分别指向RxPdoTxPdo两个节点,这两个节点每个Entry节点都是我们之前在Excel中定义的一个IO点。SSC通过Excel帮我们完成了一项庞大的工作,在XML中生成了64+64个Entry,如果手工录入,这工作量将会非常恐怖。

综上,XML中数据字典和IO点位我们就粗略的理解到这里了。这其中的还有很多深奥的地方,比如SM通道的size需要16位对齐,Entry节点的bitlen和subindex属性等等,如果您有兴趣理解透彻,可以去看一下CanOpen协议中关于字典和对象的描述,EtherCAT协议这部分内容完全脱胎于CanOPEN协议。

XML中的EEPROM内容


现在我们来到XML最后一部分内容,EEPROM节点,这个节点数据量非常少,只有两个子节点,ByteSize一般为2048,代表板载的EEPROM芯片容量是2KByte,其实我们一般使用512K的物理容量芯片,防止IO数据定义时数据量增加不够存储。这里插一句题外话,与LAN9252相连的EEPROM芯片尽量使用ATMEL家的24FC512,否则EtherCAT可能会有连接困难的现象。

XML中大部分内容都由SSC帮我们生成,现在到了比较重要的最后14byte数据,也就是ConfigData节点,SSC帮我们构建的XML是按照ET1100芯片生成的,默认为050E03440A0000000000,这里使用的是LAN9252,打开LAN9252芯片手册AN1907-Microchip LAN9252 Migration from Beckhoff ET1100,看到2.3节,手册上让我们改成800E00CC8813F0000000800000,我们先跟着做,手册下面一行提示我们如果想进一步了解含义,需要阅读LAN9252 EEPROM章节。

打开LAN9252 datasheet,在12.8 EEPROM Configurable Registers章节,有如下介绍:

可以看到这14个byte其实是由这张表组成的,上面的截图只是表格的前半部分,下面一页有后半部分,不过最重要的就是这前面第一个字节。看到第一个字节定义了芯片的0140h寄存器,这个寄存器叫做Process Data Interface,点击进入改寄存器的详细描述,如下图所示:

在12.14.24章节,有0140h寄存器的详细描述,可以看到这个寄存器配置为80h即为SPI通信方式,这与我们项目架构相匹配。回忆一下之前手册上让我们将ConfigData节点修改为800E00CC8813F0000000800000这第1个80其实就是指的SPI方式,至于后面这些数据代表什么含义,都可以在LAN9252 datasheet中查找到,如果暂时不理解就不要修改,保持默认就可以了。

至此整个XML文档我们就浏览剖析结束了,这份XML后面会放到TwinCAT安装路径下的/Io/EtherCAT文件夹,然后在TwinCAT中给寻找到的EtherCAT设备烧录,LAN9252将其中关键数据存储到与自己相连的EEPROM中,供自己以后上电时给自己配置各项参数。

花开两朵,各表一枝,XML文件我们暂且放在一边,下面一章,我们将给STM32F103配置一下SPI功能,并与之前SSC生成的协议栈做一下SPI部分的融合。

STM32与LAN9252构建EtherCAT从站(二):使用SSC生成协议栈和XML文件

  1. 一、 STM32与LAN9252构建EtherCAT从站(一):项目简介
  2. 二、 STM32与LAN9252构建EtherCAT从站(二):使用SSC生成协议栈和XML文件
  3. 三、 STM32与LAN9252构建EtherCAT从站(三):LAN9252的XML文件
  4. 四、 STM32与LAN9252构建EtherCAT从站(四):STM32配置SPI
  5. 五、 STM32与LAN9252构建EtherCAT从站(五):STM32与LAN9252适配
  6. 六、 STM32与LAN9252构建EtherCAT从站(六):TwinCAT2的使用和从站测试

STM32与LAN9252构建EtherCAT从站(二):SSC的使用

SSC简介和下载

SSC(Slave Stack Code Tool)从站协议栈代码工具,是EtherCAT协会为会员免费提供的,EtherCAT会员可以免费申请,可以致电其北京办事处寻求中文帮助,对方可以指导您与德国总部进行会员申请:https://www.ethercat.org.cn/cn/contact.html

使用SSC,可以快速地构建EtherCAT从站代码,保证从站协议栈与最新的EtherCAT协议相匹配,同时还可以生成从站设备描述文件,这是一份XML文件,需要放在TwinCAT安装路径下的/Io/EtherCAT目录下,在使用TwinCAT对设备进行组态时需要使用。是EtherCAT从站设计过程中很重要的一个文件,关于从站设备传输多少数据,是否启用分布式时钟,PHY(LAN9252)与MCU之间如何通信等等重要数据都在这个描述文件中定义。这份XML如果全靠手工编辑,工作量非常大,并且极易出错,有了SSC后,构建XML将非常简单。

在官网下载SSC时,需要用户提供VendorID,这是由EtherCAT协会为其会员企业提供的全球唯一标志,企业可以用其作为所生产设备的标志。

SSC构建协议栈文件和XML

我们的项目简单使用64入64出纯数字IO,制作一个由键盘和LED灯组成的EtherCAT从站面板,来跟BECKHOFF的PLC进行通信。LAN9252与MCU之间的通信方式我们选择使用SPI方式。

打开SSC后,File->New,打开新建项目的对话框,这里让我们选择一个项目模板,可以使用默认选项创建,该选项提示我们All settings are available.,这里我们不选则默认模板,而是在点中Custom单选按钮中,下拉出一个EL9800 | 8Bit Digital I/O, 16Bit Analog Input,选中它,下方提示我们:

This configuration provides the standard configuration for the new EL9800 EtherCAT Evaluation Kit.
The corresponding device description is located in file “..\esi\SlaveStackCode.xml” (device: EL9800-SPI-PIC24) or will be created by this tool.


显然这个模板更加适合我们,点击OK进入下一步。

此时界面由左边的树状菜单和右边的内容条目组成,有许多可以配置的选项,包括VendorID和Image等LOGO的设置。如果有兴趣可以对其进行设置,也可以直接进入下一步。

依次点击Tool->Application->Create New,提示需要先保存一下,随便找个路径保存一下本项目。保存成功后,会立刻弹出一个Excel文件(需要预先安装Excel)。

这是一份模板Excel,用来设置EtherCAT的通信数据,我们将使用此Excel进行传输IO的点位设置。根据之前的计划,输入有64个BIT,输出有64个BIT,因此对该Excel的//0x6nnx//0x7nnx条目进行配置,配置方法如下:



按照上述三张图片的配置,熟练使用Excel的批量拖拽方法,可以快速地填入。不要忘了修改最后一个Maximum number of modules条目,改成3即可。
都修改好以后,保存Excel,SSC会自动打开导入该Excel的对话框,点击OK进行导入。

导入完成后界面并不会有太大变化,此时需要点击Project->Create new Slave Files进行协议栈文件的创建。

创建完成后整个工程项目如图所示:

至此,使用SSC的工作就都完成了。下面的工作是对其生成的XML文件进行微调,并对协议栈文件进行移植。

本章所介绍的知识点大部分来自于SSC内置的一份帮助文档EtherCAT Slave Design Quick Guide.pdf,可以点击下载。我已经代表我们企业申请加入了EtherCAT协会,并注册了VendorID,在EtherCAT协会入会章程中不允许会员在互联网上扩散只有会员才可以下载到的资源,因此SSC的安装包我不方便上传,有需要的小伙伴可以私下交流,发邮件至newflydd#gmail.com。

STM32与LAN9252构建EtherCAT从站(一):项目简介

  1. 一、 STM32与LAN9252构建EtherCAT从站(一):项目简介
  2. 二、 STM32与LAN9252构建EtherCAT从站(二):使用SSC生成协议栈和XML文件
  3. 三、 STM32与LAN9252构建EtherCAT从站(三):LAN9252的XML文件
  4. 四、 STM32与LAN9252构建EtherCAT从站(四):STM32配置SPI
  5. 五、 STM32与LAN9252构建EtherCAT从站(五):STM32与LAN9252适配
  6. 六、 STM32与LAN9252构建EtherCAT从站(六):TwinCAT2的使用和从站测试

STM32与LAN9252构建EtherCAT从站(一):项目简介

EtherCAT及项目简述

EtherCAT是一种基于以太网的工业通信协议,类似于Profinet。

EterhCAT协议是一主多从模式,主站一般是由一个装有TwinCAT的PC机担任,PC机对网卡特殊要求,需要支持EtherCAT的网卡。本项目的主站是一台倍福CX9020(仅支持TwinCAT2.0),这是一台ARM架构的PC,内装Windows CE操作系统,操作系统中装了TwinCAT2.

项目需要开发其从站,周期交互IO:64入64出,选用STM32F103+LAN9252构建。

LAN9252工作模式

根据LAN9252的Datasheet所述,LAN9252一共有四种工作模式:

  • 自我工作模式(数字I/O模式),8入8出
  • SPI 串口通信模式,4线串行数据(或更多SQI)
  • 并行通信模式(HBI),16/8位数据交互
  • 扩展模式,LAN9252与MCU之间SPI通信,同时对外再提供一组MII接口,可扩展连接另一组PHY芯片,多接一个RJ45端子。


根据需求,项目选择SPI串口模式。

整体开发流程

  1. 淘宝购买相关学习板,得到文档和协议栈。
  2. 根据项目需求构建XML,该XML将会由TwinCAT2解析,并将相关特诊烧录进LAN9252连接的EEPROM中。
  3. 根据学习板附带的文档,尽可能理解EtherCAT协议栈和通信步骤。
  4. 根据项目需求绘制自选MCU与LAN9252的原理图和PCB。
  5. 移植相关代码到自己的MCU中,TwinCAT中编写PLC测试和调试。

整个体系中,LAN9252起到以下作用:

  • PHY的作用,所有跟以太网RJ45交互的工作,都由LAN9252完成。
  • 网络交换作用,EtherCAT要求从站必须有一拖一的能力,不可以终结总线,LAN9252有2端口/3端口模式,内部做网络交换。
  • 数据解析及SPI下位机作用。MCU可以作为SPI主模式与LAN9252进行数据交互,其交互流程在协议栈中,非常复杂,没能完全理解。

移植要处理的问题

  1. 首选需要初步理解TwinCAT使用的XML的作用,此XML是对设备的描述,类似于GSD文件。描述了通信时需要使用的对象字典,数据类型,长度等等。xml文件一般都有好几兆大小,但TwinCAT只会解析XML并将其中一部分特征数据烧录进LAN9252挂载的EEPROM中去,所以并不需要担心EEPROM大小问题,一般选择512KB的快速EEPROM(24FC512)。
  2. 根据自己的项目要求,设计XML,这个工作可以通过EtherCAT的开发工具SSC来简单实现,如果不使用SSC,手工修改XML将是一件非常麻烦的事情。
  3. SSC在生成XML的同时,还可以生成代码,这份代码是没法直接用的,但里面有关字典的.c文件非常有价值,可以参考并移植到开发板的代码中去,完成自己的逻辑。

代码层面的工作

整个EtherCAT协议栈相当复杂,几乎没办法阅读,只能从main()函数入手,简单地剥解一下代码,可以看到整个项目是由三个大函数构建而成的:

HW_Init();
MainInit();
while (1){
    MainLoop();
}

以上就是整个EtherCAT协议跑起来的骨架。
此外,在MCU的GPIO和内部资源部分,需要做到以下几点:

  1. SPI四根线的使能,跟LAN9252的通信就靠它了。
  2. 一个定时器中断,1ms周期,调用ECAT_CheckTimer();函数,但不要一上来就初始化使能这个中断,根据接口定义好使能入口,让协议栈调用,以上电就开启这个定时器中断会导致连接失败。
  3. 三个外部中断,IRQ,SCY0,SCY1,其中IRQ必须实现,SCY0和SCY1是分布式时钟同步用的,可以选择使用,也可不使用,注意这三个中断的使能同样要根据代码中的接口定义入口,由协议栈使能和失能中断,万万不可一上电就来使能中断。中断中处理的代码如下:
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
     if (GPIO_Pin == LAN9252_IRQ_Pin) {
             PDI_Isr();
             return;
     }
     if (GPIO_Pin == LAN9252_SYC0_Pin) {
         DISABLE_ESC_INT();
         Sync0_Isr();
         ENABLE_ESC_INT();
         return;
     }
     if (GPIO_Pin == LAN9252_SYC1_Pin) {
         DISABLE_ESC_INT();
         Sync1_Isr();
         ENABLE_ESC_INT();
         return;
     }
    }
    

开发中使用的工具

  • STM32CubeMX5.1, Keil5(TrustStudio), Sublime3
  • SSC, XMLSpy
  • TwinCAT2.0, VirtualBox
  • AltiumDesigner18
丁丁生于 1987.07.01 ,30岁,英文ID:newflydd
  • 现居住地 江苏 ● 泰州 ● 姜堰
  • 创建了 Jblog 开源博客系统
  • 坚持十余年的 独立博客 作者
  • 大学本科毕业后就职于 中国电信江苏泰州分公司,前两年从事Oracle数据库DBA工作,两年后公司精简技术人员,被安排到农村担任支局长(其本质是搞销售),于2016年因志向不合从国企辞职,在小城镇找了一份程序员的工作。
  • 在 Git OSChina 上积极参与开源社区
  •