Кто-нибудь может объяснить, как использовать 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;
}
связи
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;
}
Других решений пока нет …