当使用SSC中的XLSX表格生成数据字典时候(Tool->Application),对于RECORD类型的结构体,其要求必须16位字节对齐,否则会报警。
解决方法一般有两种:
1. 人为修改数据类型,比如将SINT类型改为INT类型, INT在这个平台上是16位,如果定义32整型,类型为DINT。然后在生成的数据字典中,将类型改回正确类型。如果在PDO中有引用,其变占据的数据长度也要修改。
2. 使用pad_xx补齐16。其本质为位域,如pad_5,其实为uint16 x :5
| 0x2300 | RECORD | RECORD_PARA | read_para | write_para | |||||||
| 1 | BOOL | P1 | rw | tx | |||||||
| 2 | BOOL | P2 | rw | rxtx | |||||||
| 3 | pad_6 | ||||||||||
| 4 | SINT | P3 | rw | rx | |||||||
| 5 | REAL | P4 | rw | rxtx | |||||||
| 6 | BOOL | P5 | rw | rxtx | |||||||
| 7 | pad_15 | ||||||||||
| 8 | REAL | P6 | rw | rxtx | |||||||
| 9 | USINT | P7 | rw | rxtx |
如上表格示意,保证了REAL数据总是16位对齐的。在生成的数据字典中删除pad的相关信息。同时也要对引用了参数的PDO部分修改索引位置。
对于在PDO中收发的参数,必须给其加上tx rx的属性。
数据字典的读写:
生成的标准函数读写默认了数据字典为16位对齐,非常差。
if (0 != (((UINT8)((pEntry->ObjAccess & ACCESS_WRITE) >> 2)) & (nAlStatus & STATE_MASK) ))
{
/* we have write access for this entry */
if (i != 0)
{
/* we increment the variable pointer to the corresponding word address */
pVarPtr += (bitOffset >> 4);
}
if ( i == subindex /* requested entry */
|| (bCompleteAccess && i >= subindex) ) /* complete access and entry should be read */
{
UINT16 bitMask;
在STM32平台上,默认的结构体是32位对齐的。即使满足了16对齐,也没法正确对混合类型的结构体进行读写。去改写OBJ_Write和OBJ_Read函数,工作量很大,需要非常理解这两个函数。简单的解决方法是针对这个结构体引入针对它的读写函数。在表格的CoeRead和CoeWrite的项下,添加其读写函数,如:read_para_xxx,write_para_xxx。其会再OBJMEM ApplicationObjDic[]中注册然后在OBJ_Write中自动调用。
if ( pObjEntry->Write != NULL )
{
/* Write function is defined, we call the object specific write function */
/* ECATCHANGE_START(V5.13) COE4*/
UINT8 result = 0;
result = pObjEntry->Write(index, subindex, dataSize, pData, bCompleteAccess);
if ((result == 0) && (pAPPL_CoeWriteInd != NULL))
{
pAPPL_CoeWriteInd(index, subindex, bCompleteAccess);
}




被折叠的 条评论
为什么被折叠?



