LINUX.ORG.RU

История изменений

Исправление Alden, (текущая версия) :

Я писал реализацию протокола Тензо-М для ПЛК Siemens. У них есть код на C в официальной документации. Я его на SCL переводил

https://www.tenso-m.ru/pdf/vks.pdf

//~~~~~~~~~~~~~~~~~~~~~~~~~~
// Эта функция рассчитывает контрольную сумму
// последовательности байтов и возвращает результат.
unsigned char ucCrcMaker (unsigned char *InputData, unsigned char BytesNumber, unsigned char Offset)
//    *InputData -указатель на последовательность байтов.
//    BytesNumber -количество байтов, 
// для которых считается контрольная сумма.
//    Offset -смещение относительно начала последовательности
// байтов, с которого начинает считаться контрольная сумма 
// (0 -без смещения).
//    Возвращает контрольную сумму.
{
	// Служебные параметры.
	register unsigned char i, j, Data, CrcCode = 0, Polinom = 0x69;
	for(i = Offset; i < BytesNumber +Offset; i++)
	{
		Data = InputData[i];
		for(j = 0; j < 8; j++)
		{
			if(CrcCode & (1 << 7))
			{
				CrcCode *= 2;
				if(Data & (1 << 7)) 
				CrcCode ++;
				CrcCode ^= Polinom;
			}
			else // if(CrcCode & (1 << 7))
			{
				CrcCode *= 2;
				if(Data & (1 <<7)) 
					CrcCode ++;
			}    // if(CrcCode & (1 << 7))
			Data *= 2;
		} // for(j = 0; j < 8; j++) 
	}  // for(i = Offset; i < BytesNumber + Offset; i++)
	// Вернѐм контрольную сумму.
	return CrcCode;
}  // unsigned char ucCrcMaker ( ... )
//~~~~~~~~~~~~~~~~~~~~~~~~~~

Исходная версия Alden, :

Я писал реализацию протокола Тензо-С для ПЛК Siemens. У них есть код на C в официальной документации. Я его на SCL переводил

https://www.tenso-m.ru/pdf/vks.pdf

//~~~~~~~~~~~~~~~~~~~~~~~~~~
// Эта функция рассчитывает контрольную сумму
// последовательности байтов и возвращает результат.
unsigned char ucCrcMaker (unsigned char *InputData, unsigned char BytesNumber, unsigned char Offset)
//    *InputData -указатель на последовательность байтов.
//    BytesNumber -количество байтов, 
// для которых считается контрольная сумма.
//    Offset -смещение относительно начала последовательности
// байтов, с которого начинает считаться контрольная сумма 
// (0 -без смещения).
//    Возвращает контрольную сумму.
{
	// Служебные параметры.
	register unsigned char i, j, Data, CrcCode = 0, Polinom = 0x69;
	for(i = Offset; i < BytesNumber +Offset; i++)
	{
		Data = InputData[i];
		for(j = 0; j < 8; j++)
		{
			if(CrcCode & (1 << 7))
			{
				CrcCode *= 2;
				if(Data & (1 << 7)) 
				CrcCode ++;
				CrcCode ^= Polinom;
			}
			else // if(CrcCode & (1 << 7))
			{
				CrcCode *= 2;
				if(Data & (1 <<7)) 
					CrcCode ++;
			}    // if(CrcCode & (1 << 7))
			Data *= 2;
		} // for(j = 0; j < 8; j++) 
	}  // for(i = Offset; i < BytesNumber + Offset; i++)
	// Вернѐм контрольную сумму.
	return CrcCode;
}  // unsigned char ucCrcMaker ( ... )
//~~~~~~~~~~~~~~~~~~~~~~~~~~