Во многой мудрости много печали. Умножающий сущности умножает
скорбь. У меня все работает без этих проблем.
//
if(PaketRX[1]==0x01)
{
//вычисление адреса запрашиваемых бит
unsigned short AdresBit=(((((unsigned short)PaketRX[2])<<8)|(PaketRX[3])));
//вычисление количества запрашиваемых бит
unsigned short KolvoBit=((((unsigned short)PaketRX[4])<<8)|(PaketRX[5]));
//если неправильный адрес и количество
if(KolvoBit>ModBusMaxOutBitTX || KolvoBit==0)
{//неправильное количество
#if ModBusUseErrMes!=0
MesErrRTU(ILLEGAL_DATA_VALUE);
#endif
return;
}
if((AdresBit+KolvoBit)>ModBusMaxOutBit)
{//неправильный адрес
#if ModBusUseErrMes!=0
MesErrRTU(ILLEGAL_DATA_ADDRESS);
#endif
return;
}
Prg2ModBusOutBit();//Заполнение регистров Модбас
//формирование пакета ответа
//адрес
ModBusPUT(PaketRX[0]);
unsigned short TmpCRC=CRCfunc(0xFFFF,PaketRX[0]);
//код команды
ModBusPUT(1);
TmpCRC=CRCfunc(TmpCRC,1);
//количество полных байт
ModBusPUT((KolvoBit+7)>>3);
TmpCRC=CRCfunc(TmpCRC,((KolvoBit+7)>>3));
//копирование битов в пакет ответа
unsigned char TxByte=0;//текущий байт
unsigned char Bit=AdresBit&7;//указатель бит в ModBusOutBit[]
AdresBit=AdresBit>>3;//указатель байт ModBusOutBit[]
//копирование из регистра ModBusOutBit[] в пакет
int i=0;
while(!0)
{
if((ModBusOutBit[AdresBit].byte)&(1<<Bit))
{
TxByte=TxByte|(1<<(i&7));
}
Bit++;
if(Bit==8){Bit=0;AdresBit++;}
i++;
if((i&7)==0)
{//скопирован байт
ModBusPUT(TxByte);
TmpCRC=CRCfunc(TmpCRC,TxByte);
TxByte=0;
if(i==KolvoBit) { break; } else { continue; }
}
if(i==KolvoBit)
{//скопированы все биты
ModBusPUT(TxByte);
TmpCRC=CRCfunc(TmpCRC,TxByte);
break;
}
}
ModBusPUT(TmpCRC);
ModBusPUT(TmpCRC>>8);
return;
}//