Пример тела функции freemodbus eMBRegCoilsCB

Кто-нибудь может объяснить, как использовать xMBUtilGetBits() а также xMBUtilSetBits() внутри eMBRegCoilsCB()? Я использую freemodbus в качестве ведомого драйвера Modbus RTU.

Я не могу добавить свой код, потому что он слишком большой, но вы можете увидеть примеры в демонстрациях (ссылка ниже). Во всех примерах eMBRegCoilsCB() не заполнено.

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

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

РЕДАКТИРОВАТЬ

Мой код не работает, если попытаться записать (0x15) несколько битов со смещением> 0

if ( ( usAddress >= REG_COILS_START )
&& ( usAddress + usNCoils <= REG_COILS_START + REG_COILS_NREGS ) )
{
iRegIndex = ( int ) ( usAddress - usRegCoilsStart );

switch ( eMode )
{
case MB_REG_READ:
{
while ( usNCoils > 0 )
{
UCHAR ucResult = xMBUtilGetBits( usRegCoilsBuf, iRegIndex, 1 );

xMBUtilSetBits( pucRegBuffer, iRegIndex, 1, ucResult );

iRegIndex++;
usNCoils--;
}

break;
}

case MB_REG_WRITE:
{
while ( usNCoils > 0 )
{
UCHAR ucResult = xMBUtilGetBits( pucRegBuffer, iRegIndex, 1 );

xMBUtilSetBits( usRegCoilsBuf, iRegIndex, 1, ucResult );

iRegIndex++;
usNCoils--;
}

break;
}
}
}
else
{
eStatus = MB_ENOREG;
}

связи

  1. freemodbus

-1

Решение

eMBErrorCode eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )
{
eMBErrorCode eStatus = MB_ENOERR;
int iRegIndex;

if ( ( usAddress >= REG_COILS_START )
&& ( usAddress + usNCoils <= REG_COILS_START + REG_COILS_NREGS ) )
{
iRegIndex = ( int ) ( usAddress - usRegCoilsStart );

switch ( eMode )
{
case MB_REG_READ:
{
while ( usNCoils > 0 )
{
UCHAR ucResult = xMBUtilGetBits( usRegCoilsBuf, iRegIndex, 1 );

xMBUtilSetBits( pucRegBuffer, iRegIndex - ( usAddress - usRegCoilsStart ), 1, ucResult );

iRegIndex++;
usNCoils--;
}

break;
}

case MB_REG_WRITE:
{
while ( usNCoils > 0 )
{
UCHAR ucResult = xMBUtilGetBits( pucRegBuffer, iRegIndex - ( usAddress - usRegCoilsStart ), 1 );

xMBUtilSetBits( usRegCoilsBuf, iRegIndex, 1, ucResult );

iRegIndex++;
usNCoils--;
}

break;
}
}
}
else
{
eStatus = MB_ENOREG;
}

return eStatus;
}
-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]