ВКТ-7 |
Реализация протокола МОДБАС |
с. 21 |
|
|
|
Приложение А – Расчет контрольной суммы кадра Modbus
Расчет контрольной суммы кадра Modbus RTU может выполняться по следующему алгоритму (текст на языке программирования С):
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;
}
Пусть какое-либо сообщение, имеющего длину N, записано в массиве Data[N+2] типа unsigned char. Тогда для этого сообщения контрольную сумму
следует формировать следующим образом:
WORD CheckSumm = Crc16(Data, N); Data[N] = CheckSumm;
Data[N+1] = CheckSumm>>8;
ВКТ-7 |
Реализация протокола МОДБАС |
с. 22 |
|
|
|
Приложение Б – Используемые типы данных и символьные константы
При реализации протокола обмена возможно использование типа данных VT_DATA_RAP — 4 байта (день, месяц, год, час).
При расшифровке кодов в байте качества элементов данных можно использовать следующие символьные константы:
•#define OPC_QUALITY_GOOD 0xC0
•#define OPC_QUALITY_BAD 0x00
•#define OPC_QUALITY_CONFIG_ERROR 0x04
•#define OPC_QUALITY_DEVICE_FAILURE 0x0C
•#define OPC_QUALITY_UNCERTAIN 0x40
•#define OPC_QUALITY_SENSOR_CAL 0x50