freeemodbus eMBRegCoilsCB函数体示例

freemodbus eMBRegCoilsCB function body example

本文关键字:函数体 eMBRegCoilsCB freeemodbus      更新时间:2023-10-16

有人能解释一下如何在 eMBRegCoilsCB() 中使用 xMBUtilGetBits() xMBUtilSetBits() 吗?我使用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

试试这个。我让REG_COILS_START = 0来简化地址魔术。但是对于我来说,即使在读取和写入时offset>0,它也可以工作。

uint8_t modbus_CS[10];
#define TABLE_CS_SIZE ( sizeof(modbus_CS) * sizeof(modbus_CS[0]) )
eMBErrorCode eMBRegCoilsCB(UCHAR * pucRegBuffer, USHORT usAddress,
    USHORT usNCoils, eMBRegisterMode eMode)
{
    usAddress -= 1; /* to c-style address */
    /* check if we away of table size */
    if (usAddress + usNCoils > TABLE_CS_SIZE) {
        return MB_ENOREG;
    }
    switch (eMode)
    {
        case MB_REG_WRITE:
            for (int i = 0; i < usNCoils; i++) {
                UCHAR wbit = xMBUtilGetBits(pucRegBuffer, i, 1 );
                xMBUtilSetBits( modbus_CS, usAddress+i, 1, wbit );
            }
            break;
        case MB_REG_READ:
            for (int i = 0; i < usNCoils; i++) {
                UCHAR rbit = xMBUtilGetBits( modbus_CS, usAddress+i, 1 );
                xMBUtilSetBits( pucRegBuffer, i, 1, rbit );
            }
            break;
    }
    return MB_ENOERR;
}
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;
}