Страница 1 из 1

FreeModBus RTU

Добавлено: Пт июл 03, 2015 09:18:17
SnabZ
Вообще мне нужно было портировать это чудо на мой ARM контроллер, с чем можно сказать справился. Теперь остается вопрос освоение работы самой библиотеки, как работает. Описание такого особо нигде не нашел. Может кто то разбирал библиотеки FreeModBus? либо у кого то есть ссылки? С английским особо не дружу, будет хорошо если есть на русском что то, ну на худой конец и информация пойдет на en.

Re: FreeModBus RTU

Добавлено: Пт июл 03, 2015 15:15:21
BorisSPB
Все взаимодействие с протоколом находится в файле mbcallbacks.c
Как распределить адреса зависит от вашего приложения.
Для меня в самом начале было странно, что при вызове функций из этого файла, адрес был увеличен на единицу. Потом прочитал, что есть разница между адресом и номером регистра, адреса начинаются с 0, а регистры с 1. Таким образом стек автоматически преобразует адрес в номер регистра.
Что касается описания, наверно все-таки пользуясь онлайн переводчиком, можно осилить http://www.freemodbus.org/api/index.html :)

Re: FreeModBus RTU

Добавлено: Пт июл 03, 2015 15:19:53
SnabZ
откуда у вас mbcallbacks.c ? :shock:
http://www.freemodbus.org/api/index.html тут не полная информация :( . Там в основном как портировать сам freemodbus на свой камушек с примерами и не более. Мне же интересно сама реализация, как все происходит...

Re: FreeModBus RTU

Добавлено: Пт июл 03, 2015 15:33:23
BorisSPB
А действительно, откуда? Не помню :?
Ну вот он:
Спойлер

Код: Выделить всё

/* ----------------------- Modbus includes ----------------------------------*/
#include "mb.h"
#include "mbport.h"

/* ----------------------- Defines ------------------------------------------*/
#define REG_INPUT_START 1000
#define REG_INPUT_NREGS 6

/* ----------------------- Static variables ---------------------------------*/
static USHORT   usRegInputStart = REG_INPUT_START;
USHORT   usRegInputBuf[REG_INPUT_NREGS];

eMBErrorCode
eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
{
    eMBErrorCode    eStatus = MB_ENOERR;
    int             iRegIndex;

    if( ( usAddress >= REG_INPUT_START )
        && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )
    {
        iRegIndex = ( int )( usAddress - usRegInputStart );
        while( usNRegs > 0 )
        {
            *pucRegBuffer++ =
                ( unsigned char )( usRegInputBuf[iRegIndex] >> 8 );
            *pucRegBuffer++ =
                ( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF );
            iRegIndex++;
            usNRegs--;
        }
    }
    else
    {
        eStatus = MB_ENOREG;
    }

    return eStatus;
}

eMBErrorCode
eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs,
                 eMBRegisterMode eMode )
{
    return MB_ENOREG;
}


eMBErrorCode
eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils,
               eMBRegisterMode eMode )
{
    return MB_ENOREG;
}

eMBErrorCode
eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
{
    return MB_ENOREG;
}


Re: FreeModBus RTU

Добавлено: Пн июл 06, 2015 07:27:39
SnabZ
BorisSPB писал(а):А действительно, откуда? Не помню :?
Ну вот он:
Спойлер

Код: Выделить всё

/* ----------------------- Modbus includes ----------------------------------*/
#include "mb.h"
#include "mbport.h"

/* ----------------------- Defines ------------------------------------------*/
#define REG_INPUT_START 1000
#define REG_INPUT_NREGS 6

/* ----------------------- Static variables ---------------------------------*/
static USHORT   usRegInputStart = REG_INPUT_START;
USHORT   usRegInputBuf[REG_INPUT_NREGS];

eMBErrorCode
eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
{
    eMBErrorCode    eStatus = MB_ENOERR;
    int             iRegIndex;

    if( ( usAddress >= REG_INPUT_START )
        && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )
    {
        iRegIndex = ( int )( usAddress - usRegInputStart );
        while( usNRegs > 0 )
        {
            *pucRegBuffer++ =
                ( unsigned char )( usRegInputBuf[iRegIndex] >> 8 );
            *pucRegBuffer++ =
                ( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF );
            iRegIndex++;
            usNRegs--;
        }
    }
    else
    {
        eStatus = MB_ENOREG;
    }

    return eStatus;
}

eMBErrorCode
eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs,
                 eMBRegisterMode eMode )
{
    return MB_ENOREG;
}


eMBErrorCode
eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils,
               eMBRegisterMode eMode )
{
    return MB_ENOREG;
}

eMBErrorCode
eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
{
    return MB_ENOREG;
}

все понял, что это