freemodbus eMBRegCoilsCB函数体实例

问题描述 投票:0回答:2

任何人都可以解释如何在xMBUtilGetBits()中使用xMBUtilSetBits()eMBRegCoilsCB()?我正在使用freemodbus作为modbus rtu slave驱动程序。

我无法添加我的代码,因为它太大但您可以在演示中看到示例(链接如下)。在所有的例子中,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
c++ c embedded modbus
2个回答
2
投票

试试这个吧。我做了REG_COILS_START = 0,以简化地址魔术。但即使在读取和写入时偏移> 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;
}

0
投票
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.