增加单个子报文数据长度说明文档.docx
- 文档编号:26446059
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:14
- 大小:96.39KB
增加单个子报文数据长度说明文档.docx
《增加单个子报文数据长度说明文档.docx》由会员分享,可在线阅读,更多相关《增加单个子报文数据长度说明文档.docx(14页珍藏版)》请在冰豆网上搜索。
增加单个子报文数据长度说明文档
1.主站修改:
只需要向发送帧中填充数据即可:
在simpletest中将
*(gstruEcSlave[0].outputs)=da1;//0x12;
*(gstruEcSlave[0].outputs+1)=da2;//0x34;
增加至:
*(gstruEcSlave[0].outputs)=da1;//0x12;
*(gstruEcSlave[0].outputs+1)=da2;//0x34;
*(gstruEcSlave[0].outputs+2)=da3;//0x56;
*(gstruEcSlave[0].outputs+3)=da4;//0x78;
其中da1和da2共2个字节,用的是第一个RxPDO:
1601
其中da3和da4共2个字节,用的是第二个RxPDO:
1602(后增加的)
2.XML文件修改:
增加RxPDO输出通道并修改Sm通道默认数据大小的设置值
此截图为xml中Fmmu和Sm和RxPDO、TxPDO的部分
首先说明下从2032行到2035行这四行的Sm通道设置分别代表SM0,SM1,SM2,SM3
SM0:
邮箱输出数据长度最小32字节最大192字节默认值128字节起始地址:
0x1000
SM1:
邮箱输入数据长度最小32字节最大192字节默认值128字节起始地址:
0x1400
SM2:
过程数据输出默认值2字节起始地址:
0x1800
SM3:
过程数据输入默认值6字节起始地址:
0x1c00
要想增加数据长度由2字节增加到4个字节则应:
(1)修改Sm通道默认数据大小设置值
将SM2中的DefaultSize=“2”改成“4”
(2)增加输出数据映射通道
首先对原输出数据映射通道进行说明(展开第2037行)
第一行有用的为Sm=2,其意义为使用同步管理器2通道SM2进行输出数据
第二行表示PDO映射对象索引0x1601,它的名字为DOOutputs,又包含四个子索引
在此只对第一个子索引进行说明:
子索引1,索引号为0x7010(这个共用,即其他几个索引号都为0x7010)
数据长度为1,子索引一的名称为LED1,数据类型为布尔型(非0即1)
子索引2、3、4同理
子索引0放在最后数据长度为12
输出数据映射通道PDO1601之所以只能传输2个字节,就是因为其子索引0~4的所有数据长度加起来为12+1+1+1+1=16=2字节
要想再多输出2个字节就要增加一个PDO在此增加的是PDO1602
增加前截图:
其中RXPdo展开后为上一截图
增加一个RxPdo后变为
第二个RxPdo同样适用输出同步管理通道2
展开后截图为
基本都是参照0x1601的格式修改的(具体如何修改参看截图)
这样同步管理通道SM2可以传输的总字节由12+1+1+1+1=16=2字节上升为
12+1+1+1+1+12+1+1+1+1=32=四字节
主站中发送的数据da3与da4就可以输出
3.从站修改:
增加数据通道1602
基本上都是参照0x1601修改
(1)objectfile.c文件中
首先将对象文件objectfile.c中
/******************************************************************************
*Object0x1C12:
RxPDOassignment
******************************************************************************/
OBJCONSTTSDOINFOENTRYDESCOBJMEMasEntryDesc0x1C12[2]={
{DEFTYPE_UNSIGNED8,0x08,ACCESS_READ},
{DEFTYPE_UNSIGNED16,0x10,ACCESS_READ}};
OBJCONSTUCHAROBJMEMaName0x1C12[]="RxPDOassign";
TOBJ1C12sRxPDOassign
#ifdef_EVALBOARD_
={0x01,{0x1601}}
#endif
;
修改为
/******************************************************************************
*Object0x1C12:
RxPDOassignment
******************************************************************************/
OBJCONSTTSDOINFOENTRYDESCOBJMEMasEntryDesc0x1C12[3]={
{DEFTYPE_UNSIGNED8,0x08,ACCESS_READ},
{DEFTYPE_UNSIGNED16,0x10,ACCESS_READ},
{DEFTYPE_UNSIGNED16,0x10,ACCESS_READ}};
OBJCONSTUCHAROBJMEMaName0x1C12[]="RxPDOassign";
TOBJ1C12sRxPDOassign
#ifdef_EVALBOARD_
={0x02,{0x1601,0x1602}}
#endif
;
其次参照1601:
/******************************************************************************
*Object0x1601:
digitaloutputRxPDO
******************************************************************************/
OBJCONSTTSDOINFOENTRYDESCOBJMEMasEntryDesc0x1601[]={
{DEFTYPE_UNSIGNED8,0x8,ACCESS_READ},/*Subindex000*/
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ},/*SubIndex001:
SubIndex001*/
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ},/*SubIndex002:
SubIndex002*/
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ},/*SubIndex003:
SubIndex003*/
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ},/*SubIndex004:
SubIndex004*/
#if_CORTEX
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ},/*SubIndex005:
SubIndex005*/
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ},/*SubIndex006:
SubIndex006*/
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ},/*SubIndex007:
SubIndex007*/
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ},/*SubIndex008:
SubIndex008*/
#endif
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ}};/*SubIndex009:
SubIndex009*/
OBJCONSTUCHAROBJMEMaName0x1601[]="DORxPDO-Map\000\377";
TOBJ1601sDORxPDOMap
#ifdef_EVALBOARD_
#if_CORTEX
={9,{0x70100101,0x70100201,0x70100301,0x70100401,0x70100501,0x70100601,0x70100701,0x70100801,0x08}}
#else
={5,{0x70100101,0x70100201,0x70100301,0x70100401,0x0C}}
#endif
#endif
;
增加一个1602:
/******************************************************************************
*Object0x1602:
digitaloutputRxPDO
******************************************************************************/
OBJCONSTTSDOINFOENTRYDESCOBJMEMasEntryDesc0x1602[]={
{DEFTYPE_UNSIGNED8,0x8,ACCESS_READ},/*Subindex000*/
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ},/*SubIndex001:
SubIndex001*/
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ},/*SubIndex002:
SubIndex002*/
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ},/*SubIndex003:
SubIndex003*/
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ},/*SubIndex004:
SubIndex004*/
#if_CORTEX
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ},/*SubIndex005:
SubIndex005*/
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ},/*SubIndex006:
SubIndex006*/
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ},/*SubIndex007:
SubIndex007*/
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ},/*SubIndex008:
SubIndex008*/
#endif
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ}};/*SubIndex009:
SubIndex009*/
OBJCONSTUCHAROBJMEMaName0x1602[]="DORxPDO-Map\000\377";
TOBJ1602sAORxPDOMap
#ifdef_EVALBOARD_
#if_CORTEX
={9,{0x70200101,0x70200201,0x70200301,0x70200401,0x70200501,0x70200601,0x70200701,0x70200801,0x08}}
#else
={5,{0x70200101,0x70200201,0x70200301,0x70200401,0x0C}}
#endif
#endif
;
(2)在objectfile.h中
参照
typedefstructSTRUCT_PACKED{
UINT16u16SubIndex0;
#if_CORTEX
UINT32aEntries[9];
#else
UINT32aEntries[5];
#endif
}STRUCT_PACKED2
TOBJ1601;
externTOBJ1601sDORxPDOMap;
增加一个对象1602:
typedefstructSTRUCT_PACKED{
UINT16u16SubIndex0;
#if_CORTEX
UINT32aEntries[9];
#else
UINT32aEntries[5];
#endif
}STRUCT_PACKED2
TOBJ1602;
externTOBJ1602sAORxPDOMap;
文件最末的端
externOBJCONSTTSDOINFOENTRYDESCOBJMEMasEntryDesc0x1C12[2];
改为
externOBJCONSTTSDOINFOENTRYDESCOBJMEMasEntryDesc0x1C12[3];
(3)ecatappl.c
一、PDO_GenerateMapping(void)函数修改
将ecatappl.c文件中的voidPDO_GenerateMapping(void)函数中用来计算输出数据字节数的for循环由:
for(j=0;j { switch(sRxPDOassign.aEntries[j]) { /*RxPDO2*/ case0x1601: /*wegothroughallentriesoftheRxPDO2MappingobjecttogetthemappedEntries*/ for(i=0;i { mapValue=sDORxPDOMap.aEntries[i]; /*weincrementtheexpectedoutputsizedependingonthemappedEntry计算输出过程数据的字节长度*/ nPdOutputSize+=(UINT16)(mapValue&0xFF); } //printf("\n\n0x1601时nPdOutputSize: %x\n\n\n",nPdOutputSize); break; } } 增加一个case0x1602,为 for(j=0;j { switch(sRxPDOassign.aEntries[j]) { /*RxPDO2*/ case0x1601: /*wegothroughallentriesoftheRxPDO2MappingobjecttogetthemappedEntries*/ for(i=0;i { mapValue=sDORxPDOMap.aEntries[i]; /*weincrementtheexpectedoutputsizedependingonthemappedEntry计算输出过程数据的字节长度*/ nPdOutputSize+=(UINT16)(mapValue&0xFF); } //printf("\n\n0x1601时nPdOutputSize: %x\n\n\n",nPdOutputSize); break; case0x1602: /*wegothroughallentriesoftheRxPDO2MappingobjecttogetthemappedEntries*/ for(i=0;i { mapValue=sAORxPDOMap.aEntries[i]; /*weincrementtheexpectedoutputsizedependingonthemappedEntry计算输出过程数据的字节长度*/ nPdOutputSize+=(UINT16)(mapValue&0xFF); } //printf("\n\n0x1601时nPdOutputSize: %x\n\n\n",nPdOutputSize); break; } } 注意增加的部分将sDORxPDOMap改为sAORxPDOMap 二、PDO_OutputMapping(UINT16*pOutputs)函数修改 最后将此文件中用来输出数据的函数voidPDO_OutputMapping(UINT16*pOutputs) 中接收数据的for循环加上一个0x1602,即将 for(j=0;j { switch(sRxPDOassign.aEntries[j]) { /*RxPDO2*/ case0x1601: DATACOUNT++; printf("\r\n1601自由模式第%d个数据: 0x%x\r\n",DATACOUNT,*pOutputs); ((UINT16*)&sDOOutputs)[1]=SWAPWORD(*pOutputs++); break; } } 改为: for(j=0;j { switch(sRxPDOassign.aEntries[j]) { /*RxPDO2*/ case0x1601: DATACOUNT++; printf("\r\n1601自由模式第%d个数据: 0x%x\r\n",DATACOUNT,*pOutputs); ((UINT16*)&sDOOutputs)[1]=SWAPWORD(*pOutputs++); break; case0x1602: printf("\r\n1602自由模式第%d个数据: 0x%x\r\n",DATACOUNT,*pOutputs); ((UINT16*)&sDOOutputs)[2]=SWAPWORD(*pOutputs++); break; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 增加 单个 报文 数据 长度 说明 文档