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.

MCU-PLUS-SDK-AM243X: PROFINET Device v2.00.01 - How to access submodule data

Part Number: MCU-PLUS-SDK-AM243X
Other Parts Discussed in Thread: LP-AM243

Dear TI

I have the PROFINET Device v2.00.01 "Compact IO-Device Example Project"  running on an LP-AM243 (revision E2) using the AM243x MCU+ SDK  08.02.00. Without modifications this example project is running fine and I can communicate via with an AM64x Evaluation Module (using the PROFINET protocol).

I see that in the function APP_runProfinetStack() I can get the input and output buffer addresses via PN_API_DEV_getBufferInputData() and PN_API_DEV_getBufferOutputData(). But these buffers pBufOut and pBufIn seem to be unstructured.

So within I APP_runProfinetStack() tried using PN_API_DEV_getExpectedSubmodule() to get to the actual data in a submodule / subslot. Here's my full code of the full function APP_runProfinetStack():

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
uint32_t APP_runProfinetStack (
void)
{
uint32_t result = 0;
uint8_t *pBufOut = NULL;
uint8_t *pBufIn = NULL;
static uint8_t incrementValue = 0;
PN_API_DEV_EAr_t ar_p = PN_API_DEV_eAR_DA;
PN_API_DEV_SModule_t Module_p = {0};
PN_API_DEV_SSubmodule_t Submodule_p = {0};
uint16_t index_p = 0;
/*This function must be called regularly.*/
result = PN_API_PDEV_run ();
if (result != PN_API_PDEV_eOK)
{
goto laError;
}
result = PN_API_DEV_getBufferOutputData (&pBufOut);
if (result != PN_API_DEV_eOK)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 

However the return value of PN_API_DEV_getExpectedSubmodule() on line 53 is always PN_API_DEV_eERROR_PARAMETER_OUT_OF_RANGE  (HEX: 0x38030402, DEC: 939721730). What am I doing wrong? 

Is ar_p = PN_API_DEV_eAR_DA; correct?

What should Module_p.moduleState = be?

Thank you and best regards

Thomas

  • Hi Thomas,

    Thanks for your query let me get feedback from internal team and I will get back here.

    BR

    Nilabh A.

  • HI Thomas,

    We are working on the same, will be providing response by EOW.

    BR

    Nilabh A.

  • Hi Thomas,

    PN_API_DEV_getExpectedSubmodule is not designed to get data from a submodule. It is used to get information about the module configuration which is sent by the PLC. Normally you do this in the Connect Indication. I think that is not what you want.

    You are interested in the processdata offsets. The offsets are set from the application during startup. This is done in APP_configureSubmodules(). You can structure the In/Out as you want. For example here the Demo App Slot 1:

    Regards

    Nilabh A.

  • Dear Nilabh 

    Thank you for your support. I think I start understand more, but I'm not quite there yet. Sorry this is my first involvement with PROFINET, so I'm really new at that.

    I think you are right, I am interested in the process data offsets, but I don't understand how I can recover those offsets, that were set during the execution of APP_configureSubmodules(), when APP_runProfinetStack() is called continuously.

    I I think I understand that in APP_runProfinetStack() I can get the pointers to the cyclic data input and output buffers using PN_API_DEV_getBufferInputData (&pBufIn) and PN_API_DEV_getBufferOutputData (&pBufOut).

    So let's say I want to do two things: read some output data that I received from the IO-Controller and write some input data to be sent to the IO-Controller.

    So from the configuration in APP_configureSubmodules() I see that Slot 10, Subslot 0x0001 is a buffer with 16 bytes of output data from the IO-Controller to me as the IO-Device. I would like to access this data somewhat like this:

    uint32_t result = 0;
    uint8_t *pBufOut = NULL;
    uint8_t aBufOutSlot10[16] = {0};


    result = PN_API_PDEV_run ();
    if (result != PN_API_PDEV_eOK)
    {
    goto laError;
    }

    result = PN_API_DEV_getBufferOutputData (&pBufOut);
    if (result != PN_API_DEV_eOK)
    {
    goto laError;
    }

    memcpy(aBufOutSlot10, pBufOut + OFFSET_FOR_SLOT10, 16);

    Or from the configuration in APP_configureSubmodules() I see that Slot 1, Subslot 0x0001 is a buffer with 16 bytes input data from me the IO-Device to the IO-Controller. I would like to write my data to this buffer somewhat like this:

    uint32_t result = 0;
    uint8_t *pBufIn = NULL;
    uint8_t aBufInSlot1[16] = {0};


    result = PN_API_PDEV_run ();
    if (result != PN_API_PDEV_eOK)
    {
    goto laError;
    }

    result = PN_API_DEV_getBufferInputData (&pBufIn);
    if (result != PN_API_DEV_eOK)
    {
    goto laError;
    }

    getDataFromMyApplicationForSlot1(aBufInSlot1); // just an example to get 16 bytes of data to be sent to the IO-Controller

    memcpy(pBufIn + OFFSET_FOR_SLOT1, aBufInSlot1, 16);

    What I don't understand is: how do I know what OFFSET_FOR_SLOT1 and OFFSET_FOR_SLOT10 are in the function APP_runProfinetStack()? (The HEX-Values.)

    Best regards

    Thomas

  • Dear Nilabh 

    Thank you for your support. I think I start understand more, but I'm not quite there yet. Sorry this is my first involvement with PROFINET, so I'm really new at that.

    I think you are right, I am interested in the process data offsets, but I don't understand how I can recover those offsets, that were set during the execution of APP_configureSubmodules(), when APP_runProfinetStack() is called continuously.

    I I think I understand that in APP_runProfinetStack() I can get the pointers to the cyclic data input and output buffers using PN_API_DEV_getBufferInputData (&pBufIn) and PN_API_DEV_getBufferOutputData (&pBufOut).

    So let's say I want to do two things: read some output data that I received from the IO-Controller and write some input data to be sent to the IO-Controller.

    So from the configuration in APP_configureSubmodules() I see that Slot 10, Subslot 0x0001 is a buffer with 16 bytes of output data from the IO-Controller to me as the IO-Device. I would like to access this data somewhat like this:

    uint32_t result = 0;
    uint8_t *pBufOut = NULL;
    uint8_t aBufOutSlot10[16] = {0};


    result = PN_API_PDEV_run ();
    if (result != PN_API_PDEV_eOK)
    {
    goto laError;
    }

    result = PN_API_DEV_getBufferOutputData (&pBufOut);
    if (result != PN_API_DEV_eOK)
    {
    goto laError;
    }

    memcpy(aBufOutSlot10, pBufOut + OFFSET_FOR_SLOT10, 16);

    Or from the configuration in APP_configureSubmodules() I see that Slot 1, Subslot 0x0001 is a buffer with 16 bytes input data from me the IO-Device to the IO-Controller. I would like to write my data to this buffer somewhat like this:

    uint32_t result = 0;
    uint8_t *pBufIn = NULL;
    uint8_t aBufInSlot1[16] = {0};


    result = PN_API_PDEV_run ();
    if (result != PN_API_PDEV_eOK)
    {
    goto laError;
    }

    result = PN_API_DEV_getBufferInputData (&pBufIn);
    if (result != PN_API_DEV_eOK)
    {
    goto laError;
    }

    getDataFromMyApplicationForSlot1(aBufInSlot1); // just an example to get 16 bytes of data to be sent to the IO-Controller

    memcpy(pBufIn + OFFSET_FOR_SLOT1, aBufInSlot1, 16);

    What I don't understand is: how do I know what OFFSET_FOR_SLOT1 and OFFSET_FOR_SLOT10 are in the function APP_runProfinetStack()? (The HEX-Values.)

    Best regards

    Thomas

    Edit: I guess I have to write a function for use in APP_configureSubmodules() that allows me to remember the offsets in an (global or module global) array.

  • Hi Thomas,

    You can try writing the function. Let me know if you need any further help.

    BR

    Nilabh A.