Tiger

XXMIT block

6 posts in this topic

Hi everyone!

I have a PLC Quantum (67160 type). I want read data from slave device ( according to Modbus RTU).

i had used XXMIT block to read data. the result is very good. But when i want connect multiple slave devices (5 device), XXMIT block don't work. althought according to  theory, XXMIT can read 20 device slave at the same time, and CPU 67160 modbus Port support up to 4 devices at the same time.If run each XXMIT block according to sequence, delay is increasing?

Have you to way can run 4 block at the same time ?

 

Share this post


Link to post
Share on other sites

Hi!

I think you must use only one instance of the XXMIT block.

Please, read help:

'Several XXMITs can not be activate at the same time. If more than one XXMIT is activated, the first scanned block will operate and prevent operation of all other XXMITs until it has completed. The next block in the scan that is called will generate an immediate fault code 150'

Many time ago I had wrote a block for Concept. The block is manager for XXMIT.

http://forums.mrplc.com/index.php?/files/file/271-management-of-the-block-xxmit/

Share this post


Link to post
Share on other sites

Hi leo!

I think so.i have read your block wrote for concept.i don' t understand principle of CNTRL_XL block. But i think only needing according to sequence read blocks and delay between blocks will calculate equal time out of reponse slaves.

Edited by Tiger

Share this post


Link to post
Share on other sites

you can place many XXMIT  blocks in your application, but you can use only 1 XXMIT in the same time

Share this post


Link to post
Share on other sites

Dear Leo!

I 'm using unity to program.how to do create CNTRL block in program.can you supply this block code.

Thank you

Share this post


Link to post
Share on other sites

Exuse me, but I have C code only with Russian comments:

{
 
    UINT i;
    UINT uTemp;
    UINT uPriorMax;

    *pLastPollErr = FALSE;
   
    //ОПРЕДЕЛЕНИЕ ПРИОРИТЕТА
    if (*pAbort || AliGetProgState()->coldInit || AliGetProgState()->warmInit)
    //Требуется прервать опрос
    {
        //Остановка опроса при необходимости
        *pStart = FALSE;
        *pDev_Num_poll = 0;
        for (i = 1; i <= *pDev_Num; i++)
        {
             //Выставить приоритет
            (*pVar)[i-1].Prior = (*pCnst)[i-1].Prior_Beg;
             //Сбросить состояние
            (*pVar)[i-1].Stat = 0;
        }
    }
    else
    {
        for (i = 1; i <= *pDev_Num; i++)
        {
            //Сбросить флаги завершения опроса
            (*pVar)[i-1].Stat &= ~(MBP_POLL_SCAN_OK | MBP_POLL_SCAN_ERR);
            if ((( (*pVar)[i-1].Stat & MBP_POLL_RUN ) == 0) && (*pVar)[i-1].Prior != 0)
            //Устройство требуется опрашивать и оно не опрашивается
            {
                //Увеличить приоритет опроса
                if ((*pVar)[i-1].Stat & MBP_POLL_LAST_OK)
                    uTemp = *pSys_Time_Delta_100 * (*pCnst)[i-1].PriorAdd_Ok;
                else
                    uTemp = *pSys_Time_Delta_100 * (*pCnst)[i-1].PriorAdd_Err;

                if ((*pVar)[i-1].Prior < 0xFFFF - uTemp)
                    (*pVar)[i-1].Prior = (*pVar)[i-1].Prior + uTemp;
                else
                    (*pVar)[i-1].Prior = 0xFFFF;
            }
        }
    }

    //РАБОТА С УСТРОЙСТВАМИ
    if (!*pXXMIT_Activ  && !*pAbort)
    //Блок XXMIT не запущен
    {
        if (*pStart && *pDev_Num_poll)
        //Ранее отпрашивалось устройсво
        {
            (*pVar)[*pDev_Num_poll-1].Stat &= ~MBP_POLL_RUN;
            if (!*pXXMIT_Code_Err)
           //Опрос завершился без ошибок
            {
                (*pVar)[*pDev_Num_poll-1].Stat &= ~(MBP_POLL_SCAN_ERR | MBP_POLL_LAST_ERR);
                (*pVar)[*pDev_Num_poll-1].Stat |= MBP_POLL_SCAN_OK | MBP_POLL_LAST_OK;
                (*pOK_Count)[*pDev_Num_poll-1] ++;
            }
            else
           //Опрос завершился с ошибкой
           {
                   //Код ошибки
                (*pErr)[*pDev_Num_poll - 1] = *pXXMIT_Code_Err;
                (*pVar)[*pDev_Num_poll-1].Stat &= ~(MBP_POLL_SCAN_OK | MBP_POLL_LAST_OK);
                (*pVar)[*pDev_Num_poll-1].Stat |= MBP_POLL_SCAN_ERR | MBP_POLL_LAST_ERR;
                (*pErr_Count)[*pDev_Num_poll-1] ++;
                *pLastPollErr = TRUE;
                *pLastPollErrCode = *pXXMIT_Code_Err;
                *pLastPollDev = *pDev_Num_poll;
           }
           //Выставить приоритет
           (*pVar)[*pDev_Num_poll-1].Prior = (*pCnst)[*pDev_Num_poll - 1].Prior_Beg;
        }
        //Поиск следующего опрашиваемого устройства
        uPriorMax = 0;
        uTemp = 0;
        *pDev_Num_poll = 0;
        *pStart = FALSE;
        for (i = 1; i <= *pDev_Num; i++)
        {
            if ((*pVar)[i-1].Prior > 0 && (*pVar)[i-1].Prior > uPriorMax)
            //Требуется опрос устройства и у него более высокий приоритет
            {
                uPriorMax = (*pVar)[i-1].Prior;
               uTemp = i;
            }
        }

        if (uTemp)
        //Найдено устройство, требующее опроса
        {
                //Запуск нового опроса
            (*pVar)[uTemp-1].Prior = 0;
            *pXXMIT_Command =(*pXXMIT_PAR)[uTemp - 1].Command;
            *pXXMIT_MsgLen =(*pXXMIT_PAR)[uTemp - 1].MsgLen;
            *pXXMIT_Port =(*pXXMIT_PAR)[uTemp - 1].Port;
            *pXXMIT_Baudrate =(*pXXMIT_PAR)[uTemp - 1].Baudrate;
            *pXXMIT_Databits =(*pXXMIT_PAR)[uTemp - 1].Databits;
            *pXXMIT_Stopbits =(*pXXMIT_PAR)[uTemp - 1].Stopbits;
            *pXXMIT_Parity =(*pXXMIT_PAR)[uTemp - 1].Parity;
            *pXXMIT_RespTour =(*pXXMIT_PAR)[uTemp - 1].RespTour;
            *pXXMIT_RetryLmt =(*pXXMIT_PAR)[uTemp - 1].RetryLmt;
            *pXXMIT_StartDly =(*pXXMIT_PAR)[uTemp - 1].StartDly;
            *pXXMIT_EndDly =(*pXXMIT_PAR)[uTemp - 1].EndDly;

            for (i = 1; i <= 5; i++)
                (*pXXMIT_MsgOut)[i - 1] =  (*pXXMIT_PAR)[uTemp - 1].MsgOut[i-1];

            (*pVar)[uTemp - 1].Stat |= MBP_POLL_RUN;
            *pDev_Num_poll = uTemp;
            *pStart = TRUE;
        }
    }
    return;
}
 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now