《Application Note ET9300 SSC》的6.4.1.2小节有一个例程解析,这篇文章主要是对该小节的翻译,英文好的同学推荐看一下原文。
本例程介绍了如何在基础例程(SAMPLE_APPLICATION)的基础上添加新的过程数据。。
默认的基础例程提供了一下的过程数据:
32Bit的Input Counter(0x6000)
32Bit的Output Counter(0x7010)
当Output Counter为0时,Input Counter每个cycle自加1;否则Input Counter等于Output Counter+1。
本例程中新增的过程数据:
32Bit的Input Counter(0x6000)
32Bit的Result(0x6010)
Output Value(0x7010)
----SI1:Value1(32Bit)
----Sl2:Value2(32Bit)
Result(0x6010)是Sl1(0x7010.1)和Sl2(0x7010.2)之和。Input Counter(0x6000)每个cycle自加1。
这一节简单介绍一下如何在倍福EL9800评估板上创建基础例程。当然,也可以在已有的其他类似的例程上进行新增过程数据的修改。
按照章节3.1 "SSC Tool”中的步骤1~7进行操作(这里的章节3.1是指《Application Note ET9300 SSC》的3.1)。
选择"EL9800 | 8Bit Digital I/O,16Bit Analog Input"的配置。
在"Application"组下将"EL9800APPLICATION"设置为0,将"SAMPLE_APPLICATION"设置为1。
保存工程并创建新的文件(Project->"Create new Slave Files")。
基于已创建的ESI文件,编辑从站EEPROM。
基于生成的源文件创建MPLAB工程。
SSC可以创建基础例程,具体的创建步骤,在《Application Note ET9300》其他章节也介绍,后面单独列一章来介绍SSC。这里重点关注如何新增过程数据。
创建为过程数据"32Bit Result"创建入口描述(Entry Description),对象名和对象实例。
要在EtherCAT中新增过程数据,首先就需要在代码中新增对象。关于”对象字典“可以参考我的另一篇博客。
在对象0x7010(32Bit Output Counter)的基础上进行修改,将对象0x7010修改成Record型对象,Record型对象可以操作超过1个的过程数据(译者注:原有的Output Counter是Var型对象,只能有1个子项;Record型对象类似于结构体,一个对象中可以有多个子项)。
Ouput Counter原本只有一个子项(类似与0x6010的结构),现在需要2个子项,同时还需要增加SubIndex0的参数。
对象名称需要与Entry相对应(每个子名称以"\000"结尾,整个对象名称以"\377"结尾)。
还需要根据对象的参数定义一个结构体,使其包含SubIndex0以及2个过程数据。
更多的细节信息请参见章节11。
在PDO-Mapping对象中,为新增的过程数据添加信息。
修改的代码被标注为红色。
更新过程数据大小(过程数据大小应该与对应的SM大小一致)。
注:如果某一个变量与ESI文件中记录的信息不一致,从站状态无法从PreOP转入SafeOP,并会发送0x1E~0x1D的错误码。
译者注:APPL_GenerateMapping用于计算输入过程数据和输出过程数据的长度,后面进行内存拷贝的时候,会根据这里计算出的长度来进行拷贝。
更新输入过程数据映射函数,将新增的过程数据本地拷贝到ESC内存中。
Result(0x6010)对象是输入过程数据,这里使用MEMCPY,将本地内存中的ResultObj6010拷贝到ESC中(pData是ESC的地址)。
更新输出过程数据映射函数,将新增的过程数据从ESC内存中拷贝到本地。
修改应用程序,使Result = Output.value1 + Output.value2,InputCounter++。
根据步骤3,更新ESI中RxPdo和TxPdo的Entry。
主站会使用ESI文件中的信息来计算SM的长度(SM长度应该与步骤5中的长度一致),并会将过程数据展示给用户(图11:EtherCAT从站RxPdo的数据)。
根据RxPdo/TxPdo Entry的位宽更新SM的默认位宽。
更新离线对象字典(元素:”Profile/Dictionary“)。
a.新增对象0x6010(此对象无需结构体定义,因为此对象仅包含了一个基础数据类型的变量)。
b.为对象0x7010新增结构体定义
c.更新对象0x7010
d.更新PDO映射对象结构体
注:对象0x1601和对象0x1A00都可以使用"DT1601"的定义,因为这两个对象的结构体是一致的。
e.更新PDO映射对象
对象字典在SSC和ESI上是一式两份,SSC和ESI上都需要对对象的结构体定义,对象名称,对象映射关系等进行修改。