Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Исходные Coils: N0...N7 = 01001101
Байт состояния Coils: 00001011
Старшие 4 бита не используются, далее состояние Coil7...Coil4
00001101 (или даже 11010000 - точно не помню, а проверить сейчас не могу)
eMBErrorCode
eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils,
eMBRegisterMode eMode )
{
eMBErrorCode eStatus = MB_ENOERR;
int iCoilIndex;
if( ( usAddress >= REG_COIL_START )
&& ( usAddress + usNCoils <= REG_COIL_START + REG_COIL_NREGS ) )
{
iCoilIndex = ( int )( usAddress - REG_COIL_START );
if (eMode == MB_REG_READ)
{
while( usNCoils > 7 )
{
*pucRegBuffer++ = xMBUtilGetBits( usRegCoilBuf, iCoilIndex, 8 );
iCoilIndex+=8;
usNCoils-=8;
}
if (usNCoils) *pucRegBuffer = xMBUtilGetBits( usRegCoilBuf, iCoilIndex, usNCoils );
}
}
else
{
eStatus = MB_ENOREG;
}
return eStatus;
}
usWordBuf = ucCoilsBuf[ usByteOffset ] << BITS_UCHAR;
usWordBuf != ucCoilsBuf[ usByteOffset + 1 ];
eMBErrorCode
eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils,
eMBRegisterMode eMode )
{
eMBErrorCode eStatus = MB_ENOERR;
int iCoilIndex;
if( ( usAddress >= REG_COIL_START )
&& ( usAddress + usNCoils <= REG_COIL_START + REG_COIL_NREGS ) )
{
iCoilIndex = ( int )( usAddress - REG_COIL_START );
if (eMode == MB_REG_READ)
{
while( usNCoils > 7 )
{
*pucRegBuffer++ = xMBUtilGetBits( usRegCoilBuf, iCoilIndex, 8 );
iCoilIndex+=8;
usNCoils-=8;
}
if (usNCoils) *pucRegBuffer = xMBUtilGetBits( usRegCoilBuf, iCoilIndex, usNCoils );
}
else if (eMode == MB_REG_WRITE)
{
while( usNCoils > 7 )
{
xMBUtilSetBits( usRegCoilBuf, iCoilIndex, 8, *pucRegBuffer++ );
iCoilIndex+=8;
usNCoils-=8;
}
if (usNCoils) xMBUtilSetBits( usRegCoilBuf, iCoilIndex, usNCoils, *pucRegBuffer);
}
}
else
{
eStatus = MB_ENOREG;
}
return eStatus;
}
Портирование FreeModbus под STM32. Версия от Динара