EtherCat SSC生成结构体数据字典16位对齐问题

当使用SSC中的XLSX表格生成数据字典时候(Tool->Application),对于RECORD类型的结构体,其要求必须16位字节对齐,否则会报警。

解决方法一般有两种:

1.  人为修改数据类型,比如将SINT类型改为INT类型, INT在这个平台上是16位,如果定义32整型,类型为DINT。然后在生成的数据字典中,将类型改回正确类型。如果在PDO中有引用,其变占据的数据长度也要修改。

2.  使用pad_xx补齐16。其本质为位域,如pad_5,其实为uint16 x :5

0x2300RECORDRECORD_PARAread_parawrite_para
1BOOLP1rwtx
2BOOLP2rwrxtx
3pad_6
4SINTP3rwrx
5REALP4rwrxtx
6BOOLP5rwrxtx
7pad_15
8REALP6rwrxtx
9USINTP7rwrxtx

如上表格示意,保证了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);
        }
        

上一篇: EtherCat 从站开发中遇到的问题分享
yu_arius
博客等级 码龄20年 4粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值