C++ freemodbus eMBRegCoilsCB功能体示例

C++ freemodbus eMBRegCoilsCB功能体示例,c++,c,embedded,modbus,C++,C,Embedded,Modbus,有谁能解释一下如何在embregcolscb()内部使用xMBUtilGetBits()和xMBUtilSetBits()?我使用freemodbus作为modbus rtu从机驱动程序 我无法添加我的代码,因为它太大了,但您可以在演示中看到示例(下面的链接)。在所有示例中,eMBRegCoilsCB()未填充 eMBErrorCode eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegis

有谁能解释一下如何在
embregcolscb()内部使用
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;
}
编辑

如果尝试写入偏移量>0的某些位(0x15),则我的代码不工作

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;
}
if((usAddress>=REG\u\u启动)
&&(usAddress+USN0)
{
UCHAR ucResult=xMBUtilGetBits(usRegCoilsBuf,iRegIndex,1);
xMBUtilSetBits(pucRegBuffer,iRegIndex,1,ucResult);
iRegIndex++;
(二);
}
打破
}
案例MB_REG_写入:
{                
而(大于0)
{
UCHAR ucResult=xMBUtilGetBits(pucRegBuffer,iRegIndex,1);
xMBUtilSetBits(usRegCoilsBuf,iRegIndex,1,ucResult);
iRegIndex++;
(二);
}
打破
}
}
}
其他的
{
eStatus=MB_ENOREG;
}
链接

  • eMBErrorCode eMBRegCoilsCB(UCHAR*pucRegBuffer、USHORT-usAddress、USHORT-usncools、eMBRegisterMode-eMode)
    {
    eMBErrorCode eStatus=MB_enorer;
    国际索引;
    如果((usAddress>=REG\u线圈\u开始)
    &&(usAddress+USN0)
    {
    UCHAR ucResult=xMBUtilGetBits(usRegCoilsBuf,iRegIndex,1);
    xMBUtilSetBits(pucRegBuffer,iRegIndex-(usAddress-usRegCoilsStart),1,ucResult);
    iRegIndex++;
    (二);
    }
    打破
    }
    案例MB_REG_写入:
    {                
    而(大于0)
    {
    UCHAR ucResult=xMBUtilGetBits(pucRegBuffer,iRegIndex-(usAddress-usRegCoilsStart),1);
    xMBUtilSetBits(usRegCoilsBuf,iRegIndex,1,ucResult);
    iRegIndex++;
    (二);
    }
    打破
    }
    }
    }
    其他的
    {
    eStatus=MB_ENOREG;
    }
    归还遗产;
    }
    
    eMBErrorCode eMBRegCoilsCB(UCHAR*pucRegBuffer、USHORT-usAddress、USHORT-usncools、eMBRegisterMode-eMode)
    {
    eMBErrorCode eStatus=MB_enorer;
    国际索引;
    如果((usAddress>=REG\u线圈\u开始)
    &&(usAddress+USN0)
    {
    UCHAR ucResult=xMBUtilGetBits(usRegCoilsBuf,iRegIndex,1);
    xMBUtilSetBits(pucRegBuffer,iRegIndex-(usAddress-usRegCoilsStart),1,ucResult);
    iRegIndex++;
    (二);
    }
    打破
    }
    案例MB_REG_写入:
    {                
    而(大于0)
    {
    UCHAR ucResult=xMBUtilGetBits(pucRegBuffer,iRegIndex-(usAddress-usRegCoilsStart),1);
    xMBUtilSetBits(usRegCoilsBuf,iRegIndex,1,ucResult);
    iRegIndex++;
    (二);
    }
    打破
    }
    }
    }
    其他的
    {
    eStatus=MB_ENOREG;
    }
    归还遗产;
    }
    
    试试这个。为了简化地址魔法,我设置了REG\u coups\u 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;
    }
    
    uint8_t modbus_CS[10];
    #定义表格大小(sizeof(modbus_CS)*sizeof(modbus_CS[0]))
    eMBErrorCode eMBRegCoilsCB(UCHAR*pucRegBuffer,USHORT-usAddress,
    USHORT(电子注册模式eMode)
    {
    usAddress-=1;/*到c样式的地址*/
    /*检查一下我们是否有超出桌子尺寸的地方*/
    if(usAddress+USNCOOLS>表格大小){
    返回MB_ENOREG;
    }
    开关(eMode)
    {
    案例MB_REG_写入:
    对于(int i=0;i<0;i++){
    UCHAR wbit=xMBUtilGetBits(pucRegBuffer,i,1);
    xMBUtilSetBits(modbus_CS,usAddress+i,1,wbit);
    }
    打破
    案例MB_REG_读取:
    对于(int i=0;i<0;i++){
    UCHAR rbit=xButilgetbits(modbus_CS,usAddress+i,1);
    xmbutilsetbit(pucRegBuffer,i,1,rbit);
    }
    打破
    }
    返回MB_enorer;
    }
    
    试试这个。为了简化地址魔法,我设置了REG\u coups\u 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;
    }
    
    uint8_t modbus_CS[10];
    #定义表格大小(sizeof(modbus_CS)*sizeof(modbus_CS[0]))
    eMBErrorCode eMBRegCoilsCB(UCHAR*pucRegBuffer,USHORT-usAddress,
    USHORT(电子注册模式eMode)
    {
    usAddress-=1;/*到c样式的地址*/
    /*检查一下我们是否有超出桌子尺寸的地方*/
    if(usAddress+USNCOOLS>表格大小){
    返回MB_ENOREG;
    }
    开关(eMode)
    {
    案例MB_REG_写入:
    对于(int i=0;i<0;i++){
    UCHAR wbit=xMBUtilGetBits(pucRegBuffer,i,1);
    xMBUtilSetBits(modbus_CS,usAddress+i,1,wbit);
    }
    打破
    案例MB_REG_读取:
    对于(int i=0;i<0;i++){
    UCHAR rbit=xButilgetbits(modbus_CS,usAddress+i,1);
    xmbutilsetbit(pucRegBuffer,i,1,rbit);
    }
    打破
    }
    返回MB_enorer;
    }