This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LP-AM243:在 EtherCAT 从站简单演示中添加记录

Guru**** 2393725 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1510420/lp-am243-adding-record-in-ethercat-slave-simple-demo

器件型号:LP-AM243

工具/软件:

您好的团队、

在给定的示例代码({Ind_Comm_ SDK}-> Example -> industrial_comms -> EtherCAT_slave_demo -> device_profiles -> 401_simple)中、

我在 EC_SLV_APP_SS_PopulateInOutObjects 下添加了一个记录0x7000和3个子索引、用于测试目的

/*0x7000 - Commands*/
    error = (EC_API_EError_t)EC_API_SLV_CoE_odAddRecord(
            ptSlave,
        0x7000,
        "Commands",
        EC_SLV_APP_setValueToMaster,
        pApplicationInstance,
        EC_SLV_APP_getValueFromMaster,
        pApplicationInstance,
        &pApplicationInstance->ptCommandObj);
    if (error != EC_API_eERR_NONE)
    {
        OSAL_printf("Object 0x7000 Record Error code: 0x%08x\r\n", error);
        /* @cppcheck_justify{misra-c2012-15.1} goto is used to assure single point of exit */
        /* cppcheck-suppress misra-c2012-15.1 */
        goto Exit;
    }
    /*0x7000:1*/
    error = (EC_API_EError_t)EC_API_SLV_CoE_configRecordSubIndex(
        ptSlave,
        pApplicationInstance->ptCommandObj,
        1,
        "INPUT COMMANDS",
        DEFTYPE_UNSIGNED16,
        16,
        ACCESS_READWRITE);
    if (error != EC_API_eERR_NONE)
    {
        OSAL_printf("Object 0x7000 SubIndex 1 Error code: 0x%08x\r\n", error);
        /* @cppcheck_justify{misra-c2012-15.1} goto is used to assure single point of exit */
        /* cppcheck-suppress misra-c2012-15.1 */
        goto Exit;
    }
    /*0x7000:2*/
    error = (EC_API_EError_t)EC_API_SLV_CoE_configRecordSubIndex(
        ptSlave,
        pApplicationInstance->ptCommandObj,
        2,
        "PROGRAM",
        DEFTYPE_UNSIGNED16,
        16,
        ACCESS_READWRITE);
    if (error != EC_API_eERR_NONE)
    {
        OSAL_printf("Object 0x7000 SubIndex 2 Error code: 0x%08x\r\n", error);
        /* @cppcheck_justify{misra-c2012-15.1} goto is used to assure single point of exit */
        /* cppcheck-suppress misra-c2012-15.1 */
        goto Exit;
    }
    /*0x7000:3*/
	error = (EC_API_EError_t)EC_API_SLV_CoE_configRecordSubIndex(
		ptSlave,
		pApplicationInstance->ptCommandObj,
		3,
		"RxPDO_SDO_FU",
		DEFTYPE_UNSIGNED16,
		16,
		ACCESS_READWRITE | OBJACCESS_RXPDOMAPPING);
	if (error != EC_API_eERR_NONE)
	{
		OSAL_printf("Object 0x7000 SubIndex 2 Error code: 0x%08x\r\n", error);
		/* @cppcheck_justify{misra-c2012-15.1} goto is used to assure single point of exit */
		/* cppcheck-suppress misra-c2012-15.1 */
		goto Exit;
	}

