Modbus в FlProg CRC

Использование протокола Modbus
Ответить
Аватара пользователя
sonata
Рядовой
Сообщения: 21
Зарегистрирован: 25.01.2018{, 00:36}
Репутация: 9
Откуда: Украина
Имя: sonata

Modbus в FlProg CRC

#1

Сообщение sonata » 25.01.2018{, 22:14}

удалено
Последний раз редактировалось sonata 10.02.2018{, 00:36}, всего редактировалось 1 раз.
pony sonata

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Modbus в FlProg CRC

#2

Сообщение Sancho » 26.01.2018{, 08:57}

sonata писал(а):
25.01.2018{, 22:14}
есть ли проверка CRC в Modbus в FlProg?
Есть
кодПоказать

Код: Выделить всё

int modbusCalcCRC(byte length, byte bufferArray[])
{
  unsigned int temp, temp2, flag;
  temp = 0xFFFF;
  for (unsigned char i = 0; i < length; i++) {
    temp = temp ^ bufferArray[i];
    for (unsigned char j = 1; j <= 8; j++) {
      flag = temp & 0x0001;
      temp >>= 1;
      if (flag)   temp ^= 0xA001;
    }
  }
  temp2 = temp >> 8;
  temp = (temp << 8) | temp2;
  temp &= 0xFFFF;
  return temp;
}
byte _modbusValidateRequest() {
int msgCRC =
    ((_modbusSlaveBuffer[_modbusSlaveBufferSize - 2] << 8)
     | _modbusSlaveBuffer[_modbusSlaveBufferSize - 1]);
  if ( modbusCalcCRC( _modbusSlaveBufferSize - 2, _modbusSlaveBuffer ) != msgCRC ) { return 255;}
  boolean isSupported = false;
  for (uint8_t i = 0; i < sizeof( _modbusSlave_fctsupported ); i++) {
    if (_modbusSlave_fctsupported[i] == _modbusSlaveBuffer[1]) {
      isSupported = 1;
      break;
    }
  }
 if (!isSupported) { return 1;}
int intRegs = 0;
  byte byteRegs;
    switch ( _modbusSlaveBuffer[1] ) {
case 4 :
 if(!(checkModbusRange((word( _modbusSlaveBuffer[2], _modbusSlaveBuffer[3])), (word( _modbusSlaveBuffer[4], _modbusSlaveBuffer[5])),3))){return 2;}    
 break;
}
  return 0; // OK, no exception code thrown
}
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Ответить

Вернуться в «Modbus»