还剩4页未读,继续阅读
文本内容:
ethercat通讯协议例程本例程介绍了如何在基础例程SAMPLE_APPLICATION的基础上添加新的过程数据默认的基础例程提供了一下的过程数据32Bit的InputCounter0x600032Bit的OutputCounter0x7010当OutputCounter为0口寸,InputCounter每个cycle自力口1;否贝UInputCounter等于OutputCounter+lo本例程中新增的过程数据32Bit的InputCounter0x600032Bit的Result0x6010OutputValue0x7010----Sll:Valuel32Bit----SI2:Value232BitResult0x6010是Sll0x
7010.l和SI20x
7010.2之和InputCounter0x6000每个cycle自加1L创建基础例程这一节简单介绍一下如何在倍福EL9800评估板上创建基础例程当然,也可以在已有的其他类似的例程上进行新增过程数据的修改按照章节
3.1SSCTool〃中的步骤1-7进行操作这里的章节
3.1是指《ApplicationNoteET9300SSC》的
3.1选择EL9800|8BitDigitall/O16BitAnalogInput”的配置在“Application”组下将“EL9800APPUCATION设置为0将“SAMPLE_APPLICATION设置为1保存工程并创建新的文件Project-CreatenewSlaveFiles”基于已创建的ESI文件,编辑从站EEPROM基于生成的源文件创建MPLAB工程SSC可以创建基础例程,具体的创建步骤,在《ApplicationNoteET9300》其他章节也介绍,后面单独列一章来介绍SSC这里重点关注如何新增过程数据
2.新增过程数据在sampleappl.h中新增Result对象创建为过程数据”32BitResult创建入口描述(EntryDescription)对象名和对象实例*Object0x6010:resultobject★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★I#ifdef_OBJD_/*Entrydescription*/OBJCONSTTSDOINFOENTRYDESCOBJMEMEntryDesc0x6010={DEFTYPE_UNSIGNED320x10ACCESS_READ|OBJACCESS_TXPDOMAPPING};一/♦Objectname*/一定义一个新的objentrydescOBJCONSTUCHAROBJMEMaName0x6010[]=Result”;DataType=uint32#endif//#ifdef_OBJD_DataLength=16/*Variabletohandletheobjectdata*/Access-readtxPdoMappingPROTOUINT32ResultObj6010;可以使用var作为bj的handle要在EtherCAT中新增过程数据,首先就需要在代码中新增对象关于〃对象字典〃可以参考我的另一篇博客在sampleappl.h中修改OutputValue对象在对象0x7010(32BitOutputCounter)的基础上进行修改,将对象0x7010修改成Record型对象,Record型对象可以操作超过1个的过程数据(译者注原有的OutputCounter是Var型对象,只能有1个子项;Record型对象类似于结构体,一个对象中可以有多个子项)OuputCounter原本只有一个子项(类似与0x6010的结构),现在需要2个子项,同时还需要增加SublndexO的参数对象名称需要与Entry相对应(每个子名称以OOO1结尾,整个对象名称以\377结尾)还需要根据对象的参数定义一个结构体,使其包含SublndexO以及2个过程数据更多的细节信息请参见章节lloObject0x7010:outputvaluesobjectOBJD_TSDOINFOENTRYDESCOBJMEMasEntryDesc0x7010[]/*Nameoftheobjectandtheentries*/OBJCONSTUCHAROBJMEMaName0x7010]=Outputvalues\000Valuel\000Value2\000\377H;#endif//#ifdef_OBJD_/*Structuretohandletheobjectdata*/typedefstructOBJ_STRUCT_PACKED_START{UINT16ul6Sub7ndexO;一UINT32Valuel;UINT32Value2;}OBJ_STRUCT_PACKED_ENDTOBJ7010;PROTOTOBJ7010OutputData#ifdef_SAMPLE_APPLICATION={0x02/0x00r0x00#endif在sampleappl.h中修改PDO-map对象在PDO-Mapping对象中,为新增的过程数据添加信息修改的代码被标注为红色DefinitionforTxPDO0x1A00handlingtheinputprocessdataObjectOxlAOO:TxPDO♦ifdef_OBJD_OBJCONSTTSDOINFOENTRYDESCOBJMEMasEntryDescOxlAOO[]={{DEFTYPE_UNSIGNED8r0x8ACCESS_READDEFTYPE二UNS1GNED320x20ACCESS_READ/♦referencetothenewprocessdata.TheinformationdoesNOTdescribetheprocessdataitselfthatmeansiftheprocessdataisanUNSIGNED8valuethedeftypeinthisdescriptionisstillUNSIGNED32*/{DEFTYPE_UNSIGNED320x20ACCESS_READ};/*OnlytheobjectnameisdescribedallentriesareautomaticallynamesasSubIndex000”000isincrementedforeachentry*/OBJCONSTUCHAROBJMEMaNameOxlAOO[]=TxPDO-Map\000\377M;fendif//#ifdef_OBJD_typedefstructOBJ_STRUCT_PACKED_START{UINT16ul6SubIndexO;/*Addoneadditionalarrayelementforthereferencetothenewprocessdata*/UINT32aEntries
[2];}OBJ_STRUCTjPACKED上ENDTOBJ1A00;——PROTOTOBJ1A00TxPDOMap#ifdefSAMPLEAPPLICATION■{2/*theobjecthasnowtwoentries*/{0x60000020z0x60100020/*Referencetoobject0x06010SubindexOand32Bitlength*/}#endifDefinitionforRxPDO0x1601handlingtheoutputprocessdata*Object0x1601:RxPDO#ifdef_OBJD_OBJCONSTTSDOINFOENTRYDESCOBJMEMasEntryDesc0xl601[]={{DEFTYPE_UNSIGNED80x8ACCESS_READ}{DEFTYPE二UNSIGNED320x20ACCESS_READ}r/*referencetothenewprocessdata.TheinformationdoesNOTdescribetheprocessdataitselfrthatmeansiftheprocessdataisanUNSIGNED8valuethedeftypeinthisdescriptionisstillUNSIGNED32*/{DEFTYPE_UNSIGNED320x20ACCESS_READ}};/.Onlytheobjectnameisdescribedallentriesareautomaticallynamesas^Sublndex000”000isincrementedforeachentry*/OBJCONSTUCHAROBJMEMaName0xl601[]=MRxPDO-Map\000\377M;♦endif//fifdef_OBJD_typedefstructOBJ_STRUCT_PACKED_START{UINT16ul6Sub!ndexO;/*Addoneadditionalarrayelementforthereferencetothenewprocessdata*/UINT32aEntries
[2];}OBJ_STRUCT_PACKED_ENDTOBJ1601;--PROTOTOBJ1601RxPDOMaptifdef_SAMPLE_APPLICATION_={2/*theobjecthasnowtwoentries419{0x70100120r0x70100220/*Referencetoobject0x07010Subindex2and32Bitlength♦/#endif在sampleappl.h中更新对象字典的参考TOBJECTOBJMEMApplicationObjDie[]={/*Object0x1601*/{NULLNULL0x1601{DEFTYPE_PDOMAPPINGx2|OBJCODE_REC«8asEntryDesc0xl601aName0xl601#RxPDOMapNULLNULL0x0000/*ObjectOxlAOO*/{NULLNULLOxlAOO{DEFTYPE_PDOMAPPINGr2|OBJCODE_REC«8}asEntryDescOxlAOOaNameOxlAOO/TxPDOMaprNULLNULL0x0000这里把.pentryobjNamebjHanle..填入objDic/*Object0x6010*/{NULLNULL0x6010{DEFTYPE_UNSIGNED320|OBJCODE_VAR«8}EntryDesc0x6010aName0x6010ResultObj6010NULLNULL0x0000/*Object0x7010*/{NULLNULL0x7010{DEFTYPE_RECORDr2|OBJCODE_REC«8asEntryDesc0x7010aName0x7010/OutputDataNULLNULL0x0000{NULLNULLOxFFFF{00]NULLNULLNULLNULL};在sampleappl.c中更新过程数据大小更新过程数据大小(过程数据大小应该与对应的SM大小一致)注如果某一个变量与ESI文件中记录的信息不一致,从站状态无法从PreOP转入SafeOP并会发送OxlE-OxlD的错误码译者注:APPL_GenerateMapping用于计算输入过程数据和输出过程数据的长度,后面进行内容拷贝的时候,会根据这里计算出的长度来进行拷贝在sampleappl.c中修改InputMapping函数更新输入过程数据映射函数,将新增的过程数据本地拷贝到ESC内存中Result(0x6010)对象是输入过程数据,这里使用MEMCPY将本地内存中的Result0bj6010拷贝到ESC中(pData是ESC的地址)在sampleappl.c中修改OutputMapping函数更新输出过程数据映射函数,将新增的过程数据从ESC内存中拷贝到本地在sampleappl.c中更新应用程式修改应用程序,使Result=Output.valuel+Output.value2lnputCounter++o更新ESI文件根据步骤3更新ESI中RxPdo和TxPdo的Entryo主站会使用ESI文件中的信息来计算SM的长度(SM长度应该与步骤5中的长度一致),并会将过程数据展示给用户(图11EtherCAT从站RxPd的数据)更新ESI文件根据RxPdo/TxPdoEntry的位宽更新SM的默认位宽更新ESI文件更新离线对象字典(元素Profile/Dictionary)a.新增对象0x6010(此对象无需结构体定义,因为此对象仅包含了一个基础数据类型的变量)b.为对象0x7010新增结构体定义C.更新对象0x7010d.更新PDO映射对象结构体注对象0x1601和对象OxlAOO都可以使用“DTIGOI11的定义,因为这两个对象的结构体是一致的e.更新PDO映射对象对象字典在SSC和ESI上是一式两份,SSC和ESI上都需要对对象的结构体定义对象名称,对象映射关系等进行修改。