<DataType>
								<Name>DT7000</Name>
								<BitSize>64</BitSize>
								<SubItem>
									<SubIdx>0</SubIdx>
									<Name>SubIndex 000</Name>
									<Type>USINT</Type>
									<BitSize>8</BitSize>
									<BitOffs>0</BitOffs>
									<DefaultData>3</DefaultData>
									<Flags>
										<Access>ro</Access>
									</Flags>
								</SubItem>
								<SubItem>
									<SubIdx>1</SubIdx>
									<Name>Input Commands</Name>
									<Type>UINT</Type>
									<BitSize>16</BitSize>
									<BitOffs>16</BitOffs>
									<Flags>
										<Access>rw</Access>
									</Flags>
								</SubItem>
								<SubItem>
									<SubIdx>2</SubIdx>
									<Name>PROGRAM</Name>
									<Type>UINT</Type>
									<BitSize>16</BitSize>
									<BitOffs>32</BitOffs>
									<Flags>
										<Access>rw</Access>
									</Flags>
								</SubItem>
								<SubItem>
									<SubIdx>3</SubIdx>
									<Name>RxPDO_SDO_FU</Name>
									<Type>UINT</Type>
									<BitSize>16</BitSize>
									<BitOffs>48</BitOffs>
									<Flags>
										<Access>rw</Access>
									</Flags>
								</SubItem>
							</DataType>
							
							
							<Object>
								<Index>#x7000</Index>
								<Name>Commands</Name>
								<Type>DT7000</Type>
								<BitSize>64</BitSize>
								<Flags>
                                    <Access>rw</Access>
                                </Flags>
							</Object>

 我在 TwinCAT CoE-Online 中新增了以下内容、

为什么我没有得到的下流的数量

0x7000:0命令值

以及默认值0x7000:1-3  

请指导我进一步解决这个问题


