Страница 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 ?
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;
}
все понял, что это