FreeModBus RTU

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
SnabZ
Родился
Сообщения: 3
Зарегистрирован: Пт июл 03, 2015 08:52:19

FreeModBus RTU

Сообщение SnabZ »

Вообще мне нужно было портировать это чудо на мой ARM контроллер, с чем можно сказать справился. Теперь остается вопрос освоение работы самой библиотеки, как работает. Описание такого особо нигде не нашел. Может кто то разбирал библиотеки FreeModBus? либо у кого то есть ссылки? С английским особо не дружу, будет хорошо если есть на русском что то, ну на худой конец и информация пойдет на en.
Реклама
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Re: FreeModBus RTU

Сообщение BorisSPB »

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

Re: FreeModBus RTU

Сообщение SnabZ »

откуда у вас mbcallbacks.c ? :shock:
http://www.freemodbus.org/api/index.html тут не полная информация :( . Там в основном как портировать сам freemodbus на свой камушек с примерами и не более. Мне же интересно сама реализация, как все происходит...
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Re: FreeModBus RTU

Сообщение 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;
}

Реклама
Эиком - электронные компоненты и радиодетали
SnabZ
Родился
Сообщения: 3
Зарегистрирован: Пт июл 03, 2015 08:52:19

Re: FreeModBus RTU

Сообщение 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;
}

все понял, что это
Реклама
Ответить

Вернуться в «ARM»