7 Расчет контрольной суммы сообщения (запроса и ответа)
При использовании фрейма RTU расчет контрольной суммы может выполнятся по следующему алгоритму. Пусть какие-либо сообщения (Query или Response), имеющие длину N байт (длина сообщения без учета Error Check l и Error Check h) записаны в массиве mess типа unsigned char.
Тогда следующий фрагмент программы формирует Error Check l и Error Check h:
unsigned crc;
unsigned char Error Check l, Error Check h, Data[BytesCount];
WORD Crc16(BYTE *Data, ULONG size)
{
union {BYTE b[2]; unsigned short w;
}
Sum;
char shift_cnt;
BYTE *ptrByte; ULONG byte_cnt = size;
ptrByte=Data;
Sum.w=0xffffU;
for(; byte_cnt>0; byte_cnt--)
{
Sum.w=(unsigned short)((Sum.w/256U)*256U+((Sum.w%256U)^(*ptrByte++)));
for(shift_cnt=0; shift_cnt<8; shift_cnt++)
{
if((Sum.w&0x1)==1) Sum.w=(unsigned short)((Sum.w>>1)^0xa001U);
else Sum.w>>=1;
}
}
return Sum.w;
}
crc = Crc16( Data, BytesCount);
Error Check l = crc;
Error Check h = crc >>8;
Примечание. Запрос версии прибора.
n 0x3 0xE 0x0 0x0 0x1 KS
Ответ зависит от версии прибора.
Версии до 4.06.01 включительно (номер 2) дают ответ в форме:
n 0x3 0x0 KS, n сетевой адрес
Последующие версии:
n 0x3 0x2 0x0 X KS, где Х - номер версии (1 байт), n сетевой адрес
|