История изменений
Исправление 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 ( ... )
//~~~~~~~~~~~~~~~~~~~~~~~~~~