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;
}