Posted 5 Sep 2016 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
Posted 5 Sep 2016 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
Posted 5 Sep 2016 (edited) 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 5 Sep 2016 by Tiger Share this post Link to post Share on other sites
Posted 6 Sep 2016 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
Posted 6 Sep 2016 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
Posted 7 Sep 2016 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