FreeModBus RTU
FreeModBus RTU
Вообще мне нужно было портировать это чудо на мой ARM контроллер, с чем можно сказать справился. Теперь остается вопрос освоение работы самой библиотеки, как работает. Описание такого особо нигде не нашел. Может кто то разбирал библиотеки FreeModBus? либо у кого то есть ссылки? С английским особо не дружу, будет хорошо если есть на русском что то, ну на худой конец и информация пойдет на en.
- Реклама
Re: FreeModBus RTU
Все взаимодействие с протоколом находится в файле mbcallbacks.c
Как распределить адреса зависит от вашего приложения.
Для меня в самом начале было странно, что при вызове функций из этого файла, адрес был увеличен на единицу. Потом прочитал, что есть разница между адресом и номером регистра, адреса начинаются с 0, а регистры с 1. Таким образом стек автоматически преобразует адрес в номер регистра.
Что касается описания, наверно все-таки пользуясь онлайн переводчиком, можно осилить http://www.freemodbus.org/api/index.html
Как распределить адреса зависит от вашего приложения.
Для меня в самом начале было странно, что при вызове функций из этого файла, адрес был увеличен на единицу. Потом прочитал, что есть разница между адресом и номером регистра, адреса начинаются с 0, а регистры с 1. Таким образом стек автоматически преобразует адрес в номер регистра.
Что касается описания, наверно все-таки пользуясь онлайн переводчиком, можно осилить http://www.freemodbus.org/api/index.html
Re: FreeModBus RTU
откуда у вас mbcallbacks.c ?
http://www.freemodbus.org/api/index.html тут не полная информация
. Там в основном как портировать сам freemodbus на свой камушек с примерами и не более. Мне же интересно сама реализация, как все происходит...
http://www.freemodbus.org/api/index.html тут не полная информация
Re: FreeModBus RTU
А действительно, откуда? Не помню
Ну вот он:
Ну вот он:
Спойлер
Код: Выделить всё
/* ----------------------- 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
все понял, что это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; }
- Реклама