此致、
D.Jenita.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jenita:

    我在 EtherCAT 子器件简单演示示示例中添加了一个带有3个子索引条目的记录对象0x7000、我使用了在线描述而不是 ESI 文件、我可以在 TwinCAT 的 CoE-Online 选项卡中看到对象0x7000的索引数。 我附上了下面的屏幕截图。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Harsha:

    感谢您的支持、

    因此、我可以确认为配置记录而添加的片段是正确的。 对吗?  
    但我也没有通过在线描述得到这些值。

    我需要在 运行时针对.ESI 文件的用例运行 CTT 测试、收到以下警告  

    TF-2302_1.1.0/在 PreOp 中具有读取访问权限的对象(离线字典) 警告 测试函数"CompareObjectData":0x7000:0 SI0完整访问数据从单个访问数据开始。 条目数据可能会更改、因为条目说明不提供默认数据。 但是、此条目的单次访问上载是同一值的十倍。

    我怀疑警告可能是因为 我提到的问题。

    您能不能 同时使用.esi 文件来进一步指导我?

    此致、  

    D. Jenita.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jenita:

    是的。 您共享用于创建记录的代码片段是正确的。 我还完成了您为 ESI 文件共享的修改、并将其复制到 TwinCAT 器件描述文件夹(C:\TwinCAT\3.1\Config\IO\EtherCAT)并进行了测试。  

    API EC_API_SLV_CoE_setObjectEntryData 可用于 将数据值写入对象条目。 请找到下面的示例代码片段、以便将默认值加载到对象0x7000的条目中。

    static void EC_SLV_APP_SS_loadDefaultValuesForInOutObjects(EC_SLV_APP_SS_Application_t *pApplicationInstance)
    {
        EC_API_EError_t             error                   = EC_API_eERR_INVALID;
        EC_API_SLV_SHandle_t        *ptSubDevice;
        EC_API_SLV_SCoE_ObjEntry_t  *ptObjEntry             = NULL;
        static uint16_t             recEntryDefaultValue    = 0xDEFA;
        
        ptSubDevice = pApplicationInstance->ptEcSlvApi;
    
        error = (EC_API_EError_t)EC_API_SLV_CoE_getObjectEntry(ptSubDevice, 0x7000, 1, &ptObjEntry);
        if (error != EC_API_eERR_NONE)
        {
            OSAL_printf("%s:%d Error code: 0x%08x\r\n", __func__, __LINE__, error);
            /* @cppcheck_justify{misra-c2012-15.1} goto is used to assure single point of exit */
            /* cppcheck-suppress misra-c2012-15.1 */
            goto Exit;
        }
    
        /* @cppcheck_justify{misra-c2012-11.3} type cast required to fit API */
        /* cppcheck-suppress misra-c2012-11.3 */
        error = (EC_API_EError_t)
            EC_API_SLV_CoE_setObjectEntryData(ptSubDevice, ptObjEntry, 2, (uint16_t *)&recEntryDefaultValue);
        if (error != EC_API_eERR_NONE)
        {
            OSAL_printf("%s:%d Error code: 0x%08x\r\n", __func__, __LINE__, error);
            /* @cppcheck_justify{misra-c2012-15.1} goto is used to assure single point of exit */
            /* cppcheck-suppress misra-c2012-15.1 */
            goto Exit;
        }
    
        error = (EC_API_EError_t)EC_API_SLV_CoE_getObjectEntry(ptSubDevice, 0x7000, 2, &ptObjEntry);
        if (error != EC_API_eERR_NONE)
        {
            OSAL_printf("%s:%d Error code: 0x%08x\r\n", __func__, __LINE__, error);
            /* @cppcheck_justify{misra-c2012-15.1} goto is used to assure single point of exit */
            /* cppcheck-suppress misra-c2012-15.1 */
            goto Exit;
        }
        
        recEntryDefaultValue = 0xDEAD;
    
        /* @cppcheck_justify{misra-c2012-11.3} type cast required to fit API */
        /* cppcheck-suppress misra-c2012-11.3 */
        error = (EC_API_EError_t)
            EC_API_SLV_CoE_setObjectEntryData(ptSubDevice, ptObjEntry, 2, (uint16_t *)&recEntryDefaultValue);
        if (error != EC_API_eERR_NONE)
        {
            OSAL_printf("%s:%d Error code: 0x%08x\r\n", __func__, __LINE__, error);
            /* @cppcheck_justify{misra-c2012-15.1} goto is used to assure single point of exit */
            /* cppcheck-suppress misra-c2012-15.1 */
            goto Exit;
        }
    
        error = (EC_API_EError_t)EC_API_SLV_CoE_getObjectEntry(ptSubDevice, 0x7000, 3, &ptObjEntry);
        if (error != EC_API_eERR_NONE)
        {
            OSAL_printf("%s:%d Error code: 0x%08x\r\n", __func__, __LINE__, error);
            /* @cppcheck_justify{misra-c2012-15.1} goto is used to assure single point of exit */
            /* cppcheck-suppress misra-c2012-15.1 */
            goto Exit;
        }
        
        recEntryDefaultValue = 0xDCBA;
        
        /* @cppcheck_justify{misra-c2012-11.3} type cast required to fit API */
        /* cppcheck-suppress misra-c2012-11.3 */
        error = (EC_API_EError_t)
            EC_API_SLV_CoE_setObjectEntryData(ptSubDevice, ptObjEntry, 2, (uint16_t *)&recEntryDefaultValue);
        if (error != EC_API_eERR_NONE)
        {
            OSAL_printf("%s:%d Error code: 0x%08x\r\n", __func__, __LINE__, error);
            /* @cppcheck_justify{misra-c2012-15.1} goto is used to assure single point of exit */
            /* cppcheck-suppress misra-c2012-15.1 */
            goto Exit;
        }
    
        Exit:
            return;
    }

     在调用 API EC_API_SLV_init ()之后调用函数 EC_SLV_APP_SS_loadDefaultValuesForInOutObjects()。

     EC_SLV_APP_SS_loadDefaultValuesForInOutObjects(pAppInstance_p);

    下面是 TwinCAT 中的 CoE - Online 选项卡的屏幕截图。



    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Harsha:

    感谢您发送编修。

    [引述 userid="594351" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1510420/lp-am243-adding-record-in-ethercat-slave-simple-demo/5805887 #5805887"]
    TF-2302_1.1.0/在 PreOp 中具有读取访问权限的对象(离线字典) 警告 测试函数"CompareObjectData":0x7000:0 SI0完整访问数据从单个访问数据开始。 条目数据可能会更改、因为条目说明不提供默认数据。 但是、此条目的单次访问上载是同一值的十倍。
    [/报价]

    根据警告、 我的理解是 0x7000:0 被解释为没有默认数据的条目描述。

    我在删除回调函数 EC_API_SLV_CBObjRead_t cbRead 和 EC_API_SLV_CBObjWrite_t cbWrite 之后得到了0x7000:0 - 3上的值 。

    (使用的 SDK 版本:IND_comms_sdk_am243x_09_02_00_08)

        error = (EC_API_EError_t)EC_API_SLV_CoE_odAddRecord(
                ptSlave,
            0x7000,
            "Commands",
            NULL/*EC_SLV_APP_setValueToMaster*/,
    		NULL/*pApplicationInstance*/,
    		NULL/*EC_SLV_APP_getValueFromMaster*/,
    		NULL/*pApplicationInstance*/,
            &pApplicationInstance->ptCommandObj);

    static uint8_t EC_SLV_APP_getValueFromMaster(
            void* pApplicationCtxt_p,
            uint16_t index_p,
            uint8_t subindex_p,
            uint32_t size_p,
            uint16_t MBXMEM * pData_p,
            uint8_t completeAccess_p)
    {
        EC_API_EError_t     error   = (EC_API_EError_t)ABORT_NOERROR;
    
        OSAL_printf("%s ==> Idx: 0x%04x:%d | Size: %d | Value: %d | access: %d\r\n", __func__
                   ,index_p, subindex_p, size_p, pData_p[0], completeAccess_p);
    
    
        /*Update the LOOKUP Table*/
        update_lookup(index_p, subindex_p, &pData_p[0], size_p);
    
        /*Whenever data is received from master, give semaphore to Task 3*/
        if (NULL == pApplicationCtxt_p)
            goto Exit;
    
        OSALUNREF_PARM(completeAccess_p);
    
    Exit:
        return (uint8_t)error;
    }

    update_lookup()是比较索引和子索引并相应更新变量的简单函数。

    我目前正在使用回调函数来更新应用中的变量(例如查找表)。

    是否有任何替代方法来更新这些变量、或者是否有更合适的方法、具体取决于应用?

    此外、在配置回调函数时、我是否可能缺少任何步骤或注意事项?

    感谢您的持续支持。

    此致、

    D.Jenita.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jenita:

    我能够重现写/读回调函数连接到 EC_API_SLV_CoE_odAddRecord ()时的问题。 我会回到您的身边。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Harsha:

    我想分享一个观察结果、该观察结果可能有助于确定在一致性测试期间遇到的这个问题的根本原因。

    在测试过程中,我注意到除了0以外的子索引的对象条目报告  Complete access: 0 [False]

    EC_SLV_APP_getValueFromMaster ==> Idx: 0x7000:1 | Size: 2 | Value: 0 | access: 0
    
    EC_SLV_APP_getValueFromMaster ==> Idx: 0x7000:2 | Size: 2 | Value: 0 | access: 0

    但是、显示了主条目(索引0)  Complete access: 1 [True]

    EC_SLV_APP_getValueFromMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 1


    为解决此问题、我尝试.esi使用以下配置禁用文件中的完全访问:

    <CoE DiagHistory="true" SdoInfo="true" PdoConfig="true" PdoUpload="true" CompleteAccess="false"/>


    我仍然有这些警告。

    我怀疑问题可能出在固件配置中。 您能否进一步指导我如何解决这个问题?

    期待您的建议。

    此致、
    D.Jenita.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jenita:

    CTT 警告表示在设置完全访问标志和重置的情况下访问时之间的数据不一致。 当通过 设置完全访问标志访问对象数据时、回调函数应返回该对象所有子索引的值。 完全访问标志仅对 SI0有效。 如果未设置完成访问标志、则回调函数应根据 SI 值返回特定数据。

    当您附加 EC_SLV_APP_setValueToMaster 和 EC_SLV_APP_getValueToMaster 等 回调函数时、这些回调函数负责处理对象的数据。

    当 EtherCAT 主器件(例如 TwinCAT)尝试读取对象数据时、 调用回调函数 EC_SLV_APP_getValueToMaster。 在这种情况下、此回调函数应从存储器中读取对象的数据并返回。 同样 、当 EtherCAT 主器件(例如 TwinCAT)尝试 写入对象数据时、 调用回调函数 EC_SLV_APP_setValueToMaster。 在这种情况下、这个回调函数应将接收到的对象数据写入对象的存储器。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Harsha:

    感谢您的解释。

    就像您提到的、  

    CTT 警告表示在设置了"完全访问"标志并重置"访问"时数据不一致。

    如果我错了、请纠正我、我明白:

    • 设置 CA 时、回调函数返回对象的所有子索引。

    • 如果未设置 CA、我们将使用单一访问(SA)、该函数仅返回指定的子索引值。

    我担心的是 清除 CTT 警告 。 我可以继续使用 CA 或 SA、但我想确认正确的方法:

    • 如果我们使用 完全访问(CA) 、 如何以及在何处 为所有子索引(SI1...sin)设置 CA 标志?

    • 如果我们使用 单访问(SA) 、 如何清除  条目对象(SI0)的 CA 标志?  

    我们的应用  更优先选择"完全访问" 、如果在这种情况下不能应用 CA、我们也可以使用 Single Access。

    请告诉我、最好使用哪种方法来解决该警告。

    此致、

    D. Jenita.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jenita:

    是的。 您是对的。 如果 CA = 1、则回调函数应返回对象的所有 SI 的数据。 在这种情况下、有2个选项。

    1.如果 SI = 0、则 回调函数应返回对象的所有 SI 的数据、包括 SI0数据。
    2.如果 SI =1 ,则 回调函数应返回对象的所有 SI 的数据,但 SI0数据除外。

    请参阅以下屏幕截图。

    如果 CA = 0、 则回调函数应返回对象的指定 SI 和索引的数据。

    为了解决 CTT 中的警告并找到根本原因、您必须验证 回调 实现并观察数据读取/写入是否符合条件。 当 EtherCAT 主设备在 CA=1和 CA=0的情况下访问对象0x7000数据时、应匹配、但警告显示数据不匹配。

    例如、在您的情况下、对象0x7000有3个 SI、每个大小为16位。 假设对象0x7000具有以下数据。

    0x7000:0 = 0x03、 0x7000:1 = 0x1234、0x7000 :2 = 0x5678、0x7000:3 = 0x9ABC。

    案例1:当 EtherCAT 主设备尝试在 CA=1和 SI=0时读取对象0x7000时、回调应该返回[0x03、0x1234、0x5678、0x9ABC]-以进行说明、表示方式如下。

    CASE2:当 EtherCAT 主设备尝试读取 CA=1和 SI=1的对象0x7000时、回调应该返回[0x1234、0x5678、0x9ABC]。

    案例3: 当 EtherCAT 主设备尝试读取 CA=0且 SI=0的对象0x7000时、回调应该返回[0x03]。

    CTT 可以比较通过 CA=1和 CA=0访问的0x7000:0的数据。 出现数据不匹配时、会发出警告。

    我在日志中看到、对于0x7000:0读取、回调返回值= 0x00。 它是否应该返回0x03而不是0x00?

    EC_SLV_APP_getValueFromMaster => IDX:0x7000:0 |大小:1 |值:0 |访问:1

    我的理解是否正确?

    将从 EtherCAT 主设备接收 CA 信息、EtherCAT 子设备应相应地执行操作。  

    [引述 userid="594351" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1510420/lp-am243-adding-record-in-ethercat-slave-simple-demo/5815016 #5815016"]

    我担心的是 清除 CTT 警告 。 我可以继续使用 CA 或 SA、但我想确认正确的方法:

    • 如果我们使用 完全访问(CA) 、 如何以及在何处 为所有子索引(SI1...sin)设置 CA 标志?

    • 如果我们使用 单访问(SA) 、 如何清除  条目对象(SI0)的 CA 标志?  

    [/报价]

    问题的这一部分对我来说有点困惑。 您能再解释一下吗?

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Harsha:

    1. 如果 SI = 0、则 回调函数应返回对象的所有 SI 的数据、包括 SI0数据。
    2.如果 SI =1、则 回调函数应返回对象的所有 SI (不包括 SI0数据)的数据。

    我理解的内容,但它确切地需要配置子索引(SI)= 0 / 1。  

    为了解决 CTT 中的警告并找到根本原因、您必须验证 回调 实现并观察数据读/写是否符合条件。

    TwinCAT 读取/写入正常工作

    [引述 userid="611477" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1510420/lp-am243-adding-record-in-ethercat-slave-simple-demo/5815661 #5815661"]

    我在日志中看到、对于0x7000:0读取、回调返回值= 0x00。 它是否应该返回0x03而不是0x00?

    EC_SLV_APP_getValueFromMaster => IDX:0x7000:0 |大小:1 |值:0 |访问:1

    我的理解是否正确?

    [/报价]

    是的、在运行 CTT 测试时、我将在控制台中登录以下内容

    EC_SLV_APP_getValueFromMaster ==> Idx: 0x7000:0 | Size: 8 | Value: 0 | access: 1
    EC_SLV_APP_getValueFromMaster ==> Idx: 0x7001:0 | Size: 10 | Value: 0 | access: 1

    正如我之前提到的、在添加回调函数后、我在 TwinCAT 中得到了如下所示的内容。
     在两个 SI0值=0中;

    来自 CTT 的警告

    表示0以外的 SI

    EC_SLV_APP_getValueFromMaster ==> Idx: 0x7000:1 | Size: 2 | Value: 0 | access: 0
    EC_SLV_APP_getValueFromMaster ==> Idx: 0x7000:2 | Size: 2 | Value: 0 | access: 0
    EC_SLV_APP_getValueFromMaster ==> Idx: 0x7000:3 | Size: 2 | Value: 0 | access: 0

    I 能够在写/读回调函数附加到 EC_API_SLV_CoE_odAddRecord ()时重现问题。 我将就此向您回复。

    正如您所说的、您也重现了同一个问题。 是否在您身边解决??  

    此致、
    D.Jenita.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jenita:

    我了解内容、但它需要在何处进行配置 Subindex (SI)= 0 / 1。

    根据连接的回调 API、索引、子索引(SI)、大小和完全访问权限是回调函数的输入参数、将由 EtherCAT 主设备在读取/写入对象数据时决定。 回调函数应检查 SI 输入参数值并执行相应操作。 不允许在回调中配置索引或 SI。

    TI EtherCAT 子器件堆栈支持并启用完整的 SDO 访问。 因此、连接的 EtherCAT 主机器件可以通过完全访问来访问 SDO。 请参阅 ecat_def.h 文件中的定义。 如果需要、您可以通过调整 SII 常规类别中的 Marco 和标志来禁用完整的 SDO 访问。

    #define COMPLETE_ACCESS_SUPPORTED                 1


    如果 EtherCAT 主设备中有与 SDO 访问相关的任何设置、您可以尝试进行该设置。

    我们不理解您为什么要在 SDO 访问期间准确配置 SI? 如何在 SDO 访问期间配置 SI?

    [引述 userid="594351" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1510420/lp-am243-adding-record-in-ethercat-slave-simple-demo/5815820 #5815820"]

    是的、在运行 CTT 测试时、我将在控制台中登录以下内容

    全屏
    1.
    2.
    EC_SLV_APP_getValueFromMaster => IDX:0x7000:0 |大小:8 |值:0 |访问:1
    EC_SLV_APP_getValueFromMaster => IDX:0x7001:0 |大小:10 |值:0 |访问:1
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    正如我之前提到的、在添加回调函数后、我在 TwinCAT 中得到了如下所示的内容。
     在两个 SI0值=0中;

    [/报价]

    这表明回调函数未按预期实现。 我的怀疑是回调函数没有处理对象数据读写。 请共享 SDO 请求和响应事务的日志。 您可以使用 OSAL_printf API 来打印详细信息。

    正如您所说的、您能够重现同样的问题。 是否在您身边解决??  [/报价]

    是的。 我在 CTT 中使用 TF-2302重现了该警告、根本原因是回调实现不正确。 请重新检查您的回调实现。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Harsha:

    这表明回调函数没有按预期实现。 我的怀疑是回调函数没有处理对象数据读写。 请共享 SDO 请求和响应事务的日志。 您可以使用 OSAL_printf API 来打印详细信息。

    是的、我同意—回调函数可能无法按预期实现。 我在之前的询问中也指出了这一点。
    我之前分享的日志仅使用 OSAL_printf 在 CB 函数内获取、这是 SDO 下载和上传数据吗?  

    TF2300
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:1 | Size: 2 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:2 | Size: 2 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:3 | Size: 2 | Value: 0 | access: 0
    
    EC_SLV_APP_getValueFromMaster ==> Idx: 0x7000:1 | Size: 2 | Value: 0 | access: 0
    EC_SLV_APP_getValueFromMaster ==> Idx: 0x7000:2 | Size: 2 | Value: 0 | access: 0
    EC_SLV_APP_getValueFromMaster ==> Idx: 0x7000:3 | Size: 2 | Value: 0 | access: 0
    
    TF2302
    State change: 0x1 -> 0x2
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 8 | Value: 0 | access: 1
    
    State change: 0x2 -> 0x4
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 8 | Value: 0 | access: 1
    
    State change: 0x4 -> 0x8
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 8 | Value: 7220 | access: 1
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 0
    
    State change: 0x1 -> 0x2
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 8 | Value: 10 | access: 1
    EC_SLV_APP_getValueFromMaster ==> Idx: 0x7000:0 | Size: 8 | Value: 0 | access: 1
    
    State change: 0x2 -> 0x4
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 1 | Value: 0 | access: 0
    EC_SLV_APP_setValueToMaster ==> Idx: 0x7000:0 | Size: 8 | Value: 0 | access: 1
    EC_SLV_APP_getValueFromMaster ==> Idx: 0x7000:0 | Size: 8 | Value: 0 | access: 1
    
    

    [引述 userid="594351" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1510420/lp-am243-adding-record-in-ethercat-slave-simple-demo/5807856 #5807856"]

    我目前正在使用回调函数来更新应用中的变量(例如查找表)。

    是否有任何替代方法来更新这些变量、或者是否有更合适的方法、具体取决于应用?

    此外、在配置回调函数时、我是否可能缺少任何步骤或注意事项?

    是的。 我在 CTT 中使用 TF-2302重现了该警告、根本原因是回调实现不正确。 请重新检查您的回叫实现。

    这是我的查询是我检查的东西根据我的知识,我希望在这方面的支持.  由于您能够重现此问题、您的见解对于解决此问题非常有价值。

    期待您对此提供的建议和支持。

    此致、

    D. Jenita.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jenita:

    是的、我同意—回调函数可能无法按预期实现。 我在之前的询问中也指出了这一点。
    我之前分享的日志仅使用 OSAL_printf 在 CB 函数内获取、这是 SDO 下载和上传数据吗?  [/报价]

    我要求提供详细日志的原因是要检查数据值部分。 您的日志中仍然缺少该信息。  pData_p 是指向对象数据的指针、必须  根据大小打印数据字节。

    我将您的回调视为参考、从而实现了 SDO 0x7000读取和写入操作的示例回调。 请在下面找到代码片段。

    static uint16_t objData[4] = {0x0003,0x1234,0x5678,0x9ABC}; // This simulates the memory/lookup table.
    
    // Attached as a write callback for SDO download.
    static uint8_t EC_SLV_APP_getValueFromMaster(void* pApplicationCtxt_p,uint16_t index_p,uint8_t subindex_p,uint32_t size_p,uint16_t MBXMEM * pData_p,uint8_t completeAccess_p)
    {
        EC_API_EError_t     error   = (EC_API_EError_t)ABORT_NOERROR;
    
        OSAL_printf("SDO Download: %s ==> Idx: 0x%04x:%d | Size: %d | access: %d\r\n", __func__,index_p, subindex_p, size_p, completeAccess_p);
        
        if (completeAccess_p)
        {
            if(subindex_p == 0)
            {
                OSAL_MEMORY_memcpy((uint8_t*)&objData[1],(uint8_t*)&pData_p[1], size_p);
                OSAL_printf("Download: 0x%04x:%d = 0x%04x\r\n",index_p, 0,objData[0]);
                OSAL_printf("Download: 0x%04x:%d = 0x%04x\r\n",index_p, 1,objData[1]);
                OSAL_printf("Download: 0x%04x:%d = 0x%04x\r\n",index_p, 2,objData[2]);
                OSAL_printf("Download: 0x%04x:%d = 0x%04x\r\n",index_p, 3,objData[3]); 
            }
            else if(subindex_p == 1)
            {
                OSAL_MEMORY_memcpy((uint8_t*)&objData[1],(uint8_t*)pData_p, size_p);
                OSAL_printf("Download: 0x%04x:%d = 0x%04x\r\n",index_p, 0,objData[0]);
                OSAL_printf("Download: 0x%04x:%d = 0x%04x\r\n",index_p, 1,objData[1]);
                OSAL_printf("Download: 0x%04x:%d = 0x%04x\r\n",index_p, 2,objData[2]);
            }
        }
        else
        {
            if(subindex_p!=0)
            {
                OSAL_printf("Download Data: %04x\n\r",pData_p[0]);
                objData[subindex_p] = pData_p[0];
                OSAL_printf("Download: 0x%04x:%d = 0x%04x\r\n",index_p, subindex_p,objData[subindex_p]);
            }
        }
    Exit:
        return (uint8_t)error;
    }
    
    // Read callback - upload
    static uint8_t EC_SLV_APP_setValueFromMaster(void* pApplicationCtxt_p,uint16_t index_p,uint8_t subindex_p,uint32_t size_p,uint16_t MBXMEM * pData_p,uint8_t completeAccess_p)
    {
        EC_API_EError_t     error   = (EC_API_EError_t)ABORT_NOERROR;
    
        OSAL_printf("SDO Upload: %s ==> Idx: 0x%04x:%d | Size: %d  | access: %d\r\n", __func__,index_p, subindex_p, size_p, completeAccess_p);
    
        if (completeAccess_p)
        {
            if (subindex_p == 0)
            {
                OSAL_MEMORY_memcpy((uint8_t*)pData_p, (uint8_t*)objData, size_p);
            }
            else if (subindex_p == 1)
            {
                OSAL_MEMORY_memcpy((uint8_t*)pData_p, (uint8_t*)&objData[1], size_p);
            }
            else
            {
                OSAL_printf("Invalid SI for Complete Access -> 0x%04x:%d\r\n",index_p,subindex_p);
            }
    
            OSAL_printf("Upload: 0x%04x:%d = 0x%04x\r\n",index_p, 0,objData[0]);
            OSAL_printf("Upload: 0x%04x:%d = 0x%04x\r\n",index_p, 1,objData[1]);
            OSAL_printf("Upload: 0x%04x:%d = 0x%04x\r\n",index_p, 2,objData[2]);
            OSAL_printf("Upload: 0x%04x:%d = 0x%04x\r\n",index_p, 3,objData[3]);  
        }
        else
        {
            if(subindex_p == 0) // size will be 1
            {
                uint8_t *SI0_data = (uint8_t*)objData;
                OSAL_MEMORY_memcpy(pData_p, &SI0_data[subindex_p], size_p);
            }
            else
            {
                OSAL_MEMORY_memcpy(pData_p, &objData[subindex_p], size_p);
            }
    
            OSAL_printf("Upload Data: %04x\n\r",pData_p[0]);
            OSAL_printf("Upload: 0x%04x:%d = 0x%04x\r\n",index_p, subindex_p,objData[subindex_p]);
        }
    
     Exit:
        return (uint8_t)error;
    }


    我观察到测试用例 TF-2302通过时没有警告。

    此致、