Freemodbus Kütüphanesi MB_EIO Hatası

Başlatan engineer42, 17 Ekim 2022, 13:32:26

engineer42

İyi günler,

Freemodbus kütüphanesini M031 için port ettim. UART ve TIMER için gerekli ayarları da yaptım. Projeyi KEIL de hatasız derliyorum ancak MODBUS POLL programında sürekli TIMEOUT hatası alıyorum. İlk önce TIMER ayarını doğru yapmadım diye düşündüm ancak debug ederken eMBRTUReceive() fonksiyonunun IO hatası döndürdüğünü gördüm. bu IO hatası nedir ve neyi yanlış yapıyorum anlayamadım. Yardımcı olabilecek fikirlere açığım.
eMBErrorCode
eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength )
{
    BOOL            xFrameReceived = FALSE;
    eMBErrorCode    eStatus = MB_ENOERR;

    ENTER_CRITICAL_SECTION(  );
    assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX );
		
    
    if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN )
        && ( usMBCRC16( ( UCHAR * ) ucRTUBuf, usRcvBufferPos ) == 0 ) )
    {
				 
        
        *pucRcvAddress = ucRTUBuf[MB_SER_PDU_ADDR_OFF];

         
        *pusLength = ( USHORT )( usRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_CRC );

        
        *pucFrame = ( UCHAR * ) & ucRTUBuf[MB_SER_PDU_PDU_OFF];
        xFrameReceived = TRUE;
    }
    else
    {
        eStatus = MB_EIO;
			printf("/n MB_EIO  ");
    }

    EXIT_CRITICAL_SECTION(  );
    return eStatus;
}

robikod

ucRTUBuf'u print etmeye çalışın ve gerçekten göndermek istediğiniz datayı mı içeriyor ona bakabilirsiiz

quarko

Hocam önce modlink le çalışabilirsiniz. Sorguları tek tek atıp adım adım debug yaparsınız. Paketi düzgün bir şekilde alıp almadığına emin olursunuz. Ondan sonra doğru bir şekilde cevap hazırlama kısmına geçersiniz. Ardından da hazırlanan cevabı doğru bir şekilde gönderme kısmı üzerinde çalışabilirsin. En son emin olduktan sonra modbus poll ile testlere devam edebilirsin.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

engineer42

robikod'un dediğini denedim. Masterdan gelen veri ile ucRTUBuf uyuşmuyor. Daha önce de freemodbus ile bir kaç proje yapmıştım ama üzerinden epey vakit geçti. UART birimini mi doğru kuramıyorum acaba.
  CLK_EnableModuleClock(UART1_MODULE);

        
        CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UART1SEL_HIRC, CLK_CLKDIV0_UART1(1));
         
        SYS->GPA_MFPL = (SYS->GPA_MFPL & ~(SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk))    |       \
                    (SYS_GPA_MFPL_PA2MFP_UART1_RXD | SYS_GPA_MFPL_PA3MFP_UART1_TXD);

        SYS_ResetModule(UART1_RST);

       
        UART_SetLine_Config(UART1, ulBaudRate, ucDataBits, parity, UART_STOP_BIT_1);
				 
        
				 
        
        NVIC_SetPriority(UART1_IRQn, 0);
        NVIC_EnableIRQ(UART1_IRQn);

quarko

freemodbus'ı daha önce kullanmadım. Kendi yazdığım modbus kütüphanesini genelde port ediyorum. Test ederken modlink her zaman ilk olarak daha kullanışlı oluyor.  Modbus Poll sürekli sorgu attığından ilk çalıştırırken çok kullanışlı olmuyor. Sonradan uzun testler için daha uygun oluyor.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."