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.

[参考译文] AM2434:IO-Link 堆栈无法写入处理数据请求

Guru**** 2393725 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1509195/am2434-io-link-stack-unable-to-write-out-process-data-request

器件型号:AM2434

工具/软件:

您好:

我发现自己无法通过 SMI API 写出处理数据请求。 我已经尝试了来自工业 COM SDK 本身和用户指南的这两个代码示例。 每当发出请求时、它都会返回一个无效的 ArgBlock Length 的错误。 请告知此代码使用是否不正确。

// Allocate ArgBlock Memory
IOLM_SMI_SPDOut *psuReq = malloc(sizeof(IOLM_SMI_SPDOut)); // Pointer to Process Data Output Struct
INT16U u16Length = sizeof(IOLM_SMI_SPDInOut);   // Argument Block Length
INT16U u16Error;                                // Return Error

// Fill Request
psuReq->u16ArgBlockID = IOLM_SMI_ENDIAN_16(IOLM_SMI_eArgBlockID_PDOut); // Big Endian Arg Block ID
psuReq->u8OE = 0x01;    // Output Enabled
psuReq->u8OutputDataLength = 0x02; // Length of Process Data Output is 2 Bytes

// Data
psuReq->au8Data[0] = 0xFF;
psuReq->au8Data[1] = 0x00;

// Method 1 Send and Callback
// Send Out Request
IOLM_SMI_vPDOutReq(IOLM_SMI_CLIENT_APP, portNumber, u16Length, (INT8U*)psuReq);

// Callback
void IOLM_EXMPL_cbPDOutCnf(uint8_t clientID, uint8_t portNumber, uint16_t error)
{
    (void)clientID;

    if (error != IOL_eErrorType_NONE)
    {
        // Returns 0x4034 - IOL_eErrorType_ARGBLOCK_LENGTH_INVALID
        portArray[portNumber].exampleState = IOLM_EXMPL_PortErrorHandler(portNumber, error);
    }
    else
    {
        IOLM_EXMPL_printf("---------------Write Process Data Success-----------------\n");
        portArray[portNumber].exampleState = IOLM_eExampleState_ReadProcessDataValue;
    }
}

// Method 2 Send Out and Confirm
// Send Out Request
u16Error = IOLM_SMI_u16PDOutReqCnf(IOLM_SMI_CLIENT_APP, portNumber, u16Length, (INT8U*)psuReq);
// Confirm
if (u16Error == IOL_eErrorType_NONE)
{
    IOLM_EXMPL_printf("---------------Write Process Data Success-----------------\n");
    portArray[portNumber].exampleState = IOLM_eExampleState_ReadProcessDataValue;
}
else
{
    // Returns 0x4034 - IOL_eErrorType_ARGBLOCK_LENGTH_INVALID
    portArray[portNumber].exampleState = IOLM_EXMPL_PortErrorHandler(portNumber, error);
}

谢谢您、

- Joe Pfaltzgraff

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

    你好、Pfaltzgraff 先生、

    请使用宏来定义 ArgBlock-length:" IOLM_SMI_ARGBLOCK_PDOUT_LEN"  (在 IOLM_SMI_TYPEs.h 中定义)。 此外、还要确保写入所用 IO-Link 器件数据表中所述的相同数量的 PDO 字节。

    此致、
    Geeta

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

    谢谢、解决了这个问题。